一、iptables:從這裡開始
删除現有規則
iptables -F
(OR)
iptables --flush
設定預設鍊政策
iptables的filter表中有三種鍊:INPUT, FORWARD和OUTPUT。預設的鍊政策是ACCEPT,你可以将它們設定成DROP。
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP #一般出站連接配接設定為ACEEPT,看需求
允許來自外部的ping測試
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
允許從本機ping外部主機
iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
二、iptables:協定與端口設定
允許所有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
允許從本地發起的SSH連接配接
本規則和上述規則有所不同,本規則意在允許本機發起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連接配接請求
以下規則僅允許來自192.168.100.0/24的網絡:
iptables -A INPUT -i eth0 -p tcp -s 192.168.100.0/24 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
上例中,你也可以使用-s 192.168.100.0/255.255.255.0作為網絡位址。當然使用上面的CIDR位址更容易讓人明白。
僅允許從本地發起到指定網絡的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
允許HTTP/HTTPS連接配接請求
# 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連接配接
本規則可以允許使用者從本地主機發起HTTPS連接配接,進而通路Internet。
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:指定多個端口
通過指定-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
允許出站DNS連接配接
iptables -A OUTPUT -p udp -o eth0 --dport 53 -j ACCEPT
iptables -A INPUT -p udp -i eth0 --sport 53 -j ACCEPT
防止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: 當達到100個連接配接後,才啟用上述25/minute限制
三、轉發與NAT
允許路由
如果本地主機有兩塊網卡,一塊連接配接内網(eth0),一塊連接配接外網(eth1),那麼可以使用下面的規則将eth0的資料路由到eht1:
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
MAC和位址的綁定
iptables -A FORWARD -s 192.18.30.10 -m mac --mac-source 00:13:21:25:E5:C8 -j ACCEPT
DNAT與端口轉發
以下規則将會把來自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
允許連接配接到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鍊。
# 2.SNAT與MASQUERADE
如下指令表示把所有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 -t nat -N BLUCK
iptables -t nat -F BLUCK
# 2.将所有來自POSTROUTING 鍊中的資料包跳轉到BLUCK鍊中
iptables -t nat -A POSTROUTING -j BLUCK
# 3.指定自定義規則
iptables -t nat -A BLUCK -s 192.168.30.0/24 -o eth0 -j MASQUERADE
本文轉自 Linux_woniu 51CTO部落格,原文連結:http://blog.51cto.com/linuxcgi/1965341