แนวคิดหลักของ iptables คือ พื้นฐานของ iptables โดยใช้ Debian เป็นตัวอย่างผ่านสายตาของเด็กทารก

สวัสดีทุกคน! ฉันเผยแพร่บทความเชิงปฏิบัตินี้เกี่ยวกับ ตัวกรองเครือข่าย Linux- ในบทความฉันจะพิจารณา ตัวอย่างทั่วไปของการใช้กฎ iptablesใน Linux และยังพิจารณาวิธีการต่างๆ บันทึกการกำหนดค่า iptables ที่สร้างขึ้น.

การตั้งค่า netfilter/iptables สำหรับเวิร์กสเตชัน

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

เพื่อกำหนดค่า ไฟร์วอลล์ฉันพยายามปฏิบัติตามนโยบายต่อไปนี้: แบนทุกอย่าง และสิ่งที่ต้องได้รับอนุญาต นั่นคือสิ่งที่เราจะทำในกรณีนี้ หากคุณมีระบบที่ติดตั้งใหม่และคุณไม่ได้พยายามกำหนดค่าตัวกรองเครือข่าย กฎจะมีลักษณะดังนี้:

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

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

Netfilter:~# iptables -P INPUT DROP netfilter:~# iptables -P OUTPUT DROP netfilter:~# iptables -P ส่งต่อ DROP

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

Netfilter:~# ping -c2 127.0.0.1 PING 127.0.0.1 (127.0.0.1) ข้อมูล 56(84) ไบต์ ping: sendmsg: ไม่อนุญาตให้ดำเนินการ ping: sendmsg: ไม่อนุญาตให้ดำเนินการ --- สถิติการ ping ของ localhost --- ส่ง 2 แพ็กเก็ต, ได้รับ 0, สูญเสียแพ็กเก็ต 100%, เวลา 1004ms

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

Netfilter:~# iptables -A INPUT -i lo -j ยอมรับ netfilter:~# iptables -A OUTPUT -o lo -j ยอมรับ

หลังจากนี้ ping ไปที่ localhost จะทำงาน:

Netfilter:~# ping -c1 127.0.0.1 PING 127.0.0.1 (127.0.0.1) ข้อมูล 56(84) ไบต์ 64 ไบต์จาก 127.0.0.1 (127.0.0.1): icmp_seq=1 ttl=64 time=0.116 ms --- สถิติการ ping 127.0.0.1 --- ส่ง 1 แพ็กเก็ต ได้รับ 1 ครั้ง แพ็กเก็ตสูญหาย 0% เวลา 116ms rtt min/ เฉลี่ย/สูงสุด/mdev = 0.116/0.116/0.116/0.116 มิลลิวินาที

หากคุณไม่คลั่งไคล้การตั้งค่าไฟร์วอลล์มากนัก คุณสามารถอนุญาตให้โปรโตคอล ICMP ทำงาน:

Netfilter:~# iptables -A อินพุต -p icmp -j ยอมรับ netfilter:~# iptables -A เอาต์พุต -p icmp -j ยอมรับ

จะปลอดภัยกว่าถ้าระบุคำสั่ง iptables ที่คล้ายกันต่อไปนี้:

Netfilter:~# iptables -A อินพุต -p icmp --icmp-type 0 -j ยอมรับ netfilter:~# iptables -A อินพุต -p icmp --icmp-type 8 -j ยอมรับ netfilter:~# iptables -A OUTPUT -p icmp -j ยอมรับ

คำสั่งนี้จะอนุญาตให้ประเภทแพ็คเก็ต ICMP เป็นคำขอ echo และ echo Reply ซึ่งจะปรับปรุงความปลอดภัย

เมื่อรู้ว่าคอมพิวเตอร์ของเราไม่ได้ติดไวรัส (ใช่ไหม) และจะสร้างการเชื่อมต่อขาออกที่ปลอดภัยเท่านั้น และการรู้ว่าการเชื่อมต่อที่ปลอดภัยคือการเชื่อมต่อจากสิ่งที่เรียกว่า ช่วงชั่วคราวของพอร์ต ซึ่งระบุโดยเคอร์เนลในไฟล์ /proc/sys/net/ipv4/ip_local_port_range,สามารถ อนุญาตการเชื่อมต่อขาออกจากพอร์ตที่ปลอดภัยเหล่านี้:

Netfilter:~# cat /proc/sys/net/ipv4/ip_local_port_range 32768 61000 netfilter:~# iptables -A OUTPUT -p TCP --sport 32768:61000 -j ยอมรับ netfilter:~# iptables -A OUTPUT -p UDP -- กีฬา 32768:61000 -j ยอมรับ

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

Netfilter:~# iptables -A OUTPUT -j ACCEPT netfilter:~# # หรือเพียงแค่ตั้งค่านโยบาย ACCEPT เริ่มต้นสำหรับ OUTPUT chain netfilter:~# iptables -P OUTPUT ACCEPT

นอกจากนี้ เมื่อทราบว่าการเชื่อมต่อเครือข่าย netfilter มี 4 สถานะ ( ใหม่,ที่จัดตั้งขึ้นที่เกี่ยวข้องและไม่ถูกต้อง) และการเชื่อมต่อขาออกใหม่จากคอมพิวเตอร์ในระบบ (ที่มีสถานะ NEW) จะได้รับอนุญาตในคำสั่ง iptables สองคำสั่งสุดท้าย ซึ่งสร้างการเชื่อมต่อไว้แล้วและคำสั่งเพิ่มเติมมีสถานะ ก่อตั้งและที่เกี่ยวข้องดังนั้น และเมื่อทราบว่าระบบภายในเครื่องเข้าถึงได้ผ่าน เราสามารถอนุญาตเฉพาะแพ็กเก็ต TCP และ UDP ที่แอปพลิเคชันในเครื่องร้องขอให้เข้าถึงคอมพิวเตอร์ของเราเท่านั้น:

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

