pslaboが試したことの記録

はてなダイヤリーからはてなブログに引っ越してきました

この日記は現在実行中の減量記録を含む個人的なメモとして始めましたが、最近はコンピュータやガジェット、ハック、セキュリティネタのほうがメインになっております。

はてなダイヤリー時代はカテゴリ分けが適当だったのですが、これはそのうち直します。


OpenWrt ベースのルータ GL.iNet GL-MT1300 レビュー(無線部分の性能測定)

OpenWrt ベースの市販ルータである GL.INet GL-MT1300 を先日購入した際に、WAN側とLAN側をまたぐ有線LAN接続のスループットを iperf3 で計測してみました。

pslabo.hatenablog.com

今回は LAN側の有線LAN と WiFi の間のスループットを計測してみます。

事前準備

  • LAN側の有線LANには、MacBook Pro + USB3 イーサネットアダプタを接続し、iperf3 のサーバーとして使用します。クライアントからは IP アドレスを指定して接続するため、NIC に割り当てられた IP アドレスを確認しておきます。
  • LAN側のWiFi (5GHz) には、iPhone XR を接続し、iperf3 のクライアントとして使用します。
  • MacBook Pro には iperf3 をインストールします。
  • iPhone XR には HE.NET Network Tools をインストールしておきます。

※ iperf は Windows 版もあるので、Windows PC でも同様の調査は可能です

計測

  • MacBook Pro で "iperf3 -s" を起動します。
  • iPhone XR で HE.NET Network Tools を起動し、iperf のメニューから iperf3 を選択します。
  • 定量の送信を行うほうが適切な計測が行えるため、ここでは 500M の送信を行うように設定します。
  • "iperf3 Server" に MacBook Pro の IP アドレスを入力して Enter を押すと計測が始まります。

計測結果は次の通りであり、概ね 400Mbits/sec のスループットが出ていることがわかります。

-----------------------------------------------------------
Server listening on 5201
-----------------------------------------------------------
Accepted connection from 192.168.8.117, port 63246
[  5] local 192.168.8.160 port 5201 connected to 192.168.8.117 port 63247
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-1.00   sec  47.9 MBytes   402 Mbits/sec                  
[  5]   1.00-2.00   sec  43.5 MBytes   365 Mbits/sec                  
[  5]   2.00-3.00   sec  43.5 MBytes   365 Mbits/sec                  
[  5]   3.00-4.00   sec  45.2 MBytes   379 Mbits/sec                  
[  5]   4.00-5.00   sec  49.0 MBytes   411 Mbits/sec                  
[  5]   5.00-6.00   sec  46.1 MBytes   387 Mbits/sec                  
[  5]   6.00-7.00   sec  49.1 MBytes   412 Mbits/sec                  
[  5]   7.00-8.00   sec  51.1 MBytes   428 Mbits/sec                  
[  5]   8.00-9.00   sec  44.1 MBytes   370 Mbits/sec                  
[  5]   9.00-10.00  sec  44.2 MBytes   371 Mbits/sec                  
[  5]  10.00-10.48  sec  23.1 MBytes   406 Mbits/sec                  
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-10.48  sec   487 MBytes   390 Mbits/sec                  receiver
-----------------------------------------------------------
Server listening on 5201
-----------------------------------------------------------

考察

iPhone XRWiFi の仕様は Apple のドキュメントによると次の通りです。https://support.apple.com/ja-jp/guide/deployment-reference-ios/apd1c22e481c/web

802.11規格、名称、周波数 最大PHYデータレート 最大チャンネル帯域幅 最大MCSインデックス 最大空間ストリーム
ac@5 GHz 866 Mbps 80 MHz 9(VHT) 2/MIMO
a/n@5 GHz 300 Mbps 40 MHz 7(HT) 2/MIMO
b/g/n@2.4 GHz 144 Mbps 20 MHz 7(HT) 2/MIMO

また、GL-MT1300 の WiFi の仕様は次の通りです。https://www.gl-inet.com/products/gl-mt1300/

Protocol IEEE 802.11a/b/g/n/ac
Wi-Fi Speed 2.4GHz(400Mbps), 5GHz(867Mbps)

従って、iPhone XR と GL-MT1300 の組み合わせの場合、5GHz の周波数帯で 802.11ac、チャネル帯域幅 80MHz での通信が行えることがわかります。

