Linux防火牆

如下命令在RHEL 6.x上執行經過,但也適用於其餘Linux發行版。linux

1.顯示防火牆的狀態服務器

以root權限運行下面的命令:網絡

# iptables -L -n -v

參數說明:併發

  • -L:列出規則。less

  • -v:顯示詳細信息。此選項會顯示接口名稱、規則選項和TOS掩碼,以及封包和字節計數。ssh

  • -n:以數字形式顯示IP地址和端口,不使用DNS解析。tcp

若是但願輸出的結果中顯示行號,能夠運行:測試

# iptables -L -n -v --line-nmubers

這樣,就能夠按照行號在防火牆中添加、刪除規則。ui

要顯示輸入或輸出鏈規則,能夠運行:spa

# iptables -L INPUT -n -v  # iptables -L OUTPUT -n -v --line-numbers

2.中止、開啓和重啓防火牆

若是你使用的是RHEL/Fedora/CentOS系統,能夠運行:

# service iptables stop  # service iptables start  # service iptables restart

咱們也能夠使用iptables命令中止防火牆並刪除全部規則:

# iptables -F  # iptables -X  # iptables -t nat -F  # iptables -t nat -X  # iptables -t mangle -F  # iptables -t mangle -X  # iptables -P INPUT ACCEPT  # iptables -P OUTPUT ACCEPT  # iptables -P FORWARD ACCEPT

參數說明:

  • -F:刪除全部的規則

  • -X:刪除鏈

  • -t table_name:匹配表(稱爲nat或mangle)

  • -P:設置默認策略(如DROP、REJECT或ACCEPT)

3.刪除防火牆規則

以帶行號的形式顯示已有的防火牆規則,請運行:

# iptables -L INPUT -n --line-numbers  # iptables -L OUTPUT -n --line-numbers  # iptables -L OUTPUT -n --line-numbers | less  # iptables -L OUTPUT -n --line-numbers | grep 202.54.1.1

下面咱們使用行號刪除規則:

# iptables -D INPUT 4

將IP地址202.54.1.1從規則中刪除:

# iptables -D INPUT -s 202.54.1.1 -j DROP

參數說明:

  • -D:從選擇的鏈中刪除一條或多條規則

4.插入防火牆規則

首先運行下面的命令:

# iptables -L INPUT -n --line-numbers

獲得運行結果:

Chain INPUT (policy DROP)  num  target    prot opt source     destination  1   DROP      all  --  202.54.1.1  0.0.0.0/0  2   ACCEPT    all  --  0.0.0.0/0    0.0.0.0/0

在行1和行2之間插入規則:

# iptables -I INPUT 2 -s 202.54.1.2 -j DROP

查看更新後的規則,會發現插入成功,下面是示例:

Chain INPUT (policy DROP)  Num  target    prot opt source    destination     1     DROP    all  --  202.54.1.1  0.0.0.0/0  2     DROP    all  --  202.54.1.2  0.0.0.0/0  3     ACCEPT  all  --  0.0.0.0/0    0.0.0.0/0

5.保存防火牆規則

在RHEL/Fedora/CentOS Linux下,能夠使用下面的命令保存防火牆規則:

# service iptables save

在其它Linux發行版(如Ubuntu)上,能夠使用iptables-save命令保存防火牆規則:

# iptables-save > /root/my.active.firewall.rules  # cat /root/my.active.firewall.rules

6.從新加載防火牆規則

咱們能夠使用iptables-restore命令從新加載使用iptables-save命令保存的防火牆規則:

# iptables-restore < /root/my.active.firewall.rules

咱們還能夠利用這種特性來快速部署防火牆規則。

7.設置默認防火牆策略

咱們首先來配置一個防火牆策略,它默認丟棄全部的網絡數據包:

# iptables -P INPUT DROP  # iptables -P OUTPUT DROP  # iptables -P FORWARD DROP  # iptables -L -v -n #鏈接失敗,由於防火牆丟棄全部的網絡數據包  # ping cyberciti.biz  # wget http://www.kernel.org/pub/linux/kernel/v3.0/testing/linux-3.2-rc5.tar.bz2

在此基礎上,咱們只關閉入站鏈接:

# iptables -P INPUT DROP  # iptables -P FORWARD DROP  # iptables -P OUTPUT ACCEPT  # iptables -A INPUT -m state --state NEW,ESTABLISHED -j ACCEPT  # iptables -L -v -n  #ping和wget能夠正常工做  # ping cyberciti.biz  # wget http://www.kernel.org/pub/linux/kernel/v3.0/testing/linux-3.2-rc5.tar.bz2