นั่นคือทั้งหมดที่ จริง ๆ แล้ว! หากบริการเครือข่ายบางประเภทยังคงทำงานบนเดสก์ท็อป คุณจะต้องเพิ่มกฎที่เหมาะสมสำหรับการเชื่อมต่อขาเข้าและขาออก ตัวอย่างเช่น, สำหรับการรันเซิร์ฟเวอร์ sshซึ่งรับและส่งคำขอบนพอร์ต TCP 22 คุณต้องเพิ่มสิ่งต่อไปนี้ กฎ iptables:

Netfilter:~# iptables -A INPUT -i eth0 -p TCP --dport 22 -j ยอมรับ netfilter:~# iptables -A OUTPUT -o eth0 -p TCP --sport 22 -j ACCEPT

เหล่านั้น. สำหรับบริการใด ๆ คุณต้องเพิ่มกฎหนึ่งข้อในเครือข่าย INPUT และ OUTPUT เพื่อให้สามารถรับและส่งแพ็กเก็ตตามลำดับโดยใช้พอร์ตนี้สำหรับอินเทอร์เฟซเครือข่ายเฉพาะ (หากคุณไม่ได้ระบุอินเทอร์เฟซก็จะได้รับอนุญาตให้ รับ/ส่งแพ็กเก็ตบนอินเทอร์เฟซใดๆ)

การกำหนดค่า netfilter/iptables เพื่ออนุญาตให้ไคลเอนต์หลายตัวเชื่อมต่อกับการเชื่อมต่อเดียว

ตอนนี้เรามาดูของเรากันดีกว่า Linux เป็นเกตเวย์สำหรับเครือข่ายท้องถิ่นไปยังอินเทอร์เน็ตภายนอก- สมมุติว่า อินเทอร์เฟซ eth0 เชื่อมต่อกับอินเทอร์เน็ตและมี IP 198.166.0.200 และ อินเทอร์เฟซ eth1 เชื่อมต่อกับเครือข่ายท้องถิ่นและมี IP 10.0.0.1 ตามค่าเริ่มต้นในเคอร์เนล Linux การส่งต่อแพ็กเก็ตผ่านห่วงโซ่ FORWARD(แพ็คเกจที่ไม่ได้มีไว้สำหรับระบบโลคัล) ถูกปิดใช้งาน หากต้องการเปิดใช้งานคุณลักษณะนี้ คุณต้องตั้งค่าเป็น 1 ในไฟล์ :

Netfilter:~# echo 1 > /proc/sys/net/ipv4/ip_forward

ถึง การส่งต่อแพ็กเก็ตบันทึกหลังจากรีบูต จะต้องอยู่ในไฟล์ /etc/sysctl.confไม่ใส่เครื่องหมายข้อคิดเห็น (หรือเพียงเพิ่ม) บรรทัด net.ipv4.ip_forward=1.

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

Netfilter:~# iptables -A FORWARD -m conntrack --ctstate ก่อตั้งขึ้นที่เกี่ยวข้อง -j ยอมรับ netfilter:~# iptables -A FORWARD -m conntrack --ctstate ใหม่ -i eth1 -s 10.0.0.1/24 -j ยอมรับ netfilter: ~# iptables -P ส่งต่อ netfilter หล่น: ~# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

ดังนั้น ตามลำดับจากบนลงล่าง เราจะแก้ไขการเชื่อมต่อที่สร้างไว้แล้ว ห่วงโซ่ไปข้างหน้า, ตารางตัวกรองจากนั้นเราจะอนุญาตให้มีการสร้างการเชื่อมต่อใหม่ ห่วงโซ่ไปข้างหน้า, ตารางตัวกรองซึ่งมาจากอินเทอร์เฟซ eth1 และจากเครือข่าย 10.0.0.1/24 แพ็กเก็ตอื่นๆ ทั้งหมดที่ผ่าน โซ่ไปข้างหน้า- ทิ้ง ต่อไป เราทำการมาสก์ (แทนที่ที่อยู่ผู้ส่งแพ็กเก็ตในส่วนหัว) ของแพ็กเก็ตทั้งหมดที่มาจากอินเทอร์เฟซ eth0

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

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

Netfilter:~# iptables -P INPUT DROP netfilter:~# iptables -P OUTPUT DROP netfilter:~# iptables -A INPUT -i lo -j ยอมรับ netfilter:~# iptables -A OUTPUT -o lo -j ยอมรับ netfilter:~# iptables -A อินพุต -p icmp --icmp-type 0 -j ยอมรับ netfilter:~# iptables -A INPUT -p icmp --icmp-type 8 -j ยอมรับ netfilter:~# iptables -A OUTPUT -p icmp -j ยอมรับ netfilter:~# cat /proc/sys/net/ipv4/ip_local_port_range 32768 61000 netfilter:~# iptables -A OUTPUT -p TCP --sport 32768:61000 -j ยอมรับ netfilter:~# iptables -A OUTPUT -p UDP -- กีฬา 32768:61000 -j ยอมรับ netfilter:~# iptables -A INPUT -p TCP -m state - สถานะที่จัดตั้งขึ้นที่เกี่ยวข้อง -j ยอมรับ netfilter:~# iptables -A INPUT -p UDP -m state - สถานะที่จัดตั้งขึ้นที่เกี่ยวข้อง -j ยอมรับ

