Linux で IPv6 用の GUE 受信トンネルを構成する方法

Linux で IPv6 用の GUE 受信トンネルを構成する方法

GUE でカプセル化された IPv4 パケットを含む IPv6 パケットを受信するために GUE トンネルを設定しようとしていますが、パケットのカプセル化解除で問題が発生しています。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

他のマシンでは、IPv4アドレスである$VIPをcurlで実行でき、私のマシンでは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

IPv4 を IPv6 にカプセル化していたため、ip6tnl0 インターフェイスでモードを設定する必要があることがわかりました。次のようにするとうまくいきました。

ip -6 tunnel change ip6tnl0 mode ipip6

関連情報