netfilter框架和iptables

轉載自:http://blog.chinaunix.net/uid-23069658-id-3160506.htmlhtml

http://blog.chinaunix.net/uid-23069658-id-3243434.html前端

https://blog.csdn.net/jasonchen_gbd/article/details/44873089web

https://blog.csdn.net/fangxin205/article/details/54972153centos

1.網絡通訊的基本模型

  數據在協議棧的發送過程當中,發送方從上至下依次是「加頭」的過程,每到達一層數據就被會加上該層的頭部;與此同時,接受方就是個「剝頭」的過程,從網卡收上包來以後,在往協議棧的上層傳遞過程當中依次剝去每層的頭部,最終到達用戶那兒的就是裸數據了數組

2.Netfilter概念

1)Netfilter 是Linux內核中在網絡層進行控制和修改網絡數據包的實現框架,經常使用來數據包過濾、地址轉換(NAT)、鏈接跟蹤等安全

2)Netfilter 定義了一系列hook點,每一個hook點上能夠掛載多個hook函數,hook函數中能夠實現對數據包內容修改、過濾數據包等功能
服務器

3)全部的hook點都放在一個全局的二維數組,第一維爲協議族編號,第二維爲該協議族下的hook點個數網絡

 

  如IPv4協議(編號爲2)下的5個hook點app

PRE_ROUTING:     nf_hooks[2][0]框架

LOCAL_IN:           nf_hooks[2][1]

FORWARD:            nf_hooks[2][2]

LOCAL_OUT:         nf_hooks[2][3]

POST_ROUTING:  nf_hooks[2][4]

4)每一個hook點上的hook函數會按照優先級順序註冊到一個鏈表中,註冊的接口爲nf_register_hook()

5)hook函數返回值的說明:

NF_ACCEPT: 接受分組,使之穿過網絡實現中剩餘的協議層(或該hook點上後續的hook函數)。
NF_STOLEN:掛鉤函數竊取了一個分組,並處理了該分組,此時,該分組已與內核無關,沒必要再調用其餘掛鉤,還必須取消其餘協議層的處理。
NF_DROP::丟棄分組,其中的數據能夠釋放了。
NF_QUEUE:將分組置於一個等待隊列上,以便其數據能夠由用戶空間代碼處理。不會執行其餘hook函數
NF_REPEAT:再次調用該hook函數。

6)一個數據包按順序通過hook點,到達一個hook點後,會檢查該hook點是否註冊了用於處理數據包的hook函數,若是有,則挨個去調用鏈表上的hook函數,根據返回到Netfilter框架中的值來進一步決定該如何處理該數據包

3.Netfilter在內核中的位置

4.IPv4下的五個hook點

  數據報從進入系統,進行IP校驗之後,首先通過第一個HOOK點NF_IP_PRE_ROUTING進行處理;而後就進入路由代碼,其決定該數據報是須要轉發仍是發給本機的;若該數據報是發被本機的,則該數據通過HOOK點NF_IP_LOCAL_IN處理之後而後傳遞給上層協議;若該數據報應該被轉發則它被NF_IP_FORWARD處理;通過轉發的數據報通過最後一個HOOK函數NF_IP_POST_ROUTING處理之後,再傳輸到網絡上。本地產生的數據包通過HOOK點NF_IP_LOCAL_OUT 處理後,進行路由選擇處理,而後通過NF_IP_POST_ROUTING處理後發送出去。

簡單的說:

1)對於發往本地的數據包,會依次通過NF_INET_PRE_ROUTING和NF_INET_LOCAL_IN兩個hook點的處理

2)對於本地向外發出去的數據包,會依次通過NF_INET_LOCAL_OUT和NF_INET_POST_ROUTING兩個hook點的處理

3)對於經過本機轉發的數據包,會依次通過F_INET_PRE_ROUTING、NF_INET_FORWARD和NF_INET_POST_ROUTING三個hook點的處理

5.iptables命令

1)iptables的主要功能是實現系統對網絡數據包的進出和轉發

2)iptables用5張不一樣的表來存放iptables規則:

  filter表:對數據包進行過濾

  nat表:對數據包進行地址轉換

  mangle表:主要用來修改數據包

  raw表:高級功能,如:設置raw時通常是爲了避免再讓iptables作數據包的跟蹤鏈接處理,提升性能https://blog.csdn.net/qk1992919/article/details/51149043

  security表:centos系統中有,用於實現強制訪問控制安全模型

4個表的優先級由高到低的順序:raw-->mangle-->nat-->filter

3)iptables有5條規則鏈(5個hook點):

  INPUT鏈:處理輸入數據包

  OUTPUT鏈:處理輸出數據包

  FORWARD鏈:處理轉發數據包

  PREROUTING鏈:用於目的地址轉換(DNAT)

  POSTOUTING鏈:用於源地址轉換(SNAT)

PREROUTING鏈上即有mangle表,也有nat表,那麼先由mangle處理,而後由nat表處理,其他鏈也是如此

