iptablesのmagleテーブルを使って、IPパケットのTOS/DSCP/ECN/MARKといった値を書き換える方法を解説します。
TOSベースのQoSに対応するよう、以下のようにiptablesを実行し、パケットを書き換えます。優先順位付には文字列や数値(10進数または16進数)を用います。
$ sudo /sbin/iptables -A PREROUTING -t mangle -p tcp --dport 22 -j TOS --set-tos Minimize-Delay
$ sudo /sbin/iptables -A PREROUTING -t mangle -p tcp --dport 80 -j TOS --set-tos Maximize-Throughput ※--set-tos TOS名または数値 ※指定可能なTOS名や数値は表1参照
DiffServベースのQoSに対応するようDSフィールドを書き換えるには、次のようにiptablesを実行します。
$ sudo /sbin/iptables -A PREROUTING -t mangle -p tcp --dport 80 -j DSCP --set-dscp-class EF --set-dscp DSCPの数値 DSフィールド内のDSCPの数値(10進または16進)を設定します --set-dscp-class DiffServクラス DSフィールド内のDSCPのDiffServクラス(BE、EF、AF○、CS○[○:数字])を設定します。
ECN(Explicit Congestion Notification)は、ルータから末端のノードに対しネットワークの輻輳(ふくそう)状態を通知するのに使います。TOSフィールドの最後の2ビットを「ECNビット」として利用します。なお、ECNに対応しないネットワーク機器で問題が起こる場合には、iptablesを使ってECNビットを削除します。
$ sudo /sbin/iptables -A PREROUTING -t mangle -p tcp --dport 80 -j ECN --ecn-tcp-remove --ecn-tcp-remove ECNビットを削除します。
LinuxでQoSを制御するために、iproute2を利用します。iproute2を使う際、次のようにiptablesでMARK値を設定します。MARK値は、Linux内部でパケットを処理するときにだけ使用し、それ以外の用途では使用しません。
$ sudo /sbin/iptables -A PREROUTING -t mangle -p tcp --dport 80 -j MARK --set-mark 15 --set-mark mark マーク値 マーク値には符号なしの整数(32ビットのシステムでは4294967296通り)を指定します。
Copyright © ITmedia, Inc. All Rights Reserved.