802.11ac でのスループットが約 400Mbits/sec 程度出ているなら、まあまあ悪くないと思います。

WiFi - DS-Lite の速度計測

WiFi - DS-Lite の速度を speedtest cli で計測してみました。MacBook Pro 13inch retina (2013) の場合はこのくらいの速度です。

$ speedtest -s 24333

   Speedtest by Ookla

     Server: Rakuten Mobile, Inc - Tokyo (id = 24333)
        ISP: Internet Multifeed Co.
    Latency:    10.60 ms   (1.79 ms jitter)
   Download:   197.66 Mbps (data used: 264.3 MB)                               
     Upload:    89.88 Mbps (data used: 157.2 MB)                               
Packet Loss:     0.0%

iPhone XR で計測した場合は、最もよい場合でこれくらいの速度が出ていました。

Download Mbps
246.16

Upload Mbps
88.80

Ping 11 ms
Jitter 1.7 ms
Packet Loss 0%

これくらいの速度が出ていれば、概ね不満はないかと思います。

OpenWrt ベースのルータ GL.iNet GL-MT1300 レビュー(有線部分の性能測定)

OpenWrt を市販ルーターで利用する場合は技術基準適合証明の問題があるので Wi-Fi 利用が憚られますが、最初から OpenWrt ベースのファームウェアを利用すれば技適の問題を気にせずに利用できるという認識です。

そこで適切な製品を探していた所、GL.iNet の製品は技適を通っているようなので、GL-MT1300 を試してみることにしました。これは本来はトラベルルータなので LAN 側の NIC が 2 つしかないなど、据え置き用として利用する場合に口が足りない場合は Hub が必須です。

Amazon の販売ページには「技適番号:R 018-210044」の記載がありますし、この番号で総務省のページの記載が確認できます。これならベンダーが提供するファームウェアを用いる限り、特に心配なく利用できそうです。

https://www.tele.soumu.go.jp/giteki/SearchServlet?pageID=jg01_01&PC=018&TC=N&PK=1&FN=210222N018&SN=%94F%8F%D8&LN=26&R1=*****&R2=*****

とりあえず、Wi-Fi 側の性能測定は後回しにして、有線LANのWAN - LAN 間のスループットや、有線LANの内部側と DS-Lite のパフォーマンスをざっくり測ってみました。

雑感

  • デフォルトの管理 UI は、GL.iNet のオリジナルの UI です。ただし ssh でログインしてみると OpenWrt のログインメッセージが表示されることを確認しました。
  • デフォルトでは WAN 側の IPv6 は無効のため、IPv6 IPoE で利用したい場合は IPv6 を有効化する必要があります。
  • 標準の管理 UI には DS-Lite の設定項目はありません。Luci UI を別途インストールし、Luci から設定する必要があります。
  • 管理UI の「高級機能」メニューから Luci をインストールすれば、OpenWrt の Luci UI が利用できるようになります。

  • OpenWrt を搭載しているとはいいつつも、ソフトウェアダウンロード用のサイトは GL.iNet が運用するサーバです。OpenWrt のサイトからダウンロードしているわけではありません。

  • そして GL.iNet のサーバーは IPv6 に対応していないため、DS-Lite をインストールするために IPv4 でインターネットに接続できる環境が必要です。すでに何かのインフラがある場合は特に問題ありませんが、そうではない場合はスマホテザリングするなどして必要なソフトウェアのインストールを行う必要があります。

WAN - LAN のスループット

フレッツ光ホームゲートウェイの WAN 側に設置した PC で iperf3 をサーバーモードで実行し (iperf3 -s) 、LAN 側の PC から iperf3 のクライアントで接続しました (iperf3 -c サーバのIPアドレス)

Connecting to host 192.168.1.6, port 5201
[  5] local 192.168.8.160 port 61798 connected to 192.168.1.6 port 5201
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-1.00   sec   109 MBytes   915 Mbits/sec                  
[  5]   1.00-2.00   sec   108 MBytes   908 Mbits/sec                  
[  5]   2.00-3.00   sec   109 MBytes   917 Mbits/sec                  
[  5]   3.00-4.00   sec   111 MBytes   932 Mbits/sec                  
[  5]   4.00-5.00   sec   110 MBytes   924 Mbits/sec                  
[  5]   5.00-6.00   sec   111 MBytes   927 Mbits/sec                  
[  5]   6.00-7.00   sec   108 MBytes   904 Mbits/sec                  
[  5]   7.00-8.00   sec   105 MBytes   882 Mbits/sec                  
[  5]   8.00-9.00   sec   106 MBytes   888 Mbits/sec                  
[  5]   9.00-10.00  sec   103 MBytes   868 Mbits/sec                  
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-10.00  sec  1.06 GBytes   907 Mbits/sec                  sender
[  5]   0.00-10.00  sec  1.06 GBytes   907 Mbits/sec                  receiv

