ความแตกต่างระหว่างตัวเลือก iptables -A และ -I


20

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

iptables -A INPUT -p udp -m udp --dport 53 -j ACCEPT

อย่างไรก็ตามในกรณีของฉันฉันต้องเปลี่ยนกฎเป็นinsertประเภทเพื่อให้ทำงานได้:

iptables -I INPUT -p udp -m udp --dport 53 -j ACCEPT

ฉันรู้ว่ากฎหนึ่งสำหรับการต่อท้ายและกฎอื่น ๆ สำหรับการแทรกและสิ่งที่ทั้งสองคำหมายถึง แต่ใครบางคนได้โปรดอธิบายความแตกต่างระหว่างทั้งสองและเมื่อใช้ตัวเลือกที่? ฉันค้นหา iptables ของ Ubuntu แล้ว แต่ไม่เห็นข้อมูลมากนัก

คำตอบ:


24

iptables -Aต่อท้ายกฎในตอนท้ายของชุดกฎในขณะที่iptables -Iแทรกกฎที่ตำแหน่งเฉพาะในชุดกฎตามที่คุณได้ชี้ให้เห็น

ดูที่รายการ man สำหรับ iptables แสดงสิ่งนี้:

-I, - ห่วงโซ่แทรก [rulenum] ข้อมูลจำเพาะของกฎแทรกหนึ่งหรือมากกว่าหนึ่งกฎในห่วงโซ่ที่เลือกเป็นจำนวนกฎที่กำหนด ดังนั้นถ้าหมายเลขกฎคือ 1 กฎหรือกฎจะถูกแทรกที่ส่วนหัวของห่วงโซ่ นี่เป็นค่าเริ่มต้นด้วยหากไม่มีการระบุหมายเลขกฎ

และนี่คือเหตุผลที่-Iทำงานให้คุณและ-Aไม่ หากคุณไม่ได้จัดหารูลูนัมใด ๆ กฎของคุณจะถูกแทรกที่ตำแหน่งแรก นั่นหมายความว่าในกรณีของคุณที่ใดที่หนึ่งใน ruleset ของคุณจะต้องมีกฎที่ห้ามแพ็กเก็ต DNS (อาจเป็นกฎที่ห้าม UDP โดยทั่วไป?) เพราะ iptables ประมวลผลกฎทั้งหมดตั้งแต่แรกถึงสุดท้ายใช้การจับคู่และหยุดครั้งแรก
Btw, นั่นคือเหตุผลที่คุณควรวางกฎที่มีจุดประสงค์เพื่อจับคู่แพ็กเก็ตส่วนใหญ่ที่ด้านบน: ถ้าคุณวางกฎที่ใช้มากที่สุดที่และแพ็คเก็ตจะถูกตรวจสอบกับกฎแต่ละข้อที่อาจใช้ทรัพยากรจำนวนมาก

และสำหรับการใช้งาน: คุณสามารถใช้อย่างชาญฉลาด-Aเมื่อคุณต้องการผนวกกฎในตอนท้ายหรือเมื่อมันไม่สำคัญว่ากฎของคุณจะอยู่ที่ใด หากคุณต้องการกฎของคุณในตำแหน่งที่ระบุให้ใช้-Iเช่นนี้: iptables -I INPUT 6 -p tcp -j DROP(สิ่งนี้จะเพิ่มคำสั่ง DROP สำหรับแพ็กเก็ต tcp ทั้งหมดที่ส่งไปยังโฮสต์เองในตำแหน่งที่ 6 ในชุดกฎ INPUT)

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