25個常用的防火牆規則之iptables
本文將給出25個iptables常用規則示例,這些例子為您提供了些基本的模板,您可以根據特定需求對其進行修改調整以達到期望。 格式
iptables [-t 表名] 選項 [鏈名] [條件] [-j 控制型別] 引數
- -P 設定預設策略:iptables -P INPUT (DROP|ACCEPT)
- -F 清空規則鏈
- -L 檢視規則鏈
- -A 在規則鏈的末尾加入新規則
- -I num 在規則鏈的頭部加入新規則
- -D num 刪除某一條規則
- -s 匹配來源地址IP/MASK,加歎號"!"表示除這個IP外。
- -d 匹配目標地址
- -i 網絡卡名稱 匹配從這塊網絡卡流入的資料
- -o 網絡卡名稱 匹配從這塊網絡卡流出的資料
- -p 匹配協議,如tcp,udp,icmp
- --dport num 匹配目標埠號
- --sport num 匹配來源埠號
示例
1. 刪除已有規則
在開始建立iptables規則之前,你也許需要刪除已有規則。
- 命令如下:
- iptables -F
- (or)
- iptables –flush
2.設定鏈的預設策略
鏈的預設政策設定為”ACCEPT”(接受),若要將INPUT,FORWARD,OUTPUT鏈設定成”DROP”(拒絕),命令如下:
- iptables -P INPUT DROP
- iptables -P FORWARD DROP
- iptables -P OUTPUT DROP
當INPUT鏈和OUTPUT鏈都設定成DROP時,對於每一個防火牆規則,我們都應該定義兩個規則。例如:一個傳入另一個傳出。在下面所有的例子中,由於我們已將DROP設定成INPUT鏈和OUTPUT鏈的預設策略,每種情況我們都將制定兩條規則。當然,如果你相信你的內部使用者,則可以省略上面的最後一行。例如:預設不丟棄所有出站的資料包。在這種情況下,對於每一個防火牆規則要求,你只需要制定一個規則——只對進站的資料包制定規則。
3. 阻止指定IP地址
例:丟棄來自IP地址x.x.x.x的包
- iptables -A INPUT -s x.x.x.x -j DROP
- 注:當你在log裡發現來自某ip地址的異常記錄,可以通過此命令暫時阻止該地址的訪問以做更深入分析
例:阻止來自IP地址x.x.x.x eth0 tcp的包
- iptables -A INPUT -i eth0 -s x.x.x.x -j DROP
- iptables -A INPUT -i eth0 -p tcp -s x.x.x.x -j DROP
4. 允許所有SSH的連線請求
例:允許所有來自外部的SSH連線請求,即只允許進入eth0介面,並且目標埠為22的資料包
- iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
- iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
5. 僅允許來自指定網路的SSH連線請求
例:僅允許來自於192.168.100.0/24域的使用者的ssh連線請求
- iptables -A INPUT -i eth0 -p tcp -s 192.168.100.0/24 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
- iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
6.允許http和https的連線請求
例:允許所有來自web - http的連線請求
- iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
- iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
例:允許所有來自web - https的連線請求
- iptables -A INPUT -i eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
- iptables -A OUTPUT -o eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT
7. 使用multiport 將多個規則結合在一起
允許多個埠從外界連入,除了為每個埠都寫一條獨立的規則外,我們可以用multiport將其組合成一條規則。如下所示: 例:允許所有ssh,http,https的流量訪問
- iptables -A INPUT -i eth0 -p tcp -m multiport --dports 22,80,443 -m state --state NEW,ESTABLISHED -j ACCEPT
- iptables -A OUTPUT -o eth0 -p tcp -m multiport --sports 22,80,443 -m state --state ESTABLISHED -j ACCEPT
8. 允許從本地發起的SSH
- iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
- iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
請注意,這與允許ssh連入的規則略有不同。本例在OUTPUT鏈上,我們允許NEW和ESTABLISHED狀態。在INPUT鏈上,我們只允許ESTABLISHED狀態。ssh連入的規則與之相反。
9. 僅允許從本地發起到一個指定的網路域的SSH請求
例:僅允許從內部連線到網域192.168.100.0/24
- iptables -A OUTPUT -o eth0 -p tcp -d 192.168.100.0/24 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
- iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
10. 允許從本地發起的HTTPS連線請求
下面的規則允許輸出安全的網路流量。如果你想允許使用者訪問網際網路,這是非常有必要的。在伺服器上,這些規則能讓你使用wget從外部下載一些檔案
- iptables -A OUTPUT -o eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
- iptables -A INPUT -i eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT
注:對於HTTP web流量的外聯請求,只需要將上述命令中的埠從443改成80即可。
11. 負載平衡傳入的網路流量
使用iptables可以實現傳入web流量的負載均衡,我們可以傳入web流量負載平衡使用iptables防火牆規則。 例:使用iptables nth將HTTPS流量負載平衡至三個不同的ip地址。
- iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 0 -j DNAT --to-destination 192.168.1.101:443
- iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 1 -j DNAT --to-destination 192.168.1.102:443
- iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 2 -j DNAT --to-destination 192.168.1.103:443
12. 允許外部主機ping內部主機
- iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
- iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
13. 允許內部主機ping外部主機
- iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
- iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
14. 允許迴環訪問
例:在伺服器上允許127.0.0.1迴環訪問。
- iptables -A INPUT -i lo -j ACCEPT
- iptables -A OUTPUT -o lo -j ACCEPT
15. 允許內部網路域外部網路的通訊
防火牆伺服器上的其中一個網絡卡連線到外部,另一個網絡卡連線到內部伺服器,使用以下規則允許內部網路與外部網路的通訊。此例中,eth1連線到外部網路(網際網路),eth0連線到內部網路(例如:192.168.1.x)。
- iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
16. 允許出站的DNS連線
- iptables -A OUTPUT -p udp -o eth0 --dport 53 -j ACCEPT
- iptables -A INPUT -p udp -i eth0 --sport 53 -j ACCEPT
17. 允許NIS連線
如果你使用NIS管理使用者帳戶,你需要允許NIS連線。如果你不允許NIS相關的ypbind連線請求,即使SSH連線請求已被允許,使用者仍然無法登入。NIS的埠是動態的,先使用命令rpcinfo –p來知道埠號,此例中為853和850埠。 rpcinfo -p | grep ypbind 例:允許來自111埠以及ypbind使用埠的連線請求
- iptables -A INPUT -p tcp --dport 111 -j ACCEPT
- iptables -A INPUT -p udp --dport 111 -j ACCEPT
- iptables -A INPUT -p tcp --dport 853 -j ACCEPT
- iptables -A INPUT -p udp --dport 853 -j ACCEPT
- iptables -A INPUT -p tcp --dport 850 -j ACCEPT
- iptables -A INPUT -p udp --dport 850 -j ACCEPT
注:當你重啟ypbind之後埠將不同,上述命令將無效。有兩種解決方案:1)使用你NIS的靜態IP 2)編寫shell指令碼通過“rpcinfo - p”命令自動獲取動態埠號,並在上述iptables規則中使用。
18. 允許來自指定網路的rsync連線請求
例:允許來自網路192.168.101.0/24的rsync連線請求
- iptables -A INPUT -i eth0 -p tcp -s 192.168.101.0/24 --dport 873 -m state --state NEW,ESTABLISHED -j ACCEPT
- iptables -A OUTPUT -o eth0 -p tcp --sport 873 -m state --state ESTABLISHED -j ACCEPT
19. 允許來自指定網路的MySQL連線請求
很多情況下,MySQL資料庫與web服務跑在同一臺伺服器上。有時候我們僅希望DBA和開發人員從內部網路(192.168.100.0/24)直接登入資料庫,可嘗試以下命令:
- iptables -A INPUT -i eth0 -p tcp -s 192.168.100.0/24 --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
- iptables -A OUTPUT -o eth0 -p tcp --sport 3306 -m state --state ESTABLISHED -j ACCEPT
20. 允許Sendmail, Postfix郵件服務
Sendmail和postfix都使用了25埠,因此我們只需要允許來自25埠的連線請求即可。
- iptables -A INPUT -i eth0 -p tcp --dport 25 -m state --state NEW,ESTABLISHED -j ACCEPT
- iptables -A OUTPUT -o eth0 -p tcp --sport 25 -m state --state ESTABLISHED -j ACCEPT
21. 允許IMAP和IMAPS
例:允許IMAP/IMAP2流量,埠為143
- iptables -A INPUT -i eth0 -p tcp --dport 143 -m state --state NEW,ESTABLISHED -j ACCEPT
- iptables -A OUTPUT -o eth0 -p tcp --sport 143 -m state --state ESTABLISHED -j ACCEPT
例:允許IMAPS流量,埠為993
- iptables -A INPUT -i eth0 -p tcp --dport 993 -m state --state NEW,ESTABLISHED -j ACCEPT
- iptables -A OUTPUT -o eth0 -p tcp --sport 993 -m state --state ESTABLISHED -j ACCEPT
22. 允許POP3和POP3S
例:允許POP3訪問
- iptables -A INPUT -i eth0 -p tcp --dport 110 -m state --state NEW,ESTABLISHED -j ACCEPT
- iptables -A OUTPUT -o eth0 -p tcp --sport 110 -m state --state ESTABLISHED -j ACCEPT
例:允許POP3S訪問
- iptables -A INPUT -i eth0 -p tcp --dport 995 -m state --state NEW,ESTABLISHED -j ACCEPT
- iptables -A OUTPUT -o eth0 -p tcp --sport 995 -m state --state ESTABLISHED -j ACCEPT
23. 防止DoS攻擊
- iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
- 上述例子中:
- -m limit: 啟用limit擴充套件
- –limit 25/minute: 允許最多每分鐘25個連線(根據需求更改)。
- –limit-burst 100: 只有當連線達到limit-burst水平(此例為100)時才啟用上述limit/minute限制。
24. 埠轉發
例:將來自422埠的流量全部轉到22埠。 這意味著我們既能通過422埠又能通過22埠進行ssh連線。啟用DNAT轉發。
- iptables -t nat -A PREROUTING -p tcp -d 192.168.102.37 --dport 422 -j DNAT --to 192.168.102.37:22
除此之外,還需要允許連線到422埠的請求
- iptables -A INPUT -i eth0 -p tcp --dport 422 -m state --state NEW,ESTABLISHED -j ACCEPT
- iptables -A OUTPUT -o eth0 -p tcp --sport 422 -m state --state ESTABLISHED -j ACCEPT
25. 記錄丟棄的資料表
第一步:新建名為LOGGING的鏈
- iptables -N LOGGING
第二步:將所有來自INPUT鏈中的資料包跳轉到LOGGING鏈中
- iptables -A INPUT -j LOGGING
第三步:為這些包自定義個字首,命名為”IPTables Packet Dropped”
- iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "IPTables Packet Dropped: " --log-level 7
第四步:丟棄這些資料包
- iptables -A LOGGING -j DROP
防火牆 匯入匯出
iptables-save 匯出防火牆規則
iptables-save >>/iptables.txt
iptables-restore 匯入防火牆規則
iptables-restore iptables.txt