フレッツひかりに接続したルーターで IPv6 IPoE を有効にするとルーターの LAN 側クライアントにも パブリック IPv6 アドレスが割り当てられるため、その IPv6 アドレスに対して外部からのインバウンド通信が通りそうな感じがして、なんだか気持ち悪い感じがしますね。そこでインターネット側からの IPv6 インバウンド通信がルーターの LAN 側のノードまで到達するかどうかを検証しておきます。
なお、ここで紹介する手順を試すには、クラウドサービスのインスタンスまたは VPS サーバに対して ssh でログインし、必要なパッケージをインストールできる程度の知識が必要です。
注意事項
この検証は、あくまで私の環境での結果を示しているだけであり、すべての OpenWrt 構成で IPv6 インバウンド通信が LAN 側に到達しないことを保証するものではありません。この内容を盲信するのではなく、ご自身の環境についてはご自身で検証してください。
使用するもの
- OpenWrt ベースのルーター
- netcat コマンドを利用可能なクライアント(macOS, Linux, または Windows の WSL)
- IPv6 reachable なクラウドサービスのインスタンス、または VPS サーバ(ここでは AWS の EC2 インスタンスを使用していますが、VPC や EC2 インスタンスに関する詳細は省略しています)
クライアント側が IPv6 で通信できていることを確認する
http://www.kame.net/ にアクセスして亀が泳いでいたら IPv6 でアクセスしています。
EC2インスタンスを用意する(その他のクラウドサービスや VPS でも IPv6 が利用可能であればよい)
EC2 の場合は t2.micro とかでインスタンスを立てて、IPv6 のアウトバウンド通信が通ることを確認しておきます。また、インバウンド通信を 8080/TCP について許可しておきます。接続元IPアドレスはローカル環境のアウトバウンド IPv6 アドレスに制限しておくのがベターですが、一時的な使い捨てのインスタンスですし、当該ポートでサービスが常時稼働するわけでもないので、0.0.0.0/0 や ::/0 に対する許可でも実質的な問題は起きないと考えられます。
ローカル環境からのアウトバウンド IPv6 アドレスは https://test-ipv6.com/ にアクセスすれば確認できます。ifconfig コマンドなどで確認しても良いのですが、不慣れな方にとっては、何をどのように見れば良いかの判断が難しいので、外部サービスに接続して確認するほうがお手軽です。
インスタンスを立てたら、次のコマンドにより、IPv6 でのアウトバウンド通信が通ることを確認しておきます。
ping6 www.google.com
また nc コマンドを sudo yum install nc でインストールし、www.google.com に対して次のように実行してみます。
$ nc -v -6 www.google.com 80 Ncat: Version 7.50 ( https://nmap.org/ncat ) Ncat: Connected to 2404:6800:4004:810::2004:80. HEAD / HTTP/1.0 Host: www.google.com HTTP/1.0 200 OK Content-Type: text/html; charset=ISO-8859-1 P3P: CP="This is not a P3P policy! See g.co/p3phelp for more info." Date: .......... Server: gws X-XSS-Protection: 0 X-Frame-Options: SAMEORIGIN Expires: .......... Cache-Control: private ..........
HEAD, Host を送出して応答が帰ってくるなら特に問題なく通信できているので、Ctrl + c で nc を止めます。念の為、ホスト名ではなく IPv6 アドレス指定でも確認します。
$ nc -v -6 2404:6800:4004:810::2004 80 Ncat: Version 7.50 ( https://nmap.org/ncat ) Ncat: Connected to 2404:6800:4004:810::2004:80. HEAD / HTTP/1.0 Host: www.google.com HTTP/1.0 200 OK Content-Type: text/html; charset=ISO-8859-1 P3P: CP="This is not a P3P policy! See g.co/p3phelp for more info." Date: .......... Server: gws X-XSS-Protection: 0 X-Frame-Options: SAMEORIGIN Expires: .......... Cache-Control: private
これで EC2 インスタンス側からの IPv6 アウトバウンド通信が通ることが確認できました。これが通らない場合は VPC で IPv6 が無効になっている可能性があります。AWS アカウントを以前から保有している場合はデフォルトの VPC にて IPv6 設定が有効化されていない可能性があります。
とはいえ、既存の VPC 設定を安易に変更できないでしょうから、この検証を行うために一時的に使用する VPC を作成し、検証が終わったら VPC を削除するのがよいと思います。
OpenWrt の LAN 側からEC2インスタンスに向けて通信する
EC2 インスタンス側で nc コマンドを以下のように実行し、8080/TCP で待ち受け状態にしておきます。
$ nc -v -6 -l 8080
次にクライアント側から EC2 インスタンスの IPv6 アドレスに向けて nc コマンドで接続します。接続先の IPv6 アドレスは EC2 コンソールなどで確認できます。
$ nc -6 EC2インスタンスのパブリックIPv6アドレス 8080
このように実行すると、EC2 インスタンス側の nc コマンドには次のようにメッセージが出力されるはずです。
$ nc -v -6 -l 8080 Ncat: Version 7.50 ( https://nmap.org/ncat ) Ncat: Listening on :::8080 Ncat: Connection from クライアントのIPv6アドレス. Ncat: Connection from クライアントのIPv6アドレス:クライアント側TCPポート番号.
この状態でクライアント側で任意の文字列を入力して enter を押すと、EC2 インスタンス側に送信されることが確認できます。また逆の操作も行えます。通信が通ることが確認できたら、Ctrl + C を押して nc コマンドを終了します。
クライアントに向けて同じ操作を行う。
こんどは OpenWrt の LAN 側へのインバウンドIPv6通信を検証しますので、手元の PC で次のように nc を 8080/TCP で待ち受けさせておきます。
$ nc -v -6 -l 8080
そして AWS の EC2 インスタンスから次のように実行してみると、nc コマンドはタイムアウトしてしまいました。
$ nc -v -6 クライアントのIPv6アドレス 8080 Ncat: Version 7.50 ( https://nmap.org/ncat ) Ncat: Connection timed out.
さらに、念のために OpenWrt から nc コマンドで LAN 側のクライアントに IPv6 で接続してみます。OpenWrt の nc コマンドでは IPv6 アドレスを [] で囲む必要があることに注意してください。実行したら任意の文字を入力してみると、LAN 側クライアントで実行中の nc コマンド側で文字が表示されることが確認できるはずです。
nc "[クライアントのIPv6アドレス]" 8080
これにより、つぎのことが検証できました。インターネット側からの IPv6 インバウンド通信が OpenWrt の LAN 側に届くことは無いようです。
- OpenWrt の LAN 側クライアントからインターネット向けの IPv6 アウトバウンド通信 = 通る
- インターネット側から OpenWrt の LAN 側への IPv6 インバウンド通信 = 通らない
- OpenWrt 自身と OpenWrt の LAN 側クライアントとの IPv6 通信 = 通る
このようにテストすることにより、OpenWrt の LAN 側機器に対して外部から IPv6 でアクセスできないことが確認できました。
参考:その他の検証方法
ポートが開いているかどうかの確認ならば、nmap を使っても良いかもしれません。PC を 2 台用意し、片方は OpenWrt の LAN 側に収容、もう一台は IPv6 接続が可能な SIM とスマートフォンでのテザリングによるモバイルインターネット接続を行います。モバイルインターネット接続側の PC から nmap によりフレッツひかり + OpenWrt IPv6 IPoE 側にポートスキャンを行えば、ポートが開いているか、閉じているかを検証できると思います。