轉載自: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)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框架中的值來進一步決定該如何處理該數據包
數據報從進入系統,進行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點的處理
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
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
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
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