iptables的state只有四種NEW、ESTABLISHED、INVALID、RELATED相較於TCP/IP illustrated作者richard steven提到的TCP狀態差異頗大,因為兩者之間真的不大一樣,可以想到UDP就理論上沒啥state,iptables為了判斷,當然在中間加上很多東西,我們可以看一下richard steven的TCP的state diagram
TCP
iptables使用ip_conntrack模組來追蹤連線狀態,並且配合xt_state/state模組來記錄狀態
- 當iptables收到一個來自client端的syn封包的時候,他就會把狀態設定為NEW,並且等待server端的反應
- 當server回應了syn/ack封包到達iptables的時候,他就會把該連線的狀態變成ESTABLISHED
當iptables將該TCP連線標記為ESTABLISHED的話,表示已經完成了three way handshake,但是如果再432000 s內沒有封包流過這個連線,iptables一樣會取消這個連線狀態
UDP
同理,UDP對於iptables一樣
當iptables收到第一個UDP封包的時候,會建立一個紀錄source IP, destination IP, source port #, destination port #,然後把狀態設定為NEW
當server回應給client一個封包的時候,就會跟上面記錄的source跟destination相反,這時候將狀態改為ESTABLISHED
在狀態為NEW的時候,有一段時間(30 s)可以等待server反應,不然則清除該連線;在狀態為ESTABLISHED的時候,若是一段時間(180 s)沒有傳輸資料,同樣會清除連線
ICMP
ICMP跟UDP類似,但是由於ICMP封包大多為單一封包,在ESTABLISHED狀態之後很快的會被清除連線
前面看到的都是NEW跟ESTABLISHED,那麼何謂RELATED狀態呢?所謂RELATED狀態泛指NEW之後所產生出來的額外連線,比方說TCP的passive mode,或者ICMP的 time exceeded封包,他們通常是回應給某個特定的source IP,但是根本身建立NEW狀態的封包的destination IP不同(ICMP case),或者port #不同(TCP case)
除了以上三種狀態之外的就通通定義為INVALID狀態,通常防火牆對這類封包就直接丟棄
2 則留言:
應該是432000 ms吧 @@"
是43200 s沒錯,長達五天,事實上使用會有人把它改小,比方說使用BT,會有些連線占用tables很長一段時間,甚至有table full的困擾
解決方案分兩種,一種就是把table弄大,一種是把timeout時間縮短
改table大小:
改的方式有兩種,一種是把數值塞到/proc內
echo "數值" > /proc/sys/net/ipv4/ip_conntrack_max
但是問題是/proc根本是臨時系統,重開機就不見
另一種就是寫到/etc/sysctl.conf
sysctl -w net.ipv4.ip_conntrack_max=
改timeout大小:
方式跟理由同上
echo "數值" > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established
sysctl -w net.ipv4.ip_conntrack_tcp_timeout_established=數值
張貼留言