วิธีเริ่ม / หยุด iptables บน Ubuntu


86

ฉันจะเริ่ม / หยุดบริการ iptables บน Ubuntu ได้อย่างไร

ฉันเหนื่อย

 service iptables stop

แต่มันคือการให้บริการ "ที่ไม่รู้จัก"

ทำไมถึงทำเช่นนั้น? มีวิธีอื่นไหม


ฉันคิดว่าความสับสนบางอย่างมาจากบทความเช่นนี้: cyberciti.biz/faq/turn-on-turn-off-firewall-in-linuxซึ่งใช้กับ Fedora / Red Hat เท่านั้นและอ้างว่าคุณจะพบ/etc/init.d/มัน (un) โดยมีประโยชน์คือลิงค์ด้านบนที่คุณได้รับเมื่อ googling 'ปิด iptables ubuntu'
icc97

คำตอบ:


76

ฉันไม่รู้เกี่ยวกับ "Ubuntu" แต่โดยทั่วไปใน Linux "iptables" ไม่ใช่บริการ - เป็นคำสั่งในการจัดการไฟร์วอลล์เคอร์เนล netfilter คุณสามารถ "ปิดการใช้งาน" (หรือหยุด) ไฟร์วอลล์โดยการตั้งค่านโยบายเริ่มต้นในเครือข่ายมาตรฐานทั้งหมดเป็น "ACCEPT" และล้างกฎ

iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -F

(คุณอาจต้องล้างข้อมูลตารางอื่นเช่น "nat" หากคุณเคยใช้)

บทความต่อไปนี้บนเว็บไซต์ Ubuntu อธิบายการตั้งค่า iptables สำหรับใช้กับ NetworkManager: https://help.ubuntu.com/community/IptablesHowTo


5
สิ่งนี้จะไม่ทิ้งกฎปัจจุบันทั้งหมดหรือไม่? ที่ดีที่สุดเพื่อช่วยให้พวกเขาอยู่ที่ไหนสักแห่งแรกที่มี sudo iptables บันทึก> / tmp / กฎ
Jens Timmerman

8
สิ่งนี้ไม่ได้หยุดบริการ แต่อนุญาตให้ทุกอย่างผ่าน
เฟรดเดอริกนีลเส็น

1
อ่าขอบคุณ iptables -Fเป็นสิ่งที่ฉันขาดหายไป :-)
Cameron

@JensTimmerman iptables-save > /tmp/rulesบันทึกวันของฉัน ขอบคุณ
blagus

46

คุณผิด :-)

คำสั่งที่คุณต้องการคือ:

$ sudo ufw disable

29
แน่ใจว่าถ้าเราได้พูดคุยเกี่ยวกับ ufw แต่โพสต์นี้เป็นเรื่องเกี่ยวกับ iptables
webjay

1
ฉันคิดว่ามันคือการติดตั้งเริ่มต้นของ Ubuntu และอันนั้นไม่มี iptables แต่มี ufw
Frederik Nielsen

22
ufw เป็นเพียงส่วนหน้าสำหรับ iptables: "Iptables เป็นไฟร์วอลล์ติดตั้งโดยค่าเริ่มต้นในการแจกจ่ายอย่างเป็นทางการของ Ubuntu ทั้งหมด (Ubuntu, Kubuntu, Xubuntu) เมื่อคุณติดตั้ง Ubuntu จะมี iptables แต่จะช่วยให้การรับส่งข้อมูลทั้งหมดเป็นค่าเริ่มต้น Ubuntu 8.04 มี ด้วย ufw - โปรแกรมสำหรับจัดการไฟร์วอลล์ iptables ได้อย่างง่ายดาย " help.ubuntu.com/community/IptablesHowTo
benjaoming

2
อาจเป็นได้ แต่เป็น ufw == iptables (มากหรือน้อย) ใน Ubuntu การปิดใช้งาน ufw เท่ากับการปิดใช้งาน iptables
Frederik Nielsen

2
โอกาสที่ OP จะให้ความสนใจในการปิดการใช้งานไฟร์วอลล์แทนที่จะเข้าใจความซับซ้อนของบริการ iptables สำหรับการจัดการไฟร์วอลล์ดังนั้นนี่จึงเป็นคำตอบที่ดี
BobDoolittle

30

ฉันจะตรวจสอบก่อนว่ามีการติดตั้ง (อาจเป็น):

dpkg -l | grep iptables

