ตัวอย่างการส่งต่อ Iptables ตัวอย่างการใช้งาน Iptables กฎเริ่มต้น

Iptables มีหน้าที่หลักในการกรองแพ็กเก็ต การตั้งค่า Iptables ด้วยตนเองค่อนข้างจะดี ไม่ใช่งานง่าย- อย่าคาดหวังว่าจะเข้าใจสิ่งนี้ "อย่างรีบร้อน" โชคดีที่มีเครื่องมือมากมายที่สามารถช่วยคุณได้หากคุณยังไม่ทราบ iptables แต่จำเป็นต้องรักษาความปลอดภัยระบบอย่างเร่งด่วน: fwbuilder, firestarter, guarddog, arno firewall - โดยพื้นฐานแล้วนี่คือ GUI สำหรับ iptables ไม่มีคำตอบที่ชัดเจนว่าอันไหนดีกว่ากัน ทางเลือกเป็นของคุณ อย่างไรก็ตาม บทความในวันนี้จัดทำขึ้นเพื่อ iptables โดยเฉพาะ และแบ่งออกเป็นสองส่วน: ทฤษฎีและการปฏิบัติ คนที่ใจร้อนที่สุดสามารถทำภาคปฏิบัติให้เสร็จสิ้นได้ทันที แม้ว่าจะไม่แนะนำวิธีนี้ก็ตาม

ความสนใจ!การดำเนินการทั้งหมดกับ iptables ดำเนินการในนามของผู้ใช้ที่มีสิทธิ์!

ทฤษฎี

รูปแบบรายการ iptables iptables [-t table] [คำสั่ง] [การกระทำ] ตัวอย่าง: iptables -t filter -A INPUT ACCEPT

การดำเนินการ

  • ยอมรับ - ยอมรับแพ็คเกจ
  • DROP - วางแพ็กเก็ต
  • DNAT - แปลงที่อยู่ปลายทาง
  • SNAT - เปลี่ยนที่อยู่ IP ขาออกในส่วนหัวของแพ็คเก็ต
  • LOG - การบันทึกแพ็กเก็ตและเหตุการณ์
  • MARK - ทำเครื่องหมายบนบรรจุภัณฑ์
  • MASQUERADE - เปลี่ยนที่อยู่ IP ขาออกในส่วนหัวของแพ็กเก็ต (ความแตกต่างจาก SNAT - ทำงานกับ IP แบบไดนามิก)
  • QUEUE - จัดคิวแพ็กเก็ตเพื่อการประมวลผล
  • เปลี่ยนเส้นทาง - เปลี่ยนเส้นทางแพ็กเก็ต/โฟลว์ไปยังพอร์ตอื่น
  • ปฏิเสธ - วางแพ็กเก็ต + แจ้งเตือน ระบบระยะไกลเกี่ยวกับเรื่องนั้น ว่าพัสดุของเธอถูกปฏิเสธ
  • RETURN - หยุดแพ็กเก็ตไม่ให้เคลื่อนที่ไปตามสายโซ่ปัจจุบันและส่งคืนไปยังสายโซ่การโทร

ทีม

  • -A - เพิ่มกฎให้กับเชน
  • -D - ลบกฎออกจากเชน
  • -R - แทนที่กฎหนึ่งด้วยอีกกฎหนึ่ง
  • -I - แทรกกฎใหม่
  • -L - แสดงรายการกฎที่มีอยู่
  • -F - รีเซ็ตกฎ
  • -Z - รีเซ็ตตัวนับในห่วงโซ่ที่กำหนด
  • -N - สร้างห่วงโซ่ใหม่ด้วยชื่อที่กำหนด
  • -X - ลบเชน
  • -P - ตั้งค่านโยบายเริ่มต้นสำหรับเชนที่เลือก
  • -E - เปลี่ยนชื่อห่วงโซ่ผู้ใช้

เกณฑ์ (ทั่วไป)

  • -p - ระบุประเภทโปรโตคอล
  • -s - ที่อยู่ IP ของแพ็กเก็ตต้นทาง
  • -d - ที่อยู่ IP ของผู้รับแพ็กเก็ต
  • -j - ระบุการดำเนินการสำหรับกฎ
  • -i - อินเทอร์เฟซที่ได้รับแพ็กเก็ต
  • -o - ระบุชื่อของอินเทอร์เฟซเอาต์พุต
  • -f - เผยแพร่กฎไปยังทุกส่วนของแพ็กเก็ต

เกณฑ์ TCP:

  • –tcp-flags - กำหนดแพ็คเก็ตมาสก์และแฟล็ก

เกณฑ์ UDP:

  • –sport - พอร์ตที่ใช้ส่งแพ็กเก็ต
  • –dport - พอร์ตที่แพ็คเก็ตถูกกำหนดที่อยู่

รายละเอียดเพิ่มเติมใน man iptables

ฝึกฝน

ดูการกำหนดค่าปัจจุบัน

$ sudo iptables -L Chain INPUT (ยอมรับนโยบาย) เป้าหมาย prot เลือกต้นทางปลายทาง Chain FORWARD (ยอมรับนโยบาย) เป้าหมาย prot เลือกต้นทางปลายทาง Chain OUTPUT (ยอมรับนโยบาย) เป้าหมาย prot เลือกปลายทางต้นทาง

หากคุณเห็นสิ่งนี้ แสดงว่าไฟร์วอลล์ของคุณยังไม่ได้กำหนดค่าและอนุญาตทุกอย่าง มาแก้ไขสถานการณ์กันเถอะ

การตั้งค่านโยบายเริ่มต้น

  • iptables -P INPUT DROP - บล็อกแพ็กเก็ตขาเข้า
  • iptables -P OUTPUT ACCEPT - อนุญาตแพ็กเก็ตขาออก
  • iptables -P FORWARD DROP - การประมวลผลแพ็กเก็ตที่เข้าถึงเซิร์ฟเวอร์จากเครื่องอื่นและกำลังรอการส่งต่อเพิ่มเติม ในตัวอย่างมันถูกบล็อก ในกรณีนี้ คุณจะต้องเพิ่มกฎสำหรับเครื่องที่เชื่อถือได้

เนื่องจากแพ็กเก็ต INPUT ขาเข้าถูกบล็อก เราจะเขียนกฎต่อไปนี้:

$ sudo iptables -A อินพุต -m รัฐ -- รัฐที่เกี่ยวข้อง จัดตั้งขึ้น -j ยอมรับ

ซึ่งจะอนุญาตให้ยอมรับแพ็กเก็ตจากการเชื่อมต่อที่สร้างไว้ก่อนหน้านี้และยอมรับแพ็กเก็ตใหม่ที่สร้างโดยการเชื่อมต่อนี้

หรือระบุประเภทโปรโตคอล:

$ sudo iptables -A INPUT -p TCP -m state - state ก่อตั้งแล้ว, เกี่ยวข้อง -j ยอมรับ $ sudo iptables -A INPUT -p UDP -m state - state ก่อตั้งแล้ว, เกี่ยวข้อง -j ยอมรับ

ตอนนี้อินเทอร์เฟซท้องถิ่น:

$ sudo iptables -A อินพุต -i lo -j ยอมรับ

  • ใหม่ - ข้อมูลเริ่มต้นการเชื่อมต่อใหม่
  • สร้างขึ้น - แพ็กเก็ตที่มาจากการเชื่อมต่อที่สร้างไว้แล้ว
  • ที่เกี่ยวข้อง - แพ็กเก็ตข้อมูลใหม่ แต่สร้างขึ้นโดยการเชื่อมต่อที่สร้างไว้เก่า
  • ไม่ถูกต้อง - จึงชัดเจน

$ sudo iptables-save > /etc/iptables.up.rules

เปิดใช้งานกฎเหล่านี้:

$sudo iptables-เรียกคืน< /etc/iptables.up.rules

และดูความแตกต่าง:

$sudo iptables -L

เรียกใช้ iptables เมื่อเริ่มต้นระบบ:

ในไดเร็กทอรี /etc/init.d ให้สร้างไฟล์ชื่อ iptables

$ sudo touch /etc/init.d/iptables

เราเขียนสิ่งต่อไปนี้ลงไป:

#!/bin/sh /sbin/iptables-restore< /etc/iptables.up.rules

การทำให้ไฟล์ iptables ปฏิบัติการได้:

$ sudo chmod +x /etc/init.d/iptables

เพิ่มไปยังการทำงานอัตโนมัติ

$ sudo update-rc.d -n ค่าเริ่มต้นของ iptables

เรียกใช้ iptables เมื่อเชื่อมต่อกับเครือข่าย:

$ sudo echo "#! /sbin/iptables-restore"> /etc/network/if-up.d/iptables.up.rules $ sudo iptables-save >> /etc/network/if-up.d/iptables up.rules $ sudo chmod +x /etc/network/if-up.d/iptables.up.rules

บันทึก:คุณสามารถตรวจสอบว่ากฎของคุณโหลดได้ตลอดเวลาหรือไม่โดยเพียงแค่ป้อน iptables-save as root

สำหรับ Archlinux การบันทึกกฎ iptables ทำได้โดยใช้คำสั่ง:

$ sudo rc.d บันทึก iptables

หลักการตั้งค่า

ไวยากรณ์ทั่วไปสำหรับการใช้ iptables คือ:

iptables -t<таблица> <команда> <цепочка>[ตัวเลข]<условие> <действие>

<таблица>

กฎ netfilter กระจายอยู่ใน 4 ตาราง ซึ่งแต่ละตารางมีวัตถุประสงค์ของตัวเอง (รายละเอียดเพิ่มเติมด้านล่าง) มันถูกระบุด้วยสวิตช์ -t แต่หากไม่ได้ระบุพารามิเตอร์นี้ การดำเนินการจะดำเนินการสำหรับตารางเริ่มต้น - ตัวกรอง

<команда>

คำสั่งจะระบุประเภทการดำเนินการที่เราดำเนินการบน netfilter เช่น การสร้างหรือการลบกฎ

<цепочка>

แต่ละตารางมีห่วงโซ่ซึ่งแต่ละกฎจะถูกสร้างขึ้นเอง ตัวอย่างเช่น สำหรับตารางตัวกรองด้านบน มีเชนที่กำหนดไว้ล่วงหน้าสามสาย - INPUT (แพ็กเก็ตขาเข้า), OUTPUT (แพ็กเก็ตขาออก) และ FORWARD (แพ็กเก็ตการขนส่ง)

[ตัวเลข]

คำสั่งบางคำสั่งจำเป็นต้องระบุหมายเลขกฎ เช่น เพื่อลบหรือแก้ไข

<условие>

เงื่อนไขจะอธิบายเกณฑ์สำหรับการสร้างกฎเฉพาะ

<действие>

แล้วถ้าเข้าเงื่อนไขจะทำยังไงกับแพ็คเกจล่ะ?

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

คีย์ iptables และตัวอย่างการใช้งาน

เพื่อทำงานกับตาราง (iptables -t)

ฉันขอเตือนคุณว่ากฎทั้งหมดใน netfilter กระจายไปตามตาราง หากต้องการทำงานกับตารางใดตารางหนึ่ง คุณต้องใช้สวิตช์ -t

ทีม

คีย์ต่อไปนี้กำหนดการดำเนินการที่ยูทิลิตี้ iptables ดำเนินการ