これくらいのスループットが出ていれば悪くないと思います。

DS-Liteスループット測定

日曜日の夜にSpeedtest CLI で計測してみました。

   Speedtest by Ookla

     Server: Rakuten Mobile, Inc - Tokyo (id = 24333)
        ISP: Internet Multifeed Co.
    Latency:    10.66 ms   (1.12 ms jitter)
   Download:   272.99 Mbps (data used: 403.6 MB)                               
     Upload:    86.51 Mbps (data used: 119.2 MB)                               
Packet Loss:     0.0%

できればもうちょっとスピードが出て欲しい気もしますが、実用上の問題は、あまりなさそうに思います。

というわけで、少なくとも WAN-LAN 間のスループットは全く問題ないので、技適の問題を気にせずに OpenWrt を利用したい場合の選択肢としては悪くないように思います。

ただし、私の手元で Luci UI をインストールして環境構築していたら Wi-Fi が認識できない状況が発生しました。無線の設定は標準の UI と Luci の UI で整合性が取れないように見受けられました。とりあえず設定を初期化し、無線の設定は標準の UI 側だけで操作したところ問題なく設定できましたが、この手のトラブルを楽しみつつ自力で問題解決できるスキルの方には向くと思いますが、そういうのが苦手な方は手を出さないほうが良いかもしれません。

もっとも、OpenWrt 自体、初心者向けではないと思うので、この程度のトラブルを自力で対処できない方向きではないことは間違いないですけど。

IPv4 DS-Lite の速度が出ない時は、そもそもルーターの性能の頭打ちの可能性を疑ってみる

フレッツ光回線でインターネット接続する場合に IPv6 IPoE + IPv4 + DS-Lite 対応プロバイダを利用し、ルータも DS-Lite 接続を有効にすると PPPoE に比べて帯域速度が改善するわけですが、スループットに対する影響を与える要素は以下のように多岐に渡ります。

  1. フレッツ光回線の種別
  2. LAN ケーブル:フレッツ光ホームゲートウェイ or ONU とルータ間
  3. ルーター
  4. LAN ケーブル:ルーターと PC 間
  5. LAN アダプタ:GbE 対応かどうか、USB3 かどうか、ドライバの性能は問題ないか
  6. PC 自体の性能

そこで、この記事ではルーターを超える通信のスループットがどの程度出るものかを計測してみました。

計測方法

2台の PC にiperf3という計測ツールをインストールして使用します。ルーターの WAN 側(フレッツ光ホームゲートウェイ側)に設置した PC でサーバーを実行し、ルーターの LAN 側に設置した PC でクライアント側を実行すれば、ルーターを超える通信のスループットを計測できます。

(サーバー側)
iperf3 -S

(クライアント側)
iperf3 -c サーバ側IPアドレス

また、ルーターを超えてインターネット側と通信する場合のスループットは Speedtest CLI を使用して計測します。 https://www.speedtest.net/ja/apps/cli

同一セグメントのノード間で計測

ルーター超えの計測を行う前に、同一セグメントのノードどうしで iperf3 による計測を実施します。この計測で十分な速度が出ていない場合は、そもそも PC の性能が頭打ちの可能性があります。

以下はルーターの LAN 側に有線LANケーブル (CAT-6) で接続した PC どうしの計測結果です。これくらいの速度が出ていれば特に不満はないと思います。

