15.4. 対話的トラフィックを優先する

たくさんのデータが接続から出て行ったり入ってきたりしていると、 telnet や ssh で何らかのメンテナンス作業を行う際の反応が悪くなります。 他のパケットがキー入力をブロックするのです。 このような対話的なパケットを、こっそりバルク転送トラフィックとは別の経路で 通すことができたらすごいと思いませんか? Linux ならできるのです。

前述のように、両方向のトラフィックを扱う必要があります。 当然ながら、接続の両端がいずれも Linux マシンであれば最高ですが、 他の UNIX でも可能です。お近くの Solaris/BSD グルに尋ねてみましょう。

標準の pfifo_fast スケジューラには 3 つの「バンド」があります。 バンド 0 のトラフィックは先に送信され、 その後バンド 1 と 2 のトラフィックが考慮されます。 よって、私たちの対話的トラフィックをバンド 0 に割り当てるのがミソです!

これらは (そろそろ obsolete になる) ipchains HOWTO からパクってきました。

IP ヘッダには、あまり用いられない 4 つのビット、 Type of Service (TOS) ビットと呼ばれる領域があります。 これらはパケットの扱いに影響します。4 つのビットはそれぞれ "Minimum Delay", "Maximum Throughput", "Maximum Reliability", "Minimum Cost" を意味します。これらのビットのうち、ひとつだけが設定できます。 ipchains の TOS 修正コードの著者である Rob van Nieuwkerk は、 次のように言っています。

私にとっては "Minimum Delay" が特に重要です。 私は「対話的な」パケットには、上流のルータ (Linux) でこれを有効にしました。 自分は 33.6k モデム接続の下流にいます。 Linux はパケットを 3 つのキューに優先付けします。 このようにして、私は大きなダウンロードをしている最中にも、 まあまあの対話性能を得ることができています。

最もよくある設定は、telnet と ftp の制御接続に "Minimum Delay" を用い、FTP データに "Maximum Throughput" を用いるやり方です。 これには上流のルータで、次のようにします。

# iptables -A PREROUTING -t mangle -p tcp --sport telnet \
  -j TOS --set-tos Minimize-Delay
# iptables -A PREROUTING -t mangle -p tcp --sport ftp \
  -j TOS --set-tos Minimize-Delay
# iptables -A PREROUTING -t mangle -p tcp --sport ftp-data \
  -j TOS --set-tos Maximize-Throughput

これだと、telnet 先のホストから ローカルの PC へと向かうパケットにしか作用しません。 しかし逆方向はすでに設定されているのです。つまり telnet や ssh などでは、 送信パケットの TOS フィールドを自動的に設定しているのです。

これを行っていないアプリケーションがあっても、 netfilter を用いれば同じことができます。 ローカルマシンで次のようにします。

# iptables -A OUTPUT -t mangle -p tcp --dport telnet \
  -j TOS --set-tos Minimize-Delay
# iptables -A OUTPUT -t mangle -p tcp --dport ftp \
  -j TOS --set-tos Minimize-Delay
# iptables -A OUTPUT -t mangle -p tcp --dport ftp-data \
  -j TOS --set-tos Maximize-Throughput