ดีบักเกอร์สำหรับ Iptables


47

ฉันกำลังมองหาวิธีง่ายๆในการติดตามแพ็กเก็ตผ่านกฎ iptables นี่ไม่ได้เกี่ยวกับการบันทึกมากนักเพราะฉันไม่ต้องการบันทึกปริมาณการใช้งานทั้งหมด (และฉันต้องการให้มีเป้าหมายการบันทึกสำหรับกฎน้อยมาก)

บางอย่างเช่น Wireshark สำหรับ Iptables หรือแม้กระทั่งบางสิ่งที่คล้ายกับดีบักเกอร์สำหรับภาษาการเขียนโปรแกรม

ขอบคุณคริส

หมายเหตุ:ไม่จำเป็นต้องเป็นเครื่องมือ GUI ที่สวยงาม แต่จะต้องทำมากกว่าเพียงแสดงตัวนับแพ็คเกจหรือมากกว่านั้น

อัปเดต:เกือบจะดูเหมือนว่าเราไม่พบสิ่งใดที่มีฟังก์ชั่นที่ขอ ในกรณีนี้: อย่างน้อยเราจะหาเทคนิคที่ดีซึ่งมาจากการบันทึก iptables - ซึ่งสามารถเปิดและปิดได้ง่ายและไม่จำเป็นต้องเขียนกฎ iptables ซ้ำซ้อน (ต้องเขียนกฎเดียวกันสำหรับ-j LOGและ-j ...)

คำตอบ:


10

ฉันไม่สามารถคิดถึงวิธีแก้ปัญหาโดยตรง แต่ฉันสามารถคิดถึงวิธีการติดตามแพ็คเก็ตเป็นรอบได้

  1. บันทึกแต่ละกฎด้วยคำสั่งคำนำหน้าบันทึก (--log-prefix "กฎ 34")
  2. สร้างแพ็คเก็ตทดสอบหรือแพ็คเก็ตสตรีมด้วยscapyและตั้งค่าฟิลด์ TOS เป็นสิ่งที่ไม่ซ้ำกัน
  3. grep เอาต์พุตไฟล์บันทึกสำหรับการตั้งค่า TOS นั้นและดูกฎที่บันทึกไว้

ขอบคุณสำหรับความคิด น่าเสียดายที่ฉันไม่สามารถบันทึกทุกกฎ (ในระบบหนึ่งดิสก์อาจจะไม่เร็วพอที่จะทำเช่นนั้นในอีกการบันทึก iptables ไม่สามารถใช้งานได้ในเคอร์เนล)
Chris Lercher

1
ใช้ไพพ์ที่มีชื่อเป็นไฟล์softpanorama.org/Logs/Syslog/pipes_in_syslog.shtml อย่างไรก็ตามเนื่องจากคุณไม่สามารถลงชื่อเข้าใช้เคอร์เนลของคุณได้คุณจะเป็นคนที่ ใจดี SOL
Haakon

ขอบคุณมันอาจจะไม่สามารถแก้ปัญหาของฉันได้ แต่โดยทั่วไปแล้วดีที่จะรู้ว่า syslog ไปป์ไลน์นั้นเป็นไปได้ - อาจจะมีประโยชน์อีกครั้ง!
Chris Lercher

คำถามหนึ่งที่เกี่ยวข้องกับการบันทึก: iptables จัดการหลาย ๆ แพ็คเก็ตพร้อมกันหรือไม่ ในกรณีนั้นฉันคิดว่าความคิด TOS เป็นสิ่งที่จำเป็นอย่างยิ่งสำหรับการวิเคราะห์ iptables LOG จำนวนมาก!
Chris Lercher

ฉันไม่รู้คำตอบสำหรับสิ่งนั้น ฉันคาดว่าแต่ละอินเตอร์เฟสจะได้รับการจัดการพร้อมกันโดย iptables อย่างน้อยแม้ว่า
ฮาก