8.在公網網絡接口上停用私有網絡地址

咱們能夠從公網網絡接口上刪除私有IPv4網段,以防止IP欺騙。運行下面的命令,沒有源路由地址的數據包會被丟棄:

# iptables -A INPUT -i eth1 -s 192.168.0.0/24 -j DROP  # iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP

下面是私有網絡IPv4地址範圍,請確認在公網接口予以屏蔽:

  • 10.0.0.0/8 -j (A)

  • 172.16.0.0/12 (B)

  • 192.168.0.0/16 (C)

  • 224.0.0.0/4 (多播 D)

  • 240.0.0.0/5 (E)

  • 127.0.0.0/8 (迴環)

9.屏蔽IP地址訪問

若是咱們想屏蔽一個IP地址,好比1.2.3.4,能夠運行:

# iptables -A INPUT -s 1.2.3.4 -j DROP  # iptables -A INPUT -s 192.168.0.0/24 -j DROP

10.屏蔽入棧端口請求

若是咱們想80端口上屏蔽全部的服務請求,能夠運行:

# iptables -A INPUT -p tcp --dport 80 -j DROP  # iptables -A INPUT -i eth1 -p tcp --dport 80 -j DROP

只想屏蔽IP地址1.2.3.4對80端口的請求,能夠運行:

# iptables -A INPUT -p tcp -s 1.2.3.4 --dport 80 -j DROP  # iptables -A INPUT -i eth1 -p tcp -s 192.168.1.0/24 --dport 80 -j DROP

11.屏蔽出棧IP地址

如今咱們來演示如何屏蔽對主機名和IP地址的出棧訪問。

首先,咱們來獲取一個域名的IP地址:

# host -t a cyberciti.biz

輸出示例:

cyberciti.biz has address 75.126.153.206

要屏蔽訪問域名cyberciti.biz的網絡數據包,能夠運行:

# iptables -A OUTPUT -d 75.126.153.206 -j DROP

下面是使用子網掩碼的示例:

# iptables -A OUTPUT -d 192.168.1.0/24 -j DROP  # iptables -A OUTPUT -o eth1 -d 192.168.1.0/24 -j DROP

下面咱們以屏蔽facebook.com爲例,進行說明。首先,咱們須要facebook的全部IP地址:

# host -t a www.facebook.com

示例輸出:

www.facebook.com has address 69.171.228.40

找出IP地址69.171.228.40的CIDR:

# whois 69.171.228.40 | grep CIDR

示例輸出:

CIDR:69.171.224.0/19

如今咱們來阻止對facebook.com的訪問:

# iptables -A OUTPUT -p tcp -d 69.171.224.0/19 -j DROP

咱們也能夠直接屏蔽域名:

# iptables -A OUTPUT -p tcp -d www.facebook.com -j DROP  # iptables -A OUTPUT -p tcp -d facebook.com -j DROP

12.記錄並丟棄數據包

在公網網絡接口上記錄並丟棄IP地址欺騙數據包:

# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j LOG --log-prefix "IP_SPOOF A: "  # iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP

默認狀況下日誌記錄在/var/log/messages文件中:

# tail -f /var/log/messages  # grep --color 'IP SPOOF' /var/log/messages

咱們還能夠用-m參數對日誌記錄進行限制,以防止日誌文件過分膨脹。

# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -m limit --limit 5/m --limit-burst 7 -j LOG --log-prefix "IP_SPOOF A: "  # iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP

13.根據MAC地址容許或阻止數據包的傳入

咱們能夠根據MAC地址容許或阻止數據包的傳入:

# iptables -A INPUT -m mac --mac-source 00:0F:EA:91:04:08 -j DROP

14.屏蔽ICMP ping請求

咱們能夠經過容許下面的命令屏蔽ping請求:

# iptables -A INPUT -p icmp --icmp-type echo-request -j DROP  # iptables -A INPUT -i eth1 -p icmp --icmp-type echo-request -j DROP

也能夠按照特定的網段和主機限制ping請求:

# iptables -A INPUT -s 192.168.1.0/24 -p icmp --icmp-type echo-request -j ACCEPT

如下命令只接受受限制的ping請求:

#假定默認INPUT策略爲丟棄數據包  # iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT  # iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT  # iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT  #全部的服務器都對ping請求做出應答  # iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