Connecting to host 192.168.1.6, port 5201
[  5] local 192.168.1.4 port 55011 connected to 192.168.1.6 port 5201
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-1.00   sec   104 MBytes   870 Mbits/sec                  
[  5]   1.00-2.00   sec   109 MBytes   916 Mbits/sec                  
[  5]   2.00-3.00   sec   109 MBytes   918 Mbits/sec                  
[  5]   3.00-4.00   sec   112 MBytes   937 Mbits/sec                  
[  5]   4.00-5.00   sec   112 MBytes   939 Mbits/sec                  
[  5]   5.00-6.00   sec   107 MBytes   902 Mbits/sec                  
[  5]   6.00-7.00   sec   111 MBytes   934 Mbits/sec                  
[  5]   7.00-8.00   sec   109 MBytes   915 Mbits/sec                  
[  5]   8.00-9.00   sec  97.9 MBytes   821 Mbits/sec                  
[  5]   9.00-10.00  sec   112 MBytes   939 Mbits/sec                  
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-10.00  sec  1.06 GBytes   909 Mbits/sec                  sender
[  5]   0.00-10.00  sec  1.06 GBytes   909 Mbits/sec                  receiver

有線LAN経由での同一セグメント接続で十分な速度が出ない場合は、PCのNICGbE に対応していることや、NIC の実際のリンク速度が GbE であることを確認します。古いLANケーブルを使っている場合はケーブルの問題で速度が出ないこともありえます。NIC のスペックが GbE なのにスピードが出ない場合は CAT6 の新品のケーブルを買ってきて試してみるのも悪くないアイデアです。

なお、有線LAN ではなく Wi-Fi で計測すると、もっと悪い数値が出る場合が多いはずです。今回の計測はルーターを超える通信のスループットを計測し、DS-Lite の速度と比べることを目的としていますが、この手の計測には Wi-Fi は不向きです。必ず有線 LAN で計測しましょう。

PC をフレッツ光ホームゲートウェイに直結して DS-Lite 接続した場合の速度(または IPv6 IPoE の速度)

ルーター超えのスループットを測る前に、DS-Lite 自体の速度の期待値を確認しておきます。Windows だと DS-Lite を扱えないのですが、macOS, Linux の場合は DS-Lite のトンネルを張ることができるため、これらの OS が利用できる場合は計測しておくと良いでしょう。

macOS Sierra 以前の macOS の場合は、下記のスクリプトDS-Lite 接続が行えます。

techlog.iij.ad.jp

macOS Sierra 以降は IPv6 のアドレス取得方法が変わっているため、上記スクリプトのままでは動作しません。下記記事では修正方法例が示されていますが、私の環境では macOS Big Sur では動作しませんでした。 blog.goo.ne.jp

もし PC からの DS-Lite 接続が行えない場合は、代わりに https://fast.com/ja/ にブラウザでアクセスしてみてください。これは Netflix の速度計測サイトですが、IPv6 only のネットワークからの速度計測にも対応しています。厳密に言えば DS-Liteスループットとは違う計測ですけど、ルーターを介さない場合の参考値として使えます。

私の場合は macOS Sierra 以降にアップデートできていない、古い MacBook (macOS El Capitan) で計測したところ、以下のようになりました。

   Speedtest by Ookla

     Server: Rakuten Mobile, Inc - Tokyo (id = 24333)
        ISP: Internet Multifeed Co.
    Latency:     8.71 ms   (0.27 ms jitter)
   Download:   548.26 Mbps (data used: 387.0 MB)                               
     Upload:    91.12 Mbps (data used: 109.8 MB)                               
Packet Loss:     0.0%

fast.com の計測は 400 〜 500Mbits/sec の間の数値が計測されました。

したがって、ルーター超えの場合に、この速度にどこまで近づくか、ということが目標になります。PC どうしの直結での計測に問題がなく、しかしインターネット側とルーターを介さない通信が遅い場合はフレッツ光側に起因する問題で速度が出ない可能性があります…

ルーター超えのスループット(WZR-HP-AG300H)

WZR-HP-AG300H は OpenWrt で無難に扱える機種として好まれていますが、OpenWrt 19.07.7 で無線を無効化し、DS-Lite でインターネット接続が行える設定にした上で、ルーター超えのスループットを計測しました。

有線LANの仕様は GbE に対応していることになっていますが、実際にスループットを計測すると、ごらんのとおり 100Mbits/sec 程度のスループットしか出ません。

