iptables四個表五條鏈
阿新 • • 發佈:2019-01-06
在啟用了iptables web伺服器上,流量高的時候經常會出現下面的錯誤:
ip_conntrack: table full, dropping packet
這個問題的原因是由於web伺服器收到了大量的連線,在啟用了iptables的情況下,iptables會把所有的連線都做連結跟蹤處理,這樣iptables就會有一個連結跟蹤表,當這個表滿的時候,就會出現上面的錯誤。
iptables的連結跟蹤表最大容量為/proc/sys/net/ipv4/ip_conntrack_max,連結碰到各種狀態的超時後就會從表中刪除。
所以解決方法一般有兩個:
(1) 加大 ip_conntrack_max 值
vi /etc/sysctl.conf
net.ipv4.ip_conntrack_max = 393216
net.ipv4.netfilter.ip_conntrack_max = 393216
(2): 降低 ip_conntrack timeout時間
vi /etc/sysctl.conf
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 300
net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 120
net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60
net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120
上面兩種方法打個比喻就是燒水水開的時候,換一個大鍋。一般情況下都可以解決問題,但是在極端情況下,還是不夠用,怎麼辦?
這樣就得反其道而行,用釜底抽薪的辦法。iptables的raw表是不做資料包的連結跟蹤處理的,我們就把那些連線量非常大的連結加入到iptables raw表。
如一臺web伺服器可以這樣:
iptables -t raw -A PREROUTING -d 1.2.3.4 -p tcp --dport 80 -j NOTRACK
iptables -A FORWARD -m state --state UNTRACKED -j ACCEPT
ip_conntrack: table full, dropping packet
這個問題的原因是由於web伺服器收到了大量的連線,在啟用了iptables的情況下,iptables會把所有的連線都做連結跟蹤處理,這樣iptables就會有一個連結跟蹤表,當這個表滿的時候,就會出現上面的錯誤。
iptables的連結跟蹤表最大容量為/proc/sys/net/ipv4/ip_conntrack_max,連結碰到各種狀態的超時後就會從表中刪除。
所以解決方法一般有兩個:
(1) 加大 ip_conntrack_max 值
vi /etc/sysctl.conf
net.ipv4.ip_conntrack_max = 393216
net.ipv4.netfilter.ip_conntrack_max = 393216
(2): 降低 ip_conntrack timeout時間
vi /etc/sysctl.conf
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 300
net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 120
net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60
net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120
上面兩種方法打個比喻就是燒水水開的時候,換一個大鍋。一般情況下都可以解決問題,但是在極端情況下,還是不夠用,怎麼辦?
這樣就得反其道而行,用釜底抽薪的辦法。iptables的raw表是不做資料包的連結跟蹤處理的,我們就把那些連線量非常大的連結加入到iptables raw表。
如一臺web伺服器可以這樣:
iptables -t raw -A PREROUTING -d 1.2.3.4 -p tcp --dport 80 -j NOTRACK
iptables -A FORWARD -m state --state UNTRACKED -j ACCEPT