Article ID: 9630, created on Jan 6, 2012, last review on Aug 12, 2014

  • Applies to:
  • Virtuozzo containers for Linux 4.6
  • Virtuozzo containers for Linux 4.0
  • Virtuozzo for Linux 3.x

症状

注記: 本記事は、Parallels Containers 4.6 およびそれ以前のバージョンに対して有効です。
これより新しいバージョンの場合、こちらの記事を参照してください。

症状はさまざまですが、たとえば次のようなものがあります。
 
-          一部の iptables ルールが機能しない
 
-          NAT テーブルで iptables ルールを作成するか、STATE モジュールを使用すると、次のエラーが発生する
 
# iptables -t nat -L
iptables v1.3.5: can't initialize iptables table `nat': Table does not exist (do you need to insmod?) Perhaps iptables or your kernel needs to be upgraded.
#

原因

この問題は、通常、PVC HW ノードで接続追跡(“conntracks” モジュール)がデフォルトで無効化されているために発生します。つまり、デフォルトのインストール設定では、iptables はステートフルではありません。
以下と同じ結果が表示されるか確認することにより、これをチェックできます。
 
# grep conntrack /etc/modprobe.conf
options ip_conntrack ip_conntrack_disable_ve0=1
#

“conntracks” が無効化されている場合、NAT テーブルが iptables にありません。
 
# cat /proc/net/ip_tables_names
mangle
filter
#

 
従って、この HW ノードでは ip_nat および ipt_state モジュールを使用できません。

解決策

注: iptables の STATE モジュール機能は、INPUT および OUTPUT チェーンに明示的な補足ルールを追加して置き換えることができます。
 
この回避策に満足できない場合や NAT テーブルの機能が必要な場合は、ここから先に進んでください。
 
 
“conntracks” を有効化する前に、次の注記と警告を確認することをお勧めします。
 
警告 1: 接続追跡を有効化すると、大量のリソースが消費されます。
 
