Linux から ToS (DSCP) を利用したテストを行う
Linux から ToS (DSCP) を利用したテストを行う方法についてメモしておきます。 検証は CentOS8 で実施しています。
PHB / IP Precedence / ToS / DSCP 一覧¶
おさらいの意味で PHB / IP Precedence / ToS / DSCP の一覧を掲載しておきます。
No. | PHB | IP Precedence (BIN) | IP Precedence (DEC) | ToS (BIN) | ToS (DEC) | ToS (HEX) | DSCP (BIN) | DSCP (DEC) | DSCP (HEX) |
---|---|---|---|---|---|---|---|---|---|
1 | CS1 | 001 | 1 | 00100000 | 32 | 0x20 | 001000 | 8 | 0x8 |
2 | AF11 | 001 | 1 | 00101000 | 40 | 0x28 | 001010 | 10 | 0xA |
3 | AF12 | 001 | 1 | 00110000 | 48 | 0x30 | 001100 | 12 | 0xC |
4 | AF13 | 001 | 1 | 00111000 | 56 | 0x38 | 001110 | 14 | 0xE |
5 | CS2 | 010 | 2 | 01000000 | 64 | 0x40 | 010000 | 16 | 0x10 |
6 | AF21 | 010 | 2 | 01001000 | 72 | 0x48 | 010010 | 18 | 0x12 |
7 | AF22 | 010 | 2 | 01010000 | 80 | 0x50 | 010100 | 20 | 0x14 |
8 | AF23 | 010 | 2 | 01011000 | 88 | 0x58 | 010110 | 22 | 0x16 |
9 | CS3 | 011 | 3 | 01100000 | 96 | 0x60 | 011000 | 24 | 0x18 |
10 | AF31 | 011 | 3 | 01101000 | 104 | 0x68 | 011010 | 26 | 0x1A |
11 | AF32 | 011 | 3 | 01110000 | 112 | 0x70 | 011100 | 28 | 0x1C |
12 | AF33 | 011 | 3 | 01111000 | 120 | 0x78 | 011110 | 30 | 0x1E |
13 | CS4 | 100 | 4 | 10000000 | 128 | 0x80 | 100000 | 32 | 0x20 |
14 | AF41 | 100 | 4 | 10001000 | 136 | 0x88 | 100010 | 34 | 0x22 |
15 | AF42 | 100 | 4 | 10010000 | 144 | 0x90 | 100100 | 36 | 0x24 |
16 | AF43 | 100 | 4 | 10011000 | 152 | 0x98 | 100110 | 38 | 0x26 |
17 | CS5 | 101 | 5 | 10100000 | 160 | 0xA0 | 101000 | 40 | 0x28 |
18 | EF | 101 | 5 | 10111000 | 184 | 0xB8 | 101110 | 46 | 0x2E |
19 | CS6 | 110 | 6 | 11000000 | 192 | 0xC0 | 110000 | 48 | 0x30 |
20 | CS7 | 111 | 7 | 11100000 | 224 | 0xE0 | 111000 | 56 | 0x38 |
ping に ToS を付与する¶
最も簡単なのは ping
のオプションで ToS を付与する方法です。 -Q
オプションに ToS を指定するだけなので手軽です。
1 |
|
man には以下のように書かれています。
-Q tos
Set Quality of Service -related bits in ICMP datagrams. tos can be decimal (ping only) or hex number.
In RFC2474, these fields are interpreted as 8-bit Differentiated Services (DS), consisting of: bits 0-1 (2 lowest bits) of separate data, and bits 2-7 (highest 6 bits) of Differentiated Services Codepoint (DSCP). In RFC2481 and RFC3168, bits 0-1 are used for ECN.
Historically (RFC1349, obsoleted by RFC2474), these were interpreted as: bit 0 (lowest bit) for reserved (currently being redefined as congestion control), 1-4 for Type of Service and bits 5-7 (highest bits) for Precedence.
ToS は 10 進数と 16 進数の両方で指定することが可能です。 例えば下記の例では 10 進数と 16 進数で ToS を指定していますが、どちらも CS1 (0x20) で ICMP を送信します。
1 2 |
|
下記の例ではどちらも AF11 (0x28) で ICMP を送信します。
1 2 |
|
firewalld の Direct Rule を使って全出力トラフィックに DSCP を付与する¶
「ping に ToS を付与する」方法では icmp パケットには ToS を付与出来るものの、その他の通信に ToS を付与することは勿論出来ません。 firewalld の Direct Rule を使うことで全ての出力トラフィックに DSCP を付与することが出来ます。 先に注意点を記載しておきますが、ping
コマンドなどで ToS 値を指定しても Direct Rule の方が優先されます。 DSCP を付与すると、firewalld を利用するので、まず firewalld を起動しておきます。 必要に応じて自動起動の設定も実施しておきます。
1 2 |
|
Direct Rule を追加します。 ここでは「全てのトラフィック (0.0.0.0/0) を対象」にしていますが、複雑な条件を指定することで「特定のトラフィックのみ、DSCP を付与する」ことも可能です。
1 |
|
Direct Rule を追加すると /etc/firewalld/direct.xml
に定義されます。
1 2 3 4 5 |
|
追加した Direct Rule を反映するには firewalld を再起動する必要があります。
1 |
|
反映された Direct Rule を確認するには firewall-cmd --direct --get-all-rules
を実行します。 下記ではしっかり Direct Rule が反映されていますので、これで全てのトラフィックに AF21 (0x28) が付与されます。
1 2 |
|
Direct Rule を削除するには以下のように実行します。 具体的には --remove-rule
を指定します。
1 |
|
Direct Rule を変更しましたので firewalld を再起動して変更を反映します。
1 |
|
tcpdump でパケットキャプチャする¶
tcpdump で ToS 値をキャプチャする方法について記載します。
ToS 値を表示する¶
tcpdump
に -v
を指定することでキャプチャしたパケットの ToS 値を 16 進数で表示することが出来ます。
1 |
|
特定の ToS 値が指定されたパケットのみ、キャプチャする¶
「特定の ToS 値が指定されたパケットのみ、キャプチャする」には ip[1]==[ToS]
というオプションを指定します。 例えば EF (0xb8) の付与されたパケットのみをキャプチャするには以下のように実行します。 10 進数と 16 進数の両方で指定することが可能ですが、結果は 16 進数で表示される為、16 進数指定の方が分かりやすいかもしれません。
1 2 |
|
実際にキャプチャした結果は以下の通りです。
1 2 3 4 5 6 7 8 |
|
複数条件のうちひとつでも一致したパケットをキャプチャする (or 条件)¶
「CS1 (0x20) と CS2 (0x40) のパケットのみ、キャプチャする」には以下のように or
を用いて条件を指定します。
1 |
|
特定のホストから、且つ、複数条件のうちひとつでも一致したパケットをキャプチャする (or 条件と and 条件の組み合わせ)¶
「特定ホストからの CS1 (0x20) と CS2 (0x40) のパケットのみ、キャプチャする」には以下のように or
と and
を組み合わせて条件を指定します。 この場合、括弧を使って条件を指定することになりますが、エスケープしないと括弧はエラーになってしまいます。 その為、以下のようにダブルクォートで括るか、もしくは '\' で括弧をエスケープします。
1 |
|
tshark でパケットキャプチャする¶
tshark で ToS 値をキャプチャする方法について記載します。
tshark のインストール¶
最初に tshark をインストールします。
1 |
|
インストールされました。
1 |
|
特定の ToS 値が指定されたパケットのみ、キャプチャする¶
「特定の ToS 値が指定されたパケットのみ、キャプチャする」には tcpdump 同様、ip[1]==[ToS]
というオプションを指定します。 以下では EF (0xb8) の設定されたパケットのみをキャプチャしています。
1 |
|
実際の実行例は以下の通りです。 EF (0xb8) のパケットのみをキャプチャした例です。
1 2 3 4 5 |
|
特定の ToS 値が指定されたパケットのみ、キャプチャする (詳細表示)¶
パケット単位で詳細を表示するには -V
オプションを指定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
|
カラムに DSCP を追加する¶
(-V
オプションを指定しない限り) デフォルトではキャプチャ結果に DSCP は表示されません。 デフォルトでは存在しないのですが、以下のように ~/.wireshark/preferences
を作成することでキャプチャ結果に DSCP を追加することが出来ます。
1 2 3 4 5 6 7 8 9 10 |
|
この設定を行うとキャプチャ結果は以下のようになります。 EF (0xb8) を付与したパケットをキャプチャした際に EF
と表示されているのが分かります。
1 2 3 4 5 6 7 |
|
WireShark でパケットキャプチャする¶
WireShark でパケットキャプチャする際、特別な手順は必要ありませんが、カラム設定を調整することで DSCP 値を見やすく出来ます。
カラムに DSCP を追加する¶
WireShark でもカラムに DSCP 表示を追加することが出来ます。 WireShark を起動し 編集
→ 設定
をクリックします。
設定
ダイアログが開きますので 外観
→ 列
から +
マークをクリックして IP DSCP Value
を追加します。
これでカラムに DSCP が追加されました。