ip_conntrackの設定を変更しても初期値に戻る場合

概要

iptablesでは、パケットを解析するために ip_conntrack(nf_conntrack)というファイルを作って、そのパケットの情報を記録します。

このip_conntrack(nf_conntrack)に記録できる上限数を決めているのが、その上限を超えると新規セッショを弾きます。その際に /var/log/messages 等に以下のエラーを吐きます。
また、CentOS 6.xでは、「nf_conntrack」と名前が変更されてますので、エラーログの内容も変更されてます

その場合は、ip_conntrack(nf_conntrack)が溢れている状態です。

# CentOS 5.x
$ sudo cat /var/log/messages
Jul  7 10:00:46 testsv kernel: ip_conntrack: table full, dropping packet

# CentOS 6.x
Jul  7 10:00:46 testsv kernel: nf_conntrack: table full, dropping packet.

ip_conntrack(nf_conntrack)の 最大値を変更すれば、最大値が変更されますが、サーバーの再起動やiptablesを再起動すれば、初期値に戻るケースがありました。その際の対応策を紹介します

ip_conntrack(nf_conntrack)の最大値を変更する

ip_conntrack(nf_conntrack)の最大値を変更する方法を紹介します

現在のip_conntrack(nf_conntrack)の最大値を確認

現在の設定でのip_conntrackの最大値は以下のコマンドで確認できます。
Cent OSのバージョンで、参照している場所が違いますので注意して下さい。

# CentOS 5.x
$ sudo cat /proc/sys/net/ipv4/ip_conntrack_max
65536
 
CentOS 6.x
$ sudo /proc/sys/net/netfilter/nf_conntrack_max
net.nf_conntrack_max = 65536

ip_conntrack(nf_conntrack)の最大値を変更する

/etc/sysctl.conf の ip_conntrack_max(net.nf_conntrack_max) の値に変更したい最大値を設定します

# CentOS 5
$ sudo vi /etc/sysctl.conf
net.ipv4.netfilter.ip_conntrack_max = 2000000

# sysctlでも良いですが、CentOS 5.xではiptablesの初期化でsysctlの内容をみない場合もケースあるので、
/etc/modprobe.d/nf_conntrack.confを変更したほうが良いみたいです 

# CentOS 6
$ sudo vi /etc/sysctl.conf
net.nf_conntrack_max = 2000000

# 設定を反映します
$ sudo /sbin/sysctl -p

設定が反映されたか確認します
# CentOS 5.x
$ sudo cat /proc/sys/net/ipv4/ip_conntrack_max
2000000
 
CentOS 6.x
$ sudo /proc/sys/net/netfilter/nf_conntrack_max
net.nf_conntrack_max = 2000000

iptabel を再起動すると、ip_conntrack(nf_conntrack)が初期される場合の対処法

OSを再起動または、iptablesを再起動すると、ip_conntrack(nf_conntrack)の最大値が初期値(65536)に戻るケースがありました。

他のサイトではCentOS 5.xだとこの事象が発生しCentOS 6.x だと発生しないと記載されているWEBサイトがありましたが、私が運用しているCentOS 6.x でも、iptablesを再起動すると、ip_conntrack(nf_conntrack)の最大値が初期値(65536)に戻るケースが発生しました。

iptablesを再起動すると、ip_conntrack(nf_conntrack)が初期値になるか確認してみます

# iptablesのバージョンを確認します
$ rpm -qa | grep iptables
iptables-1.4.7-14.el6.x86_64
iptables-ipv6-1.4.7-14.el6.x86_64

# ip_conntrack(nf_conntrack)の最大値を確認します
$ sudo cat /proc/sys/net/netfilter/nf_conntrack_max
2000000

# iptablesを再起動します
$ sudo /etc/init.d/iptables restart
iptables: Setting chains to policy ACCEPT: filter          [  OK  ]
iptables: Flushing firewall rules:                         [  OK  ]
iptables: Unloading modules:                               [  OK  ]
iptables: Applying firewall rules:                         [  OK  ]

# ip_conntrack(nf_conntrack)の最大値が初期値に戻っています
$ sudo cat /proc/sys/net/netfilter/nf_conntrack_max
65536

iptablesを再起動すると、「Unloading iptables modules  [ ok ] 」となり、iptables モジュールアンロードされて初期値に戻ります。

iptables モジュールをアンロードしないように「/etc/sysconfig/iptables-config」のファイル内の「IPTABLES_MODULES_UNLOAD="no"」と設定して、モジュールがアンロードされないようにします

# iptables-config ファイルを編集します
$ sudo vi /etc/sysconfig/iptables-config
IPTABLES_MODULES_UNLOAD="no"

# 設定を反映します
$ sido /sbin/sysctl -p

# ip_conntrack(nf_conntrack)の最大値が変更されたか確認します
$ sudo cat /proc/sys/net/netfilter/nf_conntrack_max
20000

# iptabelを再起動して、最大値が初期値に戻ってないか確認します
$ sudo /etc/init.d/iptables restart
$ sudo cat /proc/sys/net/netfilter/nf_conntrack_max
20000

スポンサーリンク