重写数据包上的 CONNMARK

重写数据包上的 CONNMARK

我有一台主机,我在该主机上重写到达它的 IP 数据包的 saddr 和 daddr,这是由程序使用 libnetfilter_queue 完成的。基本上它充当代理。例如,数据包来自 10.0.0.2 并发往此主机(IP主机),我们将此数据包重写为从 IP主机发往 google.com。我想使用 conntrack 将回复数据包 google.com→IP主机标记为进入同一队列进行重写并发送回 10.0.0.2。

我使用两个 PREROUTING 规则:

iptables -tmangle -A PREROUTING -p tcp -s 10.0.0.2 -j CONNMARK --set-mark 0x10
iptables -tmangle -A PREROUTING -m connmark --mark 0x10 -j NFQUEUE

但是回复数据包没有这个 ctmark,而且我在 conntrack 程序输出中只看到数据包 10.0.0.2→IP主机。

所以问题是是否可以这样做?或者我不明白 CONNMARK 的作用是什么?我认为它应该在与连接相关的所有内容(包括回复数据包)上设置此标记。

答案1

关闭。CONNMARK 不会对数据包执行任何操作 - 它只会在 conntrack 表中使用该会话条目的标记。该 connmark 旨在稍后与“--restore-mark”一起使用,这需要让数据包“继承”分配给其连接的标记。

这可能会根据您在用户空间中重写的数据包而中断。restore-mark 可能不会将传出的数据包与使用原始 src/dst 创建的 conntrack 条目关联起来。

相关内容