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