Linux

ip-rule 不適用於大於 0x10 的 ToS

  • January 12, 2019

ip-rule使用特定 IP ToS值會出現一些奇怪的行為。它僅適用於高達 0x10 的值,但不接受 DSCP 部分。

我試過:

ip ru a tos 0x20 table 1234

並得到:

RTNETLINK answers: Invalid argument

TOS在 RFC 791和 RFC 1349 中進一步定義,只有 4 個可能的位,如RFC 1349 的第 3 章所示

            0     1     2     3     4     5     6     7
         +-----+-----+-----+-----+-----+-----+-----+-----+
         |                 |                       |     |
         |   PRECEDENCE    |          TOS          | MBZ |
         |                 |                       |     |
         +-----+-----+-----+-----+-----+-----+-----+-----+

和 4:

                1000   --   minimize delay
                0100   --   maximize throughput
                0010   --   maximize reliability
                0001   --   minimize monetary cost
                0000   --   normal service

由於 MBZ(必須為零)位被保留並且優先級(據稱?)從未真正使用過,因此只有 0x00 和 0x1E 之間的偶數值可能。Linux在 ip.h 中定義了這一點

#define IPTOS_TOS_MASK        0x1E
#define IPTOS_TOS(tos)        ((tos)&IPTOS_TOS_MASK)
#define   IPTOS_LOWDELAY      0x10
#define   IPTOS_THROUGHPUT    0x08
#define   IPTOS_RELIABILITY   0x04
#define   IPTOS_MINCOST       0x02

ip rule(的核心部分)只是遵循這些定義來說明允許的內容。

現在,如果您想使用DSCPRFC 2474中定義的替代機制來替換TOS相同字節的視圖(以及ECNRFC 3168中),似乎不存在直接等效的 using ip rule.

您仍然可以做的是使用iptablesnftables來匹配dscp欄位值,然後標記數據包並使用 in 重用fwmarkip rule

引用自:https://unix.stackexchange.com/questions/493453