15.開啓端口序列

下面的命令能夠容許7000到7010範圍內的TCP端口訪問:

# iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 7000:7010 -j ACCEPT

16.容許一系列IP地址訪問

下面的命令能夠容許IP地址範圍

#運行IP地址範圍192.168.1.100 到192.168.1.200 訪問80端口  # iptables -A INPUT -p tcp --destination-port 80 -m iprange --src-range 192.168.1.100-192.168.1.200 -j ACCEPT  #NAT示例  # iptables -t nat -A POSTROUTING -j SNAT --to-source 192.168.1.20-192.168.1.25

17.創建鏈接並重啓防火牆

當重啓iptables服務時,它會斷開全部已創建的鏈接。這是由於在重啓防火牆時,會卸載IPTABLES_MODULES_UNLOAD模塊。

要解決這個問題,能夠編輯/etc/sysconfig/iptables-config

IPTABLES_MODULES_UNLOAD = no

18.使用Crit日誌級別

# iptables -A INPUT -s 1.2.3.4 -p tcp --destination-port 80 -j LOG --log-level crit

19.屏蔽或開啓常見端口

屏蔽或開啓經常使用的TCP、UDP端口:

#能夠使用DROP替換ACCEPT,實現端口屏蔽。  #打開22端口(SSH)  # iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT  # iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 22 -j ACCEPT  #打開TCP/UDP631端口(打印服務)  # iptables -A INPUT -s 192.168.1.0/24 -p udp -m udp --dport 631 -j ACCEPT  # iptables -A INPUT -s 192.168.1.0/24 -p tcp -m tcp --dport 631 -j ACCEPT  # 打開123端口,容許局域網用戶進行NTP時間同步  # iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p udp --dport 123 -j ACCEPT  #打開25端口(SMTP)  # iptables -A INPUT -m state --state NEW -p tcp --dport 25 -j ACCEPT  # 打開DNS端口  # iptables -A INPUT -m state --state NEW -p udp --dport 53 -j ACCEPT  # iptables -A INPUT -m state --state NEW -p tcp --dport 53 -j ACCEPT  #打開http/https端口  # iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT  # iptables -A INPUT -m state --state NEW -p tcp --dport 443 -j ACCEPT  #打開TCP110端口(POP3)  # iptables -A INPUT -m state --state NEW -p tcp --dport 110 -j ACCEPT  #打開TCP143端口  # iptables -A INPUT -m state --state NEW -p tcp --dport 143 -j ACCEPT  #爲局域網用戶開啓Samba訪問  # iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 137 -j ACCEPT  # iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 138 -j ACCEPT  # iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 139 -j ACCEPT  # iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 445 -j ACCEPT  #爲局域網用戶開啓代理服務器訪問  # iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 3128 -j ACCEPT  #爲局域網用戶開啓MySQL訪問  # iptables -I INPUT -p tcp --dport 3306 -j ACCEPT

20.限制客戶端IP的併發鏈接數

咱們能夠使用connlimit模塊限制客戶端IP的併發鏈接數。下面的命令容許每一個客戶端只能併發3個ssh鏈接:

# iptables -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 3 -j REJECT

設置HTTP併發鏈接爲20個:

# iptables -p tcp --syn --dport 80 -m connlimit --connlimit-above 20 --connlimit-mask 24 -j DROP

參數說明:

  • --connlimit-above 3:鏈接數超過3個自動匹配

  • --connlimit-mask 24:子網掩碼匹配

更好的使用iptables

首先,咱們要學會查看man手冊:

$ man iptables

 咱們還能夠這樣查看幫助:

# iptables -h

咱們還能夠查看特定命令的幫助:

# iptables -j DROP -h

測試防火牆

測試端口是否開放:

# netstat -tulpn

測試TCP 80端口是否開放:

# netstat -tulpn | grep :80

若是80端口未開放,請確保啓動Apache服務器:

# service httpd start

並確保打開iptables防火牆80端口:

# iptables -L INPUT -v -n | grep 80

若是80端口沒有開放,能夠運行下面的命令:

# iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT  # service iptables save

下面使用telnet命令測試是否能夠鏈接到80端口:

$ telnet www.cyberciti.biz 80

下面是示例輸出:

Trying 75.126.153.206...  Connected to www.cyberciti.biz.  Escape character is '^]'.  ^]  telnet> quit  Connection closed.
相關文章
相關標籤/搜索