一、前言
firewall(防火墻):工作在網絡進入或者流包,進出的網絡數據包進行一定的規則進行檢查過濾系統。包括iptables和netfilter組件。
iptables 是與 Linux 內核集成的 IP 信息包過濾系統。如果 Linux 系統連接到因特網或 LAN、服務器或連接 LAN 和因特網的代理服務器, 則該系統系統中更好地控制 IP 信息包過濾和防火墻配置。
netfilter/iptables IP 信息包過濾系統是一種功能強大的工具,可用于添加、編輯和除去規則,這些規則是在做信息包過濾決定時,防火墻所遵循和組成的規則。這些規則存儲在專用的信 息包過濾表中,而這些表集成在 Linux 內核中。在信息包過濾表中,規則被分組放在我們所謂的鏈(chain)中。
雖然 netfilter/iptables IP 信息包過濾系統被稱為單個實體,但它實際上由兩個組件netfilter 和 iptables 組成。
netfilter 組件也稱為內核空間(kernelspace),是內核的一部分,由一些信息包過濾表組成,這些表放置在在整個linux內部網絡通信流程的若干位置放置了一些檢測點(HOOK),而在每個檢測點上登記了一些表來對數據包進行處理。
iptables 組件是一種工具,也稱為用戶空間(userspace),它使插入、修改和除去信息包過濾表中的規則變得容易。
簡單理解,iptables只是Linux防火墻的管理工具而已,位于/sbin/iptables。真正實現防火墻功能的是 netfilter,它是Linux內核中實現包過濾的內部結構。
二、工作原理
如果主機開啟路由功能及未設置防火墻。當網絡數據包需要通過主機,首先經過(PREROUTING)進行判斷,是流入主機用戶空間還是進行路由,如果進入用戶空間則經過(INPUT),進行處理加工后,然后通過(OUTPUT)到達(POSTROUTONG),如果進行路由,則經過(FORWARD)到達(POSTROUTONG),到達后然后傳輸出去。
上面講解(PREROUTING),(INPUT),(OUTPUT),(FORWARD),(POSTROUTONG)為iptables上的五鏈,還存在四表分別是:
filter:過濾規則表,根據管理預定義的一組規則過濾符合條件的數據包
nat:地址轉換規則表,對IP地址進行偽裝修改,隱藏自己的真實地址。
mangle:修改數據標記位規則表,主要用于修改數據包的TOS(Type Of Service,服務類型)、TTL(Time To Live,生存周期)指以及為數據包設置Mark標記,以實現Qos(Quality Of Service,服務質量)調整以及策略路由等應用。詳細講解:http://blog.jobbole.com/90008/
raw:跟蹤數據表路由規則表一個數據包到達時,是怎么依次穿過各個鏈和表的(圖)。
基本步驟如下:
1. 數據包到達網絡接口,比如 eth0。
2. 進入 raw 表的 PREROUTING 鏈,這個鏈的作用是趕在連接跟蹤之前處理數據包。
3. 如果進行了連接跟蹤,在此處理。
4. 進入 mangle 表的 PREROUTING 鏈,在此可以修改數據包,比如 TOS 等。
5. 進入 nat 表的 PREROUTING 鏈,可以在此做DNAT,但不要做過濾。
6. 決定路由,看是交給本地主機還是轉發給其它主機。
到了這里我們就得分兩種不同的情況進行討論了,一種情況就是數據包要轉發給其它主機,這時候它會依次經過:
7. 進入 mangle 表的 FORWARD 鏈,這里也比較特殊,這是在第一次路由決定之后,在進行最后的路由決定之前,我們仍然可以對數據包進行某些修改。
8. 進入 filter 表的 FORWARD 鏈,在這里我們可以對所有轉發的數據包進行過濾。需要注意的是:經過這里的數據包是轉發的,方向是雙向的。
9. 進入 mangle 表的 POSTROUTING 鏈,到這里已經做完了所有的路由決定,但數據包仍然在本地主機,我們還可以進行某些修改。
10. 進入 nat 表的 POSTROUTING 鏈,在這里一般都是用來做 SNAT ,不要在這里進行過濾。
11. 進入出去的網絡接口。完畢。
另一種情況是,數據包就是發給本地主機的,那么它會依次穿過:
7. 進入 mangle 表的 INPUT 鏈,這里是在路由之后,交由本地主機之前,我們也可以進行一些相應的修改。
8. 進入 filter 表的 INPUT 鏈,在這里我們可以對流入的所有數據包進行過濾,無論它來自哪個網絡接口。
9. 交給本地主機的應用程序進行處理。
10. 處理完畢后進行路由決定,看該往那里發出。
11. 進入 raw 表的 OUTPUT 鏈,這里是在連接跟蹤處理本地的數據包之前。
12. 連接跟蹤對本地的數據包進行處理。
13. 進入 mangle 表的 OUTPUT 鏈,在這里我們可以修改數據包,但不要做過濾。
14. 進入 nat 表的 OUTPUT 鏈,可以對防火墻自己發出的數據做 NAT 。
15. 再次進行路由決定。
16. 進入 filter 表的 OUTPUT 鏈,可以對本地出去的數據包進行過濾。
17. 進入 mangle 表的 POSTROUTING 鏈,同上一種情況的第9步。注意,這里不光對經過防火墻的數據包進行處理,還對防火墻自己產生的數據包進行處理。
18. 進入 nat 表的 POSTROUTING 鏈,同上一種情況的第10步。
19. 進入出去的網絡接口。完畢。
三、iptables簡單使用
iptables命令的使用格式:
iptables [-t table] {-A|-C|-D} chain rule-specification
ip6tables [-t table] {-A|-C|-D} chain rule-specification
iptables [-t table] -I chain [rulenum] rule-specification
iptables [-t table] -R chain rulenum rule-specification
iptables [-t table] -D chain rulenum
iptables [-t table] -S [chain [rulenum]]
iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options…]
iptables [-t table] -N chain
iptables [-t table] -X [chain]
iptables [-t table] -P chain target
iptables [-t table] -E old-chain-name new-chain-name
rule-specification = [matches…] [target]
match = -m matchname [per-match-options]
target = -j targetname [per-target-options]
規則的編寫格式:iptables [-t table] COMMAND chain [-m matchname [per-match-options]] [-j targetname [per-target-options]]
-t table:
默認為filter;其它可用的有raw, mangle, nat;
COMMAND:
鏈:
-P:policy,策略,定義默認策略; 一般有兩種選擇,ACCEPT和DROP;
-N:new,新建一條自定義的規則鏈;被內建鏈上的規則調用才能生效;[-j chain_name];
-X:drop,刪除自定義的引用計數為0的空鏈;
-F:flush,清空指定的鏈;
-E:重命名自定義的引用計數和為0的鏈;
規則:
-A:append,追加,在指定鏈的尾部追加一條規則;
-I:insert,插入,在指定的位置(省略位置時表示鏈首)插入一條規則;
-D:delelte,刪除,刪除指定的規則;
-R:replace,替換,將指定的規則替換為新規則;不能僅修改規則中的部分,而是整條規則完全替換;
查看:
-L:list,列出表中的鏈上的規則;
-n:numeric,以數值格式顯示;
-v:verbose,顯示詳細格式信息;
-vv, -vvv
-x:exactly,計數器的精確結果;
–line-numbers:顯示鏈中的規則編號;
重置規則計數器:
-Z:zero,置0;
chain:
(1) 內建鏈;
(2) 自定義鏈;
處理動作(目標)
-j targetname [per-target-options]
targetname:
ACCEPT:接受;
DROP:丟棄;
REJECT:拒絕;
寫好規則后進行保存及還原規則
centos 7:保存 # iptables-save > /PATH/TO/FILE 或 iptables -S > /PATH/TO/FILE
還原 # iptables-restore < /PATH/TO/FILE
舉幾個簡單例子:
iptables -P INPUT ACCEPT
iptables -F
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp –dport 22 -j ACCEPT
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
iptables -L -v
現在屏幕輸出是這樣的:
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all — lo any anywhere anywhere
0 0 ACCEPT all — any any anywhere anywhere state RELATED,ESTABLISHED
0 0 ACCEPT tcp — any any anywhere anywhere tcp dpt:ssh
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
理解上面幾條命令實際做了什么:
1、iptables -P INPUT ACCEPT 假如利用遠程連接,我們必須臨時將 INPUT 鏈的缺省政策改為 ACCEPT,否則當我們清除現有的規則集時,便會將自己封鎖在服務器之外。
2、iptables -F 我們利用 -F 選項來清除一切現存的規則,好讓我們能夠在嶄新的狀態下加入的規則。
3、iptables -A INPUT -i lo -j ACCEPT 現在是時候加入一些規則了。我們利用 -A 選項來附加(新增)規則到某條鏈,而這里所指的是 INPUT 鏈。接著我們利用 -i 選項(interface「界面」之意)來指定那些符合或來自 lo(localhost、127.0.0.1)界面的封包。最后我們 -j(jump「跳至」)符合這條規則的目標動作:在這里是 ACCEPT。所以這條規則會導致所有轉至 localhost 界面的對內封包獲得接納。一般來說這是必須的,因為很多軟件預期能夠與 localhost 適配器溝通。
4、iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT 這是擔負起大部份工作的規則,而我們再一次將它加進(-A)INPUT 鏈內。這里我們利用 -m 選項來裝入一個模塊(state)。state 模塊能夠查看一個封包并判斷它的狀態是 NEW、ESTABLISHED 抑或 RELATED。NEW 指進入的封包屬于不是由主機初始化的新增連接。ESTABLISHED 及 RELATED 指進入的封包隸屬于一條現存的連接,或者與現存的連接有關系。
5、iptables -A INPUT -p tcp –dport 22 -j ACCEPT 現在我們加入一條規則來容許 SSH 通過 tcp 端口 22 來連接。這樣做是要防止我們連接到遠程系統的 SSH 連接意外地被封銷。我們稍后會更詳細解釋這條規則。
6、iptables -P INPUT DROP 這個 -P 選項設置某條規則鏈上的缺省政策。我們現在可以將 INPUT 鏈的缺省政策改為 DROP。意思就是,不符合任何一條規則的對內封包將會被丟棄。要是我們通過 SSH 遠程連接而沒有加入上一條規則,此刻我們便會被封鎖于系統之外。
7、iptables -P FORWARD DROP 同樣地,在這里我們將 FORWARD 鏈的缺省政策設為 DROP,因為我們并不是用計算機作為路由器,所以理應沒有任何封包路經它。
8、iptables -P OUTPUT ACCEPT 而最后,我們將 OUTPUT 鏈的缺省政策設為 ACCEPT,因為我們想容許所有對外的流量(由于我們信任我們的用戶)。
9、iptables -L -v 最后,我們可以列出(-L)剛加入的規則,并檢查它們是否被正確地裝入。
原創文章,作者:chenbin,如若轉載,請注明出處:http://www.www58058.com/74482