以前に投稿したように、同一リモートホストに対して、NAT配下の複数 gretap/gre クライアントからは、キーを設定しても何もしていない場合は同時に接続できません。理由はよくわかっていませんが、とりあえず挙動をしらべた所、同一リモートホストに対するパケットは、iptablesの PREROUTING raw/mangle までは通過しますが、key を設定していても、PREROUTING nat に入る前に暗黙的に破棄されていました。
そこで raw/mangleで keyを手掛かりにして破棄される前に packet を gretap/gre client に tee'd したところ、GRETAP クライアントにパケットは届きますが、当然ながら Destination Address は NAT ルータの外側のグローバル IPv4 アドレスのままなので、gretap/gre クライアントは応答しません。そこで、loopback インターフェースに NAT ルータの外側グローバル IPv4 アドレスを割り当て、さらに、リモートホストに対する gretap/gre パケットを 今一度 key を手掛かりに、raw/mangle でリモートに tee'd するようにしたところ、ping が通りました。最後に ssh/iperf3 でテストをしたところ、mtu の調整と再起動後に通信を開始するための ping は必要なのですが、無事疎通できたのでメモ代わりに挙げてみることにしました。
なお環境はリモート・ローカル・ルータのいずれも、Debian 12 Bookworm (Netinst) で構成し、ネットワークはフレッツ光クロス固定IP環境(enひかりクロス xpass 固定IP)でテストしています。
さて、今回はgretapでの要点のみの説明となりますが、greでもほぼ同じ要領です。まず、リモートホスト側です。こちらはInternetに直接つながっていることが前提です。
続いて NAT ルータです。enp1s0f0はLAN側インターフェースです。u32モジュールを使ってkey(100=0x64,101=0x65)を絞り込んでいます。
今回は以上です。それでは。
そこで raw/mangleで keyを手掛かりにして破棄される前に packet を gretap/gre client に tee'd したところ、GRETAP クライアントにパケットは届きますが、当然ながら Destination Address は NAT ルータの外側のグローバル IPv4 アドレスのままなので、gretap/gre クライアントは応答しません。そこで、loopback インターフェースに NAT ルータの外側グローバル IPv4 アドレスを割り当て、さらに、リモートホストに対する gretap/gre パケットを 今一度 key を手掛かりに、raw/mangle でリモートに tee'd するようにしたところ、ping が通りました。最後に ssh/iperf3 でテストをしたところ、mtu の調整と再起動後に通信を開始するための ping は必要なのですが、無事疎通できたのでメモ代わりに挙げてみることにしました。
なお環境はリモート・ローカル・ルータのいずれも、Debian 12 Bookworm (Netinst) で構成し、ネットワークはフレッツ光クロス固定IP環境(enひかりクロス xpass 固定IP)でテストしています。
さて、今回はgretapでの要点のみの説明となりますが、greでもほぼ同じ要領です。まず、リモートホスト側です。こちらはInternetに直接つながっていることが前提です。
#/etc/network/interfaces.d/gretap100 auto gretap100 iface gretap100 inet6 static address fd99:1:1:100::1 netmask 64 mtu 1418 pre-up ip link add gretap100 type gretap remote 192.0.2.195 local 203.0.113.173 key 100 dev ens18 tos inherit pre-up ip link set dev gretap100 mtu 1418 post-down ip link del gretap100 iface gretap100 inet static address 172.16.100.1 netmask 255.255.255.0 #/etc/network/interfaces.d/gretap101 auto gretap101 iface gretap101 inet6 static address fd99:1:1:101::1 netmask 64 mtu 1418 pre-up ip link add gretap101 type gretap remote 192.0.2.195 local 203.0.113.173 key 101 dev ens18 tos inherit pre-up ip link set dev gretap101 mtu 1418 post-down ip link del gretap101 iface gretap101 inet static address 172.16.101.1 netmask 255.255.255.0続いてNAT配下のクライアント側です。vm100とvm101の2台の vm を hyper-v ゲストで今回は構成してみました。
# vm100:/etc/network/interfaces.d/gretap100 auto gretap100 iface gretap100 inet6 static address fd99:1:1:100::2 netmask 64 mtu 1418 pre-up ip link add gretap100 type gretap remote 203.0.113.173 local 192.0.2.195 key 100 pre-up ip link set dev gretap100 mtu 1418 post-down ip link del dev gretap100 iface gretap100 inet static address 172.16.100.2 netmask 255.255.255.0 # vm100:/etc/network/interfaces auto lo iface lo inet loopback post-up ip addr add 192.0.2.195/32 dev lo # vm100:/etc/rc.local (chmod +x) #!/bin/bash ping -c30 fd99:1:1:100::1 # vm101:/etc/network/interfaces.d/gretap101 auto gretap101 iface gretap101 inet6 static address fd99:1:1:101::2 netmask 64 mtu 1418 pre-up ip link add gretap101 type gretap remote 203.0.113.173 local 192.0.2.195 key 101 pre-up ip link set dev gretap101 mtu 1418 post-down ip link del dev gretap101 iface gretap101 inet static address 172.16.101.2 netmask 255.255.255.0 # vm101:/etc/network/interfaces auto lo iface lo inet loopback post-up ip addr add 192.0.2.195/32 dev lo # vm100:/etc/rc.local (chmod +x) #!/bin/bash ping -c30 fd99:1:1:101::1当方の環境の場合、IPv4のMTUはIPv6トンネル経由で1460ですが、ここからさらに42を引いた1418にしてみました。
続いて NAT ルータです。enp1s0f0はLAN側インターフェースです。u32モジュールを使ってkey(100=0x64,101=0x65)を絞り込んでいます。
# /etc/iptables/rules.v4 -- snip -- # Generated by iptables-save v1.8.9 (nf_tables) on Sat Nov 30 17:33:00 2024 *raw :PREROUTING ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A PREROUTING -s 203.0.113.173/32 -i tun0 -p gre -m u32 --u32 "0x18&0xffffffff=0x64" -j TEE --gateway 10.1.1.100 -A PREROUTING -s 203.0.113.173/32 -i tun0 -p gre -m u32 --u32 "0x18&0xffffffff=0x65" -j TEE --gateway 10.1.1.101 -A PREROUTING -s 203.0.113.173/32 -i tun0 -p gre -m u32 --u32 "0x18&0xffffffff=0x64" -j DROP -A PREROUTING -s 203.0.113.173/32 -i tun0 -p gre -m u32 --u32 "0x18&0xffffffff=0x65" -j DROP -A PREROUTING -d 203.0.113.173/32 -i enp1s0f0 -p gre -m u32 --u32 "0x18&0xffffffff=0x64" -j TEE --gateway 203.0.113.173 -A PREROUTING -d 203.0.113.173/32 -i enp1s0f0 -p gre -m u32 --u32 "0x18&0xffffffff=0x65" -j TEE --gateway 203.0.113.173 -A PREROUTING -d 203.0.113.173/32 -i enp1s0f0 -p gre -m u32 --u32 "0x18&0xffffffff=0x64" -j DROP -A PREROUTING -d 203.0.113.173/32 -i enp1s0f0 -p gre -m u32 --u32 "0x18&0xffffffff=0x65" -j DROP COMMIT # Completed on Sat Nov 30 17:33:00 2024 -- snip --linuxのgretap/greにはkeepaliveの機能がないので、後はcrontabを使って例えば5秒おきにpingをnat配下のclientからリモートホストに打つとよいと思います。設定は以上です。gretap/gre の同一ホストに対するNAT 越えは検索してもほぼでてこないので、本稿を挙げた次第でもあります。
今回は以上です。それでは。
コメント
コメントを投稿