2

我正在尝试通过两个 Linux(Centos 6)主机之间的 gretap 隧道传输一些克隆的 IP pkts,以便为 IDS 风格的设备提供数据。

鉴于 PMTU 发现不适用于我尝试传输的克隆 pkts,我必须找到一种方法来清除 GRE pkt 标头中的 DF 位,以便它可以被发送主机分段并重新组装在另一端。否则,在添加 GRE 开销后,较大的 pkts(...接近 1500 字节 nmark)将被静默丢弃。

我找到了一个可行的解决方案,其中涉及配置 iptables 插件以清除所述 DF 位,但该解决方案有点过于复杂。见这里:http ://backreference.org/2013/07/23/gre-bridging-ipsec-and-nfqueue/ 。

我查看了 net/ipv4/ip_gre.c 的源代码,在那里我发现了这些有趣的行(从这里开始的第 432 行附近:https ://github.com/torvalds/linux/blob/master/net /ipv4/ip_gre.c ):

df = key->tun_flags & TUNNEL_DONT_FRAGMENT ?  htons(IP_DF) : 0;

iptunnel_xmit(skb->sk, rt, skb, fl.saddr, key->u.ipv4.dst, IPPROTO_GRE,
          key->tos, key->ttl, df, false);
return;

特别是第一行似乎使某些逻辑能够有条件地设置传出 GRE pkt 上的 DF 位。假设我正确理解了代码,这将允许 pkts 在没有设置 DF 位的情况下离开我的 Linux 主机,这反过来又应该允许碎片化。

我一直在试图弄清楚如何设置 key->tun_flags 的值,以便条件语句导致“0”,但我找不到任何允许我这样做的 CLU(ip li, ifconfig、udevadm 等...)。

有人知道如何操纵 key->tun_flags 的值吗?

4

1 回答 1

2

“男人 8 ip 隧道”

          ignore-df
                 enable IPv4 DF suppression on this tunnel.
                 Normally datagrams that exceed the MTU will be
                 fragmented; the presence of the DF flag inhibits
                 this, resulting instead in an ICMP Unreachable
                 (Fragmentation Required) message.  Enabling this
                 attribute causes the DF flag to be ignored.

例如:

ip link add gretap1 type gretap remote xxx.yyy.zzz.ppp ignore-df nopmtudisc

将删除 DF 标志。请注意,您还必须设置nopmtudisc选项,请参阅https://bugzilla.kernel.org/show_bug.cgi?id=14837,最终评论。

需要高于 v5.10.10 的内核版本来支持该ignore-df选项。

于 2021-06-18T13:40:16.240 回答