สำคัญ คำอธิบายและตัวอย่าง
-ก การเพิ่มกฎที่ส่วนท้ายของรายการ:
iptables -A อินพุต -s 192.168.0.15 -j DROP
ปฏิเสธข้อความขาเข้าจาก 192.168.0.15
-D การลบกฎ:
iptables -D อินพุต 10
ลบกฎในห่วงโซ่ INPUT ด้วยหมายเลข 10
-ฉัน การแทรกกฎในส่วนเฉพาะของรายการ:
iptables -I อินพุต 5 -s 192.168.0.15 -j DROP
แทรกกฎข้อที่ 5 ในรายการ
-ร แทนที่กฎ
iptables -R เอาต์พุต 5 -s 192.168.0.15 -j ยอมรับ
แทนที่กฎข้อที่ 5 ของเราจากห้ามเป็นอนุญาต
-ฟ การรีเซ็ตกฎในห่วงโซ่
iptables -F อินพุต
-Z กำลังรีเซ็ตสถิติ
iptables -Z อินพุต
-น การสร้างห่วงโซ่
iptables -N CHAINNEW
-เอ็กซ์ กำลังลบห่วงโซ่
iptables -X CHAINNEW
-ป กำหนดกฎเริ่มต้น
iptables -P อินพุตลดลง
-อี เปลี่ยนชื่อห่วงโซ่
iptables -E CHAINNEW CHAINOLD

เงื่อนไข

คีย์เหล่านี้กำหนดเงื่อนไขของกฎ

สำคัญ คำอธิบายและตัวอย่าง
-พี โปรโตคอลเครือข่าย- ตัวเลือกที่ถูกต้องคือ TCP, UDP, ICMP หรือ ALL
iptables -A อินพุต -p tcp -j ยอมรับ
อนุญาตการเชื่อมต่อ TCP ขาเข้าทั้งหมด
-ส ที่อยู่ต้นทาง - ชื่อโฮสต์ ที่อยู่ IP หรือซับเน็ตในรูปแบบ CIDR
iptables -A อินพุต -s 192.168.0.50 -j DROP
ปฏิเสธข้อความขาเข้าจากโหนด 192.168.0.50
-d ที่อยู่ปลายทาง. หลักการใช้งานคล้ายกับคีย์ก่อนหน้า -s
iptables -A เอาต์พุต -d 192.168.0.50 -j DROP
ปฏิเสธการออกไปยังโหนด 192.168.0.50
-ฉัน อะแดปเตอร์เครือข่ายที่แพ็กเก็ตมาถึง (INPUT)
iptables -A อินพุต -i eth2 -j DROP
ปิดการใช้งานการรับส่งข้อมูลขาเข้าสำหรับอินเทอร์เฟซอีเทอร์เน็ต eth2
-o อะแดปเตอร์เครือข่ายที่ใช้ส่งแพ็กเก็ต (OUTPUT)
iptables -A เอาต์พุต -o eth3 -j ยอมรับ
อนุญาตข้อความขาออกจากอินเทอร์เฟซอีเทอร์เน็ต eth3
--dport ท่าเรือปลายทาง.
iptables -A อินพุต -p tcp --dport 80 -j ยอมรับ
อนุญาตสายเรียกเข้าบนพอร์ต 80
--กีฬา พอร์ตต้นทาง
iptables -A อินพุต -p tcp --sport 1023 -j DROP
ห้ามข้อความขาเข้าจากพอร์ต 1023

กุญแจที่อยู่ในรายการยังรองรับการก่อสร้างโดยใช้ป้ายด้วย ! - มันกลับเงื่อนไข เช่น
iptables -A อินพุต -s ! 192.168.0.50 -j ดรอป
จะปฏิเสธการเชื่อมต่อกับโฮสต์ทั้งหมด ยกเว้น 192.168.0.50

การดำเนินการ

การดำเนินการที่จะดำเนินการกับแพ็คเกจที่ตรงกับเกณฑ์ของเงื่อนไข แต่ละตารางมีชุดการดำเนินการที่อนุญาตเป็นของตัวเอง ระบุโดยใช้กุญแจ -เจ.

โต๊ะ การกระทำ คำอธิบาย
กรอง ยอมรับ อนุญาตให้มีแพ็คเกจ
หยด ปฏิเสธแพ็คเกจ
ปฏิเสธ ห้ามส่งข้อความไปยังแหล่งที่มา
แนท สวมหน้ากาก สำหรับแพ็กเก็ตขาออก ให้แทนที่ที่อยู่ IP ต้นทางด้วยที่อยู่ของอินเทอร์เฟซที่แพ็กเก็ตออกไป
สนท คล้ายกับ MASQUERADE แต่ระบุอินเทอร์เฟซเครือข่ายเฉพาะซึ่งจะใช้ที่อยู่สำหรับการปลอมแปลง
ดีเอ็นเอที การทดแทนที่อยู่สำหรับพัสดุที่เข้ามา
เปลี่ยนเส้นทาง เปลี่ยนเส้นทางคำร้องขอไปยังพอร์ตอื่นบนระบบเดียวกัน
ยุ่งเหยิง ทีโอเอส การปรับเปลี่ยนฟิลด์ TOS (การจัดลำดับความสำคัญของการรับส่งข้อมูล)
ดีเอสซีพี การเปลี่ยน DSCP (รวมถึงการจัดลำดับความสำคัญของการรับส่งข้อมูล)
ทีทีแอล เปลี่ยน TTL (อายุการใช้งานแพ็คเก็ต)
เอช.แอล. คล้ายกับ TTL แต่สำหรับ IPv6
เครื่องหมาย การทำเครื่องหมายแพ็คเกจ ใช้สำหรับการกรองหรือการสร้างรูปร่างในภายหลัง
คอนมาร์ค เครื่องหมายการเชื่อมต่อ
TCPMSS การเปลี่ยนค่า MTU

ตัวอย่างคำสั่ง iptables ที่ใช้กันทั่วไป

คำสั่งทั่วไป

ดูกฎด้วยหมายเลข:

iptables -L --line-numbers

สำหรับแต่ละตาราง คุณต้องดูกฎแยกกัน:

iptables -t nat -L --line-numbers

ลบกฎทั้งหมด:

ตั้งกฎเริ่มต้น:

iptables -P อินพุตลดลง

iptables -P เอาต์พุตลดลง

* ในตัวอย่างเหล่านี้ ตามค่าเริ่มต้น กฎการปฏิเสธ (DROP) จะใช้ได้กับแพ็กเก็ตขาเข้า (INPUT) และขาออก (OUTPUT) ทั้งหมด

อนุญาตทั้งหมด

วิธีที่ 1: โดยการเพิ่มกฎ:

iptables -I อินพุต 1 -j ยอมรับ

iptables -I เอาต์พุต 1 -j ยอมรับ

iptables - ฉันส่งต่อ 1 -j ยอมรับ

* คำสั่งทั้งสามนี้จะสร้างกฎที่อนุญาตแพ็กเก็ตขาเข้า ขาออก และการขนส่งทั้งหมด

วิธีที่ 2 การทำความสะอาดกฎ:

* ในที่นี้เราจะลบกฎทั้งหมด (-F) ออกก่อน จากนั้นจึงตั้งค่านโยบายเริ่มต้นเพื่ออนุญาตขาเข้า ขาออก และการขนส่ง (-S)

วิธีที่ 3 การปิดใช้งานบริการ (สะดวกในการปิดใช้งานไฟร์วอลล์ชั่วคราวเพื่อวินิจฉัยปัญหา):

บริการ iptables หยุด

การทำงานตามกฎเกณฑ์

เพิ่มกฎที่ส่วนท้ายของรายการ:

iptables -A อินพุต -p tcp --dport 25 -j ยอมรับ

iptables -A อินพุต -p tcp -s ! 192.168.0.25 --dport 993 -i eth0 -j ยอมรับ

เพิ่มช่วงพอร์ต:

iptables -A อินพุต -p tcp --dport 3000:4000 -j ยอมรับ

* วี ในกรณีนี้จาก 3,000 ถึง 4,000

แทรกกฎ:

iptables -I ส่งต่อ 15 -p udp -d 8.8.8.8 --dport 53 -i eth1 -j ยอมรับ

บล็อกที่อยู่ IP เฉพาะสำหรับการเชื่อมต่อบนพอร์ต 25:

iptables -I อินพุต 1 -s 1.1.1.1 -p tcp --dport 25 -j DROP

การส่งต่อพอร์ต

มีวิธีการกำหนดค่าสองวิธี

1. กฎการเตรียมการ + การโพสต์:

iptables -t nat -A PREROUTING -p tcp -m tcp -d 19.8.232.80 --dport 22 -j DNAT -- สู่ปลายทาง 192.168.1.15:2222

iptables -t nat -A การโพสต์ -p tcp -m tcp -s 192.168.1.15 --sport 2222 -j SNAT --to-source 19.8.232.80:22

* ที่ไหน 19.8.232.80 — ที่อยู่ที่เรารับฟังคำขอเชื่อมต่อ 22 - พอร์ตสำหรับการส่งต่อ 192.168.1.15 — ที่อยู่ IP ภายในที่เราถ่ายโอนคำขอทั้งหมดไป 2222 - พอร์ตภายใน

2. กฎการเตรียมล่วงหน้า + ส่งต่อ:

iptables -t nat -A PREROUTING -p tcp -i eth1 --dport 22 -j DNAT -- สู่ปลายทาง 192.168.1.15:2222

iptables -A FORWARD -p tcp -d 192.168.1.15 --dport 22 -m state --state ใหม่ ก่อตั้งแล้ว เกี่ยวข้อง -j ยอมรับ

คำนิยาม ฉันพีเทเบิล- คุณประโยชน์ บรรทัดคำสั่งเป็นอินเทอร์เฟซมาตรฐานสำหรับจัดการการทำงานของไฟร์วอลล์ (ไฟร์วอลล์) เน็ตฟิลเตอร์สำหรับแกน เวอร์ชันลินุกซ์ 2.4, 2.6, 3.x, 4.x หากต้องการใช้ ยูทิลิตี้ iptablesต้องใช้สิทธิ์ Superuser (root)

เราจะจัดการกับ ไอพีเทเบิลและเราทำไม่ได้หากไม่มีการแนะนำทางทฤษฎีสักเล็กน้อย

หากต้องการกำหนดกฎไฟร์วอลล์อย่างถูกต้อง คุณต้องเข้าใจว่าแพ็กเก็ตโดยทั่วไปมีการรับส่งข้อมูลอย่างไรและเกิดอะไรขึ้นกับแพ็กเก็ตเหล่านั้น

ลำดับการเคลื่อนย้ายแพ็คเกจการขนส่ง

ขั้นตอน โต๊ะ โซ่ บันทึก
1
2 ยุ่งเหยิง กำลังเตรียมการ โดยปกติแล้วห่วงโซ่นี้จะใช้เพื่อทำการเปลี่ยนแปลงส่วนหัวของแพ็กเก็ต เช่น การเปลี่ยนบิต ทีโอเอสฯลฯ
3 แนท กำลังเตรียมการ โซ่นี้ใช้สำหรับการออกอากาศ ที่อยู่เครือข่าย (). จะถูกดำเนินการในภายหลังในห่วงโซ่อื่น
4 การตัดสินใจเกี่ยวกับเส้นทางเพิ่มเติมเช่น ณ จุดนี้ก็มีการตัดสินใจแล้ว เขาจะไปไหนถุงพลาสติก - แอปพลิเคชันท้องถิ่นหรือไปยังโหนดเครือข่ายอื่น
5 ยุ่งเหยิง ซึ่งไปข้างหน้า แพ็กเก็ตจะเข้าสู่ห่วงโซ่ ซึ่งไปข้างหน้ายุ่งโต๊ะ
6 กรอง ซึ่งไปข้างหน้า อยู่ในห่วงโซ่ ซึ่งไปข้างหน้าจะได้รับเฉพาะแพ็กเก็ตที่ไปยังโฮสต์อื่นเท่านั้นที่ควรดำเนินการกรองการรับส่งข้อมูลทั้งหมดที่นี่ อย่าลืมว่าการรับส่งข้อมูลผ่านสายโซ่นี้ทั้งสองทิศทาง อย่าลืมคำนึงถึงสิ่งนี้เมื่อเขียนกฎการกรอง
7 ยุ่งเหยิง การโพสต์ สายโซ่นี้มีจุดมุ่งหมายเพื่อทำการเปลี่ยนแปลงส่วนหัวของแพ็กเก็ตหลังจากการตัดสินใจกำหนดเส้นทางครั้งล่าสุด
9 แนท การโพสต์ โซ่นี้มีไว้เพื่อเป็นหลัก การแปลที่อยู่เครือข่ายต้นทาง- การปลอมตัวก็ดำเนินการที่นี่เช่นกัน ( การปลอมตัว).
9 อินเทอร์เฟซเครือข่ายเอาท์พุต (เช่น eth1)