บน Ubuntu iptables ไม่ใช่บริการ ในการหยุดมันคุณต้องทำสิ่งต่อไปนี้:

sudo iptables-save > /root/firewall.rules
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

ในการกู้คืนกฏก่อนหน้าของคุณ:

iptables-restore < /root/firewall.rules

สิ่งนี้นำมาจากhttp://www.cyberciti.biz/faq/turn-on-turn-off-firewall-in-linux/และได้รับการทดสอบในการติดตั้ง Ubuntu 8.X และ 9.10 จำนวนมาก


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

17

Iptables เป็นคำสั่งไม่ใช่บริการดังนั้นโดยทั่วไปไม่สามารถใช้คำสั่งเช่น

service iptables start

หรือ

service iptables stop

เพื่อเริ่มและหยุดไฟร์วอลล์ แต่ distros บางอย่างเช่น centos ได้ติดตั้งบริการที่เรียกว่า iptables เพื่อเริ่มและหยุดไฟร์วอลล์และไฟล์การกำหนดค่าเพื่อกำหนดค่า อย่างไรก็ตามเป็นไปได้ที่จะให้บริการจัดการการแก้ไข ipotables หรือติดตั้งสคริปต์สำหรับขอบเขตนี้ บริการทั้งหมดใน linux, ubuntu ไม่ใช่ข้อยกเว้นคือสคริปต์ที่เรียกใช้งานได้ภายในโฟลเดอร์ /etc/init.d ซึ่งใช้อินเตอร์เฟสมาตรฐาน (เริ่มหยุดหยุดรีสตาร์ท) สคริปต์ที่เป็นไปได้มีลักษณะดังนี้:

 #!/bin/sh -e
 ### BEGIN INIT INFO
 # Provides:          iptables
 # Required-Start:    mountvirtfs ifupdown $local_fs
 # Default-Start:     S
 # Default-Stop:      0 6
 ### END INIT INFO

 # July 9, 2007
 # James B. Crocker <ubuntu@james.crocker.name>
 # Creative Commons Attribution - Share Alike 3.0 License (BY,SA)
 # Script to load/unload/save iptables firewall settings.

 PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin"

 IPTABLES=/sbin/iptables
 IPTABLES_SAVE=/sbin/iptables-save
 IPTABLES_RESTORE=/sbin/iptables-restore

 IPTABLES_CONFIG=/etc/iptables.conf

 [ -x $IPTABLES ] || exit 0

 . /lib/lsb/init-functions


 case "$1" in
 start)
    log_action_begin_msg "Starting firewall"
         type usplash_write >/dev/null 2>/dev/null && usplash_write "TIMEOUT 120" || true
    if $IPTABLES_RESTORE < $IPTABLES_CONFIG ; then
        log_action_end_msg $?
    else
        log_action_end_msg $?
    fi
         type usplash_write >/dev/null 2>/dev/null && usplash_write "TIMEOUT 15" || true
    ;;

 stop)
    log_action_begin_msg "Saving current firewall configuration"
    if $IPTABLES_SAVE > $IPTABLES_CONFIG ; then
        log_action_end_msg $?
    else
        log_action_end_msg $?
    fi
    log_action_begin_msg "Flushing ALL firewall rules from chains!"
    if $IPTABLES -F ; then
        log_action_end_msg $?
    else
        log_action_end_msg $?
    fi
    log_action_begin_msg "Deleting ALL firewall chains [Warning: ACCEPTING ALL PORT SERVICES!]"
    if $IPTABLES -X ; then
        $IPTABLES -P INPUT ACCEPT
        $IPTABLES -P FORWARD ACCEPT
        $IPTABLES -P OUTPUT ACCEPT
        log_action_end_msg $?
    else
        log_action_end_msg $?
    fi
    ;;

 save)
    log_action_begin_msg "Saving current firewall configuration"
    if $IPTABLES_SAVE > $IPTABLES_CONFIG ; then
        log_action_end_msg $?
    else
        log_action_end_msg $?
    fi
    ;;

 force-reload|restart)
    log_action_begin_msg "Reloading firewall configuration [Warning: POTENTIAL NETWORK INSECURITY DURING RELOAD]"
    $IPTABLES -F
    $IPTABLES -X
    if $IPTABLES_RESTORE < $IPTABLES_CONFIG ; then
        log_action_end_msg $?
    else
        log_action_end_msg $?
    fi
    ;;

 *)
    echo "Usage: /etc/init.d/iptables {start|stop|save|restart|force-reload}"
    exit 1
    ;;
 esac

 exit 0 