Connecting to host 192.168.1.6, port 5201
[  5] local 192.168.3.160 port 56817 connected to 192.168.1.6 port 5201
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-1.00   sec  11.5 MBytes  96.1 Mbits/sec                  
[  5]   1.00-2.00   sec  11.3 MBytes  94.8 Mbits/sec                  
[  5]   2.00-3.00   sec  11.3 MBytes  94.8 Mbits/sec                  
[  5]   3.00-4.00   sec  11.1 MBytes  93.3 Mbits/sec                  
[  5]   4.00-5.00   sec  11.3 MBytes  94.6 Mbits/sec                  
[  5]   5.00-6.00   sec  11.3 MBytes  94.5 Mbits/sec                  
[  5]   6.00-7.00   sec  11.4 MBytes  95.4 Mbits/sec                  
[  5]   7.00-8.00   sec  11.3 MBytes  94.8 Mbits/sec                  
[  5]   8.00-9.00   sec  11.3 MBytes  95.2 Mbits/sec                  
[  5]   9.00-10.00  sec  11.3 MBytes  94.7 Mbits/sec                  
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-10.00  sec   113 MBytes  94.8 Mbits/sec                  sender
[  5]   0.00-10.00  sec   113 MBytes  94.7 Mbits/sec                  receiver

Speedtest CLI で計測してみても、ごらんの通りの結果です。PPPoE に比べれば十分に速いとは思いますが、DS-Lite の期待値には程遠い結果です。

   Speedtest by Ookla

     Server: Rakuten Mobile, Inc - Tokyo (id = 24333)
        ISP: Internet Multifeed Co.
    Latency:    10.61 ms   (0.28 ms jitter)
   Download:    89.85 Mbps (data used: 89.2 MB)                               
     Upload:    90.58 Mbps (data used: 93.3 MB)                               
Packet Loss:     0.0%

確かに無難に扱える機種ではあるのですが、DS-Lite 接続では回線のパフォーマンスを全く発揮できないスペックしか出ないので、これは予備機に格下げし、別の機器に入れ替えることを検討したほうが良い程度の性能です。

ルーター超えのスループット(I-O DATA WN-AC1600DGR2)

WZR-HP-AG300H は古すぎる機材ですから、別のハードウェアで試してみます。WZR-HP-AG300H と同様に Wi-Fi を使用しない設定での検証です。すると WZR-HP-AG300H の 3 倍程度のスループットになりました。

Connecting to host 192.168.1.6, port 5201
[  5] local 192.168.2.160 port 55576 connected to 192.168.1.6 port 5201
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-1.00   sec  40.1 MBytes   336 Mbits/sec                  
[  5]   1.00-2.00   sec  40.3 MBytes   338 Mbits/sec                  
[  5]   2.00-3.00   sec  40.2 MBytes   337 Mbits/sec                  
[  5]   3.00-4.00   sec  39.4 MBytes   331 Mbits/sec                  
[  5]   4.00-5.00   sec  39.9 MBytes   334 Mbits/sec                  
[  5]   5.00-6.00   sec  39.1 MBytes   328 Mbits/sec                  
[  5]   6.00-7.00   sec  39.2 MBytes   329 Mbits/sec                  
[  5]   7.00-8.00   sec  39.1 MBytes   328 Mbits/sec                  
[  5]   8.00-9.00   sec  39.0 MBytes   327 Mbits/sec                  
[  5]   9.00-10.00  sec  39.0 MBytes   327 Mbits/sec                  
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-10.00  sec   395 MBytes   332 Mbits/sec                  sender
[  5]   0.00-10.00  sec   395 MBytes   331 Mbits/sec                  receiver

Speedtest CLIDS-Liteスループットを計測してみると、WZR-HP-AG300H の 2 倍のスループットが出ています。DS-Lite の期待値の半分以下のスループットではありますが、これくらいの速度が出るなら許容範囲ではないかと思います。

   Speedtest by Ookla

     Server: Rakuten Mobile, Inc - Tokyo (id = 24333)
        ISP: Internet Multifeed Co.
    Latency:     9.60 ms   (0.59 ms jitter)
   Download:   223.96 Mbps (data used: 246.6 MB)                               
     Upload:    92.83 Mbps (data used: 120.1 MB)                               
Packet Loss:     0.0%

