iptables 修改 tcpmss 值

iptables 修改 tcpmss 值

我有一个 VPN 路由器,我需要降低通过的流量的 TCP MSS 值。我不知道需要哪个 iptables 表来完成这项工作。

我倾向于使用 mangle/forward 组合 -

  iptables -t mangle -A FORWARD -o GRE_+ -p tcp -m tcp --tcp-flags SYN,RST SYN -m tcpmss --mss 1361:1536 -j TCPMSS --set-mss 1361

但我看到其他人在默认过滤表中实现了它 - 并且似乎它也有效(至少使用 OUTPUT 选项)

您能向我解释一下为什么更改 TCP MSS 在两个表中都有效吗?哪种方法更正确?谢谢

答案1

首先让我们看一下Netfilter 和常规网络中的数据包流

Netfilter 和常规网络中的数据包流

你可以看到mangle/输出滤波器/输出链条,沿着道路重新路由检查。 这mangle/输出chain(以及 conntrack 的 NAT)有一个特殊的属性,它没有滤波器/输出chain:会的触发重新路由检查 每当数据包中有趣的部分发生改变时(说实话,我很惊讶没有看到滤波器/输出 示意图中的重新路由检查,因为重新路由检查可能只是网络过滤器ip_route_me_harder()功能)。

TCPMSS 目标只是改变了 TCP MSS 选项,而这并不是在mangle/输出链(IP 地址、TOS、防火墙标记),因此永远不会触发重新路由检查。因此,如果不与其他规则和/或优先级协同使用,该目标出于不相关的原因而需要放在一个地方或另一个地方,则在用于滤波器/输出或者mangle/输出

也就是说,在路由/转发情况下,曼格尔/前进链和过滤/转发chain 是完全任意的:它们之间没有功能上的区别,除了曼格尔/前进在之前被遍历过滤/转发(它具有较低的优先级/优先权),并且某些目标可能只被允许在其中一个而不是两个中。除了这个优先级,与 OUTPUT 情况相反,没有令人信服的技术理由让两者同时存在。如果必须通过修改来改变路线,这应该已经在mangle/预路由这一次,甚至在路线决策发生之前。

iptables, 这筛选表传统上用于 ACCEPT/DROP 类型的决策,而曼格尔表传统上用于更改数据包。因此在曼格尔表格似乎更合乎逻辑,但你不必遵循这一点,特别是如果它是最终导致曼格尔/前进

相比之下,nftables(您可以创建自己的自定义:它们不是固定的),具体改变路线iptables 的行为mangle/输出链条已分离并放入其具体的类型路线,仅用于输出:type route hook output链。因此,无论您执行哪种修改操作,您都可以选择是否允许将其放在这种链中而不是链中,以触发重新路由检查type filter hook output。所有其他情况(包括路由/转发)都将使用筛选类型,因为没有曼格尔不再输入。在nftables对于 OUTPUT 的情况,更合乎逻辑的做法是改造type filter hook output链中而不是type route hook output链中(我没有命名表,你可以在同一个表中添加两种类型的链,这并不等同于iptables)。

相关内容