GL.iNetの無線ルータで金盾越えのしくみを作ってみる

旅先用の無線ルータを買っていろいろ遊んでいたんですが、あれこれおもしろいことができそうなことがわかったので、もう1台買って家の無線ルータを置き換えました。

家用のは1世代新しいこちら。同じトラベルルータというくくりではあるんですが、181gとちょっと重いので、旅先向きではないかな。

一般的な金盾越えのしくみ

中国ではたとえばGoogleが使えないけれど、それは

[端末]–[金盾]–[Google]

こんなふうに通信経路に金盾が入っていて、通信相手が禁止対象だったら接続をブロックするというしくみになっているんだと思います。

VPNを使えば回避できるとよく言われているけれど、VPNを使うと

[端末]–[金盾]–[VPNサービス(中国国外)]–[Google]

構成はこんな感じになります。金盾からすると、端末の通信相手はGoogleではなくVPNサービスであるかのように見えるので、VPNサービスが禁止対象になっていなければGoogleとの通信ができてしまうというわけです。
(VPNは通信の中身が暗号化されているので、本当の通信相手がGoogleであることは中継機器には見えません。)

で、VPNサービスとしてはProton VPNが無料で使えて便利なんですが、中国では使えなかったという話を見かけます。

Proton自体が禁止対象になってしまっているようなのでそういうことかなと。

中国で使えたというVPNサービスがネットでいろいろ紹介されているんですが、どれも月額料金のかかるものばかり。これをなんとかサブスクに頼らずできるようなしくみを作ってみることにしました。

サブスクなし構成を作ってみる

[端末]–[金盾]–[家の機器]–[Googleなど]

一番シンプルなのはこんな構成です。家の機器は不特定多数の人がアクセスしに来るようなものではないので、ブロック対象として目をつけられにくそう。

でもうちのアパートのネットワークは、部屋までグローバルIPが来ていないので、インターネットから直接アクセスする構成にはできません。

ということで、GL.iNetの無線ルータで利用できるZeroTierという仮想閉域網サービスを利用することに。このサービスは小規模構成なら無料で、今のところ金盾でブロックされていません。ZeroTier自体にはインターネットに出ていく機能がなくて中継用途では使いづらいので、今後もブロックされることはないかも?

で、ZeroTierと家のルータをいろいろいじって、

[端末]-(VPN)-[ZeroTier]-(VPN)-[家のルータ]–インターネット

こういう感じの仮想ネットワークを作るところまではわりとすぐにできました。端末からどこかのサイトにアクセスすると、そのサイト側からは接続元のIPアドレスが家からと同じに見えるようになります。

でもこれだと端末上でZeroTierのアプリを動かさないといけなくて、Kindle端末とかでは利用できないので、ZeroTierへの接続を旅先用ルータでできるようにします。

[端末]-(Wi-Fi)-[旅先用ルータ]-(VPN)-[ZeroTier]-(VPN)-[家のルータ]–インターネット

つまりこんな構成に。これがめっちゃ手こずりましたが、さっきなんとか完成。

Amazon Prime Videoは、ふつうVPN経由で接続するとこんなエラーが出て再生できないんですが、この構成だとVPN扱いされずに再生できました。

追記 2024-01-17

このしくみを使って、国外からでもAmazon Prime Videoを問題なく再生できることが確認できました。

金盾が接続先としてZeroTierをブロックすることがなくても、通信の暗号化のしかたとかを見てブロックすることはあるかも・・・?

手こずった部分 〜 テクニカルな備忘録

★GUIだけでは設定ができない

家のルータ(GL-A1300)は標準でZeroTierのアプリが組み込まれていたのでGUIで操作ができたんですが、旅先用ルータ(GL-SFT1200)はZeroTierをプラグインとして入れないといけなくて、その後の操作がCUIでしかできませんでした。

Chromebook標準のターミナルクライアントではなぜか接続できなかったので、

このアプリでSSH接続しました。

CUIでのZeroTierの設定はこのへんを参考に。

追記 2024-02-11

Chromebook標準のSSHクライアントでは接続できませんでしたが、Chromebook標準コンソールのsshコマンドではログインできました。その際、

-oHostKeyAlgorithms=+ssh-rsa -oPubkeyAcceptedAlgorithms=ssh-dss,ssh-rsa

という引数が必要でした。

★LuCIインタフェースのファイアウォール設定にはご用心

OpenWrtのネットワーク設定にはLuCIというウェブインタフェースを使ったんですが、このファイアウォール設定には注意が必要です。

ここでも問題提起されていますが、一般的なファイアウォール製品のGUIとは見せ方がちがってまぎらわしいんです。

たとえばこれ、lan行のMasqueradingのチェックがはずれていますが、LANからWANへの通信にNAPTがかからないという意味ではありません。

一方wan行の方にはチェックがありますが、これが「WANインタフェース側には接続元の本当のIPアドレスを見せない」という意味なので、これがあるおかげでLANからWANへの通信にちゃんとNAPTがかかります。
(かんちがいをしてLAN側でMasqueradingをONにしてしまっている日本語のブログがあったので、混乱している人は多そう。)

「⇒」の右のForwardingsインタフェースが関係するのはForwardの設定だけで、MasqueradingだけでなくInputにもOutputにも関係がありません。LANの行なら、Input設定は「LANゾーンからこのルータを最終宛先としたInputパケットに対する処理」で、Output設定は逆に「このルータ自身を送信元としたLANゾーンに向けてのOutputパケットに対する処理」です。

あと、旅先用ルータ(GL-SFT1200)はLuCIでネットワーク設定をいじると、何もミスしてなくても、電源OFF/ONしないとその後操作すらできなくなることがあるので、その心づもりを。
(操作用のインタフェースとは何も関係がない設定変更でも起こります。)

★ZeroTierへのデフォルトルート

一番苦労したのが、最後に旅先用ルータのデフォルトルートをZeroTierに向けるところ。

Interface ZeroTier Target 0.0.0.0 IPv4-Netmask 0.0.0.0

というスタティックルートを最強のメトリック0で入れても、元から入っているWAN側インタフェース向けのデフォルトルート(メトリック20)になぜか負けてしまいます。tracerouteの実際の挙動で確認。

Interface ZeroTier Target 0.0.0.0 IPv4-Netmask 128.0.0.0
Interface ZeroTier Target 128.0.0.0 IPv4-Netmask 128.0.0.0

結局IPv4の全アドレス空間をこんなふうに前後半2つに分けてルート定義することで、ロンゲストマッチの力で勝たせることができました。ちょっと裏技っぽい?

追記 2024-02-04

このしくみに少し手を加えて別の用途を持たせてみました。この構成だとややこしいルーティング設定は不要になります。

追記 2024-02-16

ZeroTierを使って本物の金盾を越えるテストをしてみました。

追記 2024-04-14

GL-SFT1200(Opal)のZeroTierの挙動が不安定なので、旅先用ルータをGL-A1300(Slate Plus)にしました。

ちなみに今の家のルータは、BUFFALOのWXR-2533DHP2にOpenWrtを入れたものにしています。

追記 2024-12-27

ZeroTierを使った金盾越えのしくみは中国現地でも実用できました。

コメント

読み込み中...