2009年11月14日

防火牆-iptables的state(3)

這裡要先說明,因為一般許多人把iptables當作單機防火牆,這裡是一個網路防火牆,也就是server跟iptables並不在同一部機器上

iptables的state只有四種NEWESTABLISHEDINVALIDRELATED相較於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
當然,上面提到的state轉換是happy path,如果說client送出了syn封包,但是server在一段時間(目前為120 s)沒有回應syn/ack封包,則iptables會取消該連線狀態;相同的理由,client在一段時間內(60 s)沒有回應three way handshake的最後一個封包,iptables一樣會取消該連線狀態。

當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吧 @@"

Crazy Thought 提到...

是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=數值