このエントリーをはてなブックマークに追加

iptables の ip_conntrack の最大値を変更する方法

iptables を使っているとき、接続数が増えてくると /var/log/messages に次のようなエラーが表示されることがあります。

Aug  2 23:44:44 s13 kernel: ip_conntrack: table full, dropping packet.
Aug  2 23:44:51 s13 last message repeated 10 times
Aug  2 23:45:40 s13 kernel: printk: 2 messages suppressed.

このエラーメッセージの意味は iptables の ip_conntrack という接続テーブルが一杯になってパケットが破棄されたという意味です。詳しいことは、「中〜大規模サーバーを運用するときの勘所 – iptablesとip_conntrack」に解説されています。

まず、現在の ip_conntrack の最大値を確認するには、次のコマンドで確認します。

$ cat /proc/sys/net/ipv4/ip_conntrack_max
65535

どうやら、8GB メモリのマシンでも 65535 に設定されるようです。

次に、現在の ip_conntrack の数を確認するには、次のコマンドで確認します。

$ cat /proc/sys/net/ipv4/netfilter/ip_conntrack_count
53663

netfilter の FAQ をみると、ip_conntrack の 1 コネクションあたり 350 バイトのメモリを必要とのことです。 また、64MB なら 4096 個ということで、搭載物理メモリ容量 8GB で計算して 524288 に設定してみることにしました。

ip_conntrack の最大値を変更するには、/etc/sysctl.conf に次の内容を追記します。

# Maximum number of conntrack
net.ipv4.netfilter.ip_conntrack_max = 524288

あとは、この設定を有効にするために、次のコマンドを実行します。

$ sudo sysctl -p

念のため、 /proc/sys/net/ipv4/ip_conntrack_max を確認しておきます。

これで一晩様子を見ましたが、特にエラーメッセージもメモリ不足にもなっていないようなので問題がなくなりました。

iptables の ip_conntrack サイズは、現代のサーバマシンにとってかなり低いのでロードバランサーなどトラフィックが集中するサーバには忘れずに設定しておきたいものです。

One Comments

Comments are closed.