สำหรับแอปพลิเคชันท้องถิ่น (แพ็คเกจที่เข้ามา)

ขั้นตอน โต๊ะ โซ่ บันทึก
1 อินพุตอินเทอร์เฟซเครือข่าย (เช่น eth0)
2 ยุ่งเหยิง กำลังเตรียมการ โดยทั่วไปจะใช้เพื่อทำการเปลี่ยนแปลงส่วนหัวของแพ็กเก็ต เช่น การตั้งค่าบิต ทีโอเอสฯลฯ
3 แนท กำลังเตรียมการ การแปลที่อยู่ ( การแปลที่อยู่เครือข่ายปลายทาง).
4 การตัดสินใจเกี่ยวกับเส้นทาง
5 ยุ่งเหยิง ป้อนข้อมูล แพ็กเก็ตเข้าสู่ห่วงโซ่ ป้อนข้อมูลยุ่งโต๊ะ นี่คือจุดที่มีการเปลี่ยนแปลงส่วนหัวของแพ็กเก็ตก่อนที่จะส่งต่อไปยังแอปพลิเคชันในเครื่อง
6 กรอง ป้อนข้อมูล การรับส่งข้อมูลขาเข้าจะถูกกรองที่นี่ โปรดจำไว้ว่าแพ็กเก็ตขาเข้าทั้งหมดที่ส่งถึงเราจะต้องผ่านสายโซ่นี้ ไม่ว่าแพ็กเก็ตนั้นจะมาจากอินเทอร์เฟซใดก็ตาม
7 กระบวนการ/แอปพลิเคชันเฉพาะที่ (เช่น โปรแกรมเซิร์ฟเวอร์หรือโปรแกรมไคลเอ็นต์)

จากกระบวนการท้องถิ่น (แพ็กเก็ตขาออก)

ขั้นตอน โต๊ะ โซ่ บันทึก
1 กระบวนการภายในเครื่อง (เช่น โปรแกรมเซิร์ฟเวอร์หรือโปรแกรมไคลเอ็นต์)
2 การตัดสินใจเกี่ยวกับเส้นทาง นี่คือการตัดสินใจว่าแพ็กเก็ตจะไปที่ใด - ไปยังที่อยู่ใดผ่านอินเทอร์เฟซเครือข่ายใด ฯลฯ
3 ยุ่งเหยิง เอาท์พุท นี่คือจุดที่มีการเปลี่ยนแปลงส่วนหัวของแพ็กเก็ต การกรองในห่วงโซ่นี้อาจส่งผลเสีย
4 แนท เอาท์พุท สายโซ่นี้ใช้สำหรับการแปลที่อยู่เครือข่าย (NAT) ในแพ็กเก็ตที่มาจากกระบวนการไฟร์วอลล์ในเครื่อง
5 กรอง เอาท์พุท การรับส่งข้อมูลขาออกจะถูกกรองที่นี่
6 ยุ่งเหยิง การโพสต์ โซ่ การโพสต์ตาราง Mangle ใช้สำหรับกฎที่จำเป็นต้องเปลี่ยนแปลงส่วนหัวของแพ็คเก็ตก่อนที่จะออกจากไฟร์วอลล์เป็นหลัก แต่หลังจากตัดสินใจกำหนดเส้นทางแล้ว แพ็กเก็ตทั้งหมดทั้งการส่งผ่านและสร้างโดยกระบวนการไฟร์วอลล์ในเครื่องจะตกอยู่ในห่วงโซ่นี้
7 แนท การโพสต์ วิ่งมาที่นี่ การแปลที่อยู่เครือข่ายต้นทาง- คุณไม่ควรกรองแพ็กเก็ตในห่วงโซ่นี้เพื่อหลีกเลี่ยงสิ่งที่ไม่ต้องการ ผลข้างเคียง- อย่างไรก็ตาม คุณสามารถหยุดแพ็กเก็ตได้ที่นี่เช่นกันโดยใช้นโยบายเริ่มต้น หยด.
8 อินเทอร์เฟซเครือข่าย (เช่น eth0)

ตามที่เราเข้าใจ มีสามตารางหลัก:

  • ยุ่งเหยิงตารางนี้มีไว้สำหรับการดำเนินการในการจำแนกประเภทและการทำเครื่องหมายของแพ็กเก็ตและการเชื่อมต่อ รวมถึงการแก้ไขส่วนหัวของแพ็กเก็ต (ฟิลด์ TTL และ TOS)
  • กรอง— ตารางหลักสำหรับการกรองแพ็กเก็ตที่ใช้เป็นค่าเริ่มต้น ที่จริงแล้วในตารางนี้เกิดการกรองแพ็กเก็ต
  • แนท- มีฟังก์ชัน nat หากคุณต้องการใช้คอมพิวเตอร์เป็นเราเตอร์ กฎการกำหนดเส้นทางถูกกำหนดไว้ที่นี่

สำหรับโต๊ะ แนทการดำเนินการมีผล:

  • สวมหน้ากาก

การกระทำ ดีเอ็นเอที(การแปลที่อยู่เครือข่ายปลายทาง) แปลงที่อยู่ปลายทางในส่วนหัวของแพ็กเก็ต กล่าวอีกนัยหนึ่ง การดำเนินการนี้เปลี่ยนเส้นทางแพ็กเก็ตไปยังที่อยู่อื่นนอกเหนือจากที่ระบุไว้ในส่วนหัวของแพ็กเก็ต

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

ปลอมตัว ( สวมหน้ากาก) ใช้เพื่อจุดประสงค์เดียวกันกับ สนทแต่ต่างจากอันที่แล้ว สวมหน้ากากให้มากขึ้น ภาระหนักบนระบบ สิ่งนี้เกิดขึ้นเนื่องจากทุกครั้งที่ต้องมีการดำเนินการนี้ ระบบจะขอที่อยู่ IP สำหรับอินเทอร์เฟซเครือข่ายที่ระบุในการดำเนินการ ในขณะที่สำหรับ สนทที่อยู่ IP ถูกระบุโดยตรง อย่างไรก็ตาม เนื่องจากความแตกต่างนี้ สวมหน้ากากสามารถทำงานได้ในกรณีที่มีที่อยู่ IP แบบไดนามิกเช่น เมื่อคุณเชื่อมต่ออินเทอร์เน็ตให้พูดผ่าน พรรคพลังประชาชน, ลื่นหรือ ดีเอชซีพี.

iptables -t nat -A การโพสต์ -s 10.8.0.0/24 -o eth0 -j MASQUERADE

ดำเนินการ สวมหน้ากากสำหรับแพ็กเก็ตทั้งหมดที่มาจากเครือข่าย 10.8.0.0 ถึงอินเทอร์เฟซ eth0 เพื่อความชัดเจน สมมติว่าเรามีการ์ดเครือข่ายสองใบและสองเครือข่าย เราต้องการเครือข่าย 10.8.0.0/24 (การ์ดเครือข่ายใบแรก) สามารถเข้าถึงอินเทอร์เน็ตผ่านทาง eth0(การ์ดเครือข่ายที่สอง)

  • ดิบ— ออกแบบมาเพื่อดำเนินการกับแพ็คเกจก่อนที่ระบบจะประมวลผล

ตารางเริ่มต้นนั้นเอง กรอง .

  • ป้อนข้อมูล- ประมวลผลการรับส่งข้อมูลที่มาถึงโฮสต์โดยตรง
  • ซึ่งไปข้างหน้า- ช่วยให้คุณสามารถกรองปริมาณการขนส่งสาธารณะได้
  • เอาท์พุท- ช่วยให้คุณกรองการรับส่งข้อมูลที่มาจากโฮสต์เอง

ดำเนินการกับแพ็คเกจ

  • ยอมรับ- การข้ามแพ็กเก็ต แพ็กเก็ตจะออกจากสายโซ่ฐานปัจจุบันและเดินหน้าต่อไป
  • ปฏิเสธ- ปิดกั้นแพ็คเกจและแจ้งแหล่งที่มาเกี่ยวกับการปฏิเสธ
  • หยด- ปิดกั้นแพ็คเกจโดยไม่แจ้งแหล่งที่มาเกี่ยวกับการปฏิเสธ จะดีกว่าเมื่อกรองการรับส่งข้อมูลบนอินเทอร์เฟซที่เชื่อมต่อกับอินเทอร์เน็ต เนื่องจากจะลดเนื้อหาข้อมูลของการสแกนพอร์ตโฮสต์โดยผู้โจมตี
  • บันทึก— จัดทำบันทึกเกี่ยวกับแพ็คเกจในไฟล์บันทึก

ปรากฎว่าเรามีห่วงโซ่ [ตาราง - ตัวกรอง] - [การจราจร - อินพุต] - [การกระทำ - DROP] ตรรกะของการกระทำดูเหมือนจะซับซ้อนเท่านั้น ฉันคิดว่าเราจะอธิบายด้วยตัวอย่างและทุกอย่างจะง่ายขึ้น

คำสั่ง iptables:

  • -กเพิ่มกฎที่ส่วนท้ายของห่วงโซ่
  • -Dลบกฎ
  • -ฉันใส่กฎด้วยหมายเลขที่ต้องการ
  • -ลแสดงกฎทั้งหมดในห่วงโซ่ปัจจุบัน
  • -สแสดงกฎทั้งหมด
  • -ฟเคลียร์ทุกกฎ
  • -นสร้างห่วงโซ่
  • -เอ็กซ์ลบโซ่
  • -ปตั้งค่าการดำเนินการเริ่มต้น

เริ่มจากตัวอย่างที่เฉพาะเจาะจงกันก่อน

iptables -A อินพุต -p tcp --dport 80 -j ยอมรับ

-กเพิ่มกฎใหม่ ป้อนข้อมูล สำหรับแพ็คเกจที่เข้ามา -พีโปรโตคอล หนึ่งใน tcp, udp, udplite, icmp, icmpv6, esp, ah, sctp,
อืม — — ดีพอร์ต พอร์ตปลายทาง 80 (ตัวเลือกโปรโตคอลเท่านั้น) -เจ เลือกการดำเนินการหากกฎตรงกัน ยอมรับ อนุญาต. นั่นก็คือ อนุญาต การจราจรขาเข้าผ่านโปรโตคอล TCP บนพอร์ต 80

กุญแจที่อยู่ในรายการยังรองรับการก่อสร้างโดยใช้ป้ายด้วย ! . มันจะกลับเงื่อนไข เช่น:

iptables -A อินพุต -s ! 192.168.0.50 -j ดรอป

-สที่อยู่ต้นทาง - ชื่อโฮสต์ (www.help.com) ที่อยู่ IP หรือเครือข่ายย่อยในรูปแบบ CIDR (192.168.0.1/16) ! การผกผัน หยดห้าม ปฏิเสธการรับส่งข้อมูลขาเข้าทั้งหมดยกเว้นแหล่งที่มา 192.168.0.50 (ถ้าไม่ใช่เพราะ. ! แล้วห้ามเฉพาะจาก 192.168.0.50)

iptables -A อินพุต -s 192.168.0.50 -j DROP

ปฏิเสธการรับส่งข้อมูลขาเข้าจาก ip - 192.168.0.50 .

