11.25. TOSターゲット

TOS ターゲットは IP ヘッダ中の Type Of Service フィールドを設定するのに用いる。 TOS フィールドは 8ビットから成り、パケットのルーティングを補助するために使われる。このフィールドは、 iproute2 またはそのサブシステムから直接利用することが可能で、ルーティングポリシーの決定に活用できる。複数のファイヤーウォールやルータを備えている場合には、注目に値するターゲットだ。というのも、 TOS ターゲットはパケットそのものに実際に情報を付加できる唯一の手段だからだ。前述したように、 MARK ターゲット (特定のパケットに MARK を関連づけする) はカーネル内でのみ利用可能なものであり、パケットに何かをくっつけるわけではない。特定のパケットやストリームにルーティング情報を付加したい時には、まさにそのために設けられた、この TOS フィールドを使用すべきだ。

今日のインターネット上では、 TOS フィールドに対してろくな扱いをしないルータが多い。そのため、パケットをインターネットに送り出す直前に TOS をいじっても、現状ではほとんど役に立たないはずだ。 TOS フィールドがルータに無視されるだけならまだましだが、最悪の場合、 TOS フィールドを見て見当違いの処理が行われてしまう。それでも、前述の通り、複数のルータを利用する大きな WANLAN を扱っているのなら、有効な利用法があることは火を見るより明らかだ。これを使えば、パケットの TOS フィールドに基づいてルータや優先度を切り替える能力が獲得できる。たとえそれが自分のネットワーク内に限定されるとしてもだ。

Caution

TOS ターゲットでパケットに対して指定可能なのは、特定の、名前の付いている値に限られている。規定済みの TOS 値はカーネルのインクルードファイル、正確に言うと Linux/ip.h ファイルを見れば分かる。理由はいろいろとあるが、ともかく、それ以外の値を設定する必要はまずありえないだろう。しかし、この制限を出し抜く手はある。名前のある値しか指定できないという制限を乗り越えるには、Matthew G. Marsh の管理しているサイト Paksecured Linux Kernel patches で入手可能な FTOS パッチを使えばいい。ただし、このパッチを使うには注意が必要! 何か極端なケースでもなければ、規定の値以外を使う必要はないはずだ。

Note

このターゲットは mangle テーブルでのみ有効で、それ以外では使うことができない

Note

もうひとつ注意がある。古いバージョン (1.2.2 以前) の iptables に付属する TOS ターゲットは実装に不具合があり、パケットの改変時にパケットのチェックサムを補正しない。そのため、パケットが駄目になり、再送が必要になってしまう。結果として、さらに上乗せで改変 (mangle) しなければならなくなり、コネクションが正常に成り立たない事態に陥ることも多い。

TOS ターゲットが採るオプションは下記の 1種類のみだ。

Table 11-19. TOSターゲットオプション

オプション--set-tos
iptables -t mangle -A PREROUTING -p TCP --dport 22 -j TOS --set-tos 0x10
説明--set-tos オプションは、マッチしたパケットに設定すべき TOS の値を TOS 改変機構に指示する。引数は数字で、16進または 10進の数値が使用できる。 TOS 値は 8ビットから成るので、値は 0-255、16進なら 0x00-0xFF となる。標準の TOS ターゲットでは、前述したように、名前を持つ値 (事実上の標準化された値) しか採ることができないという点に注意。具体的には、 Minimize-Delay (10進値 16, 16進値 0x10), Maximize-Throughput (10進値 8, 16進値 0x08), Maximize-Reliability (10進値 4, 16進値 0x04), Minimize-Cost (10進値 2, 16進値 0x02), Normal-Service (10進値 0, 16進値 0x00) のいずれかとなる。ほとんどのパケットのデフォルト値は Normal-Service つまり 0 になっている。もちろん、16進数などで指定する代わりに、 TOS 値を名前で指定することも可能であり、むしろ、そうしたほうがよいとされている。というのも、 TOS 名に結びつけられた数値は、将来変更される可能性があるからだ。 TOS名の全リストが見たければ、 iptables -j TOS -h すればよい。

Note

Linux カーネル 2.3, 2.4, 2.5, 2.6 で機能する。