82

หากคุณมีเคอร์เนลและเวอร์ชันล่าสุดของ iptables เพียงพอคุณสามารถใช้เป้าหมาย TRACE (ดูเหมือนว่าจะสร้างขึ้นภายในอย่างน้อย Debian 5.0) คุณควรตั้งค่าเงื่อนไขการติดตามของคุณให้มีความเฉพาะเจาะจงที่สุดเท่าที่จะทำได้และปิดการใช้งานกฎการติดตามใด ๆ เมื่อคุณไม่ได้ทำการดีบั๊กเพราะมันจะพ่นข้อมูลจำนวนมากไปยังบันทึก

TRACE
เป้าหมายนี้ทำเครื่องหมายแพ็คเพื่อให้เคอร์เนลจะบันทึกทุกกฎที่ตรงกับแพ็คเก็ตซึ่งเป็นไปตามตารางโซ่โซ่กฎ (โมดูล ipt_LOG หรือ ip6t_LOG เป็นสิ่งจำเป็นสำหรับการบันทึก) แพ็กเก็ตจะถูกบันทึกด้วยคำนำหน้าสตริง: "TRACE: tablename: chainname: type: rulenum" โดยที่ประเภทสามารถเป็น "กฎ" สำหรับกฎธรรมดา "กลับ" สำหรับกฎโดยนัย ในตอนท้ายของห่วงโซ่ที่ผู้ใช้กำหนดและ "นโยบาย" สำหรับนโยบายของโซ่ภายใน สามารถใช้งานได้ในตารางดิบเท่านั้น

หากคุณเพิ่มกฎเช่นนี้

iptables -t raw -A PREROUTING -p tcp --destination 192.168.0.0/24 --dport 80 -j TRACE
iptables -t raw -A OUTPUT -p tcp --destination 192.168.0.0/24 --dport 80 -j TRACE

คุณจะได้รับเอาต์พุตที่มีลักษณะเช่นนี้