ด้วยเหตุนี้ หากหนึ่งในโฮสต์เครือข่ายท้องถิ่น เช่น 10.0.0.2 พยายามติดต่อกับโฮสต์อินเทอร์เน็ตตัวใดตัวหนึ่ง เช่น 93.158.134.3 (ya.ru) ด้วย ที่อยู่ต้นทางจะถูกแทนที่ด้วยที่อยู่ภายนอก ที่อยู่เกตเวย์ในห่วงโซ่ POSTROUTING ตาราง nat นั่นคือ IP ขาออก 10.0.0.2 จะถูกแทนที่ด้วย 198.166.0.200 จากมุมมองของโฮสต์ระยะไกล (ya.ru) จะดูราวกับว่าเกตเวย์กำลังสื่อสารกับมันโดยตรง เมื่อโฮสต์ระยะไกลเริ่มส่งข้อมูลกลับ โฮสต์จะระบุข้อมูลนั้นไปที่เกตเวย์โดยเฉพาะ ซึ่งก็คือ 198.166.0.200 อย่างไรก็ตาม ที่เกตเวย์ ที่อยู่ปลายทางของแพ็กเก็ตเหล่านี้จะเปลี่ยนเป็น 10.0.0.2 หลังจากนั้นแพ็กเก็ตจะถูกส่งไปยังผู้รับจริงบนเครือข่ายท้องถิ่น สำหรับการแปลงแบบย้อนกลับ ไม่จำเป็นต้องระบุกฎเพิ่มเติม - ซึ่งจะดำเนินการในลักษณะเดียวกัน ปฏิบัติการสวมหน้ากากซึ่งจะจดจำโฮสต์บนเครือข่ายท้องถิ่นที่ส่งคำขอ และโฮสต์ใดจำเป็นต้องส่งคืนการตอบกลับที่เข้ามา

บันทึก:ยอมรับโดยปริยายดีกว่า ก่อนคำสั่ง iptables ทั้งหมดห่วงโซ่ที่ชัดเจนที่จะเพิ่มกฎ:

ตัวกรองเน็ต:~# iptables -F CHAIN_NAME

ให้การเข้าถึงบริการบนเกตเวย์

สมมติว่าบริการบางอย่างทำงานบนเกตเวย์ของเรา ซึ่งควรตอบสนองต่อคำขอที่มาจากอินเทอร์เน็ต สมมติว่ามันใช้งานได้กับพอร์ต TCP บางพอร์ต nn เพื่อให้สามารถเข้าถึงบริการนี้ได้ จำเป็นต้องแก้ไขตารางตัวกรองในห่วงโซ่ INPUT (เพื่ออนุญาตให้รับแพ็กเก็ตเครือข่ายที่ส่งถึงบริการในพื้นที่) และตารางตัวกรองในห่วงโซ่ OUTPUT (เพื่อให้สามารถตอบสนองต่อคำขอที่เข้ามาได้)

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

Netfilter:~# iptables -A INPUT -p TCP --dport nn -j ยอมรับ netfilter:~# iptables -A OUTPUT -p TCP --sport nn -j ยอมรับ

กฎเหล่านี้อนุญาตให้มีการเชื่อมต่อ TCP ขาเข้าไปยังพอร์ต nn และการเชื่อมต่อ TCP ขาออกจากพอร์ต nn นอกจากนี้ คุณสามารถเพิ่มพารามิเตอร์จำกัดเพิ่มเติมได้ เช่น อนุญาตการเชื่อมต่อขาเข้าจากอินเทอร์เฟซภายนอก eth0 เท่านั้น (คีย์ -i eth0) ฯลฯ

ให้การเข้าถึงบริการบนเครือข่ายท้องถิ่น

สมมติว่าบนเครือข่ายท้องถิ่นของเรามีโฮสต์บางตัวที่มี IP X.Y.Z.1 ซึ่งจะต้องตอบสนองต่อคำขอเครือข่ายจากเครือข่ายภายนอกบนพอร์ต TCP xxx เพื่อให้การตอบสนองบริการที่ถูกต้องจากเครือข่ายท้องถิ่นเกิดขึ้นเมื่อไคลเอนต์ระยะไกลเข้าถึงพอร์ต IP ภายนอก xxx จำเป็นต้องส่งต่อคำขอที่มาถึงพอร์ต IP ภายนอก xxx ไปยังโฮสต์ที่เกี่ยวข้องบนเครือข่ายท้องถิ่น ซึ่งสามารถทำได้โดยการแก้ไขที่อยู่ผู้รับในแพ็กเก็ตที่มาถึงพอร์ตที่ระบุ การดำเนินการนี้เรียกว่า DNAT และนำไปใช้ในห่วงโซ่ PREROUTING ในตาราง nat และยังอนุญาตให้ผ่านแพ็กเก็ตเหล่านี้ในห่วงโซ่ FORWARD ในตารางตัวกรอง

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

Netfilter:~# iptables -t nat -A PREROUTING -p tcp -d 198.166.0.200 --dport xxx -j DNAT --to-destination X.Y.Z.1 netfilter:~# iptables -A FORWARD -i eth0 -p tcp -d X.Y.Z. 1 --dport xxx -j ยอมรับ

กำลังบันทึกกฎที่ป้อนเมื่อรีบูต

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