รายการเกณฑ์กฎ:

  • -พีโปรโตคอล โปรโตคอลสามารถระบุด้วยหมายเลขหรือชื่อตามที่แสดงใน /etc/protocols สามารถระบุค่า "โปรโตคอลใดๆ" ได้โดยใช้คำว่าทั้งหมดหรือตัวเลข 0 นอกจากนี้ยังมีบันทึกอีกด้วย ตัวเลือกเพิ่มเติม : --กีฬา(--แหล่งที่มาพอร์ต)ช่วยให้คุณสามารถระบุพอร์ตขาออก (หรือช่วงของพอร์ตดังกล่าว) --dport(--ปลายทางพอร์ต)ช่วยให้คุณสามารถระบุพอร์ตปลายทาง (หรือช่วงดังกล่าว)
  • -สระบุที่อยู่ของผู้ส่ง ที่อยู่อาจเป็นที่อยู่ IP (อาจมีมาสก์) ชื่อโดเมน(ในสองกรณีสุดท้าย ก่อนที่จะเพิ่มกฎลงในห่วงโซ่ ชื่อจะได้รับการแก้ไขเป็นที่อยู่ IP)
  • -ฉันกำหนดอินเทอร์เฟซเครือข่ายขาเข้า ถ้า ชื่อที่ระบุอินเทอร์เฟซลงท้ายด้วยเครื่องหมาย “+” (เช่น eth +) จากนั้นเกณฑ์จะจับคู่อินเทอร์เฟซทั้งหมดที่มีชื่อขึ้นต้นด้วยชื่อที่ระบุ (etho,eth1)
  • -dระบุที่อยู่ของผู้รับ ไวยากรณ์คล้ายกัน -ส .
  • -oกำหนดอินเทอร์เฟซเครือข่ายขาออก ไวยากรณ์คล้ายกัน -ฉัน.

สามารถรวมเกณฑ์เข้าด้วยกันได้

iptables -A อินพุต -i eth0 -s 192 .168.0.0 -j DROP

ปฏิเสธแพ็กเก็ตขาเข้าจากอินเทอร์เฟซ eth0และ ไอพี 192.168.0.0- และไปยังอินเทอร์เฟซ eth1แพ็คเกจจะผ่านไป

เกิดอะไรขึ้นถ้า คุณไม่รู้ล่วงหน้าว่าจะเปิดพอร์ตไหนตัวอย่างเช่น คุณต้องการให้เซิร์ฟเวอร์ FTP ทำงาน โหมดพาสซีฟ- โมดูล ขัดแย้งกันสถานะการเชื่อมต่อจะช่วยได้ และโดยเฉพาะอย่างยิ่ง เกณฑ์ - ctstate โมดูลเชื่อมต่อกันด้วยแท็ก -ม.

iptables -A INPUT -m conntrack --ctstate ก่อตั้งขึ้นที่เกี่ยวข้อง -j ยอมรับ

iptables -A INPUT -m conntrack --ctstate ใหม่ -p tcp --dport 21 -j ยอมรับ # อนุญาตให้เปิดการเชื่อมต่อไปยังพอร์ต TCP 21 พอร์ต

สถานะที่เป็นไปได้:

  • ใหม่- การเชื่อมต่อไม่เปิด กล่าวคือ แพ็กเก็ตเป็นอันแรกในการเชื่อมต่อ
  • ที่จัดตั้งขึ้น- แพ็กเก็ตหมายถึงการเชื่อมต่อที่สร้างไว้แล้ว โดยปกติแล้ว แพ็กเก็ตดังกล่าวจะได้รับการยอมรับโดยไม่มีการกรองเพิ่มเติม เช่นเดียวกับกรณีที่เกี่ยวข้องกับ RELATED
  • ที่เกี่ยวข้อง- แพ็กเก็ตจะเปิดการเชื่อมต่อใหม่ การเชื่อมต่อเชิงตรรกะกับการเชื่อมต่อที่สร้างไว้แล้ว เช่น การเปิดช่องข้อมูลในแบบพาสซีฟ โหมดเอฟทีพี- การเชื่อมต่อได้รับสถานะ ที่เกี่ยวข้องหากเชื่อมต่อกับสารประกอบอื่นที่มีลักษณะเฉพาะ ที่จัดตั้งขึ้น.
  • ไม่ถูกต้อง— เครื่องหมายไม่ถูกต้องบ่งชี้ว่าไม่สามารถระบุแพ็กเก็ตได้ดังนั้นจึงไม่สามารถมีสถานะเฉพาะได้

iptables -A INPUT -m สถานะ - สถานะที่จัดตั้งขึ้นที่เกี่ยวข้อง -j ยอมรับ

เทต และอุดมการณ์รุ่นก่อนของ conntrack มีตัวเลือก --state เดียว คล้ายกับตัวเลือก --ctstate ของโมดูล conntrack (แต่ไม่รองรับสถานะ DNAT และ SNAT ซึ่งแตกต่างจากตัวเลือกนี้)

เรามาดูตารางคนขับแท็กซี่กันดีกว่า ซึ่งสามารถพบได้ในไฟล์ /proc/net/ip_conntrack ประกอบด้วยรายการการเชื่อมต่อที่ใช้งานอยู่ทั้งหมด

Tcp 6 300 ที่สร้างขึ้น src=128.*.*.* dst=194.*.*.* sport=52524 dport=2223 src=194.*.*.* dst=128.*.*.* sport=2223 dport =52524 เครื่องหมาย=0 ใช้=2

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

คุณสมบัติบางประการของโปรโตคอล

การเชื่อมต่อ TCP จะถูกสร้างขึ้นเสมอโดยการส่งแพ็กเก็ตสามชุด ซึ่งจะเริ่มต้นและสร้างการเชื่อมต่อซึ่งข้อมูลจะถูกส่งในภายหลัง เซสชั่นเริ่มต้นด้วยการส่งสัญญาณ ซินแพ็กเก็ตเพื่อตอบสนองต่อสิ่งที่ถูกส่ง ซิน/อัคแพ็กเก็ตและยืนยันแพ็กเก็ตการสร้างการเชื่อมต่อ อ๊ากก .

ทันทีที่ผู้ตามเห็นคนแรก ( ซิน) จากนั้นกำหนดสถานะให้กับมัน ใหม่- ทันทีที่แพ็กเก็ตที่สองผ่านตัวติดตาม ( ซิน/อัค) จากนั้นการเชื่อมต่อจะถูกกำหนดสถานะ ที่จัดตั้งขึ้น.

ด้วยโปรโตคอล UDP ทุกอย่างจะแตกต่างกันเล็กน้อย โปรโตคอลนี้ไม่ได้มีไว้สำหรับการสร้างและปิดการเชื่อมต่อ แต่ข้อเสียเปรียบที่ใหญ่ที่สุดคือการไม่มีข้อมูลเกี่ยวกับลำดับที่แพ็กเก็ตมาถึง แต่จากมุมมองของผู้ติดตาม ทุกอย่างก็เหมือนกับ TCP แพ็กเก็ตแรกที่มาถึงจะถูกกำหนดสถานะ ใหม่.ทันทีที่คุณส่งแพ็กเก็ตตอบกลับ สถานะจะถูกกำหนด ที่จัดตั้งขึ้น.ข้อแตกต่างเพียงอย่างเดียวคือกฎเกณฑ์ของ ASSURED จะถูกกำหนดเมื่อมีการแลกเปลี่ยนแพ็กเก็ตหลายแพ็กเก็ตแล้วเท่านั้น

แอปพลิเคชันกฎการบันทึก

iptables ทำให้สามารถเก็บบันทึกของแต่ละแพ็กเก็ตและเหตุการณ์ได้ เมื่อต้องการทำเช่นนี้ ให้ใช้การดำเนินการ บันทึก.

iptables -A INPUT -p tcp —syn -j LOG — ข้อมูลระดับบันทึก — คำนำหน้าบันทึก “แพ็กเก็ตอินพุต”

--บันทึกระดับใช้เพื่อตั้งค่าระดับการบันทึก สำหรับรายการระดับทั้งหมด โปรดดูที่หน้าคู่มือ syslog.conf โดยปกติคุณสามารถตั้งค่าได้ ระดับต่อไป: แก้ปัญหา, ข้อมูล, สังเกต, คำเตือน, เตือน, ผิดพลาด, ข้อผิดพลาด, คริติคอล, เตือน, โผล่ออกมาและ ตื่นตกใจ- บันทึกจะถูกเขียนลงในไฟล์ บันทึกระบบ

--log-คำนำหน้าคีย์ระบุข้อความ (คำนำหน้า) ที่จะนำหน้าข้อความทั้งหมด ไอพีเทเบิล- ข้อความที่มีคำนำหน้าเฉพาะจึงสามารถค้นหาได้ง่ายโดยใช้ตัวอย่างเช่น เกรป- คำนำหน้าสามารถมีอักขระได้สูงสุด 29 ตัว รวมถึงการเว้นวรรค

1 มิ.ย. เคอร์เนลเดเบียน 17:12:20 น.: แพ็กเก็ต INPUT IN=eth0 OUT= MAC=02:1e:6d:00:e2:1c:00:01:e8:11:73:69:08:00 SRC=125.94 12.95 DST=194.87.239.104 LEN=40 TOS=0x00 PREC=0x00 TTL=52 ID=38690 โปรโต=TCP SPT=12557 DPT=23 WINDOW=1460$ RES=0x00 SYN URGP=0

คำสั่งการจัดการ iptables ยอดนิยม

iptables -L -n --line-numbersดูรายการกฎเกณฑ์

-nจำนวนพอร์ตและ IP ในรูปแบบดิจิทัล

--line-ตัวเลขหมายเลขบรรทัด

iptables -Fรีเซ็ตกฎใหม่ทั้งหมด

iptables -P ยอมรับอินพุตกฎเริ่มต้นสำหรับตาราง INPUT
iptables -P ยอมรับเอาต์พุตกฎเริ่มต้นสำหรับตารางเอาต์พุต
iptables -P ส่งต่อลดลงกฎเริ่มต้นสำหรับตาราง FORWARD

iptables -D อินพุต 1การลบกฎตามหมายเลขในห่วงโซ่

iptables -D อินพุต -s 123.45.67.89 -j DROPลบกฎโดยยึดตามสิ่งที่ทำ

iptables -ฉันอินพุต ...แทรกกฎที่จุดเริ่มต้นของห่วงโซ่

iptables -I อินพุต 3 ...หรือคุณสามารถระบุตำแหน่งเฉพาะได้

เปลี่ยนเส้นทาง

การดำเนินการ REDIRECT ได้รับการออกแบบมาเพื่อเปลี่ยนเส้นทางแพ็กเก็ตจากชุดพอร์ตหนึ่งไปยังอีกพอร์ตหนึ่งภายในระบบเดียวกัน โดยไม่ต้องออกจากเจ้าภาพ.
การเปลี่ยนเส้นทางใช้งานได้เฉพาะในห่วงโซ่ PREROUTING และ OUTPUT ของตาราง แนท- ดังนั้นขอบเขตของแอปพลิเคชันจึงลดลงเหลือเพียงการเปลี่ยนเส้นทางเท่านั้น ส่วนใหญ่มักจะใช้สำหรับพร็อกซีแบบโปร่งใสเมื่อไคลเอ็นต์จากเครือข่ายท้องถิ่นเชื่อมต่อกับพอร์ต 80 และเกตเวย์เปลี่ยนเส้นทางแพ็กเก็ตไปยังพอร์ตพร็อกซีในเครื่อง:

iptables -t nat -A การเตรียมการ -p tcp --dport 80 -j REDIRECT --to-port 3128

กฎใหม่จะไม่ถูกบันทึกโดยอัตโนมัติและจะไม่มีผลหลังจากรีสตาร์ทเซิร์ฟเวอร์ ดังนั้นหลังจากเปลี่ยน iptables เราจำเป็นต้องบันทึกการเปลี่ยนแปลง

iptables - คืนค่า > /etc/iptablesโหลดกฎจากไฟล์

วิธีบันทึกและโหลดกฎขึ้นอยู่กับคุณ เราเพิ่งทำความคุ้นเคยกับพื้นฐานของทฤษฎี iptables เท่านั้น แน่นอนว่ามีตัวเลือกการปรับแต่งอีกมากมาย เราจะพูดถึงรายละเอียดเพิ่มเติมใน อื่นบทความ.

