それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

フレッツ網内折返しのv6 で拠点間を単純にIPIP/GREでトンネル接続してVPNする。

フレッツのv6網の網内同士で通信したい。

フレッツのv6オプションを申し込んだら、フレッツ網内(広域イーサネット)内部での通信ができるようになる。しかも追加料金無し!

これはいいオモチャになりそうだとずっと思っていて、ようやく一通りをLinuxルータで扱えるようになったのでメモとして残します。

フレッツのIPv6オプション

このオプションが有ると、インターネットを経由せずに通信が可能です。

f:id:takuya_1st:20190506142217p:plain https://flets.com/v6option/

初期ONに切れてる人もいるようですが、私個人としてはデフォルト有効は素晴らしいのではないか、などと思ってる。ISP経由しなくても隣近所の一般のご家庭と通信ができるようになる。しかも無料で。NTT東西がNTT法で縛り付けられた結果で生まれた謎のインターネット、それが広域イーサネットです。

NTTでフレッツ・v6オプションを契約している人は切れた方がいい(デフォルト設定でのセキュリティは皆無) - Qiita

設定例

今回はどちらの拠点間もLinuxルーターで構成することにした。

## mode ipip6 
## 拠点1ルーター
ip -6 tunnel del tun1 mode ip4ip6 remote 2001:a2xx:xxxx:a300:b2be:xxxx:xxx7  local 2001:a25xx:3xxx:3700:xxxx:xxxx:c53b
ip -6 tunnel add tun1 mode ip4ip6 remote 2001:a2xx:xxxx:a300:b2be:xxxx:xxx7  local 2001:a25xx:3xxx:3700:xxxx:xxxx:c53b
ip link set tun1 up
ip addr add 172.16.1.2/30 dev tun1
ip route add 192.168.2.0/24 via 172.16.1.1 dev tun1
iptables -I INPUT -i tun1 -j ACCEPT
iptables -I FORWARD -i tun1 -j ACCEPT
iptables -I OUTPUT -o tun1 -j ACCEPT
iptables -I FORWARD -o tun1 -j ACCEPT

ローカル側とリモート側の違いは remote と local だけなので、同じ設定をリモートとローカルを入れ替えて通すだけ

## 拠点2ルーター
ip -6 tunnel del tun1 mode ip4ip6 local 2001:a2xx:xxxx:a300:b2be:xxxx:xxx7  remote 2001:a25xx:3xxx:3700:xxxx:xxxx:c53b
ip -6 tunnel add tun1 mode ip4ip6 local 2001:a2xx:xxxx:a300:b2be:xxxx:xxx7  remote 2001:a25xx:3xxx:3700:xxxx:xxxx:c53b
### 以下IP以外はヤッてることが同じ
ip link set tun1 up
ip addr add 172.16.1.2/30 dev tun1
ip route add 192.168.1.0/24 via 172.16.1.1 dev tun1
iptables -I INPUT -i tun1 -j ACCEPT
iptables -I FORWARD -i tun1 -j ACCEPT
iptables -I OUTPUT -o tun1 -j ACCEPT
iptables -I FORWARD -o tun1 -j ACCEPT

上記設定に必要なもの

Linuxカーネルのモジュールのロード

modprobe ip6_tunnel

パケットのフォワーディングをできるような設定(ルーターに使ってるなら最初から入れてるはず)

$ sysctl net.ipv4.conf.all.forwarding
net.ipv4.conf.all.forwarding = 1

rp_filter  はオフ

$ sysctl net.ipv4.conf.tun1.rp_filter
net.ipv4.conf.tun1.rp_filter = 0

greの場合。

ipip6(ip4ip6) のところが、grev6 になる。

ip -6 tunnel del tun1
ip -6 tunnel add tun1 mode grev6 local 2001:a2xx:xxxx:a300:b2be:xxxx:xxx7  remote 2001:a25xx:3xxx:3700:xxxx:xxxx:c53b

GRE のパケットを許可する

iptables -A INPUT -p gre -j ACCEPT
iptables -A OUTPUT -p gre -j ACCEPT

拠点間通信の速度

Linux ルータの限界が200Mbps 程度なのでそれまで出てた。速度上限がわからない。上限が見えないなんて、サイヤ人みたいだな。

フレッツのv6オプションについて知っておくこと。

広域イーサネットでIPv6で通信ができる。IPv6は自動的に払い出される。そして半固定。NTT側からRAで払い出される。

ひかり電話契約の有無で、取得方法が異なる。ひかり電話なしの場合、RAで取得する。ひかり電話契約があるとNTTのHGWからDHCPv6-PDで払い出される。*1

いずれの場合もv6 対応したOSを挿すだけでv6が使えるようになる。

v6広域イーサネットを経由してインターネットに出ていくにIPoEを使うには契約が必要。だが、インターネットに出ていかないならISP契約が必要ない!でも通信はできる。あとはわかるな。

IPv6があるとフォールバックする

IPoE契約してないPPPoEのISP(IPv4)のまま、v6を有効にするとインターネットつながらない「壊れたv6インターネット」になってしまう。そのためインターネット接続開始時に遅延を感じてしまう。

これは、IPv6通信が失敗するまでIPv4を通信をしないv6優先のためで、iOSなどはSafariでページを開く際にこのフォールバックが発生し体感でモタツキを感じてしまう。

フォールバックによる遅延防止→IPv6 をLAN内部に展開しない

拠点間通信にv6を使うのであれば、ルーターだけIPv6を受け取ってLAN内部はv4で運用すれば良いわけです。つまりLAN内部へフレッツIPv6のパケットを通さなければ問題は解決する。

iptables(ip6tables) で v6 のLAN内部へFORWARDを止めてしまえばいい。

今回はルーターだけにv6 アドレスを持って拠点間通信させる予定。なので ipt6ables のINPUTでルーター(CPU)側にだけパケットを通せば、フォールバック問題は見て見ぬふりができる。

v6 インターネットへLANを公開しない

ip6tables でRA/DHCPv6 などICMPパケットを止めてしまえるので、LAN内部の各種機器がフレッツv6 アドレスを受け取らずにすみ、LANがインターネットに公開されることもなくなる。

ひかり電話ありの場合は、HGWで設定ができる。

ひかり電話なしの場合は、ip6tables で止めてしまえばいい。ググってもパススルーとか対応機器を用意しましょうとかあれこれ書いてあるけど、自由なソフトウェアで構成できないルーターはちょっと・・・

*1: ホームゲートウェイを経由しなければひかり電話なしと基本的には同じと考えていい。 PDあるけど