如何在 Linux 中为 IPv6 配置 GUE 接收隧道

如何在 Linux 中为 IPv6 配置 GUE 接收隧道

我正在尝试配置 GUE 隧道来接收包含 GUE 封装的 IPv4 数据包的 IPv6 数据包,但在解封装数据包时遇到问题。 IPv6数据包具有GUE封装的数据包,其内部具有IPv4数据包。我在我的一端设置了一个接收隧道。

sysctl net.ipv4.conf.all.rp_filter=2
modprobe fou
modprobe fou6
ip -6 fou add port 42428 gue -6
ip addr add $VIP/32 dev ip6tnl0
ip -6 link set ip6tnl0 up

生成的 ip6tnl0 如下所示:

4: ip6tnl0@NONE: <NOARP,UP,LOWER_UP> mtu 1452 qdisc noqueue state UNKNOWN group default qlen 1000
    link/tunnel6 :: brd ::
    inet $VIP/32 scope global ip6tnl0
       valid_lft forever preferred_lft forever
    inet6 $LINK_LOCAL/64 scope link
       valid_lft forever preferred_lft forever

在我的另一台机器上,我可以卷曲 $VIP,它是 IPv4 地址,在我的机器上通过 tcp-dump 我可以看到封装的数据包

tcpdump: listening on any, link-type LINUX_SLL (Linux cooked v1), capture size 262144 bytes
21:32:09.183750 IP6 (hlim 60, next-header UDP (17) payload length: 72) $IPV6_A.53322 > $IPV6_B.42428: [udp sum ok] UDP, length 64

因此,当该 UDP 数据包正确打开时,我希望它包含与 $VIP 的源 IPv4 匹配的 IPv4 数据包。但当我跑步时

tcpdump -i any host $VIP -n

我什么也没看到。

我对 IPv4 重复了完全相同的设置(使用 GUE 将 IPv4 数据包封装在 IPv4 数据包内),其接收隧道的设置类似:

sysctl net.ipv4.conf.all.rp_filter=2
modprobe fou
ip fou add port 42428 gue
ip addr add $VIP/32 dev tunl0
ip link set tunl0 up

在这种情况下我可以看到开封的数据包

root@ipv4-control:~# tcpdump -i any host $VIP -n
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked v1), capture size 262144 bytes
23:12:04.749247 IP $VIP.43830 > $VIP.80: Flags [S], seq 2247712115, win 65495, options [mss 65495,sackOK,TS val 2120453320 ecr 0,nop,wscale 7], length 0

上面的 $VIP 是一个为 http 流量提供服务的虚拟 ipv4 地址。

我的 IPv6 接收隧道设置方式有什么问题吗?

答案1

结果我必须在 ip6tnl0 接口上设置模式,因为我将 IPv4 封装在 IPv6 中。这样做就达到了目的:

ip -6 tunnel change ip6tnl0 mode ipip6

相关内容