ルーター超えのスループット(Raspberry Pi4 + USB3-NIC

もうちょっと新しいハードウェアでも検証してみましょう。Raspberry Pi 4 が手元にあるので、これに OpenWrt 21.02-rc1 をインストールして検証します。

Raspberry Pi4 はオンボードNIC が一つしかないので、手元にあった Anker の USB-LAN アダプタを組み合わせます。これは Realtek RTL8153 を搭載しているようでしたので、RTL8152 向けのドライバを OpenWrt に追加インストールして使用します…

この構成でルーター超えの iperf3 の速度を計測すると PC どうしの直結に迫る速度でした。

Connecting to host 192.168.1.6, port 5201
[  5] local 192.168.4.188 port 52825 connected to 192.168.1.6 port 5201
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-1.00   sec  98.2 MBytes   824 Mbits/sec                  
[  5]   1.00-2.00   sec  99.9 MBytes   838 Mbits/sec                  
[  5]   2.00-3.00   sec   102 MBytes   853 Mbits/sec                  
[  5]   3.00-4.00   sec   100 MBytes   840 Mbits/sec                  
[  5]   4.00-5.00   sec  96.4 MBytes   809 Mbits/sec                  
[  5]   5.00-6.00   sec   101 MBytes   850 Mbits/sec                  
[  5]   6.00-7.00   sec   100 MBytes   840 Mbits/sec                  
[  5]   7.00-8.00   sec   104 MBytes   872 Mbits/sec                  
[  5]   8.00-9.00   sec   102 MBytes   856 Mbits/sec                  
[  5]   9.00-10.00  sec   103 MBytes   860 Mbits/sec                  
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-10.00  sec  1007 MBytes   844 Mbits/sec                  sender
[  5]   0.00-10.00  sec  1006 MBytes   844 Mbits/sec                  receiver

これくらいのスループットが出るようならいろいろと期待が高まります。Speedtest CLIDS-Lite の速度を計測してみると、なかなかよい数値が出ました。ここまでのパフォーマンスが出るようなら期待値として十分だと思います。

   Speedtest by Ookla

     Server: Rakuten Mobile, Inc - Tokyo (id = 24333)
        ISP: Internet Multifeed Co.
    Latency:     9.31 ms   (2.23 ms jitter)
   Download:   416.15 Mbps (data used: 395.7 MB)                               
     Upload:    85.40 Mbps (data used: 97.7 MB)                               
Packet Loss:     0.0%
 Result URL: https://www.speedtest.net/result/c/20c6db34-c2b1-4952-8475-c3281e577505

ただし Raspberry Pi4 はルーター用に用いるには少々お高いので、Nanopi R2S などを用いるのがよいかもしれません。

Internet Watch の記事例では Nanopi R2S で fast.com での速度計測を行った場合に約600Mbits/secのスループットが出ているようです。すべての環境でこの速度が出ることが期待できるわけではないでしょうけれど、十分な速度が出るものと思われます。 https://internet.watch.impress.co.jp/docs/column/shimizu/1311821.html

curl コマンドは URL に含まれる Anchor を送信しない

Windows で OAuth2 Implicit Grant で認可リクエストを送信するクライアントアプリを試作した際にリダイレクトURIのリクエストを受けるサーバ側の挙動を試そうと考えたのですが、 http://localhost:port/redirectpage#access_token=....&state=....&token_type=... というリクエストを受け先のサーバに curl で送信しようとしてみたのですが、アンカー部分が受け先のサーバに送出されている気配が全くない。

どうも変だなあ、と思って調べてみたら、curl 7.20.0 で "fragment part of URLs are no longer sent to the server" という Bugfix が行われていて、アンカー部分を落として送信するように修正されているということを知りました。

stackoverflow.com

仕方がないので、とりあえず telnet コマンドを以下の PowerShell コマンドでインストールして検証しました。

Enable-WindowsOptionalFeature -Online -FeatureName TelnetClient

OpenWrt で IPv6 IPoE 接続した場合にインターネット側からの IPv6 インバウンド通信が LAN 側に流れないことを検証する

フレッツひかりに接続したルーターIPv6 IPoE を有効にするとルーターの LAN 側クライアントにも パブリック IPv6 アドレスが割り当てられるため、その IPv6 アドレスに対して外部からのインバウンド通信が通りそうな感じがして、なんだか気持ち悪い感じがしますね。そこでインターネット側からの IPv6 インバウンド通信がルーターの LAN 側のノードまで到達するかどうかを検証しておきます。

なお、ここで紹介する手順を試すには、クラウドサービスのインスタンスまたは VPS サーバに対して ssh でログインし、必要なパッケージをインストールできる程度の知識が必要です。

注意事項

この検証は、あくまで私の環境での結果を示しているだけであり、すべての OpenWrt 構成で IPv6 インバウンド通信が LAN 側に到達しないことを保証するものではありません。この内容を盲信するのではなく、ご自身の環境についてはご自身で検証してください。

使用するもの

クライアント側が 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 アウトバウンド通信が通ることが確認できました。これが通らない場合は VPCIPv6 が無効になっている可能性があります。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 側にポートスキャンを行えば、ポートが開いているか、閉じているかを検証できると思います。

macOS でシェルスクリプトの実行完了時にターミナルを前面に表示する

シェルスクリプトの実行中に、特定のタイミングでターミナルを前面に表示させて、その実行状況を確認する必要が生じました。この処理は実行中のスクリプト側でコントロールしたかったので、方法を調べてみたところ、osascript で次のように操作すればよいことがわかりました。

osascript -e 'tell application "Terminal" to activate'

なお、ウィンドウを前面に持ってくる必要はないけれど、特定のタイミングになったら通知を受けたい、という場合は "display notification" を利用すればシステム通知にメッセージを送ることができます。

osascript -e 'display notification "通知したいメッセージ内容"'

追加オプションで title, subtitle を設定したり、通知音を指定したりできますので、単に状況を知りたい場合はこの方法も使えると思います。

AWS の IP アドレスを対話的な操作で抽出するスクリプト

AWS ではサービスが使用する IP アドレスが公開されていて、特定のサービスとの通信だけを通したい場合に、この情報を用いてフィルタリングする設定を作る際に利用できます。

docs.aws.amazon.com

そしてこのページでは抽出方法も示されていますが、なんとなく、ノリと勢いだけで対話的なUIで抽出できるスクリプトを書いてみました。

なお、実行の際は peco と jq が必要です。 対話的な操作に peco を使用しており、JSON データの操作には jq を用いています。

また出力結果には curl + jq で同じ結果を取得する際のコマンド実行例も含めています。後日に同じ条件で最新の情報を取得したい場合には、対話的な操作を行わなくても容易に抽出が行えるようにしています。

#!/bin/bash

interactive_helper=peco
aws_ip_address_url="https://ip-ranges.amazonaws.com/ip-ranges.json"
ip_ranges=$( curl -s "${aws_ip_address_url}" )

service=$(
    echo ${ip_ranges} | jq ".prefixes[].service" -r | sort | uniq | ${interactive_helper}
)

region=$(
    (
        echo "ALL"
        echo ${ip_ranges} | jq ".prefixes[] | select (.service == \"${service}\") | .region" -r | sort | uniq
    ) | ${interactive_helper}
)

if [ "${region}" == "ALL" ]; then
    condition=".service == \"${service}\""
else
    condition=".service == \"${service}\" and .region == \"${region}\""
fi

echo "# service=${service}"
echo "# region=${region}"
echo "#"
echo "# curl -s ${aws_ip_address_url} | jq '.prefixes[] | select( ${condition} ) | .ip_prefix' -r | sort -n"
echo "# curl -s ${aws_ip_address_url} | jq '.ipv6_prefixes[] | select( ${condition} ) | .ipv6_prefix' -r | sort -n"
echo ${ip_ranges} | jq ".prefixes[] | select( ${condition} ) | .ip_prefix" -r | sort -n
echo ${ip_ranges} | jq ".ipv6_prefixes[] | select( ${condition} ) | .ipv6_prefix" -r | sort -n

例えば、S3 が使用する IP アドレスを大阪リージョンの分だけ出力させてみると次のようになります。

$ get_aws_iprange.sh 

# service=S3
# region=ap-northeast-3
#
# curl -s https://ip-ranges.amazonaws.com/ip-ranges.json | jq '.prefixes[] | select( .service == "S3" and .region == "ap-northeast-3" ) | .ip_prefix' -r | sort -n
# curl -s https://ip-ranges.amazonaws.com/ip-ranges.json | jq '.ipv6_prefixes[] | select( .service == "S3" and .region == "ap-northeast-3" ) | .ipv6_prefix' -r | sort -n
3.5.240.0/22
52.95.157.0/24
52.95.158.0/23
52.95.181.0/24
52.95.182.0/23
2406:daa0:6000::/40
2406:daf0:6000::/40
2406:daf8:6000::/40
2406:daf9:6000::/40
2406:dafa:6000::/40