สำคัญ แนวคิดของ iptablesเป็น:

    กฎ - ประกอบด้วยเกณฑ์ การกระทำ และการโต้ตอบ หากแพ็กเก็ตตรงตามเกณฑ์ จะมีการดำเนินการกับแพ็กเก็ตนั้นและจะถูกนับในตัวนับ อาจไม่มีเกณฑ์ - จากนั้นถือว่าเกณฑ์ "แพ็กเก็ตทั้งหมด" โดยปริยาย ไม่จำเป็นต้องระบุการดำเนินการ - ในกรณีที่ไม่มีการดำเนินการ กฎจะใช้เป็นตัวนับเท่านั้น กฎของแต่ละเชนจะถูกเรียกใช้ตามลำดับที่ปรากฏ ดังนั้นลำดับจึงมีความสำคัญ

    • เกณฑ์ - การแสดงออกทางตรรกะซึ่งวิเคราะห์คุณสมบัติของแพ็กเก็ตและ/หรือการเชื่อมต่อและกำหนดว่าแพ็กเก็ตนั้นอยู่ภายใต้กฎปัจจุบันหรือไม่ เกณฑ์เชื่อมโยงกันด้วยตรรกะ "และ"

      การดำเนินการ - คำอธิบายของการดำเนินการที่ต้องทำกับแพ็กเก็ตและ/หรือการเชื่อมต่อ หากอยู่ภายในขอบเขตของกฎนี้ การดำเนินการจะอธิบายรายละเอียดเพิ่มเติมด้านล่าง

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

    ลูกโซ่คือลำดับของกฎตามลำดับ โซ่สามารถแบ่งออกเป็นแบบกำหนดเองและแบบพื้นฐาน

    • ห่วงโซ่ฐานคือห่วงโซ่ที่สร้างขึ้นโดยค่าเริ่มต้นเมื่อมีการเตรียมใช้งานตาราง แต่ละแพ็กเก็ต ขึ้นอยู่กับว่ามันมีไว้สำหรับโฮสต์เอง สร้างโดยมันหรือเป็นการขนส่ง จะต้องผ่านชุดของลูกโซ่พื้นฐานของตารางต่างๆ ที่ได้รับมอบหมาย นอกจากนี้ ห่วงโซ่พื้นฐานยังแตกต่างจากห่วงโซ่ผู้ใช้เมื่อมี "นโยบายเริ่มต้น" การดำเนินการนี้ใช้กับแพ็กเก็ตเหล่านั้นที่ไม่ได้รับการประมวลผลโดยกฎอื่นในสายโซ่นี้และสายโซ่ที่ถูกเรียกจากมัน ชื่อห่วงโซ่ฐานจะเขียนด้วยตัวพิมพ์ใหญ่เสมอ (PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING)

      ห่วงโซ่ผู้ใช้ - ห่วงโซ่ที่สร้างขึ้นโดยผู้ใช้ สามารถใช้ได้ภายในตารางของตัวเองเท่านั้น ไม่แนะนำให้ใช้ชื่อตัวพิมพ์ใหญ่สำหรับเชนดังกล่าว เพื่อหลีกเลี่ยงความสับสนกับเชนฐานและการดำเนินการในตัว

    ตาราง - ชุดของเครือข่ายพื้นฐานและเครือข่ายผู้ใช้ที่รวมกันเป็นหนึ่งเดียวกัน วัตถุประสงค์การทำงาน- ชื่อของตาราง (รวมถึงโมดูลเกณฑ์) จะถูกเขียนไว้ ตัวพิมพ์เล็กเนื่องจากโดยหลักการแล้วพวกเขาไม่สามารถขัดแย้งกับชื่อของกลุ่มผู้ใช้ได้ เมื่อเรียกใช้คำสั่ง iptables ตารางจะถูกระบุในรูปแบบ -t table_name หากไม่ได้ระบุไว้อย่างชัดเจน ตารางตัวกรองจะถูกใช้

การแยกวิเคราะห์:

# กฎตารางตัวกรองการถ่ายโอนข้อมูล$ sudo iptables-save -c -t filter # ตัวกรองตาราง * ตัวกรอง # INPUT, FORWARD, OUTPUT chains, นโยบายและตัวนับ:ยอมรับอินพุต [ 19302 :9473669 ] :ยอมรับล่วงหน้า [ 0 :0 ] :ยอมรับเอาต์พุต [ 5462736 :4247599532 ] # กฎ: "" - ตัวนับกฎ "-A INPUT" - เชน "-i em1 -p tcp -m tcp --dport 22" - เกณฑ์ "-j ยอมรับ" - การกระทำ[17:1020] -A INPUT -i em1 -p tcp -m tcp --dport 22 -j ยอมรับการกระทำ

สถาปัตยกรรม

ในระบบ netfilter แพ็กเก็ตจะถูกส่งผ่านลูกโซ่ ลูกโซ่คือรายการกฎที่เรียงตามลำดับ และแต่ละกฎสามารถมีเกณฑ์และการดำเนินการหรือการเปลี่ยนแปลงได้ เมื่อแพ็กเก็ตผ่านลูกโซ่ ระบบ netfilter จะตรวจสอบทีละรายการว่าแพ็กเก็ตตรงตามเกณฑ์ทั้งหมดของกฎถัดไปหรือไม่ และหากเป็นเช่นนั้น ระบบจะดำเนินการ (หากไม่มีเกณฑ์ในกฎ การดำเนินการจะดำเนินการ) สำหรับแพ็กเก็ตทั้งหมดที่ผ่านกฎ) มีเกณฑ์ที่เป็นไปได้มากมาย ตัวอย่างเช่น แพ็กเก็ตจะตรงกับเกณฑ์ –source 192.168.1.1 หากส่วนหัวของแพ็กเก็ตระบุว่าต้นทางคือ 192.168.1.1 การกระโดดประเภทที่ง่ายที่สุด –jump เป็นการส่งต่อแพ็กเก็ตไปยังจุดเริ่มต้นของเชนอื่น คุณยังสามารถระบุการกระทำโดยใช้ –jump การดำเนินการมาตรฐานที่มีอยู่ในทุกเชน - ยอมรับ (ข้าม), DROP (ลบ), คิว (ส่งเพื่อการวิเคราะห์ โปรแกรมภายนอก) และ RETURN (กลับไปยังเชนก่อนหน้าเพื่อการวิเคราะห์) เช่น คำสั่ง

Iptables -A INPUT --source 192.168.1.1 --jump ยอมรับ iptables -A INPUT --jump other_chain

หมายถึง "เพิ่มที่ส่วนท้ายของห่วงโซ่ INPUT กฎต่อไปนี้: ข้ามแพ็กเก็ตจาก 192.168.1.1 และสิ่งที่เหลืออยู่จะถูกส่งไปวิเคราะห์ไปยัง other_chain"

โซ่

โซ่มาตรฐานที่สร้างในระบบมี 5 ประเภท:

    PREROUTING - สำหรับการประมวลผลแพ็กเก็ตขาเข้าครั้งแรก

    INPUT - สำหรับแพ็กเก็ตขาเข้าที่ส่งถึงโดยตรง กระบวนการท้องถิ่น(ไคลเอนต์หรือเซิร์ฟเวอร์)

    FORWARD - สำหรับแพ็กเก็ตขาเข้าที่ส่งต่อไปยังเอาต์พุต (โปรดทราบว่าแพ็กเก็ตที่ส่งต่อจะต้องผ่านห่วงโซ่ PREROUTING ก่อน จากนั้นจึงส่งต่อและ POSTROUTING)

    OUTPUT - สำหรับแพ็กเก็ตที่สร้างโดยกระบวนการในเครื่อง

    การโพสต์ - สำหรับการประมวลผลแพ็กเก็ตขาออกขั้นสุดท้าย

คุณยังสามารถสร้างและทำลายเชนของคุณเองได้โดยใช้ยูทิลิตี้ iptables

ตาราง

โซ่แบ่งออกเป็น 4 ตาราง:

    Raw - ดูก่อนส่งแพ็กเก็ตไปยังระบบตรวจจับสถานะ ไม่ค่อยได้ใช้ เช่น เพื่อทำเครื่องหมายแพ็กเก็ตที่ไม่ควรประมวลผลโดยระบบตรวจจับสถานะ เมื่อต้องการทำเช่นนี้ กฎจะระบุการดำเนินการ NOTRACK ประกอบด้วยโซ่ PREROUTING และ OUTPUT

    Mangle - มีกฎสำหรับการแก้ไข (โดยปกติจะเป็นส่วนหัว) แพ็กเก็ต IP เหนือสิ่งอื่นใด รองรับการดำเนินการ TTL (Time to live), TOS (ประเภทของบริการ) และการดำเนินการ MARK (สำหรับการเปลี่ยนฟิลด์ TTL และ TOS และสำหรับการเปลี่ยนเครื่องหมายแพ็คเก็ต) ไม่ค่อยจำเป็นและอาจเป็นอันตรายได้ ประกอบด้วยโซ่มาตรฐานทั้งหมด 5 เส้น

    Nat - ดูเฉพาะแพ็กเก็ตที่สร้างการเชื่อมต่อใหม่ (ตามระบบตรวจจับสถานะ) รองรับการกระทำ DNAT, SNAT, MASQUERADE, REDIRECT ประกอบด้วยโซ่ PREROUTING, OUTPUT และ POSTROUTING

    ตัวกรอง - ตารางหลัก ใช้เป็นค่าเริ่มต้นหากไม่ได้ระบุชื่อตาราง ประกอบด้วยเชน INPUT, FORWARD และ OUTPUT

เชนที่มีชื่อเดียวกันแต่อยู่ในตารางต่างกันถือเป็นอ็อบเจ็กต์ที่เป็นอิสระอย่างสมบูรณ์ ตัวอย่างเช่น PREROUTING แบบดิบและแบบ mangle PREROUTING มักจะมีอยู่ ชุดที่แตกต่างกันกฎ; แพ็กเก็ตก่อนอื่นจะผ่านห่วงโซ่ PREROUTING แบบดิบ จากนั้นจึงผ่านห่วงโซ่ PREROUTING แบบ mangle

รัฐ

ในระบบ netfilter แต่ละแพ็กเก็ตที่ผ่านกลไกการตรวจจับสถานะสามารถมีหนึ่งในนั้นได้ สี่เป็นไปได้รัฐ:

    ใหม่ - แพ็คเกจเปิดเซสชันใหม่ ตัวอย่างคลาสสิกคือแพ็กเก็ต TCP ที่มีแฟล็ก SYN

    สร้างขึ้น - แพ็กเก็ตเป็นส่วนหนึ่งของเซสชันที่มีอยู่แล้ว

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

    ไม่ถูกต้อง - แพ็คเกจอื่นๆ ทั้งหมด

แผนผังทางเดินของโต๊ะและโซ่

แผนภาพแบบง่ายของทางเดินของตารางและโซ่:

แผนภาพรายละเอียด:

การกำหนดค่าพื้นฐาน

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

IPv4

sudo iptables-บันทึก

สร้างสคริปต์ด้วยดัมพ์กฎ iptables:

sudo nano / etc/ network/ if-up.d/ iptables-rules

คัดลอกรหัสต่อไปนี้:

#!/sbin/iptables-restore -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -j REJECT - ปฏิเสธด้วย icmp-host-prohibited -A FORWARD -m conntrack - ctstate ที่เกี่ยวข้อง สร้างขึ้นแล้ว -j ยอมรับ -A ส่งต่อ -p icmp -j ยอมรับ -A ส่งต่อ -j ปฏิเสธ --ปฏิเสธด้วย icmp-host-ห้าม #-A เอาต์พุต -p icmp -j ยอมรับ #-A เอาต์พุต -o lo - เจ ยอมรับ #-A OUTPUT -j REJECT --reject-with icmp-host-prohibitedให้สัญญา

เราเสริมด้วยกฎที่จำเป็นโดยคำนึงถึง iptables-save

