Score:0

syslog-ng: วิธีกำหนดค่าการส่งข้อความ RFC5424 ด้วยการนับเฟรมแบบ octet

ธง al

โปรดอย่ารบกวนการอ่านคำถามนี้ syslog-ng ได้รับการตั้งค่าให้ส่งข้อความ RFC5424 พร้อมการนับจำนวนเฟรมตามค่าเริ่มต้น ฉันสับสนกับพฤติกรรมของส่วนประกอบอื่น คำถามนี้ไม่ถูกต้อง


ฉันมีการกำหนดค่า OSE syslog-ng (v3.31.2):

@เวอร์ชั่น: 3.29
@รวม "scl.conf"
    
แหล่งที่มา s_network {
    พอร์ต udp(ip(0.0.0.0)(514));
};
    
ปลายทาง d_network_telegraf {
    syslog (พอร์ต "telegraf" (601) การขนส่ง (tcp));
};
    
บันทึก {
    แหล่งที่มา (s_network);
    ปลายทาง (d_network_telegraf);
};

มีความตั้งใจที่จะส่งต่อ RFC3164 ได้รับข้อความ syslog ที่จัดรูปแบบบนพอร์ต UDP 514 และส่งต่อเป็น RFC5424 ข้อความที่จัดรูปแบบเป็น telegraf บนพอร์ต TCP 601

ด้วยการกำหนดค่านี้ syslog-ng ดูเหมือนว่าจะส่งข้อความที่ส่งต่อเป็น RFC5424 โดยมีกรอบที่ไม่โปร่งใส (ใส่ออคเต็ต) (ข้อความขึ้นต้นด้วยอักขระ < อักขระ ASCII) น่าเสียดายที่ telegraf คาดว่าจะได้รับข้อความที่มีกรอบการนับ octet (ข้อความเริ่มต้นด้วยตัวเลข) RFC6587 ครอบคลุมสิ่งเหล่านี้

แม้ว่าจะเป็นไปได้ที่จะกำหนดค่า telegraf ให้คาดว่าเฟรมจะไม่โปร่งใส แต่ดูเหมือนว่าจะทำงานไม่ถูกต้อง ก่อนที่ฉันจะพูดถึงเรื่องนั้น ฉันต้องการลองทางเลือกอื่น ซึ่งก็คือการกำหนดค่า syslog-ng เพื่อส่งออกข้อความ RFC5424 พร้อมการนับเฟรมแบบ octet เห็นได้ชัดว่านี่เป็นประเภทเฟรมที่แนะนำ

อย่างไรก็ตาม ฉันไม่พบสิ่งใดในเอกสาร syslog-ng เกี่ยวกับเรื่องนี้ ในเกือบทุกกรณี เอกสารจะกล่าวถึงการใช้ syslog ไดรเวอร์สำหรับ ป้อนข้อมูล, ไม่ เอาต์พุตและเกือบจะมี ไม่มีการพูดถึง ของการนับออกเตตเลย

เป็นไปได้ไหมที่จะกำหนดค่า syslog-ng ในลักษณะนี้


แก้ไข

นี่คือการกำหนดค่าที่ฉันใช้:

@เวอร์ชั่น: 3.29
@รวม "scl.conf"

ตัวเลือก {
    สร้าง dirs (ใช่);
    ล้างเส้น (1);
    เวลาเปิดใหม่ (60);
};

แหล่งที่มา s_local {
    ระบบ();
    ภายใน();
};

แหล่งที่มา s_network {
    พอร์ต udp(ip(0.0.0.0)(514));
};

ปลายทาง d_local {
    ไฟล์ ("/data/syslog-ng/var/log/messages");
    ไฟล์ ("/data/syslog-ng/var/log/messages-kv.log" template("$ISODATE $HOST $(format-welf --scope all-nv-pairs)\n") frac-digits(3 ));
};

ปลายทาง d_network_files {
    ไฟล์ ("/data/syslog-ng/var/log/messages-network");
    ไฟล์ ("/data/syslog-ng/var/log/messages-network-kv.log" template("$ISODATE $HOST $(format-welf --scope all-nv-pairs)\n") frac-digits (3));
};

