SO_MARK
的有效且有意义的值是什么?我发现一些项目使用 int
,一些 unsigned int
( dnsmasq ):
unsigned int mark;
if (get_incoming_mark(&forward->frec_src.source, &forward->frec_src.dest, 0, &mark))
setsockopt(fd, SOL_SOCKET, SO_MARK, &mark, sizeof(unsigned int));
我认为使用 unsigned int
是正确的(因此 ping
的 PR 可能是正确的: https://github.com/iputils/iputils/pull/345 )。但是 ping
允许用户指定 SO_MARK
,因此我还想添加对有效输入的检查。
另外,我可以在wireshark/tcpdump输出中看到SO_MARK
设置吗?
最佳答案
内核用于套接字的struct sock
结构defines the field由SO_MARK
设置为:__u32 sk_mark
。所以我想说任何 uint32_t
对于此选项都是有意义的值。
Also, can I see
SO_MARK
setup in wireshark/tcpdump output?
据我所知不,mark
实际上并未设置在数据包上(在任何层),它只是设置在用于管理套接字的内部内核结构上(struct sock
)和数据包控制信息(struct sk_buff
)。您不会“在线上”看到它。
但是,您可以使用 iptables 将标记的数据包记录到 dmesg,例如 this answer在 Unix 和 Linux SE 上建议:
$ sudo iptables -A INPUT -m mark ! --mark 0 -m limit --limit 8/min --limit-burst 12 -j LOG --log-prefix "IPTables-Marks: "
$ ./send-some-marked-packets ...
$ sudo dmesg
...
[27448.839237] IPTables-Marks: IN=lo OUT= MAC=00:00:00:00:00:00:00:00:00:00:00:00:08:00 SRC=127.0.0.1 DST=127.0.0.1 LEN=31 TOS=0x00 PREC=0x00 TTL=64 ID=45988 DF PROTO=UDP SPT=40656 DPT=12345 LEN=11 MARK=0xcc
关于c - SO_MARK有效值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69890641/