ดังนั้นความคิดที่ดีที่สุดก็คือ เริ่มต้นกฎ netfilter/iptablesเมื่อโหลด Debian มีเครื่องมือที่ยอดเยี่ยมสำหรับสิ่งนี้ - ไดเร็กทอรี /etc/network/if-up.d/ซึ่งคุณสามารถวางสคริปต์ที่จะเปิดตัวเมื่อเครือข่ายเริ่มทำงาน ยังมีทีมงาน iptables-บันทึกและ iptables-เรียกคืนซึ่งบันทึกจะสร้างดัมพ์ของกฎ netfilter จากเคอร์เนลและกู้คืนกฎจากเคอร์เนลตามลำดับ

ดังนั้น, อัลกอริธึมการบันทึก iptables มีดังต่อไปนี้โดยประมาณ:

  • เรากำหนดค่าไฟร์วอลล์ให้เหมาะสมกับความต้องการใช้งานของคุณ
  • สร้างดัมพ์ของกฎที่สร้างขึ้นโดยใช้คำสั่ง iptables-save > /etc/iptables.rules
  • สร้าง สคริปต์นำเข้าดัมพ์ที่สร้างขึ้นเมื่อเครือข่ายเริ่มทำงาน (ในไดเร็กทอรี /etc/network/if-up.d/) และอย่าลืมทำให้สามารถเรียกใช้งานได้:
# cat /etc/network/if-up.d/firewall #!/bin/bash /sbin/iptables-restore< /etc/iptables.rules exit 0 # chmod +x /etc/network/if-up.d/firewall

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

# สร้างโดย iptables-save v1.4.5 ในวันเสาร์ที่ 24 ธันวาคม 22:35:13 2554 *ตัวกรอง:INPUT ACCEPT :FORWARD ACCEPT ....... # ความคิดเห็น -A INPUT -i lo -j ACCEPT -A INPUT ! -i lo -d 127.0.0.0/8 -j ปฏิเสธ ........... -A FORWARD -j ปฏิเสธ COMMIT # เสร็จสิ้นเมื่อวันเสาร์ที่ 24 ธันวาคม 22:35:13 2554 # สร้างโดย iptables-save v1 .4.5 เมื่อวันเสาร์ที่ 24 ธันวาคม 2554 22:35:13 น. *ดิบ ...... มุ่งมั่น

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

:นโยบายลูกโซ่ [แพ็กเก็ต: ไบต์]

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

ที่เรดแฮท ฟังก์ชั่นการจัดเก็บคำสั่ง iptablesดำเนินการเมื่อเครือข่ายเริ่มต้นและหยุดดำเนินการไฟล์ /etc/sysconfig/iptables- และการจัดการไฟล์นี้ขึ้นอยู่กับ iptables daemon

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

บรรทัดล่าง

นั่นก็จะเพียงพอแล้วสำหรับวันนี้ ฉันจะเผยแพร่การใช้งานไฟร์วอลล์ที่ซับซ้อนมากขึ้นในบทความต่อๆ ไปอย่างแน่นอน

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

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

ไวยากรณ์ทั่วไปสำหรับการใช้ 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-number

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

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 ยอมรับ

แนวคิดหลักของ 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 การดำเนินการมาตรฐานที่มีอยู่ในทุกเชน ได้แก่ ACCEPT (ข้าม), DROP (ลบ), QUEUE (ส่งไปยังโปรแกรมภายนอกเพื่อทำการวิเคราะห์) และ RETURN (กลับไปยังเชนก่อนหน้าเพื่อทำการวิเคราะห์) เช่น คำสั่ง

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

หมายถึง “เพิ่มกฎต่อไปนี้ที่ส่วนท้ายของ INPUT chain: ข้ามแพ็กเก็ตจาก 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

เชนที่มีชื่อเดียวกันแต่อยู่ในตารางต่างกันถือเป็นอ็อบเจ็กต์ที่เป็นอิสระอย่างสมบูรณ์ ตัวอย่างเช่น raw 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 ได้ที่นี่ # ปิดการใช้งานอย่างอื่นทั้งหมดสำหรับ 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 iptables เป็นโปรแกรมอรรถประโยชน์บรรทัดคำสั่งที่เป็นอินเทอร์เฟซมาตรฐานสำหรับจัดการการทำงานของไฟร์วอลล์ (ไฟร์วอลล์) เน็ตฟิลเตอร์สำหรับเคอร์เนล Linux เวอร์ชัน 2.4 และ 2.6 จำเป็นต้องมีสิทธิพิเศษเพื่อใช้ยูทิลิตี้ iptables

ผู้ใช้ระดับสูง

(root) บางครั้งคำว่า iptables ก็หมายถึงไฟร์วอลล์ netfilter นั่นเอง 1. ไฟร์วอลล์คืออะไร และเหตุใดจึงจำเป็น

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

2. iptables ทำงานอย่างไร

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

Iptables ใช้ตารางสามประเภท:

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

ดังนั้นเราจึงสนใจตารางตัวกรองที่สาม ตารางนี้มีโซ่ในตัวสามแบบ:

  1. INPUT - สำหรับแพ็กเก็ตขาเข้า
  2. FORWARD - สำหรับผู้ที่ผ่านเครื่องนี้ไปยังเครื่องอื่น
  3. OUTPUT - สำหรับขาออก

แพ็กเก็ตที่ส่งผ่านลูกโซ่เหล่านี้ตามกฎสามารถส่งผ่าน (ยอมรับ) หรือทิ้ง (DROP)

โปรแกรม Iptables ช่วยให้คุณสามารถแก้ไขกฎผ่านเทอร์มินัลโดยการป้อนคำสั่ง

เล็กน้อยเกี่ยวกับการเขียนกฎ:

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

อิปเทเบิล [-t ชื่อตาราง ] คำสั่ง [รูปแบบ] [ -เจ การกระทำ ]