ปลายทาง d_network_telegraf {
    syslog (พอร์ต "telegraf" (601) การขนส่ง (tcp));
};

บันทึก {
    แหล่งที่มา (s_network);
    ปลายทาง (d_network_telegraf);
    ปลายทาง (d_network_files);
};

นี่คือข้อความที่ส่งโดย คนตัดไม้ -i -d --server localhost นี่คือการทดสอบ เพื่อ syslog-ng ผ่านพอร์ต UDP 514:

0000 02 42 ac 15 00 09 02 42 69 3a f6 78 08 00 45 00 .B.....Bi:.x..E.
0010 00 a6 79 e7 40 00 40 11 68 2b ac 15 00 01 ac 15 ..y.@[email protected]+......
0020 00 09 b4 bd 02 02 00 92 58 d8 3c 31 33 3e 31 20 ..........X<13>1 
0030 32 30 32 31 2d 31 31 2d 31 38 54 31 32 3a 34 31 2021-11-18T12:41
0040 3a 35 39 2e 39 34 33 39 36 35 2b 31 33 3a 30 30 :59.943965+13:00
0050 20 6b 6f 72 69 6d 61 6b 6f 20 64 61 76 69 64 20 เดวิด โคริมาโกะ 
0060 36 38 38 31 34 30 20 2d 20 5b 74 69 6d 65 51 75 688140 - [timeQu
0070 61 6c 69 74 79 20 74 7a 4b 6e 6f 77 6e 3d 22 31 ality tzKnown="1
0080 22 20 69 73 53 79 6e 63 65 64 3d 22 31 22 20 73 " isSynced="1" วินาที
0090 79 6e 63 41 63 63 75 72 61 63 79 3d 22 37 39 37 yncAccuracy="797
00a0 30 30 30 22 5d 20 74 68 69 73 20 69 73 20 61 20 000"] นี่คือ 
00b0 74 65 73 74 ทดสอบ

และนี่คือข้อความที่บันทึกระหว่าง syslog-ng และ telegraf (พอร์ต TCP 601):

0000 02 42 ac 15 00 07 02 42 ac 15 00 09 08 00 45 00 .B.....B......E.
0010 00 ก.ค. 61 40 00 40 06 27 70 ก.ค. 15 00 09 ก.ค 15 ...a@.@.'p......
0020 00 07 a7 ab 02 59 be 1c 32 98 d1 f9 90 93 80 18 .....พ..2.......
0030 01 f6 59 19 00 00 01 01 08 0a 0c 3e 2a 2d 7a e2 ......ย.......>*-z.
0040 58 เด 3c 31 33 3e 31 20 32 30 32 31 2d 31 31 2d X.<13>1 2021-11-
0050 31 37 54 32 33 3a 34 31 3a 35 39 2b 30 30 3a 30 17T23:41:59+00:0
0060 30 20 31 37 32 2e 32 31 2e 30 2e 31 20 31 20 2d 0 172.21.0.1 1 -
0070 20 2d 20 2d 20 32 30 32 31 2d 31 31 2d 31 38 54 - - 11-2021-18T
0080 31 32 3a 34 31 3a 35 39 2e 39 34 33 39 36 35 2b 12:41:59.943965+
0090 31 33 3a 30 30 20 6b 6f 72 69 6d 61 6b 6f 20 64 13:00 น.
00a0 61 76 69 64 20 36 38 38 31 34 30 20 2d 20 5b 74 มักมาก 688140 - [t
00b0 69 6d 65 51 75 61 6c 69 74 79 20 74 7a 4b 6e 6f imeQuality tzKno
00c0 77 6e 3d 22 31 22 20 69 73 53 79 6e 63 65 64 3d wn="1" isSynced=
00d0 22 31 22 20 73 79 6e 63 41 63 63 75 72 61 63 79 "1" ซิงค์ความแม่นยำ
00e0 3d 22 37 39 37 30 30 30 22 5d 20 74 68 69 73 20 ="797000"] นี้ 
00f0 69 73 20 61 20 74 65 73 74 0a เป็นการทดสอบ

คุณจะเห็นว่าข้อความซึ่งเริ่มต้นที่ไบต์ 66 (0x42) เริ่มต้นด้วย a < อักขระ (<13>1 2021...). ตาม RFC6587 สิ่งนี้ไม่ได้ตีความว่าเป็นการจัดเฟรมแบบนับอ็อกเตต แต่เป็นทางเลือก: การสร้างเฟรมแบบไม่โปร่งใส

บันทึกแบบเต็มของ syslog-ng สำหรับเหตุการณ์นี้คือ:

[2021-11-17T23:41:59.944928] รายการบันทึกขาเข้า; line='<13>1 2021-11-18T12:41:59.943965+13:00 korimako david 688140 - [timeQuality tzKnown="1" isSynced="1" syncAccuracy="797000"] นี่คือการทดสอบ'
[2021-11-17T23:41:59.987236] ข้อความขาออก; ข้อความ='2021-11-17T23:41:59.944+00:00 172.21.0.1 HOST=172.21.0.1 HOST_FROM=172.21.0.1 LEGACY_MSGHDR="1 " MESSAGE="2021-11-18T12:41:59.943965+13:00 korimako david 688140 - [timeQuality tzKnown=\"1\" isSynced=\"1\" syncAccuracy=\"797000\"] นี่คือการทดสอบ" PROGRAM=1 SOURCE=s_network\x0a'
[2021-11-17T23:41:59.987403] ข้อความขาออก; message='17 พ.ย. 23:41:59 172.21.0.1 1 2021-11-18T12:41:59.943965+13:00 korimako david 688140 - [timeQuality tzKnown="1" isSynced="1" syncAccuracy="797000"] this เป็นการทดสอบ\x0a'
[2021-11-17T23:42:31.994550] สร้างการเชื่อมต่อ Syslog แล้ว fd='12', เซิร์ฟเวอร์='AF_INET(172.21.0.7:601)', local='AF_INET(0.0.0.0:0)'
[2021-11-17T23:42:31.994946] ข้อความขาออก; message='<13>1 2021-11-17T23:41:59+00:00 172.21.0.1 1 - - - 11-2021-11-18T12:41:59.943965+13:00 ดาวิด korimako 688140 - [timeQuality tzKnown="1 " isSynced="1" syncAccuracy="797000"] นี่คือการทดสอบ\x0a'
[2021-11-17T23:42:36.996059] EOF เกิดขึ้นในขณะที่ไม่ได้ใช้งาน fd='12'
[2021-11-17T23:42:36.996187] ปิดการเชื่อมต่อ Syslog; fd='12', เซิร์ฟเวอร์='AF_INET(172.21.0.7:601)', time_reopen='60'
[2021-11-17T23:43:36.996635] สร้างการเชื่อมต่อ Syslog แล้ว fd='12', เซิร์ฟเวอร์='AF_INET(172.21.0.7:601)', local='AF_INET(0.0.0.0:0)'

อัปเดต 1: ฉันพบค่าการนับออคเต็ตที่ขาดหายไปที่จุดเริ่มต้นของข้อความ - มันอยู่ในเฟรม TCP ก่อนหน้า ฉันคิดว่านี่หมายความว่าเอาต์พุตจาก syslog-ng กำลังใช้การนับเฟรมแบบ octet ตอนนี้ฉันกำลังแก้ไขจุดบกพร่องต้นทางโทรเลขเพราะฉันคิดว่าได้รับข้อความแต่ปิดการเชื่อมต่ออย่างผิดพลาดในภายหลัง ฉันจะอัปเดตสิ่งนี้เมื่อฉันค้นพบเพิ่มเติม


อัปเดต 2: ฉันพบว่าปลั๊กอิน telegraf syslog มีข้อบกพร่องหรือข้อผิดพลาดในเอกสารประกอบ และกำลังตัดการเชื่อมต่อ TCP ขาเข้าที่ไม่ได้ใช้งานนานกว่า 5 วินาที ไม่ใช่ปัญหาในการแยกวิเคราะห์เพียงการหมดเวลา

ดังนั้นจึงไม่มีปัญหากับ syslog-ng และคำถามทั้งหมดนี้เป็นโมฆะ

Score:0
ธง vn

syslog-ng สามารถกำหนดค่าให้รองรับชุดค่าผสมทั้งหมด: รูปแบบ RFC3164 หรือ RFC5424 โดยมีหรือไม่มีเทคนิคการจัดเฟรมที่กำหนดไว้ใน RFC6587

ซิสล็อก() ใช้การจัดเฟรม RFC6587 (การนับจำนวนออกเตต) และเลือกใช้ RFC5424 เป็นรูปแบบข้อความ แต่กลับไปใช้ RFC3164 ที่ฝั่งต้นทาง เมื่อการแยกวิเคราะห์ RFC5424 ล้มเหลว

เครือข่าย() ทำงานโดยไม่มีเฟรม (โดยไม่มีการนับออกเตต - สิ่งนี้เรียกว่า "Non-Transparent-Framing" ใน RFC) และค่าเริ่มต้นคือ RFC3164 แต่สามารถเปลี่ยนได้ (เป็น RFC5424) ด้วย ค่าสถานะ (โปรโตคอล syslog) ธง.

al flag
เมื่อใช้ `syslog()` หรือ `network(... flag(syslog-protocol))` คุณจะสลับระหว่างโหมด octet-counting และ non-transparent (octet stuffing) ได้อย่างไร ขณะนี้ฉันใช้ `syslog()` และดูเหมือนว่าจะไม่โปร่งใสเท่านั้น ทั้งสองโหมดนั้นครอบคลุมโดย RFC6587 อาจมีตัวเลือกพิเศษในการเปลี่ยนไปใช้การนับออกเตต ฉันไม่พบสิ่งใดในเอกสารเกี่ยวกับเรื่องนี้
MrAnno avatar
vn flag
syslog() ควรใช้ octet-counting ในขณะที่ network() ใช้วิธี "ไม่โปร่งใสในกรอบ" แบบเก่า (แยกข้อความด้วย \n)
MrAnno avatar
vn flag
หากไม่เป็นเช่นนั้น คุณอาจพบจุดบกพร่อง คุณใช้การกำหนดค่าเดียวกันกับที่คุณแชร์หรือไม่
al flag
ฉันได้อัปเดตข้อความของคำถามเพื่อรวมการกำหนดค่าทั้งหมดที่ฉันใช้อยู่ พร้อมด้วยการจับภาพ wireshark และบันทึกคอนโซล syslog-ng ที่สอดคล้องกัน แจ้งให้เราทราบหากมีสิ่งอื่นที่อาจเป็นประโยชน์ในการดู
al flag
การอัปเดตอื่น - ฉันพบคำนำหน้า 'หายไป' octet-counting "[digits] " ในเฟรม TCP ก่อนหน้า ดังนั้นจึงมีอยู่ในสตรีม ฉันพลาดสิ่งนี้ นี่หมายความว่า syslog-ng *is* ส่งออกการนับเฟรมแบบ octet ตามที่คาดไว้ ฉันคิดว่ามีปัญหาแน่นอนกับวิธีที่ telegraf จัดการกับข้อความเหล่านี้ เนื่องจากมันกำลังปิดการเชื่อมต่อหลังจากแต่ละข้อความเนื่องจากการหมดเวลา ตอนนี้ฉันกำลังแก้ไขข้อบกพร่องนี้ อย่างไรก็ตาม @MrAnno ขอบคุณที่สละเวลาตอบกลับ และขออภัยที่ทำให้เสียเวลา
MrAnno avatar
vn flag
ด้วยความยินดี. อืม น่าสนใจ มีบางสิ่งที่น่าสนใจสำหรับคุณ: ในกรณีที่ telegraf ส่งอะไรกลับมาที่ syslog-ng ลักษณะการทำงานเริ่มต้นคือการปิดการเชื่อมต่อ เนื่องจากไดรเวอร์ network(), syslog() ไม่คาดหวังคำตอบจากเซิร์ฟเวอร์ หากเป็นกรณีนี้ คุณสามารถลองใช้ตัวเลือกที่ไม่มีเอกสารต่อไปนี้: `close-on-input(no)`

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา