เหตุใดจึงไม่สามารถให้บริการแบบถาวรได้บันทึกการเปลี่ยนแปลงของฉัน


18

ฉันทำตามบทช่วยสอนนี้เพื่อตั้งค่ากฎ IP บน Ubuntu 12.04 ทุกอย่างทำงานได้ดีในการตั้งค่า - แต่ตอนนี้ฉันได้ทำการเปลี่ยนแปลงไฟร์วอลล์ที่ไม่คงอยู่เมื่อรีบูต ฉันไม่เข้าใจว่าทำไม นี่เป็นการสาธิตวิธีที่ฉันใช้ iptables-persistent ผมทำอะไรผิดหรือเปล่า?

$ sudo service iptables-persistent start
 * Loading iptables rules...                                                                                             *  IPv4...                                                                                                              *  IPv6...   

$ sudo iptables -L   //shows a certain rule
$ iptables -D INPUT ... //command successfully drops the rule
$ sudo iptables -L   //shows rule has been deleted

 $ sudo service iptables-persistent restart
 * Loading iptables rules...                                                                                             *  IPv4...                                                                                                              *  IPv6...                                                                                                      [ OK ] 
 $ sudo iptables -L  //rule is back

ฉันสังเกตเห็นiptables -D INPUTกฎไม่ได้sudoคุณแน่ใจหรือว่ามันรายงานความสำเร็จจริง ๆ ? ไม่เปลี่ยนแปลงพฤติกรรมถ้าคุณไม่เรียกใช้ภายในsudo?
Bratchley

คำตอบ:


41

iptables-persistentไม่ทำงานอย่างนั้น การรีสตาร์ทiptables-persistent"บริการ" ไม่ได้บันทึกสถานะปัจจุบันของ iptables และบันทึก; สิ่งที่มันทำคือคืนสถานะกฎ iptables ที่บันทึกไว้เมื่อมีการกำหนดค่าแพคเกจล่าสุด

ในการกำหนดค่าiptables-persistentคุณต้องบอกเกี่ยวกับชุดกฎ iptables ปัจจุบันของคุณ

วิธีหนึ่งที่จะทำให้สำเร็จมีดังต่อไปนี้:

iptables-save >/etc/iptables/rules.v4
ip6tables-save >/etc/iptables/rules.v6

หรือเทียบเท่า iptables-persistentแพคเกจยังมีดังต่อไปนี้:

dpkg-reconfigure iptables-persistent

(คุณจะต้องตอบว่าใช่สำหรับคำถามเกี่ยวกับว่าจะบันทึกกฎหรือไม่)

หลังจากนั้นในครั้งถัดไปที่iptables-persistentเริ่ม / เริ่มใหม่ iptables rulesets ที่คุณคาดว่าจะถูกโหลด


9

วิธีที่ง่ายมากในการบันทึกกฎ iptables ปัจจุบันคือการใช้คำสั่ง:

sudo service netfilter-persistent save

การใช้ข้างต้นซึ่งทำงานอย่างน้อยใน Ubuntu หลังจากติดตั้งแพคเกจnetfilter-persistent(และiptables-persistent) ไม่จำเป็นต้องเรียกใช้คำสั่ง iptables ด้วยตนเองหรือทำการกำหนดค่าแพ็คเกจใหม่ (ตามที่แนะนำโดยแม้แต่คำตอบที่ยอมรับข้างต้น)


มันเป็นsudo service netfilter-persistent saveหรือsudo service netfilter-persistent save .? (จุดท้าย)

ขอบคุณที่สังเกตว่าคำสั่งที่ถูกต้องคือไม่มีจุดที่ท้ายบรรทัด แก้ไขคำตอบให้ถูกต้อง
OpenITeX

3
$ iptables ... DROP //command successfully drops the rule
$ sudo iptables -L   //shows rule has been deleted