sudo chmod +x / etc/ เครือข่าย/ if-up.d/ iptables-rules sudo / etc/ เครือข่าย/ if-up.d/ iptables-rules

IPv6

ดูการกำหนดค่าปัจจุบัน:

sudo ip6tables-บันทึก

สร้างสคริปต์ด้วยดัมพ์ของกฎ ip6tables:

sudo nano / etc/ network/ if-up.d/ ip6tables-rules

คัดลอกรหัสต่อไปนี้:

#!/sbin/ip6tables-restore # โต๊ะกรองและโซ่* ตัวกรอง:ยอมรับอินพุต [ 0 :0 ] :ยอมรับล่วงหน้า [ 0 :0 ] :ยอมรับเอาต์พุต [ 0 :0 ] # อนุญาตการเชื่อมต่อและสร้างการเชื่อมต่อแล้ว-A INPUT -m conntrack --ctstate ที่เกี่ยวข้อง ก่อตั้งแล้ว -j ยอมรับ # อนุญาตการรับส่งข้อมูล icmp ของบริการ-A อินพุต -p ipv6-icmp -j ยอมรับ # อนุญาตการรับส่งข้อมูลที่เชื่อถือได้ไปยังอินเทอร์เฟซแบบย้อนกลับ-A อินพุต -i lo -j ยอมรับ #สามารถแทรกได้ที่นี่ กฎเพิ่มเติมสำหรับห่วงโซ่อินพุต # ปิดการใช้งานอย่างอื่นทั้งหมดสำหรับ INPUT-A INPUT -j REJECT --ปฏิเสธโดยห้าม icmp6-adm # ลำดับและความหมายของกฎสำหรับห่วงโซ่ FORWARD และ OUTPUT นั้นคล้ายคลึงกับ INPUT-A ส่งต่อ -m conntrack --ctstate ที่เกี่ยวข้อง จัดตั้งขึ้น -j ยอมรับ -A ส่งต่อ -p ipv6-icmp -j ยอมรับ -A ส่งต่อ -j ปฏิเสธ --ปฏิเสธด้วย icmp6-adm-ห้าม # ไม่สนับสนุนการกรอง OUTPUT chain อย่างยิ่ง #-A OUTPUT -m conntrack --ctstate ที่เกี่ยวข้อง ก่อตั้งแล้ว -j ยอมรับ #-A เอาต์พุต -p ipv6-icmp -j ยอมรับ#-เอาต์พุต -o lo -j ยอมรับ #-A OUTPUT -j ปฏิเสธ --ปฏิเสธด้วย icmp6-adm-ต้องห้ามให้สัญญา

เราเสริมด้วยกฎที่จำเป็นโดยคำนึงถึง ip6tables-save

บันทึกและปิด: Ctrl + O, Enter, Ctrl + X

ทำให้สคริปต์ปฏิบัติการได้และโหลดกฎ iptables:

sudo chmod +x / etc/ เครือข่าย/ if-up.d/ ip6tables-rules sudo / etc/ เครือข่าย/ if-up.d/ ip6tables-rules

กฎเพิ่มเติม

ด้านล่างนี้คือกฎบางส่วนที่ใช้กันโดยทั่วไป ห่วงโซ่ INPUT/OUTPUT ใช้เพื่อกรองการรับส่งข้อมูลในท้องถิ่น สำหรับการจราจรคุณต้องใช้ห่วงโซ่ FORWARD

การเข้าถึงระยะไกล

# remote.ssh -A INPUT -p tcp -m conntrack --ctstate ใหม่ -m tcp --dport 22 -j ยอมรับ # remote.rdp -A INPUT -p tcp -m conntrack --ctstate ใหม่ -m tcp --dport 3389 -j ยอมรับ # remote.vnc -A อินพุต -p tcp -m conntrack --ctstate ใหม่ -m tcp --dport 5900 -j ยอมรับ

บริการเว็บและไฟล์

# web.http, web.https -A INPUT -p tcp -m conntrack --ctstate ใหม่ -m multiport -A INPUT -p tcp -m conntrack --ctstate ใหม่ -m tcp --dport 21 -j ยอมรับ

เมลและข้อความโต้ตอบแบบทันที

# mail.pop3, mail.pop3s -A INPUT -p tcp -m conntrack --ctstate ใหม่ -m multiport --dports 110,995 -j ยอมรับ # mail.imap, mail.imaps -A INPUT -p tcp -m conntrack - ctstate ใหม่ -m multiport --dports 143 ,993 -j ยอมรับ # mail.smtp, mail.smtps -A INPUT -p tcp -m conntrack --ctstate ใหม่ -m multiport --dports 25 ,465 -j ยอมรับ # im xmpp -A INPUT -p tcp -m conntrack --ctstate ใหม่ -m multiport --dports 5222 ,5223 -j ยอมรับ # im.icq.oscar -A INPUT -p tcp -m conntrack --ctstate ใหม่ -m tcp -- dport 5190 -j ยอมรับ

บริการเครือข่าย

# network.openvpn.vpn -A อินพุต -p udp -m conntrack --ctstate ใหม่ -m udp --dport 1194 -j ยอมรับ # network.squid.proxy -A อินพุต -p udp -m conntrack --ctstate ใหม่ -m udp --dport 3128 -j ยอมรับ # network.dns -A อินพุต -p tcp -m conntrack --ctstate ใหม่ -m tcp --dport 53 -j ยอมรับ -A อินพุต -p udp -m conntrack --ctstate ใหม่ -m udp --dport 53 -j ยอมรับ # network.ntp -A อินพุต -p udp -m conntrack --ctstate ใหม่ -A อินพุต -p udp -m conntrack --ctstate ใหม่ -m udp --dport 69 -j ยอมรับ # network.dhserver.dhcp.discover-request-A INPUT -p udp -m conntrack --ctstate ใหม่ -m udp --sport 68 --dport 67 -j ยอมรับ # network.dhclient.dhcp.discover-request #-A เอาต์พุต -p udp -m conntrack --ctstate ใหม่ -m udp --sport 68 --dport 67 -j ยอมรับ # network.dhserver.dhcp.offer-ack #-A เอาต์พุต -p udp -m conntrack --ctstate ใหม่ -m udp --sport 67 --dport 68 -j ยอมรับ

การทดสอบและการดีบัก

ดูการกำหนดค่าปัจจุบันสำหรับ IPv4 และ IPv6:

sudo iptables-บันทึก sudo ip6tables-บันทึก

การบันทึก

การติดตาม

โมดูลเคอร์เนล

ดูโมดูลที่โหลด:

lsmod |

grep -E "^ip|^nf" |

เรียงลำดับ

หากต้องการโหลดโมดูลเพิ่มเติม จะสะดวกในการใช้การเติมข้อความอัตโนมัติ: 2x Tab

sudo modprobe nf sudo modprobe โมดูล-load.dบทนำและประวัติ ไอพีเทเบิลเน็ตฟิลเตอร์ - ไฟร์วอลล์ (หรือที่เรียกว่าไฟร์วอลล์ หรือไฟร์วอลล์ หรือไฟร์วอลล์...) ได้ถูกสร้างขึ้นในเคอร์เนล Linux ตั้งแต่เวอร์ชัน 2.4 Netfilter ถูกควบคุมโดยยูทิลิตี้(สำหรับ IPv6 - ip6tables) ถึง netfilter/iptablesเคยเป็น ไอเชน ซึ่งรวมอยู่ในเคอร์เนล Linux 2.2 ก่อนที่ ipchains ใน Linux จะมีสิ่งที่เรียกว่า, ย้ายจาก BSD ยูทิลิตี้การจัดการ - ipfwadm โครงการ netfilter/iptables ก่อตั้งขึ้นในปี 1998 ผู้เขียนคือ Rusty Russell (เขายังเป็นผู้นำการพัฒนาในอดีตด้วย) ในปี 1999 มีการก่อตั้ง Netfilter Core Team (ตัวย่อว่า coreteam) ไฟร์วอลล์ที่พัฒนาแล้วมีชื่ออย่างเป็นทางการว่า netfilter ในเดือนสิงหาคม พ.ศ. 2546 Harald Welte กลายเป็นหัวหน้าทีมแกนกลาง

โครงการ ไอแพดเชนและ ipfwadmเปลี่ยนการทำงานของโปรโตคอลสแต็ก เคอร์เนลลินุกซ์เพราะก่อนจะปรากฏตัว เน็ตฟิลเตอร์ไม่มีข้อกำหนดในสถาปัตยกรรมเคอร์เนลสำหรับการเพิ่มโมดูลการจัดการแพ็คเกจเพิ่มเติม ไอพีเทเบิลคงไว้ซึ่งแนวคิดหลัก ipfwadm- รายการกฎที่ประกอบด้วยเกณฑ์และการดำเนินการที่จะดำเนินการหากแพ็กเก็ตตรงตามเกณฑ์ ใน ไอแพดเชนมีการแนะนำแนวคิดใหม่ - ความสามารถในการสร้างลูกโซ่ของกฎใหม่และถ่ายโอนแพ็กเก็ตระหว่างลูกโซ่และใน iptables แนวคิดได้ขยายเป็นสี่ตาราง (ใน netfilter สมัยใหม่ - มากกว่าสี่) โดยแบ่งเขตลูกโซ่ของกฎตามงาน: การกรอง NAT และการแก้ไขแพ็กเก็ต- นอกจากนี้ iptables ยังได้ขยายความสามารถในการตรวจจับสถานะของ Linux ทำให้สามารถสร้างไฟร์วอลล์ที่ทำงานในระดับเซสชันได้

สถาปัตยกรรม Netfilter/iptables

ข้อกำหนดเบื้องต้น ()

ตามที่กล่าวไว้ข้างต้น เพื่อให้ Netfilter ทำงานได้ คุณต้องมีเคอร์เนลเวอร์ชัน 2.6 (หรืออย่างน้อย 2.3.15) นอกจากนี้ หากจำเป็น การตั้งค่า CONFIG_NETFILTER, CONFIG_IP_NF_IPTABLES, CONFIG_IP_NF_FILTER (ตารางตัวกรอง), CONFIG_IP_NF_NAT (ตาราง nat), CONFIG_BRIDGE_NETFILTER รวมถึงโมดูลเพิ่มเติมอีกมากมาย: CONFIG_IP_NF_CONNTRACK (การติดตามการเชื่อมต่อ), CONFIG_IP_NF_FTP (โมดูลเสริมสำหรับการติดตาม การเชื่อมต่อ FTP), CONFIG_IP_NF_MATCH_* ( ประเภทเพิ่มเติมรูปแบบการจับคู่แพ็คเก็ต: LIMIT, MAC, MARK, MULTIPORT, TOS, TCPMSS, STATE, UNCLEAN, OWNER), CONFIG_IP_NF_TARGET_* (การดำเนินการเพิ่มเติมในกฎ: REJECT, MASQUERADE, REDIRECT, LOG, TCPMSS), CONFIG_IP_NF_COMPAT_IPCHAINS เพื่อความเข้ากันได้กับ ipchains, CONFIG_BRIDGE_NF_EB TABLES และ CONFIG_BRIDGE_EBT_* สำหรับการทำงานในโหมดบริดจ์ ส่วน CONFIG_IP_NF_* อื่นๆ และ CONFIG_IP6_NF_* อื่นๆ นอกจากนี้ยังมีประโยชน์ในการระบุ CONFIG_PACKET

อย่างที่คุณเห็น โต๊ะแนทและ ยุ่งเหยิงสามารถแก้ไขผู้รับหรือผู้ส่งได้ แพ็คเกจเครือข่าย- นี่คือสาเหตุว่าทำไมแพ็กเก็ตเครือข่ายจึงถูกตรวจสอบหลายครั้งกับตารางเส้นทาง

กลไกการตรวจจับสถานะ (conntrack)

