今回も表題通りなんですが、unicast の vxlanを ipv4 nat (ip masquerading) が効いている linux router (Debian 12, netwark-manager無、1固定IPv4アドレス) 越えで通信できたので備忘録として挙げてみました。やり方は二種類あります。一つはvni(id)を参照する方法で、もう一つは対向のIPv4アドレスを参照する方法です。まず、最初にvni(id)を参照する方法です。
パケットの絞り込みはこちらを参考にxt_u32モジュールを使いました。
クライアントのvni(id)は1002 (8bit 左シフトで256512) でローカルマシンのプライベートアドレスが192.168.1.1かつポートが4789でvxlanのインターフェースが立ち上がっていて、ルータの外側のIPv4インターフェースがtun0の場合、ルータ上でのiptables設定は以下のようになります。
続いて、リモート側のインターフェース設定(ipv6グローバルアドレス付与)は以下のようにしてみました。(10.1.1.2は対向のローカル側Linux routerの外側グローバルIPv4アドレス)
テストはリモート・ローカル双方からpingが通り、例えば外部のVPSなどからリモート・ローカルのアドレスに対してpingが通ればOKです。
参考ですがtcpdumpでvxlanをキャプチャするには以下のようにするといけました。1002は上述のvni(id)です。
今回は以上です。それでは。
パケットの絞り込みはこちらを参考にxt_u32モジュールを使いました。
クライアントのvni(id)は1002 (8bit 左シフトで256512) でローカルマシンのプライベートアドレスが192.168.1.1かつポートが4789でvxlanのインターフェースが立ち上がっていて、ルータの外側のIPv4インターフェースがtun0の場合、ルータ上でのiptables設定は以下のようになります。
# 1002 << 8 = 256512 # "0 >> 22 & 0x3C @ 12 & 0xFFFFFF00 = 256512" iptables -t nat -I PREROUTING -i tun0 -p udp --dport 4789 -m u32 --u32 "0 >> 22 & 0x3C @ 12 & 0xFFFFFF00 = 256512" -j DNAT --to-destination 192.168.1.1:4789次は、対向のアドレスを参照する方法です。10.1.1.1が対向のグローバルアドレスで、192.168.1.1がローカルのプライベートアドレスの場合は以下のようになります。
iptables -t nat -A PREROUTING -i tun0 -s 10.1.1.1 -p udp --dport 4789 -j DNAT --to-destination 192.168.1.1:4789vxlanのNAT越えそのものは以上です。
続いて、リモート側のインターフェース設定(ipv6グローバルアドレス付与)は以下のようにしてみました。(10.1.1.2は対向のローカル側Linux routerの外側グローバルIPv4アドレス)
auto vxlan1002 iface vxlan1002 inet6 static address 2001:db8:280:1:1002::1 netmask 80 pre-up ip link add vxlan1002 type vxlan id 1002 dstport 4789 remote 10.1.1.2 dev eth0 post-down ip link del dev vxlan1002ローカル側のインターフェース設定(ipv6グローバルアドレス付与は以下のようにしてみました。(10.1.1.1は対向のリモート側のグローバルIPv4アドレス。ポリシーベースルーティング設定有。)
auto vxlan1002 iface vxlan1002 inet6 static address 2001:db8:280:1:1002::2 netmask 80 # gateway 2001:db8:280:1:1002::1 pre-up ip link add vxlan1002 type vxlan id 1002 remote 10.1.1.1 dstport 4789 dev eth0 post-up echo 201 vxlan1002 >> /etc/iproute2/rt_tables post-up ip -6 rule add from all to 2001:db8:280:1:1002::/80 tab vxlan1002 priority 201 post-up ip -6 rule add to all from 2001:db8:280:1:1002::/80 tab vxlan1002 priority 201 post-up ip -6 route add to 2001:db8:280:1:1002::/80 dev vxlan1002 tab vxlan1002 post-up ip -6 route add to default via 2001:db8:280:1:1002::1 dev vxlan1002 tab vxlan1002 down ip link set vxlan1002 down post-down ip -6 rule del from all to 2001:db8:280:1:1002::/80 tab vxlan1002 priority 201 post-down ip -6 rule del to all from 2001:db8:280:1:1002::/80 tab vxlan1002 priority 201 post-down sed -i '/vxlan1002/d' /etc/iproute2/rt_tables post-down ip link del dev vxlan1002ローカル側はip link addで"local グローバルアドレス"の指定をすると正常に通信できないので注意してください。
テストはリモート・ローカル双方からpingが通り、例えば外部のVPSなどからリモート・ローカルのアドレスに対してpingが通ればOKです。
参考ですがtcpdumpでvxlanをキャプチャするには以下のようにするといけました。1002は上述のvni(id)です。
tcpdump -l -n 'port 4789 and udp[8:2] = 0x0800 & 0x0800 and udp[11:4] = 1002 & 0x00FFFFFF'unicastのvxlanをipv4 nat越えで使いたいケースはあまりないかもしれませんが、参考になれば幸いです。
今回は以上です。それでは。
コメント
コメントを投稿