7.2. conntrackエントリ

それでは、conntrack エントリの様子と /proc/net/ip_conntrack の読み方を簡単に見てみよう。 conntrack エントリには、あなたのマシンの現在の conntrack データベースエントリがリストされている。 ip_conntrack モジュールがロードされていれば、 /proc/net/ip_conntrackcat すると以下のような感じになるだろう:

tcp      6 117 SYN_SENT src=192.168.1.6 dst=192.168.1.9 sport=32775 \
     dport=22 [UNREPLIED] src=192.168.1.9 dst=192.168.1.6 sport=22 \
     dport=32775 [ASSURED] use=2
     

この例は、特定のコネクションのステートを判断するために conntrack モジュールが管理する情報をつぶさに示している。まず最初に、プロトコルが読み取れる。この場合 tcp だ。次に、プロトコルの 10 進表記。その次には、この conntrack エントリがどれだけの時間保持されるかが書いてある。現在の値は 117 秒で、新たなトラフィックを検出するまでの間、この値は一定間隔で減ってゆく。その後、しかるべき時に達すると、コネクションの置かれたステートに応じたデフォルト値へとリセットされる。次のフィールドには、現時点で置かれているステートそのものが書いてある。今観察している上記パケットのケースでは、SYN_SENT と読み取れる。内部で使われるコネクションの値は、我々が iptables で使う表層用の記述とは少々異なっている。 SYN_SENT という値は、ここで見ているコネクションでは、今のところ片方向の TCP SYN パケットだけが検出されていることを物語っている。続いては、送信元IPアドレス宛先IPアドレス送信元ポート宛先ポートが並ぶ。次に来るのが、このコネクションに対する返答はまだ受け取っていないということを示す、特別なキーワードだ。そして最後に、返答パケットに期待される事柄が記載されている。上記で見られる情報は、送信元IPアドレス宛先IPアドレス (ただし、送り返されるパケットを期待しているわけなので、アドレスは入れ替わっている) を具体的に示している。そして送信元ポート宛先ポートに関しても同様。多少なりとも我々の興味を惹く、こうした値だ。

コネクション追跡エントリの初期値は、数セットの異なったバリエーションがあり、その値は linux/include/netfilter-ipv4/ip_conntrack*.h ファイルの conntrack ヘッダで定義されている。値は、どの IP サブプロトコルを使用するかによって異なる。 TCP, UDP, ICMP プロトコルの場合には linux/include/netfilter-ipv4/ip_conntrack.h で定義された特定のデフォルト値を採る。それぞれを精査するのは、そのプロトコルを解説する下りまでとっておくことにしよう。 conntrack の内部機構以外でそれらを使うことはほとんどないので、これ以上このチャプターで触れるのは止めておく。コネクションが破棄されるまでの時間の値もまた、ステートの推移によって逐次変化していく。

Note

最近、 iptables patch-o-matic に、tcp-window-tracking と呼ばれる新しいパッチが上がった。このパッチが面白いのは、特に、前述のタイムアウト値を特定の sysctl 変数で書き換えることができるという点だ。つまり、システムの稼働中でも、随時書き換えが可能になるのだ。タイムアウト値を変えるために、いちいちカーネルをリコンパイルする必要がなくなる。

これらの値の変更は、 /proc/sys/net/ipv4/netfilter ディレクトリにある特別なシステムコールによって行える。 /proc/sys/net/ipv4/netfilter/ip_ct_* は必見と言っていいだろう。

コネクションが双方向のトラフィックを検出すると、conntrack エントリから [UNREPLIED] フラグが消え、リセットされる。上記コードの末尾付近の [ASSURED] フラグが、コネクションはまだ双方向のトラフィックを観察していないということを示していたエントリに取って代わるのだ。 [ASSURED] フラグは、このコネクションが確立済みであることを表し、コネクション追跡の数が制限数に達したとしても消去されない。このようにして[ASSURED] にマークされたコネクションは、未確立の ([ASSURED] とマークされていない) コネクションとは異なり、抹消されることがなくなる。コネクション追跡テーブルが接続をいくつ保持できるかは、或る変数に依存しており、それは現行カーネルでは ip-sysctl によって設定できる。デフォルト値はマシンの実装メモリの量と深く関係しており、RAM が 128MB の場合は 8192 エントリが上限、256MB では 16376 エントリとなる。値の確認と設定は /proc/sys/net/ipv4/ip_conntrack_max で行える。

それと同じことをやるには他にも方法があり、こちらのほうがより効率的。 ip_conntrack モジュールのロードの際に hashsize オプションを与える方法だ。常態では、ip_conntrack_max の値はハッシュサイズの 8 倍となる。つまり、 hashsize を 4096 にすれば ip_conntrack_max は 32768 となる。実際に行うとすればどのようになるかを示そう:

work3:/home/blueflux# modprobe ip_conntrack hashsize=4096
work3:/home/blueflux# cat /proc/sys/net/ipv4/ip_conntrack_max
32768
work3:/home/blueflux#