nf_conntrack_max
を変更しようとしたときにうまく変更できない場合にどうぞ。
状況
-
/etc/modprobe.d/nf_conntrack.conf
(以下、設定ファイル)(nf_conntrack.conf
のファイル名は任意)に設定したoptions nf_conntrack hashsize=[設定値]
が、iptables 再起動時に反映できない。 - このとき、 iptables のほかに ip6tables を実行している。
原因
説明
- iptables と ip6tables の両方を実行中の時にどちらかを再起動しても、設定ファイルの値が反映できない。
- iptables と ip6tables がどちらかが実行されるとき、nf_conntrack モジュール(以下、モジュール)がロードされる。
- 設定ファイルはモジュールのロード時に読み込まれる。
- iptables, ip6tables 停止時、モジュールはアンロードされる。
- しかし、iptables, ip6tables どちらかが引き続き実行中の時は、モジュールはアンロードされない。iptables, ip6tables どちらもが nf_conntrack モジュールに依存しているためである。
再現
モジュール ロード状況の確認
[root@hb-agent-test ~]# lsmod | grep conntrack
nf_conntrack_ipv4 9506 2
nf_defrag_ipv4 1483 1 nf_conntrack_ipv4
nf_conntrack_ipv6 8337 2
nf_defrag_ipv6 27236 1 nf_conntrack_ipv6
nf_conntrack 80390 3 nf_conntrack_ipv4,nf_conntrack_ipv6,xt_state
ipv6 334932 31 nf_conntrack_ipv6,nf_defrag_ipv6,ip6t_REJECT
[root@test ~]# service iptables stop
iptables: チェインをポリシー ACCEPT へ設定中filter [ OK ]
iptables: ファイアウォールルールを消去中: [ OK ]
iptables: モジュールを取り外し中: [ OK ]
[root@test ~]# lsmod | grep conntrack
nf_conntrack_ipv6 8337 2
nf_defrag_ipv6 27236 1 nf_conntrack_ipv6
nf_conntrack 80390 2 nf_conntrack_ipv6,xt_state
ipv6 334932 31 nf_conntrack_ipv6,nf_defrag_ipv6,ip6t_REJECT
[root@test ~]# service ip6tables stop
ip6tables: チェインをポリシー ACCEPT に設定中: filter [ OK ]
ip6tables: ファイアウォールルールを消去中: [ OK ]
ip6tables: モジュールを取り外し中: [ OK ]
[root@test ~]# lsmod | grep conntrack
[root@test ~]#
対策
/etc/sysctl.conf
に も 同じ設定を記述して読み込む
設定ファイルにも記述を行いつつ、/etc/sysctl.conf
にも記述。これだと即反映可能。設定値を8倍する1のをお忘れなく。
# echo "net.nf_conntrack_max = [設定値 * 8]" >> /etc/sysctl.conf
# sysctl -p
全て停止して全て起動し直す
iptables, ip6tables を全て停止の上で再起動する。これだと、/etc/sysctl.conf
には手を入れずとも値の反映が可能。
# service ip6tables stop
# service iptables restart
# service ip6tables start
ip6tables を動かさない
IPv6 を使っていないのならあり。
マシンを再起動する
テスト機や開発機など、マシン再起動が許される環境・状況の場合はどうぞ。
備考
-
nf_conntrack_max
の上限値変更は、/etc/sysctl.conf
よりも/etc/modprobe.d/nf_conntrack.conf
に記載することが望ましい2。 - RHEL/CentOS 5系だと、
nf_conntrack
はip_conntrack
と変数名が違う3ので注意。