# cat /var/log/kern.log | grep 'TRACE:'
Mar 24 22:41:52 enterprise kernel: [885386.325658] TRACE: raw:PREROUTING:policy:2 IN=eth0 OUT= MAC=00:1d:7d:aa:e3:4e:00:04:4b:05:b4:dc:08:00 SRC=192.168.32.18 DST=192.168.12.152 LEN=52 TOS=0x00 PREC=0x00 TTL=128 ID=30561 DF PROTO=TCP SPT=53054 DPT=80 SEQ=3653700382 ACK=0 WINDOW=8192 RES=0x00 SYN URGP=0 OPT (020405B40103030201010402)
Mar 24 22:41:52 enterprise kernel: [885386.325689] TRACE: mangle:PREROUTING:policy:1 IN=eth0 OUT= MAC=00:1d:7d:aa:e3:4e:00:04:4b:05:b4:dc:08:00 SRC=192.168.32.18 DST=192.168.12.152 LEN=52 TOS=0x00 PREC=0x00 TTL=128 ID=30561 DF PROTO=TCP SPT=53054 DPT=80 SEQ=3653700382 ACK=0 WINDOW=8192 RES=0x00 SYN URGP=0 OPT (020405B40103030201010402)
Mar 24 22:41:52 enterprise kernel: [885386.325713] TRACE: nat:PREROUTING:rule:1 IN=eth0 OUT= MAC=00:1d:7d:aa:e3:4e:00:04:4b:05:b4:dc:08:00 SRC=192.168.32.18 DST=192.168.12.152 LEN=52 TOS=0x00 PREC=0x00 TTL=128 ID=30561 DF PROTO=TCP SPT=53054 DPT=80 SEQ=3653700382 ACK=0 WINDOW=8192 RES=0x00 SYN URGP=0 OPT (020405B40103030201010402)
Mar 24 22:41:52 enterprise kernel: [885386.325731] TRACE: nat:nat.1:rule:1 IN=eth0 OUT= MAC=00:1d:7d:aa:e3:4e:00:04:4b:05:b4:dc:08:00 SRC=192.168.32.18 DST=192.168.12.152 LEN=52 TOS=0x00 PREC=0x00 TTL=128 ID=30561 DF PROTO=TCP SPT=53054 DPT=80 SEQ=3653700382 ACK=0 WINDOW=8192 RES=0x00 SYN URGP=0 OPT (020405B40103030201010402)
Mar 24 22:41:52 enterprise kernel: [885386.325731] TRACE: mangle:INPUT:policy:1 IN=eth0 OUT= MAC=00:1d:7d:aa:e3:4e:00:04:4b:05:b4:dc:08:00 SRC=192.168.32.18 DST=192.168.32.10 LEN=52 TOS=0x00 PREC=0x00 TTL=128 ID=30561 DF PROTO=TCP SPT=53054 DPT=3128 SEQ=3653700382 ACK=0 WINDOW=8192 RES=0x00 SYN URGP=0 OPT (020405B40103030201010402)
Mar 24 22:41:52 enterprise kernel: [885386.325731] TRACE: filter:INPUT:rule:2 IN=eth0 OUT= MAC=00:1d:7d:aa:e3:4e:00:04:4b:05:b4:dc:08:00 SRC=192.168.32.18 DST=192.168.32.10 LEN=52 TOS=0x00 PREC=0x00 TTL=128 ID=30561 DF PROTO=TCP SPT=53054 DPT=3128 SEQ=3653700382 ACK=0 WINDOW=8192 RES=0x00 SYN URGP=0 OPT (020405B40103030201010402)
Mar 24 22:41:52 enterprise kernel: [885386.325731] TRACE: filter:in_world:rule:1 IN=eth0 OUT= MAC=00:1d:7d:aa:e3:4e:00:04:4b:05:b4:dc:08:00 SRC=192.168.32.18 DST=192.168.32.10 LEN=52 TOS=0x00 PREC=0x00 TTL=128 ID=30561 DF PROTO=TCP SPT=53054 DPT=3128 SEQ=3653700382 ACK=0 WINDOW=8192 RES=0x00 SYN URGP=0 OPT (020405B40103030201010402)
Mar 24 22:41:52 enterprise kernel: [885386.325731] TRACE: filter:in_world_all_c1:return:2 IN=eth0 OUT= MAC=00:1d:7d:aa:e3:4e:00:04:4b:05:b4:dc:08:00 SRC=192.168.32.18 DST=192.168.32.10 LEN=52 TOS=0x00 PREC=0x00 TTL=128 ID=30561 DF PROTO=TCP SPT=53054 DPT=3128 SEQ=3653700382 ACK=0 WINDOW=8192 RES=0x00 SYN URGP=0 OPT (020405B40103030201010402)
Mar 24 22:41:52 enterprise kernel: [885386.325731] TRACE: filter:in_world:rule:2 IN=eth0 OUT= MAC=00:1d:7d:aa:e3:4e:00:04:4b:05:b4:dc:08:00 SRC=192.168.32.18 DST=192.168.32.10 LEN=52 TOS=0x00 PREC=0x00 TTL=128 ID=30561 DF PROTO=TCP SPT=53054 DPT=3128 SEQ=3653700382 ACK=0 WINDOW=8192 RES=0x00 SYN URGP=0 OPT (020405B40103030201010402)
Mar 24 22:41:52 enterprise kernel: [885386.325731] TRACE: filter:in_world_irc_c2:return:2 IN=eth0 OUT= MAC=00:1d:7d:aa:e3:4e:00:04:4b:05:b4:dc:08:00 SRC=192.168.32.18 DST=192.168.32.10 LEN=52 TOS=0x00 PREC=0x00 TTL=128 ID=30561 DF PROTO=TCP SPT=53054 DPT=3128 SEQ=3653700382 ACK=0 WINDOW=8192 RES=0x00 SYN URGP=0 OPT (020405B40103030201010402)