警告 2: “conntracks” を有効化すると、ネットワーク負荷が高いときに、ネットワークから HW ノードに全く到達できなくなる可能性があります
これは、物理サーバごとに接続追跡のスロット数が制限されているためです。 "conntracks" の有効化は、PVC HW ノードにおいては非常に危険です。これは、1 つのコンテナへの 1 つの接続ごとに 2 つの追跡スロットを割り当てるためです(外部接続用と、HW ノードとコンテナの接続用)。 従って、1 つのコンテナへの接続が余りに増えると、HW ノードが新しい接続を確立できなくなります。
このような状況は、任意のコンテナへの DDoS 攻撃によって発生する場合があります。 HW ノードの管理者はノードにログインできなくなるため、CT の停止や iptables ルールの追加によってこの状況を止めることができません。
 
 
“conntracks” を有効化する方法:
 
  1. 必要なすべてのモジュールをハードウェアノードにロードしたことを確認します。
    [root@pvcfl46x64 ~]# lsmod | grep ipt
    ipt_REDIRECT 34944 0
    iptable_nat 43404 0
    ip_nat 53520 4 ipt_REDIRECT,ip_nat_irc,ip_nat_ftp,iptable_nat
    ip_conntrack 101396 10 ip_conntrack_netbios_ns,ip_nat_irc,ip_nat_ftp,xt_helper,xt_conntrack,ip_conntrack_irc,ip_conntrack_ftp,xt_state,iptable_nat,ip_nat
    ipt_recent 43404 1
    ipt_LOG 39808 1
    ipt_TOS 35200 0
    ipt_ttl 34816 0
    ipt_TCPMSS 37248 0
    iptable_mangle 37888 1
    iptable_filter 37760 2
    ipt_tos 34560 0
    ipt_REJECT 39812 0
    ip_tables 57440 3 iptable_nat,iptable_mangle,iptable_filter
    x_tables 52744 21 ipt_REDIRECT,xt_helper,xt_conntrack,xt_state,iptable_nat,ipt_recent,ipt_LOG,ipt_TOS,xt_comment,xt_length,ipt_ttl,xt_tcpmss,ipt_TCPMSS,xt_multiport,xt_limit,ipt_tos,ipt_REJECT,ip_tables,ip6t_REJECT,xt_tcpudp,ip6_tables
    [root@pvcfl46x64 ~]#
  2. これらのモジュールをノードの iptables 構成に追加します。
    [root@pvcfl46x64 ~]# egrep '^IPTABLES_MODULES=' /etc/sysconfig/iptables-config
    IPTABLES_MODULES="ipt_comment ipt_tcp iptable_filter iptable_mangle ipt_limit ipt_multiport ipt_tos ipt_TOS ipt_REJECT ipt_TCPMSS ipt_tcpmss ipt_ttl ipt_LOG ipt_length ip_conntrack ip_conntrack_ftp ip_conntrack_irc ipt_conntrack ipt_helper iptable_nat ip_nat_ftp ip_nat_irc ipt_REDIRECT ipt_state ip_conntrack_netbios_ns"
    [root@pvcfl46x64 ~]#
  3. /etc/modprobe.conf を編集し、ip_conntrack_disable_ve0=0 を設定します。
    [root@pvcfl46x64 ~]# grep conntrac /etc/modprobe.conf
    options ip_conntrack ip_conntrack_disable_ve0=0
    [root@pvcfl46x64 ~]#
  4. iptables ロギングを有効化し、機能することを確認します。
    [root@pvcfl46x64 ~]# egrep "^kern" /etc/syslog.conf
    kern.* /var/log/iptables.log
    [root@pvcfl46x64 ~]#
  5. iptables を再起動します。
    [root@pvcfl46x64 ~]# service iptables restart
    Flushing firewall rules: [ OK ]
    Setting chains to policy ACCEPT: nat mangle filter [ OK ]
    Unloading iptables modules: [FAILED]
    Applying iptables firewall rules: [ OK ]
    Loading additional iptables modules: ipt_comment ipt_tcp iptable_filter iptable_mangle ipt_limit ipt_multiport ipt_tos ipt_TOS ipt_REJECT ipt_TCPMSS ipt_tcpmss ipt_ttl ipt_LOG ipt_length ip_conntrack ip_conntrack_ftp ip_conntrack_irc ipt_conntrack ipt_helper iptable_nat ip_nat_ftp ip_nat_irc ipt_REDIRECT ipt_state[ OK ]track_netbios_ns
    [root@pvcfl46x64 ~]#
  6. syslog を再起動します。
    [root@pvcfl46x64 ~]# service syslog restart
    Shutting down kernel logger: [ OK ]
    Shutting down system logger: [ OK ]
    Starting system logger: [ OK ]
    Starting kernel logger: [ OK ]
    [root@pvcfl46x64 ~]#
  7. テストルールを追加します(例:新しい SSH 接続の追跡)。
    [root@pvcfl46x64 ~]# iptables -A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m recent --set --name ssh_attempt --rsource -j LOG --log-prefix "SSH connection attempt: "
    [root@pvcfl46x64 ~]#
  8. システムリソースの消費を抑えるために、他の TCP 接続の追跡は停止します。
    iptables -t raw -I PREROUTING ! --dport 22 -j NOTRACK
  9. ログをモニタリングした状態でサーバに SSH ログインします。
    [root@pvcfl46x64 ~]# tail -f /var/log/iptables.log
    Mar 10 07:09:32 pvcfl46x64 kernel: SSH connection attempt: IN=eth0 OUT= MAC=00:1c:42:43:65:5c:00:1c:c0:46:1f:e5:08:00 SRC=192.168.33.58 DST=10.55.63.10 LEN=48 TOS=0x00 PREC=0x00 TTL=123 ID=40718 DF PROTO=TCP SPT=1478 DPT=22 WINDOW=65535 RES=0x00 SYN URGP=0

よくある質問(FAQ)

Q: このオプションは実際にどのように機能しますか?
 
A: このオプションは、ノード環境でパケットの追跡を制御します。 無効化すると、パケットは通過が許可されるか、ルートされるか、その他の処理がされますが、カーネルは各パケットを完全なユニットと見なすため、パケットの接続に関する情報を一切保存しません。
このオプションは NAT にも影響があります。NAT 用に次の情報が必要になります。 接続の最初のパケットを決定し、次のパケットの中から、最初のパケットに属するものを決める(つまり、どのパケットを「接続」とみなすかを決める)必要があります。

追加情報

PVCfL 4.7 ノードでの conntrack の構成方法については、以下の記事を参照してください。
113000 Issues with firewall on HW Node - Impossible to use ip_nat and ipt_state modules

e8e50b42231236b82df27684e7ec0beb d02f9caf3e11b191a38179103495106f 9b9439294978ca011521bd467a069524 36627b12981f68a16405a79233409a5e 35c16f1fded8e42577cb3df16429c57a 2897d76d56d2010f4e3a28f864d69223

Email subscription for changes to this article