netfilterモジュール

私の中でちょっと問題になった部分を共有します。

kernel: nf_conntrack: table full, dropping packet
このエラーでよく紹介されている解決方法が
sysctl.confに設定を追記してsysctl -pで設定を読み込ませるという方法です。

確かにこれでも問題はありません。わたしもこの方法でやってます。
ただし、iptablesを使っている方には問題がでる可能性があります。

conntrackテーブルはiptablesで利用されているnetfilterモジュールに設定される値ですので、iptablesを再起動など行ってしまうと一度そのモジュールが読み込みなおされることになり、設定が初期化されてしまいます。この事実を知らずにiptablesを再起動しちゃうと、混雑する深夜の時間帯にkernel: nf_conntrack: table full, dropping packetとなり、たたき起こされてしまうことになりかねません。私がそうです。^^;

これを回避するためは
sysctl.confではなくmodprobe.dディレクトリ配下に設定ファイルを置きます。

vi /etc/modprobe.d/conntrack.conf
options nf_conntrack hashsize=25000

例えば上記のように設定しておけばnetfilterモジュールの読み込み時(iptablesの再起動時)にこの設定が読み込まれ、値に合わせたテーブルサイズに変更してくれます。

ちなみにnf_conntrack_maxの値を200000にする場合は
hashsizeで8分の1の値(25000)を設定しておけば20万となります。

hashsizeで設定を行う場合は下記のパラメーターに変更が加えられます。
※下記は6系の例

あと、rhelの5系と6系でも違いがあります。
6系になるとiptablesの起動スクリプトでsysctlも親切に読み込んでくれるようになっています。なのでsysctl.confで設定しておいても値が初期化されることはなくなります。
※5系のiptablesの起動スクリプトではsysctlを読み込んでくれません。

ただし、modprobe.d配下の設定ファイルとsysctl.confのファイルが混在している場合は
modprobe.d配下の設定ファイルが優先されていますので注意が必要です。

sysctl.confで設定を増加させた後、6系なのでと安心しきっていると、
誰かがiptablesを再起動してmodprobe.dの設定が読み込まれて再度問題となるなんてこともあるかもしれませんよ。

linux

Posted by Akira


PAGE TOP