8
ขอบคุณนี่ยอดเยี่ยมมาก! จริงๆแล้วมันเป็นคำตอบที่ดีที่สุดฉันหวังว่าฉันจะยอมรับได้ (มันเป็นคำถามที่ได้รับรางวัลดังนั้นคำตอบที่ได้รับการยอมรับนั้นแน่นอน) แม้ว่าฉันจะไม่สามารถใช้งานได้กับทุกระบบของฉัน (เนื่องจากข้อ จำกัด ของเคอร์เนล) ในบางระบบที่ฉันสามารถทำได้ คำตอบนี้สมควรได้รับการเลื่อนเพราะมันใกล้เคียงกับสิ่งที่ฉันกำลังมองหา
Chris Lercher

ฉันพบคุณลักษณะนี้เมื่อคืนที่ฉันอ่านหน้า iptables อีกครั้งเพื่อที่ฉันจะได้ตอบคำถามอื่น ดูเหมือนว่าจะเป็นคุณสมบัติที่ค่อนข้างใหม่ ไม่ต้องกังวลว่าจะไม่สามารถทำเครื่องหมายว่ายอมรับได้ บางทีนี่อาจจะได้รับการโหวตให้มากพอที่จะได้รับป้ายประชานิยมอีกอันหนึ่งสำหรับฉัน
Zoredache

นี่เป็นคำตอบที่ยอมรับได้สำหรับการติดตามแพ็กเก็ตใน iptables มันแย่มากที่เมล็ดบางอันไม่ได้เปิดใช้งานโดยค่าเริ่มต้น
Peter Grace

เคอร์เนลรองรับ TRACE นานเท่าไหร่แล้ว? ฉันใช้กับความสำเร็จใน CentOS 6.4 แต่ไม่ได้อยู่ใน CentOS 6.2
sebelk

6

สามคำตอบในหนึ่งโพสต์:

1) ดีบักตามสคริปต์:

#!/bin/bash
debug() {
    if [ -n "$debug" ]; then
        $@ || echo -e "The command which launched the error:\n$@"
    else
        $@
    fi
}
debug=1
IPTABLES="debug /sbin/iptables"

$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
....

2) Debug โดย syslog

จากเว็บไซต์นี้: http://www.brandonhutchinson.com/iptables_fw.html

If you want to make a syslog entry of dropped packets, change:

# Drop all other traffic
/sbin/iptables -A INPUT -j DROP

To:

# Create a LOGDROP chain to log and drop packets
/sbin/iptables -N LOGDROP
/sbin/iptables -A LOGDROP -j LOG
/sbin/iptables -A LOGDROP -j DROP

# Drop all other traffic
/sbin/iptables -A INPUT -j LOGDROP


You may also want to configure the --log-level to log dropped packets to a separate file instead of /var/log/messages:

# Drop all other traffic
/sbin/iptables -A INPUT -j LOGDROP --log-level debug


/etc/syslog.conf change:

# Send iptables LOGDROPs to /var/log/iptables
kern.=debug                                             /var/log/iptables

Reload the syslogd service for the change to take effect.
/sbin/service syslog reload

3) ไม่มีการแก้ปัญหาดี iptables แก้ไข:

นอกจากนี้ยังสามารถเป็นประโยชน์: http://www.fwbuilder.org/


1
ขอบคุณ จุด 1) และ 3) ไม่มีอะไรเกี่ยวข้องกับแพ็คเก็ตต่อไปนี้ผ่านกฎ iptables แต่ประเด็นเกี่ยวกับการเปลี่ยนเส้นทางรายการบันทึกตาม "- ระดับล็อก" อาจเป็นประโยชน์ถ้าในที่สุดฉันต้องถอยกลับไป การบันทึก (ในกรณีที่ไม่มีวิธีแก้ไขปัญหาอื่น ๆ )
Chris Lercher