ตัวเลือก -t ระบุ โต๊ะ- หากละเว้นตัวเลือก ค่าเริ่มต้นคือการใช้ตารางตัวกรอง หากคุณต้องการใช้ตารางอื่น จะต้องระบุอย่างชัดเจน

ต่อไปถัดจากชื่อตารางควรมีคำสั่ง หากไม่มีตัวระบุตาราง คำสั่งจะต้องมาก่อนเสมอ
ทีมกำหนดการกระทำของ iptables เช่น แทรกกฎ หรือเพิ่มกฎที่ส่วนท้ายของห่วงโซ่ หรือลบกฎ เป็นต้น

รายการคำสั่ง:

  • -ก ชื่อลูกโซ่ กฎ (เพิ่มกฎที่ส่วนท้ายของเชนสวิตช์ --set-counters ช่วยให้คุณสามารถตั้งค่าตัวนับแพ็กเก็ตและไบต์)
  • -ฉัน ชื่อลูกโซ่ ตัวเลข กฎ (แทรกกฎในห่วงโซ่ก่อนกฎด้วยหมายเลขที่ระบุโดยกำหนดหมายเลขตั้งแต่ 1; ปุ่ม --set-counters อนุญาตให้คุณตั้งค่าตัวนับแพ็กเก็ตและไบต์)
  • -ร ชื่อลูกโซ่ ตัวเลข กฎ (แทนที่;
    สวิตช์ --set-counters ช่วยให้คุณสามารถตั้งค่าตัวนับแพ็กเก็ตและไบต์)
  • -D ชื่อลูกโซ่ ตัวเลข (ลบกฎที่มีหมายเลขระบุตั้งแต่ 1)
  • -D ชื่อลูกโซ่ กฎ (ลบกฎตามการจับคู่ข้อความ)
  • -ค ชื่อลูกโซ่ ถุงพลาสติก (ทดสอบเส้นทางแพ็กเก็ต;
    ที่อยู่ขาออก, ที่อยู่ปลายทาง, โปรโตคอล, อินเทอร์เฟซ, พอร์ตจะถูกระบุโดยคีย์ที่เกี่ยวข้อง)
  • -ล [ชื่อลูกโซ่ ] (แสดงรายการกฎ คีย์เพิ่มเติม:
    • -v(แสดงข้อมูลเพิ่มเติมโดยเฉพาะเคาน์เตอร์)
    • --ที่แน่นอน(แสดงตัวนับโดยไม่ต้องปัดเศษเป็น KB, MB ฯลฯ)
    • --ตัวเลข(แสดงที่อยู่และหมายเลขพอร์ตเป็นตัวเลข)
    • --line-ตัวเลข(แสดงหมายเลขกฎ)
  • -ฟ ชื่อลูกโซ่ (ลบกฎทั้งหมดออกจากห่วงโซ่)
  • -Z ชื่อลูกโซ่ (รีเซ็ตตัวนับ)
  • -น ชื่อลูกโซ่ (สร้างห่วงโซ่)
  • -เอ็กซ์ ชื่อลูกโซ่ (ลบกระทู้ว่างที่ไม่มีลิงค์)
  • -ป ชื่อลูกโซ่ การกระทำ (เปลี่ยนการกระทำเริ่มต้น: ยอมรับ,
    วาง, คิว, กลับ)
  • -อี ชื่อลูกโซ่เก่า ชื่อลูกโซ่ใหม่ (เปลี่ยนชื่อโซ่)

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

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

รายการการกระทำบางอย่าง:

  • ยอมรับ - ข้ามแพ็กเก็ต; การสแกนตารางสิ้นสุดลง
  • DROP - ทิ้งไปอย่างเงียบ ๆ การสแกนจะสิ้นสุดไม่เพียงแต่สำหรับเชนปัจจุบันเท่านั้น แต่ยังรวมถึงตารางอื่นๆ ด้วย
  • ปฏิเสธ - ทิ้งโดยแจ้งผู้ส่ง ( --ปฏิเสธ-ด้วย ประเภทการแจ้งเตือน )

3. ลำดับของแพ็กเก็ตเครือข่ายที่กำหนดสำหรับกระบวนการ/แอปพลิเคชันในเครื่อง:

สำหรับการใช้งานในท้องถิ่น

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

สิ่งสำคัญคือต้องจำไว้ว่าคราวนี้แพ็กเก็ตจะผ่านห่วงโซ่ INPUT ไม่ใช่ผ่าน FORWARD

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

จากกระบวนการในท้องถิ่น

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

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

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

มีสามตัวเลือกที่แตกต่างกันสำหรับการส่งแพ็กเก็ต

1. จากภายนอกไปยังบริการท้องถิ่น (เซิร์ฟเวอร์) ของคอมพิวเตอร์เครื่องนี้ (INPUT)

2. จากบริการภายในเครื่อง (เซิร์ฟเวอร์) ของคอมพิวเตอร์เครื่องนี้ไปยังภายนอก (OUTPUT)

3. ผ่าน, เกตเวย์, ผ่านอินเทอร์เฟซเครือข่ายของคอมพิวเตอร์เครื่องนี้ (FORWARD)

4. ตัวอย่างการกำหนดค่าบางส่วน:

สคริปต์ตัวอย่าง:

#set ตัวแปรเพื่อกำหนดอินเทอร์เฟซเครือข่ายภายนอกและภายใน

LOCAL_IF="eth0"
INET_IF="eth0:g"

#=======================
# ลบกฎทั้งหมดออกจากห่วงโซ่
#=======================
iptables -F
iptables -X

#=======================
# กำหนดนโยบายเริ่มต้น
#=======================

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

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

iptables -P ยอมรับไปข้างหน้า

#=======================
# สร้างกฎสำหรับอินเทอร์เฟซทั้งหมด
#=======================

# http - เปิดพอร์ต 80
iptables -A INPUT -i ทั้งหมด -p tcp -m tcp --dport 80 -j ยอมรับ
iptables -A อินพุต -i ทั้งหมด -p icmp -j ยอมรับ

#=======================
# สร้างกฎสำหรับอินเทอร์เฟซภายใน
#=======================

#ssh - เปิด 22

iptables -A อินพุต -p tcp -i $ LOCAL_IF -m tcp --dport 22 -j ยอมรับ

สิ่งที่เหลืออยู่คือการรันสคริปต์

ตัวอย่างของแต่ละโซ่:

เราอนุญาตทุกอย่างบนอินเทอร์เฟซภายใน (แท้จริง eth0, eth1 - อินเทอร์เฟซภายใน)
iptables -A อินพุต -i eth1 -j ยอมรับ
iptables -A อินพุต -i eth0 -j ยอมรับ
iptables -A อินพุต -i lo -j ยอมรับ

อนุญาตให้เข้าถึงพอร์ตที่ระบุจากอินเทอร์เน็ต
iptables -A อินพุต -p tcp -m tcp -d external_ip --dport 80 -j ยอมรับ

การเปิดโปรโตคอล
iptables -A อินพุต -p gre -j ยอมรับ

5. ลิงก์ไปยังเอกสารประกอบสำหรับการกำหนดค่า iptables

http://www.posix.ru/network/iptables/ - บทความโดย Dmitry Kulakov "การกำหนดค่าไฟร์วอลล์ Iptables"

http://www.opennet.ru/docs/RUS/iptables/ - บทความโดย Oscar Anderson แปลโดย Andrey Kiselev "IPtables Guide"

http://system-administrators.info/?p=396 - บทความ "netfilter และ iptables ใน Linux: หลักการทำงาน, การกำหนดค่า"

http://www.iptables.ru/ - การกำหนดค่า iptables ทีละขั้นตอน การสนับสนุนด้านเทคนิค


แสดงความคิดเห็นของคุณ!

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

มันมีลักษณะอย่างไร

เราจะพิจารณาโครงการทั่วไปสำหรับสำนักงานและอพาร์ตเมนต์ ใช่แล้ว อพาร์ทเมนต์! มีคนไม่กี่คนที่จะมีเซิร์ฟเวอร์เล็กๆ ของตัวเองอยู่ใต้โต๊ะที่บ้าน แต่อินเทอร์เน็ตที่บ้านส่วนใหญ่กระจายผ่านเราเตอร์ และส่วนใหญ่แล้วพวกเขายังเป็นเฟิร์มแวร์กับ Linux อีกด้วย
นี่เป็นรูปแบบสำนักงานขนาดเล็กทั่วไป เมื่อคอมพิวเตอร์ 1 เครื่อง (เซิร์ฟเวอร์) เชื่อมต่อกับอินเทอร์เน็ต และส่วนที่เหลือเชื่อมต่อกับอินเทอร์เน็ตผ่านเซิร์ฟเวอร์นี้

ไปกันเถอะ ช้าๆ...

แล้วเราจะได้อะไร:
  • เซิร์ฟเวอร์ที่มีการ์ดเครือข่าย 2 ใบและติดตั้ง Debian Lenny ไว้
  • ค่าเริ่มต้นในไฟร์วอลล์ Debian Lenny - netfilter/iptables
  • เครือข่ายท้องถิ่นของคอมพิวเตอร์ N เครื่อง ทั้งหมดเชื่อมต่อผ่านสวิตช์ รวมถึงเซิร์ฟเวอร์ด้วย
NAT คืออะไร
ก่อนอื่น เราต้องเข้าใจว่าเราจะตั้งค่า NAT (การแปลที่อยู่เครือข่าย) ที่ธรรมดาที่สุด สำหรับผู้ที่กระหายน้ำ ในตอนท้ายฉันจะพูดถึงพร็อกซีเซิร์ฟเวอร์ที่ใช้ squid เป็นตัวอย่างด้วย อย่างที่ผมบอกไปแล้วเราจะเคี้ยวเกือบทุกอย่าง
แนทคืออะไร? ในความเป็นจริง ทุกอย่างเป็นเรื่องง่าย คอมพิวเตอร์ทุกเครื่องมีที่อยู่จริง (MAC) และเครือข่าย (IP) ขณะนี้เราสนใจที่อยู่ IP ที่อยู่ IP ภายในเครือข่ายเดียวกันจะต้องไม่ซ้ำกัน! และด้วยมาตรฐาน IPv4 ในปัจจุบัน มีเพียง 4,294,967,296 (2 32) เท่านั้นที่ไม่ซ้ำใครซึ่งมีจำนวนไม่มากและเกือบจะหมดแล้ว แต่ไม่ต้องกังวล IPv6 กำลังจะแพร่หลายและมีที่อยู่มากมายที่นั่น!
แต่ที่นี่คุณอาจสังเกตเห็นว่ามีคอมพิวเตอร์มากกว่าที่ IPv4 อนุญาตอย่างมาก หรือคุณอาจบอกว่าเพื่อนที่บ้านมีที่อยู่เดียวกันกับคุณ! และนี่คือที่เราพูดถึง NAT - ช่วยให้คุณสามารถเชื่อมต่อเครือข่ายคอมพิวเตอร์ระหว่างกันโดยใช้ที่อยู่ IP ของคุณเองเพียงที่อยู่เดียว การดำเนินการของไฟร์วอลล์เรียกว่า SNAT (Source NAT หรือการทดแทนที่อยู่ต้นทาง) เหล่านั้น. ใน 99% ของกรณี สำนักงานทั้งหมดของคุณเข้าถึงอินเทอร์เน็ตภายใต้ที่อยู่ IP 1 แห่ง ในขณะที่ทุกคนในสำนักงานมีของตัวเอง คุณสามารถอ่านเกี่ยวกับคลาสของที่อยู่ IP ได้บนอินเทอร์เน็ต

ตอนนี้เรารู้แล้วว่า NAT คืออะไรและจำเป็นสำหรับอะไร เราก็สามารถดำเนินการตั้งค่าเซิร์ฟเวอร์ได้โดยตรง

การจราจรขนส่งสาธารณะ
คำสั่งทั้งหมดดำเนินการในฐานะ root (superuser) ใน Debian การจราจรที่เรียกว่าการขนส่งสาธารณะจะถูกปิดใช้งานตามค่าเริ่มต้น เช่น ตามค่าเริ่มต้น การทำงานจะมีให้ในเครื่องเดียวเท่านั้น ดังที่คุณอาจเดาได้ หากไม่มีการจราจรติดขัด ก็ไม่มี NAT หากต้องการเปิดใช้งานเพียงเปลี่ยน 1 หลัก - $ เสียงสะท้อน 1 > /proc/sys/net/ipv4/ip_forwardแต่การตั้งค่านี้จะหายไปหลังจากรีบูต ดังนั้นจึงควรแก้ไขการกำหนดค่าให้ถูกต้อง - $ นาโน /etc/sysctl.confต่อไปเราจะมองหาเส้น #net.ipv4.ip_forward=1และลบแฮช (สัญลักษณ์ความคิดเห็น) ที่จุดเริ่มต้นของบรรทัดและตรวจสอบว่าค่าเป็น 1! ตอนนี้คุณสามารถดำเนินการกำหนดค่า iptables ได้โดยตรง
การตั้งค่า iptables
มีบทความมากมายบนอินเทอร์เน็ตเกี่ยวกับวิธีเขียนกฎใน iptables และสิ่งที่คุณสามารถทำได้ด้วยความช่วยเหลือของพวกเขา ฉันพบว่าบทความนี้มีความสมบูรณ์และน่าอ่านที่สุด
เรามาเริ่มกันเลย ก่อนอื่น มาเคลียร์ตารางกฎที่ไม่จำเป็นกันก่อน เผื่อว่าจะมีสิ่งใดที่ไม่จำเป็น...
$ iptables -F
$ iptables -t nat -F
$ iptables -t mangle -F

ส่วนเกินก็ทำความสะอาด เป็นสิ่งสำคัญมากที่จะต้องเข้าใจและจำไว้ว่ากฎใน iptables นั้นถูกนำไปใช้ตามลำดับชั้น เช่น กฎข้างต้นจะต้องปฏิบัติตามเร็วกว่านี้ เชนทั้งหมดมีนโยบายยอมรับเป็นค่าเริ่มต้น - อนุญาตทุกอย่าง ซึ่งไม่อยู่ภายใต้กฎเกณฑ์ของห่วงโซ่นี้
เรายอมรับว่าอินเทอร์เฟซที่หันเข้าหาเครือข่ายท้องถิ่นคือ eth0 และอินเทอร์เฟซอินเทอร์เน็ตคือ eth1 เครือข่ายท้องถิ่นมีที่อยู่ 192.168.0.0/24 และผู้ให้บริการให้ที่อยู่คงที่แก่เรา 10.188.106.33 (แม้ว่าจะไม่ใช่ "สีขาว" - คุณยังสามารถพูดคุยเกี่ยวกับประเภทของที่อยู่ IP ที่คุณสามารถค้นหาได้บนอินเทอร์เน็ต) ดังนั้นเราจึงเขียน:
$ iptables -A ส่งต่อ -i eth0 -o eth1 -s 192.168.0.0/24 -j ยอมรับ
$ iptables -A ส่งต่อ -i eth1 -o eth0 -d 192.168.0.0/24 -j ยอมรับ
$ iptables -P ส่งต่อลดลง

ดังนั้นเราจึงอนุญาตให้แพ็กเก็ตการส่งผ่านไฟร์วอลล์สำหรับช่วงที่อยู่ IP ของเรา และเราห้ามสิ่งอื่นใดอีก
ตอนนี้ NAT เอง:
$ iptables -A POSTROUTING -s 192.168.0.0/24 -o eth1 -j SNAT --to-source 10.188.106.33
แค่นี้ก็เพียงพอแล้วสำหรับคุณที่จะทำให้ NAT ทำงาน
สิ่งเล็กๆ น้อยๆ...
บนไคลเอนต์ เราจะระบุ IP จากช่วงที่เลือกและระบุที่อยู่ IP ของเซิร์ฟเวอร์ของเราเป็นเกตเวย์ (โดยปกติแล้วจะถูกกำหนดจากเครือข่ายย่อยก่อน - ฉันจะปล่อยให้เป็นไปตามดุลยพินิจของคุณ) การตั้งค่าเครือข่ายทั้งหมดบนเซิร์ฟเวอร์สามารถทำได้ดังนี้:
$ nano /etc/network/interfacesระบุการตั้งค่าอินเทอร์เฟซเครือข่ายของคุณ
เข้าถึงความลึกของเครือข่ายผ่านเกตเวย์หรือ DNAT
แล้วคุณก็รู้ว่าคุณมี Windows Server บนเครือข่ายที่คุณสามารถเข้าถึงได้ง่ายผ่าน RDP อยู่เสมอ จากนั้นเกตเวย์ Debian ที่น่ารำคาญนี้ก็ออกมา! ทุกอย่างง่ายมาก - คุณเพียงแค่ต้องเพิ่มกฎ DNAT ลงใน iptables ของเรา
DNAT เป็นสัตว์ชนิดใด? DNAT (NAT ปลายทางหรือการทดแทนที่อยู่ของผู้รับ) - การ์ดเครือข่ายทำงานในโหมดที่ยอมรับเฉพาะแพ็กเก็ตที่ส่งถึงพวกเขาโดยเฉพาะ แต่คุณสามารถเข้าสู่เซิร์ฟเวอร์ของเราได้หรือไม่หาก IP ที่เข้าถึงอินเทอร์เน็ตนั้นเป็นเครื่องอื่นอีกหลายสิบเครื่อง ในสำนักงานของคุณ? คำขอจะไปถึงเขาได้อย่างไร? ที่จริงแล้ว คำขอประเภทนี้ทั้งหมดเกิดขึ้นกับเกตเวย์ของเรา และสิ่งที่เราต้องทำคือตั้งกฎสำหรับการทำงานกับแพ็คเกจดังกล่าว
$ iptables -A การเตรียมการล่วงหน้า -i eth1 -p tcp -m tcp --dport 3389 -j DNAT --to-destination 192.168.0.2
กฎง่ายๆ นี้จะเปลี่ยนเส้นทางแพ็กเก็ตทั้งหมดที่มาถึงเกตเวย์จากอินเทอร์เน็ตไปยังพอร์ต TCP 3389 (ซึ่งเป็นสิ่งที่โปรโตคอล RDP ใช้) ไปยัง Windows Server ภายในของคุณ และทุกอย่างก็เหมาะกับคุณ
แล้วปลาหมึกตัวโปรดของคุณล่ะ
แม้ว่าทุกอย่างจะทำงานได้ในตอนนี้ แต่ทุกคนมีอินเทอร์เน็ตและทุกอย่างทำงานได้ แต่บางคนยังต้องการพร็อกซีเซิร์ฟเวอร์ ฉันจะไม่พูดถึงการตั้งปลาหมึก แต่จะแสดงกฎเกณฑ์ที่จะทำให้มัน “โปร่งใส” ใน Squid คุณเพียงแค่ต้องเขียนคำวิเศษให้โปร่งใสในตำแหน่งที่ถูกต้องและมันจะเริ่มดำเนินการตามคำขอที่ตกลงมาอย่างถูกต้อง
เราเขียน $ iptables -A การเตรียมการ -d! 192.168.0.0/24 -i eth0 -p tcp -m multiport --dports 80,443 -j REDIRECT -- ไปยังพอร์ต 3128.
และสิ่งนี้ให้อะไรเรา? ตอนนี้คำขอทั้งหมดไปยังหน้าเว็บจากเวิร์กสเตชันของคุณผ่านโปรโตคอล http ((80) และ https (443) จะถูกเปลี่ยนเส้นทางไปยังพอร์ตที่ squid ฟัง คุณจะได้รับการกรองเนื้อหาข้อมูลเกี่ยวกับใครอยู่ที่ไหนและทำอะไรบนอินเทอร์เน็ต ผู้ใช้ไม่ทำอะไรเลยโดยไม่สงสัยว่าจะทำงานเหมือนเดิม...
ความปลอดภัยเล็กน้อย
อย่างน้อยคุณควรปกป้องเกตเวย์ของคุณให้น้อยที่สุด ดังนั้นเรามาเพิ่มกฎอีกสองสามข้อกัน
$ iptables -A อินพุต -i lo -j ยอมรับ
$ iptables -A อินพุต -i eth0 -s 192.168.0.0/24 -j ยอมรับ
$ iptables -A INPUT -i eth1 -m conntrack --ctstate ที่เกี่ยวข้อง ก่อตั้งแล้ว -j ยอมรับ
$ iptables -P อินพุตลดลง

ดังนั้นจึงห้ามการสื่อสารใดๆ โดยตรงกับเกตเวย์ ยกเว้นการเชื่อมต่อที่สร้างไว้แล้ว เช่น สิ่งที่คุณริเริ่มและคุณก็จะได้รับคำตอบ อย่ากลัว เพราะ DNAT ของเราไม่เป็นไปตามกฎเหล่านี้...
ทำไมน้อยจัง?
บทความนี้ไม่ใช่ยางและคุณยังไม่สามารถบอกได้ทุกเรื่อง... ฉันนำมา ขั้นต่ำชุดของการดำเนินการและแนวคิดเพื่อให้คุณสามารถเริ่มต้นการเรียนรู้ยักษ์ใหญ่ดังกล่าวเป็นเกตเวย์บน Linux ที่นี่คุณสามารถพูดคุยได้เป็นเวลานานมาก โดยหารือเกี่ยวกับแง่มุมและความสามารถของ netfilter มากมาย

ทั้งหมด

อย่างที่เราเห็น ทุกอย่างเรียบง่ายมาก! สิ่งสำคัญคือการเข้าใจหลักการทำงานของเครือข่ายและอย่ากลัวที่จะตั้งค่าและอ่านคู่มือขนาดใหญ่
ฉันหวังว่าฉันจะสามารถรวบรวมข้อมูลได้เพียงพอเพื่อเริ่มต้นมิตรภาพของคุณกับเราเตอร์ซอฟต์แวร์ที่ใช้ Linux

แท็ก: iptables, netfilter, NAT