ข้างต้นในข้อความมีการกล่าวถึงแนวคิดเรื่อง "คำจำกัดความของรัฐ" หลายครั้ง สมควรแยกหัวข้อสำหรับการอภิปราย แต่อย่างไรก็ตาม ฉันจะกล่าวถึงปัญหานี้โดยย่อในโพสต์ปัจจุบัน โดยทั่วไปกลไกในการกำหนดสถานะ (หรือที่เรียกว่าเครื่องของรัฐหรือที่รู้จักกันในชื่อ คอนการดำเนินการ ติดตามไอเอ็นเอ ขัดแย้งกัน) เป็นส่วนหนึ่งของตัวกรองแพ็กเก็ต และช่วยให้คุณกำหนดการเชื่อมต่อ/เซสชันของแพ็กเก็ตได้ คอนแทรควิเคราะห์สถานะของแพ็คเกจทั้งหมด ยกเว้นที่ทำเครื่องหมายเป็น ไม่ติดตามใน ตารางดิบ - ตามสถานะนี้ แพ็คเกจที่เป็นของจะถูกกำหนด ใหม่การเชื่อมต่อ (สถานะ ใหม่), เรียบร้อยแล้ว ที่จัดตั้งขึ้นการเชื่อมต่อ (สถานะ ที่จัดตั้งขึ้น), เพิ่มเติมไปยังอันที่มีอยู่แล้ว ( ที่เกี่ยวข้อง) หรือ " ไปที่อื่น" (ตรวจไม่พบ) การเชื่อมต่อ (state ไม่ถูกต้อง- สถานะของแพ็กเก็ตถูกกำหนดตามการวิเคราะห์ส่วนหัวของแพ็กเก็ต TCP ที่ส่ง โมดูลคอนแทร็กอนุญาตให้คุณใช้ไฟร์วอลล์ระดับเซสชัน (ที่ห้า) หากต้องการควบคุมกลไกนี้ ให้ใช้ยูทิลิตีนี้ ขัดแย้งกัน,เช่นเดียวกับพารามิเตอร์ยูทิลิตี้ iptables: -m คอนแทรคหรือ -รัฐ(ล้าสมัย). รัฐ การเชื่อมต่อปัจจุบัน conntrack ถูกเก็บไว้ในเคอร์เนล สามารถดูได้ในไฟล์ /proc/net/nf_conntrack (หรือ /proc/net/ip_conntrack)

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

การจัดการกฎการกรองเครือข่าย Netfilter (โดยใช้คำสั่ง iptables)

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

โดยทั่วไปรูปแบบคำสั่งจะเป็นดังนี้:

อิปเทเบิล [-t ]

พารามิเตอร์ทั้งหมดในวงเล็บเหลี่ยม - ไม่จำเป็น- ค่าเริ่มต้นคือ ตารางตัวกรองหากคุณต้องการระบุตารางอื่น คุณควรใช้คีย์ -tแสดงให้เห็น ชื่อ- หลังจากระบุชื่อตารางที่กำหนดการดำเนินการ ( ตัวอย่างเช่น: แทรกกฎ หรือเพิ่มกฎที่ส่วนท้ายของห่วงโซ่ หรือลบกฎ) ตัวอย่างเช่นตั้งค่าพารามิเตอร์การเลือก

ระบุว่าควรดำเนินการใดหากเกณฑ์การเลือกในกฎตรงกัน (

: ส่งแพ็กเก็ตไปยังกฎลูกโซ่อื่น "ปล่อย" แพ็กเก็ตออกข้อความแสดงข้อผิดพลาดไปยังต้นทาง...) คำอธิบาย ด้านล่างนี้คือคำสั่งและพารามิเตอร์ของยูทิลิตี้ iptables:
ทีม
พารามิเตอร์ เพิ่มกฎที่ระบุไปที่จุดสิ้นสุดของรายการในกลุ่มที่ระบุและตารางที่ระบุ iptables -A เกณฑ์ไปข้างหน้า -j การกระทำ
--ลบ (-D) ลบกฎที่ระบุโดยหมายเลขหรือกฎ ตัวอย่างแรกจะลบกฎทั้งหมดที่มีหมายเลข 10,12 ในกลุ่มทั้งหมด ในตารางตัวกรอง ตัวอย่างที่สองจะลบกฎที่ระบุออกจากตาราง mangle ในห่วงโซ่ PREROUTING ไอพีเทเบิล -D 10.12
iptables -t mangle -D เกณฑ์การเตรียมการ -j การกระทำ
--เปลี่ยนชื่อโซ่ (-E) เปลี่ยนชื่อโซ่ iptables -E OLD_CHAIN ​​​​NEW_CHAIN
--ฟลัช (-F) ล้างกฎทั้งหมดของตารางปัจจุบัน สำหรับแพ็กเก็ตทั้งหมดที่เกี่ยวข้องกับการเชื่อมต่อที่สร้างไว้แล้ว ให้ใช้การดำเนินการเทอร์มินัล ACCEPT - ข้าม iptables -F
--ใส่ (-I) แทรกกฎที่ระบุในตำแหน่งที่ระบุด้วยหมายเลข iptables -I ส่งต่อ 5 เกณฑ์ -j การกระทำ
--list (ตัวย่อ -L) ดูกฎที่มีอยู่ (โดยไม่ต้องระบุตารางอย่างชัดเจน - ตารางตัวกรองของเชนทั้งหมดจะปรากฏขึ้น) iptables -L
--นโยบาย (-P) กำหนดนโยบายเริ่มต้นสำหรับห่วงโซ่ที่กำหนด iptables -t mangle -P วางล่วงหน้า
--แทนที่ (-R) แทนที่กฎที่ระบุด้วยตัวเลขด้วยกฎที่ระบุในเกณฑ์ iptables -R การโพสต์ 7 | เกณฑ์ -j การกระทำ
--ลบห่วงโซ่ (-X) ลบ chains ที่สร้างขึ้นเองทั้งหมด (เก็บเฉพาะ INPUT, OUTPUT, FORWARD, PREROUTING และ POSTROUTING มาตรฐาน) iptables -X
--ศูนย์ (-Z) รีเซ็ตตัวนับของข้อมูลที่ส่งในลูกโซ่ iptables -Z อินพุต
ตัวเลือก
--ตัวเลข (-n) ไม่สามารถแก้ไขที่อยู่และโปรโตคอลระหว่างเอาต์พุต
--line-ตัวเลข ระบุหมายเลขกฎในเอาต์พุต (สามารถใช้ร่วมกับ -L) iptables -L --line-numbers
--ช่วย (-h) เราจะอยู่ที่ไหนถ้าไม่มีเธอ?
-โต๊ะ ระบุชื่อของตารางที่ต้องดำเนินการ ตัวอย่างนี้จะรีเซ็ตตาราง nat ในทุกเชน iptables -t nat -F
--รายละเอียด (-v) บทสรุปโดยละเอียด iptables -L -v

เกณฑ์ (พารามิเตอร์) สำหรับการเลือกแพ็กเก็ตเครือข่ายของคำสั่ง iptables

เกณฑ์ในการเลือกแพ็กเก็ตเครือข่ายแบ่งออกเป็นหลายกลุ่มอย่างลับๆ: เกณฑ์ทั่วไป, เกณฑ์โดยนัย, เกณฑ์ที่ชัดเจน สามารถใช้ในกฎใดก็ได้ โดยไม่จำเป็นต้องขึ้นอยู่กับประเภทโปรโตคอล และไม่จำเป็นต้องโหลดโมดูลส่วนขยาย(ผมจะเรียกมันว่า. ไม่ใช่แบบทั่วไป) เกณฑ์เหล่านั้นที่โหลดโดยปริยายและพร้อมใช้งาน เช่น เมื่อระบุเกณฑ์ทั่วไป --โปรโตคอล TCP|udp|icmp- ก่อนใช้งานคุณต้องเชื่อมต่อ การขยายตัวเพิ่มเติม(สิ่งเหล่านี้แปลกประหลาด ปลั๊กอินสำหรับเน็ตฟิลเตอร์) ส่วนขยายเพิ่มเติมโหลดโดยใช้พารามิเตอร์ -มหรือ --จับคู่จากนั้นเราจะต้องระบุสิ่งนี้อย่างชัดเจนในบรรทัดกฎ: -รัฐทางด้านซ้ายของเกณฑ์ที่ใช้ ความแตกต่างระหว่าง ชัดเจนและ โดยปริยายที่ไม่ใช่แบบทั่วไปเกณฑ์คือต้องโหลดรายการที่ชัดเจนอย่างชัดเจน และรายการโดยนัยจะถูกโหลดโดยอัตโนมัติ

สามารถใช้ได้ในทุกเกณฑ์ เข้าสู่ระบบ!ก่อนค่าเกณฑ์ นี่จะหมายถึงแพ็กเก็ตทั้งหมดนั้น ไม่สอดคล้องกับพารามิเตอร์นี้. ตัวอย่างเช่น: เกณฑ์ --โปรโตคอล ! ทีพีพีจะหมายถึงแพ็กเก็ตทั้งหมดนั้น ไม่โปรโตคอล TCP อยู่ภายใต้กฎ อย่างไรก็ตาม iptables เวอร์ชันล่าสุด (โดยเฉพาะ 1.4.3.2 และสูงกว่า) ไม่รองรับไวยากรณ์นี้อีกต่อไป และจำเป็นต้องใช้ --โปรโตคอล ! ทีพีพี, ก - --โปรโตคอล TCPโดยให้ข้อผิดพลาดดังต่อไปนี้:

การใช้การปฏิเสธแบบ intrapositioned (`--option ! this`) เลิกใช้แล้วเพื่อแทนที่แบบ extrapositioned (`! --option this`)

ด้านล่างได้รับในรูปแบบตาราง พารามิเตอร์การเลือกแพ็คเก็ตที่ใช้กันทั่วไป:

: ส่งแพ็กเก็ตไปยังกฎลูกโซ่อื่น "ปล่อย" แพ็กเก็ตออกข้อความแสดงข้อผิดพลาดไปยังต้นทาง...) คำอธิบาย ด้านล่างนี้คือคำสั่งและพารามิเตอร์ของยูทิลิตี้ iptables:
การตั้งค่าทั่วไป
--โปรโตคอล
(ตัวย่อ -p)
กำหนดโปรโตคอล ตัวเลือก tcp, udp, icmp, ทั้งหมดหรือโปรโตคอลอื่นใดที่กำหนดไว้ใน /etc/protocols iptables -A อินพุต -p tcp
--แหล่งที่มา
(-s, --src)
ที่อยู่ IP ของแหล่งแพ็กเก็ต สามารถกำหนดได้หลายวิธี:
  • โฮสต์เดียว: host.domain.tld หรือที่อยู่ IP: 10.10.10.3
  • กลุ่มที่อยู่ (ซับเน็ต): 10.10.10.3/24 หรือ 10.10.10.3/255.255.255.0