2

มีคำถามเดียวกันและพบ Zoredache ที่ชี้ไปที่ TRACE / ipt_LOG เป็นวิธีการแก้!

นอกจากนี้ฉันได้พบสคริปต์ที่แทรก / ลบกฎของ LOG ก่อนหน้ากฎ iptables ที่ใช้งานอยู่ในปัจจุบันทั้งหมด ฉันลองและพบว่ามันเป็นเครื่องมือที่ดีจริงๆ - เอาต์พุตคล้ายกับโซลูชัน TRACE - ข้อดี: ทำงานบนการกำหนดค่า iptables ที่ใช้งานไม่ว่าจะโหลดจากที่ใด คุณสามารถเปิด / ปิดการบันทึกได้ทันที! คุณไม่จำเป็นต้องแก้ไขสคริปต์ไฟร์วอลล์ใด ๆ ที่อาจสร้างขึ้นโดยเครื่องมือสร้างไฟร์วอลล์หรือเครื่องมือใดก็ตามที่คุณใช้ ... - ข้อเสีย: หากไม่มีการแก้ไขสคริปต์จะสร้างกฎการเข้าสู่ระบบสำหรับกฎที่ใช้งานทั้งหมด แต่เมื่อใช้กฎการติดตามคุณอาจ จำกัด การบันทึกที่อยู่ / บริการ / การเชื่อมต่อที่คุณต้องการตรวจสอบการประมวลผล iptables ทันที

อย่างไรก็ตามฉันชอบ aproach :) Kudos ถึง Tony Clayton ได้ดู: http://lists.netfilter.org/pipermail/netfilter/2003-March/043088.html

ขอแสดงความนับถือคริส


0

ฉันมักจะใช้แพ็คเก็ตและไบต์เพื่อดูว่ากฎทำงานอย่างไรและค้นหาสิ่งที่ขาดหายไปหรือผิด

คุณสามารถดูได้โดย "iptables -nvL"


2
ฉันสามารถเห็นสิ่งที่ผู้เขียนต้องการ แต่; หากคุณกำลังพยายามทดสอบกฎ iptables ของคุณบนอินเตอร์เฟซที่ไม่ว่างเพียงแค่การดูเคาน์เตอร์จะไม่ช่วยทั้งจำนวนมากโดยเฉพาะอย่างยิ่งถ้าแพ็กเก็ตมีแนวโน้มที่จะจับคู่กับกฎหลายกฎและกระโดดไปตามโซ่ที่ผู้ใช้กำหนด กรองที่อยู่ IP ที่ไม่ต้องการและกฎการป้องกันน้ำท่วม)
PP

@PP: แน่นอนคุณกำลังอ่านใจของฉัน @Vi: ขอบคุณสิ่งนี้มีประโยชน์ในบางสถานการณ์และฉันเคยใช้มันในบางครั้ง ตอนนี้ฉันต้องการสิ่งที่มีประสิทธิภาพยิ่งขึ้น
Chris Lercher

-2

AFAIK แพ็กเก็ต IP ข้ามห่วงโซ่กฎจนกระทั่งนัดแรก ดังนั้นฉันไม่เห็นว่าปัญหาคืออะไรที่นี่ ถ้าคุณมี:

  1. กฎ 1
  2. กฎ 2
  3. กฎ 3 เข้าสู่ระบบ

และแพ็คเก็ตทำให้มันเป็นบันทึกนั่นหมายความว่ากฎ 3 เป็นกฎการจับคู่แรก


ไม่จริง. แพ็คเก็ตสามารถจับคู่กฎหลายข้อได้ เว้นแต่กฎมีการกระทำ (เช่น-j DROPหรือ-j ACCEPT) มันก็จะจับคู่ต่อไปลงในห่วงโซ่
PP
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.