สคริปต์นี้เป็นส่วนหนึ่งของบทช่วยสอนนี้คำสั่งทั้งหมดในการกำหนดค่าไฟร์วอลล์จะต้องแทรกตามสคริปต์ข้างต้นลงในไฟล์ /etc/iptables.conf สคริปต์นี้ต้องถูกแทรกลงในไฟล์ชื่อiptablesใน /etc/init.d และทำให้สามารถเรียกใช้งานได้โดยใช้

chmod+x *iptables* 

และเพิ่มบริการเพื่อ runlevels โดยใช้

update-rc.d iptables defaults

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

ฉันหวังว่านี่จะเป็นประโยชน์กับทุกคน


6

เนื่องจากทั้ง iptables และ ufw เป็นวิธีการจัดการไฟร์วอลล์netfilterใน Linux และเนื่องจากทั้งสองมีให้ใช้งานตามค่าเริ่มต้นใน Ubuntu คุณสามารถใช้กฎไฟร์วอลล์ทั้งเริ่มและหยุด (และจัดการ)

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

sudo ufw disable # เพื่อปิดไฟร์วอลล์

sudo ufw enable # เพื่อเปิดใช้งานไฟร์วอลล์

หากต้องการดูการใช้งานการตั้งค่าไฟร์วอลล์ปัจจุบันหรือsudo ufw status verboseiptables -L

หน้าเอกสารชุมชนของ Ubuntu บนiptablesและUFWมีข้อมูลมากมาย


3

ดูเหมือนจะมีวิธีจัดการไฟร์วอลล์ใน Ubuntu หลายวิธีดังนั้นคุณอาจสนใจอ่านสิ่งนี้: https://help.ubuntu.com/community/IptablesHowTo#Configuration%20on%20startup

หากต้องการวางกฎปัจจุบันทั้งหมดคุณสามารถใช้คำสั่งเหล่านี้ (วางไว้ในบางสคริปต์):

iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -P PREROUTING ACCEPT
iptables -t mangle -P INPUT ACCEPT
iptables -t mangle -P FORWARD ACCEPT
iptables -t mangle -P OUTPUT ACCEPT
iptables -t mangle -P POSTROUTING ACCEPT
iptables -t mangle -F
iptables -t mangle -X
iptables -t filter -P INPUT ACCEPT
iptables -t filter -P FORWARD ACCEPT
iptables -t filter -P OUTPUT ACCEPT
iptables -t filter -F
iptables -t filter -X

ในกรณีปกติกฎไฟร์วอลล์เริ่มต้นของคุณบันทึกไว้ในบางไฟล์ (ตัวอย่างเช่น /etc/iptables.rules) ในขณะที่คำสั่งระบบการบูตiptables-restore </etc/iptables.rulesดำเนินการโหลดกฎไฟร์วอลล์ ดังนั้นการรันคำสั่งเดียวกันหลังจากที่คุณทิ้งกฎทั้งหมดโดยใช้คำสั่งข้างต้นจะส่งผลให้ "รีโหลดไฟร์วอลล์" ซึ่งคุณถาม


2

ถ้าฉันจำได้อย่างถูกต้องวิธีที่แนะนำในการตั้งค่า iptables ในคู่มือ Ubuntu คือการตั้งค่าเป็นส่วนหนึ่งของสคริปต์เครือข่าย ซึ่งหมายความว่าไม่มีสคริปต์ /etc/init.d/iptables เหมือนใน BSD style OS


มีอยู่ใน Debian Woody (มี Ubuntu อยู่ไหม?) แล้วมันยังคงใช้งานได้โดย sysadmins วันนี้ ทำไมพวกเขาถึงเปลี่ยนความคิดนั้น

ฉันไม่ใช่เบาะแส ... แต่ฉันดูเหมือนจะจำได้ว่ามันเป็นหนึ่งในสิ่งที่น่ารำคาญที่ฉันต้องคิดออกเมื่อฉันตั้งค่าเซิร์ฟเวอร์อูบุนตู 9.10 หรืออะไรบางอย่าง ... เนื่องจากฉันต้องการ distro รุ่นที่มี postgres เมื่อเร็ว ๆ นี้และ สำหรับเซิร์ฟเวอร์ ... มิฉะนั้นฉันเรียกใช้ arch linux
xenoterracide

2

สร้างไฟล์ใน /etc/init.d/

touch fw.rc

