什么是iptables
iptables是用於監控進/出服務器流量的一個工具,iptables使用一個叫做table的結構,而這些tables包含了一系列規則(set of rules),我們稱這些規則為chain,chain會過濾進/出服務器的數據包(data packets)。
當一個數據包與一個chain相匹配時,會被賦予一個target,而這個target可能是另一個chain,或者可能是以下幾種特殊值:
- ACCEPT:允許數據包通過
- DROP:不允許數據包通過
- RETURN:停止數據包在chain鏈中傳輸,並告知返回至前一個chain
而在iptables中有一個默認的table,我們稱之為filter,它包含了以下3個chain:
- INPUT:控制發送至服務器的數據包
- FORWARD:過濾發送至服務器的數據包,用於轉發至其他地方
- OUTPUT:過濾由服務器發出去的數據包
安裝iptables
注意:iptables執行時均在root用戶下進行。
一般來說,iptables是默認安裝在linux系統中的,當然也可以手動安裝:
# sudo apt-get update
# sudo apt-get install iptables
檢查iptables的版本:
# sudo iptables -V
iptables v1.4.21
查看當前iptables的信息:
# sudo iptables -L -v
在這里,-L
用於列出所有的規則,而-v
用於顯示詳細的信息。
如何自定義iptables規則
自定義一個新的規則,相當於是向其中添加一個chain,為此,我們需要使用-A
這個選項(其表示append)。此外,還有一些其他選項參數,介紹如下:
-i
:interface,后面添加想要過濾的網卡名稱,比如eth0
,lo
,docker0
等等;-p
:protocol,后面添加想要過濾的網絡協議名稱,比如tcp
,udp
,icmp
等等,此外還可以使用關鍵詞all
表示選擇所有的協議;-s
:source,表示數據流量的源地址,可以在其后面hostname或ip地址;-dport
:destination port,目標地址的端口號,比如https對應的是443等;-j
:target,后面跟着target的名字(即ACCEPT
,DROP
,RETURN
);
因此,添加一條新的規則,使用如下命令:
# sudo iptables -A <chain> -i <interface> -p <protocol(tcp/udp)> -s <source> --dport <port> -j <target>
比如說,我們想要阻擋指定ip地址的訪問,則可以通過如下命令簡歷規則:
# sudo iptables -A INPUT -s 192.168.1.3 -j DROP
設置后,由IP地址為192.168.1.3發送過來的數據包就會被丟棄掉。
此外,我們還可以指定一個IP地址范圍,比如,對於192.168.1.100-192.168.1.200這個范圍內的IP地址,我們都要將其過濾掉,則可以使用如下命令進行創建:
# sudo iptables -A INPUT -m iprange --src-range 192.168.1.100-192.168.1.200 -j DROP
注意,這里必須指定-m
選項以及iprange
模式,並使用--src-range
參數,后面跟着IP地址范圍,並且兩個IP地址間必須用-
連着。
如果想要刪除一條規則呢?
首先,我們需要查看當前可用的規則,命令如下:
# sudo iptables -L --line-numbers
然后,我們將會看到:
接着,就可以執行刪除操作了。為了刪除一個規則,需要指定對應的chain和標號(即num),比如,我們要刪除INPUT
鏈的第3條規則,則可以執行如下命令:
# sudo iptables -D INPUT 3
持久化自定義的iptables規則
新建的iptables規則是保留在內存中的,重新啟動機器后數據就消失了,因此,我們要對其進行持久化。只要執行如下命令即可:
# sudo /sbin/iptables-save
這一命令會將當前的規則保存至系統的配置文件中,當機器重啟時,會去讀取這份配置文件來還原iptables。
iptables進階介紹
前面經過一些簡單的操作,已經對iptables有了具象的了解。但事實上,iptables遠比想象的復雜的多。前面的例子中,我們只簡單介紹了Filter Table
這一種table,接下來,我們會進一步深入的介紹iptables。
我們重新認識一下iptables,這到底是個什么玩意兒呢?
簡單的說,iptables是構築Linux系統的防火牆的基礎,我們可以自定義設置一些規則,用於數據包的過濾。但是,其功能可不只是過濾,事實上,iptables可以理解為:
Tables which has Chains and the Chains which contains Rules.
即Tables --> Chains --> Rules,而rules用於控制數據包的input/output。
首先,iptables包含3種table,分別是: Filter Table,NAT table和Mangle table。
- Filter table:filter是iptables默認的table,就如我們上面演示的,我們在對filter table進行操作時,不需要指定table的名稱。如果對NAT table或Mangle table進行操作,則必須要指定(通過
-t
選項)。前面執行過的命令iptables -L
,相當於iptables -t filter -L
。- INPUT chain:
- FORWARD chain:
- OUTPUT chain:
- NAT table:NAT即Network address translation,網絡地址轉換。如果想要操作NAT table,則必須要指定名字,比如
iptables -t nat -L
- PREROUTING chain:在數據包被路由之前
- POSTROUTING chain:在數據包被路由之后
- OUTPUT chain
- Mangle table:
- PREROUTING chain
- OUTPUT chain
- FORWARD chain
- INPUT chain
- POSTROUTING chain
iptables總結如下:
參考: