如何在 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

相關內容