ทำให้ไฟล์เรียกทำงาน chmod + x

ทำ symlink ให้กับไฟล์นั้นใน /etc/rc2.d/

ln -s /etc/init.d/fw.rc S80firewall

แก้ไข S80firewall และเพิ่มรายการต่อไปนี้

iptables --flush
iptables --table nat --flush
iptables --delete-chain
iptables --table nat --delete-chain

echo "1" > /proc/sys/net/ipv4/ip_forward
iptables -F

คุณสามารถเพิ่มกฎ iptables ที่คุณกำหนดเองทั้งหมดลงในไฟล์นี้

ตอนนี้คุณสามารถรีสตาร์ทไฟร์วอลล์ (iptables) โดยเรียกใช้ /etc/rc2.d/S80firewall (ต้องเป็น root)


2

ฉันมีปัญหาเดียวกัน อันที่จริงไม่มี iptables-persistent ใน/etc/init.d

ดังนั้นฉันจึงสร้างไฟล์ถาวร iptables /etc/init.d

nano /etc/init.d/iptables-persistent

และเขียนสิ่งต่อไปนี้ภายใน:

#!/bin/sh
#       Written by Simon Richter <sjr@debian.org>
#       modified by Jonathan Wiltshire <jmw@debian.org>
#       with help from Christoph Anton Mitterer
#

### BEGIN INIT INFO
# Provides:          iptables-persistent
# Required-Start:    mountkernfs $local_fs
# Required-Stop:     $local_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# X-Start-Before:    $network
# X-Stop-After:      $network
# Short-Description: Set up iptables rules
# Description:       Loads/saves current iptables rules from/to /etc/iptables
#  to provide a persistent rule set during boot time
### END INIT INFO

. /lib/lsb/init-functions

rc=0

load_rules()
{
    log_action_begin_msg "Loading iptables rules"

    #load IPv4 rules
    if [ ! -f /etc/iptables/rules.v4 ]; then
        log_action_cont_msg " skipping IPv4 (no rules to load)"
    else
        log_action_cont_msg " IPv4"
        iptables-restore < /etc/iptables/rules.v4 2> /dev/null
        if [ $? -ne 0 ]; then
            rc=1
        fi
    fi

    #load IPv6 rules    
    if [ ! -f /etc/iptables/rules.v6 ]; then
        log_action_cont_msg " skipping IPv6 (no rules to load)"
    else
        log_action_cont_msg " IPv6"
        ip6tables-restore < /etc/iptables/rules.v6 2> /dev/null
        if [ $? -ne 0 ]; then
            rc=1
        fi
    fi

    log_action_end_msg $rc
}

save_rules()
{
    log_action_begin_msg "Saving rules"

    #save IPv4 rules
    #need at least iptable_filter loaded:
    /sbin/modprobe -q iptable_filter
    if [ ! -f /proc/net/ip_tables_names ]; then
        log_action_cont_msg " skipping IPv4 (no modules loaded)"
    elif [ -x /sbin/iptables-save ]; then
        log_action_cont_msg " IPv4"
        iptables-save > /etc/iptables/rules.v4
        if [ $? -ne 0 ]; then
            rc=1
        fi
    fi

    #save IPv6 rules
    #need at least ip6table_filter loaded:
    /sbin/modprobe -q ip6table_filter
    if [ ! -f /proc/net/ip6_tables_names ]; then
        log_action_cont_msg " skipping IPv6 (no modules loaded)"
    elif [ -x /sbin/ip6tables-save ]; then
        log_action_cont_msg " IPv6"
        ip6tables-save > /etc/iptables/rules.v6
        if [ $? -ne 0 ]; then
            rc=1
        fi
    fi

    log_action_end_msg $rc
}

flush_rules()
{
    log_action_begin_msg "Flushing rules"

    if [ ! -f /proc/net/ip_tables_names ]; then
        log_action_cont_msg " skipping IPv4 (no module loaded)"
    elif [ -x /sbin/iptables ]; then
        log_action_cont_msg " IPv4"
        for param in F Z X; do /sbin/iptables -$param; done
        for table in $(cat /proc/net/ip_tables_names)
        do
            /sbin/iptables -t $table -F
            /sbin/iptables -t $table -Z
            /sbin/iptables -t $table -X
        done
        for chain in INPUT FORWARD OUTPUT
        do
            /sbin/iptables -P $chain ACCEPT
        done
    fi

    if [ ! -f /proc/net/ip6_tables_names ]; then
        log_action_cont_msg " skipping IPv6 (no module loaded)"
    elif [ -x /sbin/ip6tables ]; then
        log_action_cont_msg " IPv6"
        for param in F Z X; do /sbin/ip6tables -$param; done
        for table in $(cat /proc/net/ip6_tables_names)
        do
            /sbin/ip6tables -t $table -F
            /sbin/ip6tables -t $table -Z
            /sbin/ip6tables -t $table -X
        done
        for chain in INPUT FORWARD OUTPUT
        do
            /sbin/ip6tables -P $chain ACCEPT
        done
    fi

    log_action_end_msg 0
}