นั่นไม่ใช่สิ่งที่DROPหมายหรือทำ จากman iptables:

... ค่าพิเศษ ACCEPT, DROP, QUEUE หรือ RETURN ACCEPT หมายถึงการปล่อยให้แพ็กเก็ตผ่าน DROP หมายถึงการวางแพ็กเก็ตบนพื้น QUEUE หมายถึง ...

ดังนั้นสิ่งที่คุณทำคือเพิ่มกฎใหม่ มันอาจแทนที่กฎอื่น ๆ ได้อย่างมีประสิทธิภาพ แต่กฎเหล่านั้นยังคงมีอยู่

เมื่อตรวจสอบสิ่งต่าง ๆ เช่นนี้ (สิ่งที่คุณiptables -Lส่งออก) ฉันจะเลี้ยงด้วยgrep "string unique to this rule"แทนที่จะใช้สายตา ง่ายกว่าและเร็วกว่าที่จะทำและมีข้อผิดพลาดน้อยลง

iptables -L | grep "some unique string"

หากคุณต้องการลบกฎให้ใช้-Dสวิตช์ man page อธิบายสองรูปแบบของสิ่งนี้:

-D, - ลบกฎลูกโซ่สเปค

-D, - ลบ rulenum ของโซ่

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


ขอโทษที่ไม่ชัดเจน ฉันใช้ตัวเลือก -D เพื่อ DROP กฎ ดูการเปลี่ยนแปลงข้างต้น
bernie2436

3
-Dย่อมาจาก "delete" ไม่ใช่ "DROP" การใช้คำว่า "DROP" เพื่อหมายถึงสิ่งอื่นใดนอกจากเป้าหมายกระโดดเมื่อพูดถึงiptablesสับสนว่าเป็นนรก
Bratchley

1

ตามที่อธิบายโดย@ Steven-จันทร์คุณสามารถบันทึกชุดกฎของคุณด้วยตัวเองในไดเรกทอรีที่เหมาะสม (กล่าวคือ: /etc/iptables/rules.v{4,6})

อย่างไรก็ตาม@OpenITeXถูกต้อง: การเรียกการsaveกระทำของservice netfilter-persistentดีกว่า

ณ วันนี้ (18.10 ใน) iptables-Save เป็น builtin แต่iptables-persistentจะไม่ได้ติดตั้ง ดังนั้นไดเร็กทอรีปลั๊กอินที่เรียกใช้โดยservice netfilter-persistentว่างเปล่าและเซอร์วิสจะพิมพ์ออกมาว่าชุดกฎถูกบันทึก แต่ไม่ได้

TLDR: ติดตั้งiptables-persistentและตรวจสอบว่าไดเรกทอรี/usr/share/netfilter-persistent/plugins.dปลั๊กอินมีปลั๊กอิน


นี่คือวิธีที่ฉันค้นพบว่า:

$ cat /etc/init.d/netfilter-persistent 
...
case "$1" in
...
save)
    log_action_begin_msg "Saving netfilter rules"
    /usr/sbin/netfilter-persistent save
    log_action_end_msg $?
    ;;

จากนั้นตรวจสอบ/usr/sbin/netfilter-persistentสคริปต์สังเกตว่ามันเรียกใช้สคริปต์ภายนอก:

$ cat /usr/sbin/netfilter-persistent
...
PLUGINS=/usr/share/netfilter-persistent/plugins.d
...
run_plugins () {
    if [ -d ${PLUGINS} ]; then
        run-parts -v -a ${1} ${PLUGINS}
    fi
}

case $1 in
start|save|flush)
    run_plugins ${1}
    ;;

จากนั้นฉันสังเกตเห็นว่า/usr/share/netfilter-persistent/plugins.dว่างเปล่า


1

ติดตั้ง iptables- ถาวร:

sudo apt install iptables-persistent

บันทึกกฎหลังจากทำการเปลี่ยนแปลงที่ต้องการ:

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