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-rulesIPv6
ดูการกำหนดค่าปัจจุบัน:
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 ของแหล่งแพ็กเก็ต สามารถกำหนดได้หลายวิธี:
ขอแนะนำอย่างยิ่งว่าอย่าใช้ชื่อโดเมนที่จำเป็นต้องมีการสืบค้น 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 |
สถานะการเชื่อมต่อ ตัวเลือกที่มี:
|
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!