http://www.linuxso.com/linuxpeixun/10332.html
先查看本機配置
- sudo iptables -L -n
如要重新配置,則先清除已有配置
- sudo iptables -F //清除預設表filter中的所有規則鏈的規則
- sudo iptables -X //清除預設表filter中使用者自定鏈中的規則
如果是遠程通過ssh連接服務器進行配置,則先加入允許ssh的規則
- sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
設定預設規則,DROP掉INPUT鏈與FORWARD鏈
- sudo iptables -P INPUT DROP
- sudo iptables -P FORWARD DROP
INPUT鏈規則配置
允許來自於lo接口的數據訪問本機
- sudo iptables -A INPUT -i lo -j ACCEPT
lo:loopback,回環接口,通常對應的IP地址為127.0.0.1(未開啟之前,本機不能ping通本機)
允許icmp包通過,也就是允許ping
- sudo iptables -A INPUT -p icmp -j ACCEPT
開啟web服務端口
- sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
FORWARD鏈規則配置
開啟轉發功能,(在做NAT時,FORWARD默認規則是DROP時,必須做)
- sudo iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
- sudo iptables -A FORWARD -i eth1 -o eh0 -j ACCEPT
丟棄壞的TCP包
- sudo iptables -A FORWARD -p TCP ! --syn -m state --state NEW -j DROP
處理IP碎片數量,防止攻擊,允許每秒100個
- sudo iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT
限制ICMP,允許每秒1個包,限制觸發條件是10個包
- sudo iptables -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT
保存及調用
- iptables-save > /etc/iptables.rules (可能需要切換至root用戶)
重啟后會失效,重新調用配置
- sudo iptables-restore < /etc/iptables.rules
設置自動保存與調用
- sudo vim /etc/network/interfaces
在
- auto ath0
- iface ath0 inet dhcp
后面加上
- # Auto save and restore iptables rules
- pre-up iptables-restore < /etc/iptables.rules
- post-down iptables-save > /etc/iptables.rules
解決INPUT DROP后,引起sshd服務DNS反向解析不順,從而導致登錄等待時間過長的問題:
vim /etc/ssh/sshd_config
在最后添加下面一行,關閉 SSH 的 DNS 反解析
UseDNS no
重啟sshd服務
sudo /etc/init.d/ssh restart
常見命令:
-A, --append 新增規則(追加方式)
-D, --delete 刪除規則
-L, --list 列出某規則鏈中的所有規則 iptables -L INPUT
常見參數:
-p, --protocol 指定協議
-s --source 源地址
-d, --dst, --destination 指定目的地址
-i, --in-interface 指定入口網卡 iptables -A INPUT -i eth0 (-i eth+ 所有網卡)
--out-interface -o 指定出口網卡 iptables -A INPUT -o eth0 (-i eth+ 所有網卡)
--dport, --destination-port 目的端口
-j 指定對包的處理(ACCEPT、DROP、REJECT、REDIRECT)
-A:指定鏈名
-p:指定協議類型
-d:指定目標地址
--dport:指定目標端口(destination port 目的端口)
--sport:指定源端口(source port 源端口)
-j:指定動作類型
對於防火牆的設置,有兩種策略:一種是全部通訊口都允許使用,只是阻止一些我們知道的不安全的或者容易被利用的口;另外一種,則是先屏蔽所有的通訊口,而只是允許我們需要使用的通訊端口。
- sudo iptables -P INPUT DROP //一旦執行,將馬上阻斷所有進站數據,遠程配置時,注意順序問題(ssh先加入允許)
- sudo iptables -P OUTPUT ACCEPT
- sudo iptables -P FORWARD DROP
注意-P中的P需要大寫,表示Protocol。
可以看出INPUT,FORWARD兩個鏈采用的是允許什么包通過,而OUTPUT鏈采用的是不允許什么包通過。
當超出了IPTABLES里filter表里的兩個鏈規則(INPUT、FORWARD)時,不在這兩個規則里的數據包怎么處理呢,那就是DROP(放棄)。應該說這樣配置是很安全的,我們要控制流入數據包。
而對於OUTPUT鏈,也就是流出的包我們不用做太多限制,而是采取ACCEPT,也就是說,不在這個規則里的包怎么辦呢,那就是通過。
為INPUT鏈添加規則
允許icmp包通過,也就是允許ping
允許loopback!(不然會導致DNS無法正常關閉等問題)
sudo iptables -A INPUT -i lo -p all -j ACCEPT
對於OUTPUT規則,因為預設的是ACCEPT,所以要添加DROP規則,減少不安全的端口鏈接。
- sudo iptables -A OUTPUT -p tcp --sport 31337 -j DROP
- sudo iptables -A OUTPUT -p tcp --dport 31337 -j DROP
有些特洛伊木馬會掃描端口31337到31340(即黑客語言中的 elite 端口)上的服務。既然合法服務都不使用這些非標准端口來通信,阻塞這些端口能夠有效地減少你的網絡上可能被感染的機器和它們的遠程主服務器進行獨立通信的機會。
我們還可以把規則限制到只允許某個IP:
- sudo iptables -A INPUT -s 192.168.0.18 -p tcp --dport 22 -j ACCEPT
這表示只允許192.168.0.18的機器進行SSH連接。
如果要允許一個IP段,可以使用下面的寫法:
- sudo iptables -A INPUT -s 192.168.0.1/255 -p tcp --dport 22 -j ACCEPT
這表示允許192.168.0.1/255IP段的機器進行連接。
但是,注意我們前面已經添加一條規則來允許所有IP連接22端口,需要把這條規則刪除掉。
- sudo iptables -D INPUT -p tcp --dport 22 -j ACCEPT
在下面就是FORWARD鏈,FORWARD鏈的默認規則是DROP,所以我們就寫需要ACCETP(通過)的鏈,對正在轉發鏈的監控
開啟轉發功能,(在做NAT時,FORWARD默認規則是DROP時,必須做)
- sudo iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
- sudo iptables -A FORWARD -i eth1 -o eh0 -j ACCEPT
丟棄壞的TCP包
- sudo iptables -A FORWARD -p TCP ! --syn -m state --state NEW -j DROP
處理IP碎片數量,防止攻擊,允許每秒100個
- sudo iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT
設置ICMP包過濾,允許每秒1個包,限制觸發條件是10個包(在前面只允許ICMP包通過,在這里作限制)
- sudo iptables -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT
例如我給SSH加放行的語句:
添加input記錄: iptables -A INPUT -p tcp --dport 22 -j ACCEPT
添加output記錄: iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT