iptables學習筆記

iptables傳輸數據包的過程
① 當一個數據包進入網卡時,它首先進入PREROUTING鏈,內核根據數據包目的IP判斷是否須要轉送出去。 
② 若是數據包就是進入本機的,它就會沿着圖向下移動,到達INPUT鏈。數據包到了INPUT鏈後,任何進程都會收到它。本機上運行的程序能夠發送數據包,這些數據包會通過OUTPUT鏈處理,而後到達POSTROUTING鏈輸出。 
③ 若是數據包是要轉發出去的,且內核容許轉發,數據包就會如圖所示向右移動,通過FORWARD鏈,而後到達POSTROUTING鏈輸出。網絡

1. 表:
   mangle: 拆開報文,改變包的(TOS/TTL/MARK)標誌位。建議不加任何過濾,也只是建議哈。
   nat: 用於轉換包的源地址和目標地址。流的第一個包會進行匹配,後面的包會作按第一個包同樣處理。包括DNAT/SNAT/MASQUERADE。
   filter: 用於過濾,對包的抉擇ACCEPT或者DROP。
   raw:狀態追蹤,列外放行。
規則表之間的優先順序:
Raw——mangle——nat——filtertcp

2. 鏈:
   PREROUTING: 全部進入的包最早進入的鏈
   POSTROUTING: 全部發送包最後經過的鏈
   INPUT: 進入本地的鏈,過濾全部目的地址是本機地址的數據包
   OUTPUT: 本地發送出去的鏈,過濾源地址是本機地址的數據包
   FORWARD: 轉發的鏈,不進入本地ui

   一般有三種狀態:
   a) 進入本地的包:NETWORK-->(mangle)PREROUTING-->(nat)PREROUTING-->-->(mangle)INPUT-->(filter)INPUT-->
   b) 從本地發出的包:-->(mangle)OUTPUT-->(nat)OUTPUT-->(filter)OUTPUT-->(mangle)POSTROUTING-->(nat)POSTROUTING-->NETWORK
   c) 路由的包:NETWORK-->(mangle)PREROUTING-->(nat)PREROUTING-->-->(mangle)FORWARD-->(filter)FORWARD-->(mangle)POSTROUTING-->(nat)POSTROUTING-->NETWORK代理

filter表——三個鏈:INPUT、FORWARD、OUTPUT
Nat表——三個鏈:PREROUTING、POSTROUTING、OUTPUT
Mangle表——五個鏈:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD
Raw表——兩個鏈:OUTPUT、PREROUTING日誌

3. 狀態防火牆:全部狀態的改變和計算都是在nat表中的PREROUTING鏈和OUTPUT鏈裏完成的。進程

4. 狀態記錄表:/proc/net/ip_conntrack
   [UNREPLIED]鏈接尚未收到迴應
   [ASSURED]兩個方向已無流量
   當記錄錶慢的時候,沒有[ASSURED]標記的記錄將被刪除。
   記錄條數目能夠設置:/proc/sys/net/ipv4/ip_conntrack_maxip

5. 數據包的四種狀態:
   NEW: conntrack看到的某個鏈接的第一個包,並無收到對方的應答。
   ESTABLISHED: 數據已經在兩個方向進行了傳輸。有應答就算,好比ICMP的錯誤返回包。
   RELATED: 當和ESTABLISHED狀態又發生新鏈接時候。好比ftp-data和ftp-control。
   INVALID: 無效,一般DROP。路由

語法: iptables [-t table] command [match] [target/jump]
   table 對哪一個表的操做,默認是filter表
   match 根據什麼對包進行匹配
   target 匹配到的數據包如何處理get

1. command 能夠見iptables的幫助 iptables -h
2. match. -p 匹配協議。協議在/etc/protocols中定義。默認的是tcp,udp,icmp。
3. match. -s,-d 匹配源地址和目的地址。能夠是單個IP,也能夠是網絡地址。192.168.0.0/24
4. match. -f 匹配被分片的包的第二片和後面的全部片。
5. match. -m multiport --source-port 22,110 多端口匹配
6. match. -m owner --pid-owner 78 對某個進程匹配(另外如--uid-owner,--sid-owner)
7. DNAT target 改寫目的IP地址,只能用在nat表中的PREROUTING鏈和OUTPUT鏈中。
   SNAT target 改寫源IP地址,只用於nat表中的POSTROUTING鏈中。
   iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT --to-destination 192.168.1.9
   # 將全部的訪問15.45.23.67:80端口的數據作DNAT發到192.168.1.9:80
   若是和192.168.1.9在同一內網的機器要訪問15.45.23.67,防火牆還須要作設置,改變源IP爲防火期內網IP 192.168.1.1。不然數據包直接發給內網機器,對方將丟棄。
   iptables -t nat -A POSTROUTING -p tcp --dst 15.45.23.67 --dport 80 -j SNAT --to-source 192.168.1.1
   # 將全部的訪問15.45.23.67:80端口的數據包源IP改成192.168.1.1
   若是防火牆也須要訪問15.45.23.67:80,則須要在OUTPUT鏈中添加,由於防火牆本身發出的包不通過PREROUTING。
   iptables -t nat -A OUTPUT --dst 15.45.23.67 --dport 80 -j DNAT --to-destination 192.168.1.9
8. MASQUERADE target
 和SNAT target相似。不使用--to-source,由於假裝的,不須要指定源IP,只可選用--to-ports指定端口。對於靜態IP,一般使用SNAT,保留鏈接跟蹤,對於動態IP,一般使用MASQUERADE,不保留鏈接跟蹤,但會佔用更多的開銷。
9. MIRROR target
 顛倒IP頭中的源地址與目的地址,再轉發。
10. REDIRECT target
 在防火牆內部轉發包到另一個端口,只用在nat表的PREROUTING鏈和OUTPUT鏈中。經常使用在透明代理中。
   iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080-8090
11. REJECT target
 和DROP基本同樣。可是DROP不返回錯誤信息,REJECT能夠指定返回的錯誤信息。
   iptables -A FORWARD -p TCP --dport 22 -j REJECT --reject-with icmp-net-unreachable
12. RETURN target
 返回上一層,順序是:子鏈——>父鏈——>缺省的策略。
13. TTL target
 用來更改包的TTL,有些ISP根據TTL來判斷是否是有多臺機器共享鏈接上網。
   iptables -t mangle -A PREROUTING -i eth0 -j TTL --ttl-set 64
   iptables -t mangle -A PREROUTING -i eth0 -j TTL --ttl-dec 1
   # 離開防火牆的時候實際上TTL已經-2了,由於防火牆自己要-1一次。
   iptables -t mangle -A PREROUTING -i eth0 -j TTL --ttl-inc 1
   # 離開防火牆的時候不增不減,tracert就很差用了,呵呵。
14. LOG target
 在內核空間記錄日誌,dmesg等才能看。
15. ULOG target
 在用戶空間記錄日誌。it

打開轉發IP功能(IP forwarding): echo "1" > /proc/sys/net/ipv4/ip_forward 若是使用PPP、DHCP等動態IP,須要打開: echo "1" > /proc/sys/net/ipv4/ip_dynaddr

相關文章
相關標籤/搜索