4)iptables規則的動做包括:

  ACCEPT:接收數據包

  DROP:丟棄數據包

  SNAT:源地址轉換

  DNAT:目的地址轉換

  MASQUERADE:ip地址假裝,算是SNAT中的一種特例,有着和SNAT相近的效果,能夠實現自動化的SNAT

  REDIRECT:重定向、映射、透明代理

  LOG:日誌記錄

5)下圖是IPv4協議中iptables在每一個hook點上默認註冊好註冊的hook函數,這些hook函數會去遍歷這些表中的iptables規則,並根據這些規則去處理數據包:

6)下圖這些默認註冊好的hook函數對應的iptables表:

7)iptables指令參數:

1. --proto -p proto protocol: by number or name, eg. `tcp'
2. --source -s address[/mask][...]. Source specification
3. --destination -d address[/mask][...]. Destination specification
4. --in-interface -i input name[+]. Network interface name ([+] for wildcard)
5. --jump -j target. Target for rule (may load target extension)
6. --goto -g chain. Jump to chain with no return 
7. --match -m match extended match (may load extension)
8. --numeric -n numeric output of addresses and ports
9. --out-interface -o output name[+]network interface name ([+] for wildcard)
10. --table -t table table to manipulate (default: `filter')
11. --verbose -v verbose mode
12. --line-numbers print line numbers when listing
13. --exact -x expand numbers (display exact values)
14. --fragment -f match second or further fragments only
15. --modprobe= try to insert modules using this command
16. --set-counters PKTS BYTES set the counter during insert/append
17. --version -V print package version.

8)指令舉例:

//在filter表的INPUT鏈上添加一條規則:將源地址爲192.168.100.122的icmp請求包丟棄(禁止別人ping我)
iptables -t filter -A INPUT -p icmp --icmp-type echo-request -s 192.168.100.122 -j DROP
//在filter表的INPUT鏈上刪除這條規則
iptables -t filter -D INPUT -p icmp --icmp-type echo-request -s 192.168.100.122 -j DROP
//在filter表的OUTPUT鏈上添加一條規則:將目的地址爲114.114.114.114的icmp請求包丟棄(禁止我ping別人)
iptables -t filter -A OUTPUT -p icmp --icmp-type echo-request -d 114.114.114.114 -j DROP
//在filter表的INPUT鏈上刪除這條規則
iptables -t filter -D OUTPUT -p icmp --icmp-type echo-request -d 114.114.114.114 -j DROP
//在filter表的FORWARD鏈上添加一條規則:將源地址爲192.168.100.100的數據包丟棄不轉發
iptables -t filter -A FORWARD -s 192.168.100.100 -j DROP

6.iptables命令中的SNAT、DNAT和MASQUERADE

6.1SNAT

1)SNAT(source network address translation),即源地址轉換。舉例來講,多個用戶鏈接路由器上網,每一個用戶都配置了內網IP,用戶訪問外網時,用戶將數據包發給路由器,路由器將數據包的報頭中的源地址(用戶的內網ip)替換成路由器的ip,再將數據包轉發給下一跳;下一跳收到數據包時,查看數據包的源地址將是路由器的ip地址,而不是用戶的ip地址

2)指令舉例:

//把全部10.8.0.0網段的數據包的源地址改爲192.168.5.3,再由eth0口發出
iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j SNAT --to-source 192.168.5.3
////把全部10.8.0.0網段的數據包的源地址改爲192.168.5.3或192.168.5.4或192.168.5.5,再由eth0口發出
iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j SNAT --to-source 192.168.5.3-192.168.5.5

6.2DNAT

1)DNAT(destination network address translation),即目的地址轉換。舉例來講,有個web服務器放在內網配置內網ip,前端有個防火牆配置公網ip,用戶使用公網ip來訪問這個網站,當訪問的時候,用戶發出一個數據包,這個數據包的目的地址是公網ip,因此這個數據包會發送到防火牆,防火牆收到數據包會把數據包的報頭裏的目的地址改爲web服務器的內網ip,而後再把這個數據包發送到內網的web服務器上

2)指令舉例:

//更改全部從eth0口進來的源地址爲192.168.1.0/24的數據包的目的地址爲1.2.3.4
iptables -t nat -A PREROUTING -s 192.168.1.0/24 -i eth0 -j DNAT --to 1.2.3.4

6.3MASQUERADE

1)MASQUERADE,ip地址假裝,算是SNAT中的一種特例,有着和SNAT相近的效果,能夠實現自動化的SNAT

2)使用SNAT的時候,出口的ip地址能夠是一個,也能夠是一個範圍,可是無論是幾個,都必須明確的寫出出口的ip;當系統採用動態撥號方式上網時,出口的ip時常發生變化,這個時候就使用MASQUERADE,自動地獲取當前出口的ip來作nat

3)指令舉例:

//把全部10.8.0.0網段的數據包的源地址動態地改爲出口的ip
iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j MASQUERADE
相關文章
相關標籤/搜索