以前は nf_nat_proto_gre モジュールを読み込む必要があったのですが、最近のカーネル(5.x,6.x)ではこのモジュールがなくなったので、ルータ越えで gre nat は使えないと思い込んでいました。しかし、どこで見たのか忘れましたが、 nat モジュールさえ効いていれば gre は nat ルータを通過できるとのことでした。そこでルータの設定を特にせず gre/gretap を以下のようにしてみたところ、確かに gre/gretap は nat (masquerading) の効いている Debian 12 ルータを同時に通過できました。(追記2024/12/01:同一リモートホストに対してNAT配下の複数クライアントからの同時接続についての記事を別稿で挙げてみました。)
まず先にgretapの場合の /etc/network/interfaces.d/以下の設定です。
なお、カーネルソースなどは追っていませんが、 remote に加え local のアドレスを見て gre nat しているのではないかと思われます。というのも同一クライアントから gretap を複数セッション張る場合、エイリアスのアドレスを与えて local を 10.1.1.106に加え 10.1.1.116, 10.1.1.126のアドレスをイーサネットデバイスに付与し試したところ、同時に(20241128追記:非同一 remote に対して)複数セッションを張ることが出来たからです。つまり、同一 local アドレスからは同時に複数セッションを張れなかったということです。(20241201追記:何もしない場合、nat越えでは同一 remote アドレスに対しても非同一 local アドレスから同時にはセッションを張れませんでした。)
続いて gre の場合です。こちらはとあるプロバイダのIPv6 BGP トランジットトンネルです。
2024/12/04追記: greでの同一クライアント(異なるエイリアスアドレス)からキー無での異なるホストへの例を挙げておきます。
今回は以上です。それでは。
まず先にgretapの場合の /etc/network/interfaces.d/以下の設定です。
auto BX_US_DAL iface BX_US_DAL inet6 static address 2001:db8:1000:83::10b netmask 64 pre-up ip link add BX_US_DAL type gretap remote 192.0.2.1 local 10.1.1.106 ttl 255 post-down ip link del dev BX_US_DAL iface BX_US_DAL inet static address 203.0.113.2 netmask 24ちなみにこちらは、as 番号さえあればフリーで IX に接続できる bgp.exchange というサイトで使用しているものです。10.1.1.106 が NAT 越えさせたいマシンの内部ネットワークアドレスです。
なお、カーネルソースなどは追っていませんが、 remote に加え local のアドレスを見て gre nat しているのではないかと思われます。というのも同一クライアントから gretap を複数セッション張る場合、エイリアスのアドレスを与えて local を 10.1.1.106に加え 10.1.1.116, 10.1.1.126のアドレスをイーサネットデバイスに付与し試したところ、同時に(20241128追記:非同一 remote に対して)複数セッションを張ることが出来たからです。つまり、同一 local アドレスからは同時に複数セッションを張れなかったということです。(20241201追記:何もしない場合、nat越えでは同一 remote アドレスに対しても非同一 local アドレスから同時にはセッションを張れませんでした。)
続いて gre の場合です。こちらはとあるプロバイダのIPv6 BGP トランジットトンネルです。
auto XX_US_FMT01 iface XX_US_FMT01 inet6 static address 2001:db8:f00:1111::2 netmask 64 pre-up ip tunnel add XX_US_FMT01 mode gre remote 198.51.100.247 local 10.1.1.106 post-up ip -6 addr add 2001:db8:20::1/48 dev XX_US_FMT01 post-up ip -6 addr add 2001:db8:21::1/48 dev XX_US_FMT01 post-up ip -6 addr add 2001:db8:22::1/48 dev XX_US_FMT01 post-up ip -6 addr add 2001:db8:23::1/48 dev XX_US_FMT01 post-down ip tunnel del XX_US_FMT01ローカルのアドレスは gretap と同じですが、問題なく gre/gretap を同時に NAT 越えできています。また gretap と同様に gre 複数セッションを同一クライアントから張る場合も local アドレスを複数用意すれば同時に通過できました。(20241201追記:gretapと同様に何もしない場合は同一 remote に対して、あるいは同一 local からは、セッションを複数同時に張ることはできませんでした。)なおこれは以前からかわらないのですが、NATを挟んだgre/gretapセッションはかならずNAT 内部から始める必要があります。linuxの実装ではCiscoルータのように keepalive の機能がないので、cronなどで定期的にpingを打つなどするとよいと思います。
2024/12/04追記: greでの同一クライアント(異なるエイリアスアドレス)からキー無での異なるホストへの例を挙げておきます。
# gre to 198.51.100.59 without key auto gre116 iface gre116 inet tunnel address 172.16.116.2 netmask 255.255.255.0 mode gre mtu 1418 local 10.1.1.116 endpoint 198.51.100.59 # gre to 198.51.100.168 without key auto gre126 iface gre126 inet tunnel address 172.16.126.2 netmask 255.255.255.0 mode gre mtu 1418 local 10.1.1.126 endpoint 198.51.100.168最近のカーネルでの gre/gretap の NAT 越えについての記事はほとんど見あたらなかったので、備忘録として挙げてみました。
今回は以上です。それでは。
コメント
コメントを投稿