ขอแนะนำอย่างยิ่งว่าอย่าใช้ชื่อโดเมนที่จำเป็นต้องมีการสืบค้น DNS เพื่อแก้ไขปัญหา เนื่องจาก netfilter DNS อาจทำงานไม่ถูกต้องในระหว่างขั้นตอนการกำหนดค่า นอกจากนี้ โปรดทราบว่าชื่อจะได้รับการแก้ไขเพียงครั้งเดียว - เมื่อเพิ่มกฎลงในห่วงโซ่ ต่อจากนั้นที่อยู่ IP ที่สอดคล้องกับชื่อนี้อาจเปลี่ยนแปลงได้ แต่จะไม่ส่งผลกระทบต่อกฎที่บันทึกไว้แล้ว แต่อย่างใด (จะยังคงอยู่ ที่อยู่เก่า- หากคุณระบุชื่อโดเมนที่แก้ไขที่อยู่ IP หลายรายการ จะมีการเพิ่มกฎแยกต่างหากสำหรับแต่ละที่อยู่

iptables -A อินพุต -s 10.10.10.3
--ปลายทาง
(-ง)
ที่อยู่ IP ของปลายทางของแพ็คเก็ต สามารถกำหนดได้หลายวิธี (ดู --source) iptables -A INPUT --ปลายทาง 192.168.1.0/24
--ในอินเทอร์เฟซ
(-ฉัน)
ระบุอินเทอร์เฟซที่แพ็กเก็ตมาถึง มีประโยชน์สำหรับ NAT และเครื่องที่มีอินเทอร์เฟซเครือข่ายหลายตัว ใช้ในโซ่ INPUT, FORWARD และ PREROUTING คุณสามารถใช้เครื่องหมาย "+" ได้ ซึ่งหมายถึงการใช้อินเทอร์เฟซทั้งหมดที่ขึ้นต้นด้วยชื่อ + (เช่น eth+ - อินเทอร์เฟซ eth ทั้งหมด) iptables -t nat -A PREROUTING -- ในอินเทอร์เฟซ eth0
--ออกอินเตอร์เฟซ
(-โอ)
กำหนดอินเทอร์เฟซที่แพ็กเก็ตจะออก มีประโยชน์สำหรับ NAT และเครื่องที่มีอินเทอร์เฟซเครือข่ายหลายตัว ใช้ในโซ่เอาท์พุต ไปข้างหน้า และโพสท์ติ้ง สามารถใช้เครื่องหมาย "+" ได้ iptables -t nat -A POSTROUTING -- ในอินเทอร์เฟซ eth1
พารามิเตอร์โดยนัย (ไม่แบ่งใช้)
-p โปรโต -h การแสดงความช่วยเหลือเกี่ยวกับพารามิเตอร์โดยนัยของโปรโตคอลโปรโต iptables -p icmp -h
--แหล่งที่มาพอร์ต
(--กีฬา)
แหล่งที่มาของพอร์ต เป็นไปได้สำหรับเท่านั้น โปรโตคอล--โปรโตคอล TCP หรือ --protocol udp iptables -A INPUT --โปรโตคอล TCP --source-port 25
--ปลายทางพอร์ต
(--พอร์ต)
พอร์ตปลายทาง ใช้ได้กับโปรโตคอล --protocol tcp หรือ --protemocol udp เท่านั้น iptables -A INPUT --protocol udp --destination-port 67
พารามิเตอร์ที่ชัดเจน
-m รัฐ --state (เลิกใช้แล้ว)
อาคา
-m conntrack --ctstate

สถานะการเชื่อมต่อ ตัวเลือกที่มี:

  • ใหม่(แพ็คเกจทั้งหมดที่สร้างการเชื่อมต่อใหม่)
  • ที่จัดตั้งขึ้น(แพ็กเก็ตทั้งหมดที่เป็นของการเชื่อมต่อที่สร้างขึ้น)
  • ที่เกี่ยวข้อง(แพ็กเก็ตที่ไม่ได้อยู่ในการเชื่อมต่อที่สร้างขึ้น แต่เชื่อมโยงอยู่ด้วย ตัวอย่างเช่น - FTP ใน โหมดแอคทีฟการใช้งาน การเชื่อมต่อที่แตกต่างกันสำหรับการถ่ายโอนข้อมูล การเชื่อมต่อเหล่านี้เกี่ยวข้องกัน)
  • ไม่ถูกต้อง(แพ็กเก็ตที่ไม่สามารถระบุได้ด้วยเหตุผลใดก็ตาม ตัวอย่างเช่น ข้อผิดพลาด ICMP ที่ไม่ได้อยู่ในการเชื่อมต่อที่มีอยู่)
  • ฯลฯ (รายละเอียดเพิ่มเติมในเอกสารประกอบ)
iptables -A INPUT -m state - สถานะใหม่, ก่อตั้งขึ้นแล้วiptables -A INPUT -m conntrack - ctstate ใหม่, ก่อตั้งขึ้นแล้ว
-m mac --mac-source ชุด ที่อยู่ MACโหนดเครือข่ายที่ส่งแพ็กเก็ต ต้องระบุที่อยู่ MAC ในรูปแบบ XX:XX:XX:XX:XX:XX -m mac --mac-แหล่งที่มา 00:00:00:00:00:0

การดำเนินการกับแพ็คเกจ

ชื่อนี้จะใช้ถ้อยคำใหม่ให้ถูกต้องมากขึ้นเป็น " การดำเนินการกับแพ็คเกจที่ตรงกับเกณฑ์การเลือก“ ดังนั้นการจะบรรลุผลใดๆ การกระทำบนแพ็คเกจคุณต้องระบุรหัส -j (--กระโดด)และระบุการดำเนินการเฉพาะเจาะจง

การดำเนินการกับแพ็คเกจสามารถรับค่าต่อไปนี้:

  • ยอมรับ- แพ็กเก็ตออกจากเชนนี้และถูกถ่ายโอนไปยังแพ็กเก็ตถัดไป (ตามตัวอักษร - ยอมรับ)
  • หยด- ทิ้งแพ็กเก็ตที่ตรงตามเงื่อนไข ในขณะที่แพ็กเก็ตไม่ถูกส่งไปยังตาราง/เชนอื่น
  • ปฏิเสธ- ทิ้งแพ็กเก็ตโดยการส่งข้อความ ICMP ไปยังผู้ส่ง ในขณะที่แพ็กเก็ตจะไม่ถูกส่งไปยังตาราง/เครือข่ายอื่น
  • กลับ- คืนแพ็กเก็ตกลับไปยังเชนก่อนหน้าและดำเนินการต่อโดยเริ่มจากกฎถัดไป
  • สนท แหล่งที่มาในแพ็คเกจ ใช้ได้เฉพาะในโซ่เท่านั้น การโพสต์และเอาท์พุตในตารางแนท
  • ดีเอ็นเอที- ใช้การแปลที่อยู่ การนัดหมายในแพ็คเกจ สามารถใช้แบบโซ่ได้ กำลังเตรียมการในตารางแนท (ในกรณีพิเศษ - ในห่วงโซ่เอาต์พุต)
  • บันทึก- บันทึกแพ็กเก็ต (ส่งไปยัง daemon) และประมวลผลด้วยกฎอื่น ๆ
  • สวมหน้ากาก- ใช้แทน สนทหากมีการเชื่อมต่อกับ IP แบบไดนามิก (อนุญาตให้ระบุเฉพาะในห่วงโซ่เท่านั้น การโพสต์ตารางแนท)
  • เครื่องหมาย- ใช้เพื่อกำหนดป้ายกำกับบนแพ็กเก็ตและส่งต่อไปยังกฎเพิ่มเติมเพื่อการประมวลผล
  • ฯลฯ

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

ตารางด้านล่างแสดงตัวอย่างและคำอธิบายของพารามิเตอร์เพิ่มเติม:

: ส่งแพ็กเก็ตไปยังกฎลูกโซ่อื่น "ปล่อย" แพ็กเก็ตออกข้อความแสดงข้อผิดพลาดไปยังต้นทาง...) คำอธิบาย ด้านล่างนี้คือคำสั่งและพารามิเตอร์ของยูทิลิตี้ iptables:
DNAT (การแปลที่อยู่เครือข่ายปลายทาง)
--ไปยังปลายทาง ระบุว่าควรแทนที่ที่อยู่ IP ใดเป็นที่อยู่ปลายทาง ในตัวอย่างในทุกแพ็คเกจ โปรโตคอลทีซีพีที่มาที่อยู่ 1.2.3.4, ที่อยู่ที่ได้รับจะถูกแทนที่ด้วย 4.3.2.1 iptables -t nat -A การเตรียมการ -p tcp -d 1.2.3.4 -j DNAT - ไปยังปลายทาง 4.3.2.1
บันทึก
--บันทึกระดับ ใช้เพื่อตั้งค่าระดับการบันทึก () ในตัวอย่าง ระดับการบันทึกสูงสุดถูกตั้งค่าสำหรับแพ็กเก็ต TCP ทั้งหมดในตารางตัวกรองของห่วงโซ่ FORWARD iptables -A FORWARD -p tcp -j LOG -- การดีบักระดับบันทึก
--log-คำนำหน้า ระบุข้อความ (คำนำหน้า) ที่จะนำหน้าข้อความทั้งหมด ไอพีเทเบิล- (สะดวกมากไว้ใช้ทีหลัง) คำนำหน้าสามารถมีอักขระได้สูงสุด 29 ตัว รวมการเว้นวรรค ในตัวอย่าง ทุกอย่างจะถูกส่งไปยัง syslog แพ็กเก็ต TCPในตารางตัวกรองของห่วงโซ่ INPUT พร้อมด้วยคำนำหน้าตัวกรอง INRUT iptables -A INPUT -p tcp -j LOG --log-คำนำหน้า "ตัวกรอง INRUT"
--log-ip-ตัวเลือก ให้คุณเข้าได้ ข้อมูลต่างๆจากส่วนหัวของแพ็กเก็ต IP iptables -A ส่งต่อ -p tcp -j LOG --log-ip-options
ฯลฯ...

นี่เป็นการสรุปทฤษฎีเกี่ยวกับตัวกรองเครือข่าย netfilter/iptables ในบทความถัดไป ฉันจะยกตัวอย่างเชิงปฏิบัติเพื่อการเรียนรู้ทฤษฎีนี้

ประวัติย่อ

ในบทความนี้ เราได้ตรวจสอบแนวคิดพื้นฐานโดยย่อ เครื่องป้องกันไฟกระชากในลินุกซ์ ดังนั้น ระบบย่อย netfilter/iptables จึงเป็นส่วนหนึ่งของเคอร์เนล Linux และใช้ในการจัดระเบียบ แผนงานต่างๆการกรองและการจัดการแพ็กเก็ตเครือข่าย ในกรณีนี้ แต่ละแพ็กเก็ตจะส่งผ่านจากอินเทอร์เฟซเครือข่ายที่มาถึงและส่งต่อไปตามเส้นทางลูกโซ่บางเส้นทาง ขึ้นอยู่กับว่ามีไว้สำหรับระบบโลคัลหรือระบบ "ที่ไม่ใช่โลคัล" แต่ละห่วงโซ่ประกอบด้วยชุดของตารางที่มีชุดกฎตามลำดับ แต่ละกฎประกอบด้วยเกณฑ์/เกณฑ์เฉพาะสำหรับการเลือกแพ็กเก็ตเครือข่ายและการดำเนินการบางอย่างกับแพ็กเก็ตที่ตรงตามเกณฑ์เหล่านี้ ตามกฎที่กำหนด การดำเนินการใดๆ ก็สามารถดำเนินการได้บนแพ็กเก็ต (เช่น ถ่ายโอนไปยังเชนถัดไป/อื่นๆ การรีเซ็ตแพ็กเก็ต การแก้ไขเนื้อหาหรือส่วนหัว ฯลฯ) แต่ละเครือข่ายและแต่ละตารางมีวัตถุประสงค์ ฟังก์ชั่น และสถานที่ในเส้นทางแพ็คเกจของตัวเอง ตัวอย่างเช่น ในการกรองแพ็กเก็ต ตารางตัวกรองจะถูกใช้ซึ่งมีอยู่ในสายโซ่มาตรฐานสามสายและสามารถอยู่ในสายโซ่ที่ผู้ใช้ระบุได้ เส้นทางของแพ็กเก็ตสิ้นสุดที่อินเทอร์เฟซเครือข่ายขาออกหรือโดยการจัดส่งไปยังกระบวนการ/แอปพลิเคชันภายในเครื่อง

วรรณกรรม

ค่อนข้างน้อย ข้อมูลที่น่าสนใจในภาษารัสเซียมีอยู่ที่นี่:

  • http://www.opennet.ru/docs/RUS/iptables/
  • http://ru.wikibooks.org/wiki/Iptables

มีเนื้อหาเชิงลึกเพิ่มเติมเป็นภาษากระฎุมพีอยู่ที่นี่:

  • http://www.frozentux.net/documents/isysctl-tutorial/
  • http://www.netfilter.org/documentation/index.html

ขอแสดงความนับถือ McSim!