本文介紹25個經常使用的iptables用法。若是你對iptables還不甚瞭解,能夠參考上一篇iptables詳細教程:基礎、架構、清空規則、追加規則、應用實例,看完這篇文章,你就能明白iptables的用法和本文提到的基本術語。ios
iptables -F (OR) iptables --flush
iptables的filter表中有三種鏈:INPUT, FORWARD和OUTPUT。默認的鏈策略是ACCEPT,你能夠將它們設置成DROP。數據庫
iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT DROP
你須要明白,這樣作會屏蔽全部輸入、輸出網卡的數據包,除非你明確指定哪些數據包能夠經過網卡。服務器
如下規則將屏蔽BLOCK_THIS_IP所指定的IP地址訪問本地主機:網絡
BLOCK_THIS_IP="x.x.x.x" iptables -A INPUT -i eth0 -s "$BLOCK_THIS_IP" -j DROP (或者僅屏蔽來自該IP的TCP數據包) iptables -A INPUT -i eth0 -p tcp -s "$BLOCK_THIS_IP" -j DROP
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT
本規則容許全部來自外部的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
本規則和上述規則有所不一樣,本規則意在容許本機發起SSH鏈接,上面的規則與此正好相反。tcp
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
如下規則僅容許來自192.168.100.0/24的網絡:ide
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
上例中,你也可使用-s 192.168.100.0/255.255.255.0做爲網絡地址。固然使用上面的CIDR地址更容易讓人明白。oop
如下規則僅容許從本地主機鏈接到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
# 1.容許HTTP鏈接:80端口 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 # 2.容許HTTPS鏈接:443端口 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
本規則能夠容許用戶從本地主機發起HTTPS鏈接,從而訪問Internet。spa
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協議(80端口)。
經過指定-m 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
iptables -A OUTPUT -p udp -o eth0 --dport 53 -j ACCEPT iptables -A INPUT -p udp -i eth0 --sport 53 -j ACCEPT
若是你在使用NIS管理你的用戶帳戶,你須要容許NIS鏈接。即便你已容許SSH鏈接,你仍需容許NIS相關的ypbind鏈接,不然用戶將沒法登錄。NIS端口是動態的,當ypbind啓動的時候,它會自動分配端口。所以,首先咱們須要獲取端口號,本例中使用的端口是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.每次系統啓動時調用腳本得到NIS相關端口,並根據上述iptables規則添加到filter表中去。
你可能啓用了rsync服務,可是又不想讓rsync暴露在外,只但願可以從內部網絡(192.168.101.0/24)訪問便可:
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
你可能啓用了MySQL服務,但只但願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
郵件服務都使用了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
# IMAP: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
# POP3:110 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:995 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
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: 當達到100個鏈接後,才啓用上述25/minute限制
若是本地主機有兩塊網卡,一塊鏈接內網(eth0),一塊鏈接外網(eth1),那麼可使用下面的規則將eth0的數據路由到eht1:
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
如下規則將會把來自422端口的流量轉發到22端口。這意味着來自422端口的SSH鏈接請求與來自22端口的請求等效。
# 1.啓用DNAT轉發 iptables -t nat -A PREROUTING -p tcp -d 192.168.102.37 --dport 422 -j DNAT --to-destination 192.168.102.37:22 # 2.容許鏈接到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
假設如今外網網關是xxx.xxx.xxx.xxx,那麼若是咱們但願把HTTP請求轉發到內部的某一臺計算機,應該怎麼作呢?
iptables -t nat -A PREROUTING -p tcp -i eth0 -d xxx.xxx.xxx.xxx --dport 8888 -j DNAT --to 192.168.0.2:80 iptables -A FORWARD -p tcp -i eth0 -d 192.168.0.2 --dport 80 -j ACCEPT
當該數據包到達xxx.xxx.xxx.xxx後,須要將該數據包轉發給192.168.0.2的80端口,事實上NAT所作的是修改該數據包的目的地址和目的端口號。而後再將該數據包路由給對應的主機。
可是iptables會接受這樣的須要路由的包麼?這就由FORWARD鏈決定。咱們經過第二條命令告訴iptables能夠轉發目的地址爲192.168.0.2:80的數據包。再看一下上例中422端口轉22端口,這是同一IP,所以不須要設置FORWARD鏈。
以下命令表示把全部10.8.0.0網段的數據包SNAT成192.168.5.3的ip而後發出去:
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j snat --to-source 192.168.5.3
對於snat,不論是幾個地址,必須明確的指定要snat的IP。假如咱們的計算機使用ADSL撥號方式上網,那麼外網IP是動態的,這時候咱們能夠考慮使用MASQUERADE
iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j MASQUERADE
能夠利用iptables的-m nth擴展,及其參數(–counter 0 –every 3 –packet x),進行DNAT路由設置(-A PREROUTING -j DNAT –to-destination),從而將負載平均分配給3臺服務器:
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
# 1.新建名爲LOGGING的鏈 iptables -N LOGGING# 2.將全部來自INPUT鏈中的數據包跳轉到LOGGING鏈中 iptables -A INPUT -j LOGGING # 3.指定自定義的日誌前綴"IPTables Packet Dropped: " iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "IPTables Packet Dropped: " --log-level 7 # 4.丟棄這些數據包 iptables -A LOGGING -j DROP