case "$1" in
start|restart|reload|force-reload)
    load_rules
    ;;
save)
    save_rules
    ;;
stop)
    # Why? because if stop is used, the firewall gets flushed for a variable
    # amount of time during package upgrades, leaving the machine vulnerable
    # It's also not always desirable to flush during purge
    echo "Automatic flushing disabled, use \"flush\" instead of \"stop\""
    ;;
flush)
    flush_rules
    ;;
*)
    echo "Usage: $0 {start|restart|reload|force-reload|save|flush}" >&2
    exit 1
    ;;
esac

exit $rc

และให้สิทธิ์ chmod 755

chmod 755 /etc/init.d/iptables-persistent

ตอนนี้มันทำงานได้อย่างสมบูรณ์แบบ! หวังว่ามันจะช่วยใครซักคน


2

หากคุณใช้เซิร์ฟเวอร์ Ubuntu ในฐานะแขก VM (เช่นใน VirtualBox) อาจเปิดใช้งานlibvirt หากเป็นเช่นนั้น libvirt จะมีตัวกรองเครือข่ายที่สร้างขึ้นซึ่งใช้ iptables ตัวกรองเหล่านี้อาจถูกกำหนดค่าตามที่อธิบายไว้ในส่วนของไฟร์วอลล์ในnwfilters

หากต้องการปิดใช้งานกฎ iptables คุณจะต้องลบกฎที่ละเมิดทั้งหมดออกจาก libvirt หรือคุณสามารถปิดการใช้งาน libvirt หากคุณไม่ได้ใช้งาน - เช่นติดตั้ง config override ที่กำหนดเอง (จากนั้นรีบูต):

sudo bash -c 'echo "manual" > /etc/init/libvirt-bin.override'


1

ไม่มีค่าเริ่มต้น แต่ใน debian อนุพันธ์ล่าสุด (รวมถึง Ubuntu) คุณสามารถติดตั้งบริการเพื่อจัดการiptables :

sudo apt install iptables-persistent

จากนั้นคุณสามารถโหลดกฎที่บันทึกไว้ก่อนหน้านี้:

systemctl start netfilter-persistent

ตรวจสอบสิ่งที่เกิดขึ้น:

systemctl status netfilter-persistent

netfilter-persistent.service - netfilter persistent configuration

       Loaded: loaded (/lib/systemd/system/netfilter-persistent.service; enabled; vendor preset: enabled)
       Active: active (exited) since Sun 2019-03-24 10:49:50 IST; 16min ago
     Main PID: 1674 (code=exited, status=0/SUCCESS)
        Tasks: 0
       Memory: 0B
          CPU: 0
       CGroup: /system.slice/netfilter-persistent.service

Mar 24 10:49:50 ubuntu systemd[1]: Starting netfilter persistent configuration...
Mar 24 10:49:50 ubuntu netfilter-persistent[1674]: run-parts: executing /usr/share/netfilter-persistent/plugins.d/15-ip4tables start
Mar 24 10:49:50 ubuntu netfilter-persistent[1674]: Warning: skipping IPv4 (no rules to load)
Mar 24 10:49:50 ubuntu netfilter-persistent[1674]: run-parts: executing /usr/share/netfilter-persistent/plugins.d/25-ip6tables start
Mar 24 10:49:50 ubuntu netfilter-persistent[1674]: Warning: skipping IPv6 (no rules to load)
Mar 24 10:49:50 ubuntu systemd[1]: Started netfilter persistent configuration.
Mar 24 11:02:49 ubuntu systemd[1]: Started netfilter persistent configuration.

หรือหยุดบริการ:

systemctl stop netfilter-persistent

ตามค่าเริ่มต้นการหยุดบริการจะไม่ล้าง iptables (เช่นจะไม่ปิดใช้งานไฟร์วอลล์ดูman netfilter-persistent)

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