Linux
如何在 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
在我的另一台機器上,我可以 curl 作為 IPv4 地址的 $VIP,在我的機器上通過 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 接收隧道的設置方式有什麼問題?
原來我必須在 ip6tnl0 介面上設置模式,因為我將 IPv4 封裝在 IPv6 中。這樣做就成功了:
ip -6 tunnel change ip6tnl0 mode ipip6