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

บทนำและประวัติ

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

โครงการ ไอแพดเชนและ ipfwadmเปลี่ยนการทำงานของสแต็กโปรโตคอลเคอร์เนล Linux ตั้งแต่ก่อนการถือกำเนิดของ เน็ตฟิลเตอร์ไม่มีข้อกำหนดในสถาปัตยกรรมเคอร์เนลสำหรับการเพิ่มโมดูลการจัดการแพ็คเกจเพิ่มเติม ไอพีเทเบิลคงไว้ซึ่งแนวคิดหลัก 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_EBTABLES และ CONFIG_BRIDGE_EBT_* สำหรับการทำงานในโหมดบริดจ์, อื่นๆ CONFIG_IP_NF_* และ CONFIG_IP6_NF_* นอกจากนี้ยังมีประโยชน์ในการระบุ CONFIG_PACKET

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

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

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

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

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

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

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

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

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

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

: ส่งแพ็กเก็ตไปยังกฎลูกโซ่อื่น "ปล่อย" แพ็กเก็ตออกข้อความแสดงข้อผิดพลาดไปยังต้นทาง...) ด้านล่างนี้คือคำสั่งและพารามิเตอร์ของยูทิลิตี้ iptables: พารามิเตอร์
คำอธิบาย
ตัวอย่าง ทีม --ผนวก (-A)
เพิ่มกฎที่ระบุไปที่จุดสิ้นสุดของรายการในกลุ่มที่ระบุและตารางที่ระบุ 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)
--ศูนย์ (-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
--แหล่งที่มาพอร์ต
(--กีฬา)
พอร์ตต้นทาง เป็นไปได้สำหรับโปรโตคอล --protocol tcp หรือ --protocol udp เท่านั้น iptables -A INPUT --โปรโตคอล TCP --source-port 25
--ปลายทางพอร์ต
(--พอร์ต)
พอร์ตปลายทาง ใช้ได้กับโปรโตคอล --protocol tcp หรือ --protemocol udp เท่านั้น iptables -A INPUT --protocol udp --destination-port 67
พารามิเตอร์ที่ชัดเจน
-m รัฐ --state (เลิกใช้แล้ว)
อาคา
-m conntrack --ctstate

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

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

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

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

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

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

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

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

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

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

ประวัติย่อ

ในบทความนี้ เราได้ดูแนวคิดพื้นฐานของตัวกรองเครือข่ายใน Linux โดยย่อ ดังนั้น ระบบย่อย 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!

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 state - สถานะที่เกี่ยวข้อง ก่อตั้งแล้ว -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 คือ:

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

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

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

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

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

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

1. ไฟร์วอลล์คืออะไร และเหตุใดจึงจำเป็น

ไฟร์วอลล์- ชุดของฮาร์ดแวร์หรือซอฟต์แวร์ที่ตรวจสอบและกรองแพ็กเก็ตเครือข่ายที่ส่งผ่านในระดับต่างๆ ของแบบจำลอง OSI ตามกฎที่ระบุ


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

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 และยังพิจารณาวิธีการต่างๆ บันทึกการกำหนดค่า 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 ธันวาคม 22:35:13 2554 *raw ...... COMMIT

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

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

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

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

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

บรรทัดล่าง

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

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