- Imgurの英国ユーザー向けブロックにより、Reddit、フォーラム、ドキュメントなど各所の画像リンクがすべて「unavailable」と表示される問題が発生
- 個別VPNではなくネットワーク全体レベルの自動回避構造を構築し、どのデバイスでもImgurにアクセスできるように構成
- Pi-hole、Traefik、Gluetun、Nginx、NixOSを組み合わせ、DNSブロックを回避しつつトラフィックをVPN経由で転送する構造を設計
- TLSパススルーとDockerネットワーク共有を使って暗号化トラフィックをそのまま伝送し、速度低下を最小化
- 結果として、全デバイスで個別設定なしにImgur画像へのアクセスが可能となり、速度ロスを抑えた透過的なネットワーク制限解除構造を実現
Imgurブロックと不便な事例
- Imgurが英国ユーザーのアクセスを制限したことで、Reddit・フォーラム・ドキュメントなど様々なWebページの画像リンクが表示されない問題が発生した
- Minecraftシェーダーのプレビュー画像がすべて消え、どのシェーダーかを確認できない状態になった
- 古い投稿やREADMEファイルなどでもImgurリンクが残っているため、アクセス不能な状態が継続していた
VPNではなくネットワーク単位の解決を選択
- 一般的な対処はVPN使用だが、2.5Gbpsの高速インターネット環境で全トラフィックをVPN経由で回避すると速度低下が発生する
- 各デバイスごとにVPNをインストールして接続する必要があり、運用の複雑さが生じる
- すべてのデバイスで自動的に動作するクライアント設定不要のネットワーク単位ソリューションを目指した
ネットワークレベルの構成設計
- 既存のホームラボ環境でTraefik(リバースプロキシ)、Pi-hole(DNS)、**NixOS(宣言的設定)**を既に使用中
- DNS段階で
i.imgur.comリクエストを横取りし、**VPN接続コンテナ(Gluetun)**へ転送
- Pi-holeがTraefikのIPを返す
- TraefikがSNIホスト名を確認してGluetunにルーティング
- GluetunがVPNを通してリクエストを送信
- Gluetun内のNginxが実際のImgurサーバーへプロキシ
- 画像をトンネル経由で再度返す
NginxとGluetunの構成
- GluetunはVPN接続のみを提供するため、VPNネットワーク内部でプロキシとして動作するNginxが必要
- NginxはTCPストリームモードに設定され、SNIヘッダーを読み取って
i.imgur.com:443へトラフィックを転送
- TLSハンドシェイクはエンドツーエンドで実施され、Nginxは復号されたデータを閲覧しない
- Docker Composeで**2つのコンテナ(Gluetun、Nginx)**を実行
network_mode: "service:gluetun"設定により、NginxがGluetunのネットワークスタックを共有
- すべてのNginxトラフィックが自動的にVPNトンネルを通過
TraefikおよびNixOSの統合
- TraefikはTCPルーティングとTLSパススルーを用いて
i.imgur.comリクエストをGluetunへ送る
- NixOSではsystemdサービスとしてDocker Composeスタックを実行
- Agenixを使ってVPN認証情報を暗号化保存
- ドットファイルリポジトリ全体を公開で保ちながら、秘密情報を保護
結果とパフォーマンス
- ネットワーク内の全デバイス(スマートフォン、ノートパソコン、ゲスト機器含む)が個別設定なしでImgur画像へアクセス可能
- Pi-holeがDNSを傍受し、Traefikがルーティングし、GluetunがVPNトンネリングを実行
- 画像読み込みの遅延はほぼなく、ImgurトラフィックのみがVPNを経由して一般トラフィック速度を維持
- 保守が簡単で、ホームラボ環境での自動化された地域制限解除構造を完成
- MinecraftシェーダーなどImgurベースのコンテンツを再び正常に確認可能
1件のコメント
Hacker Newsの意見
Linuxを入れた安価なファンレスボックスに複数ポートを持たせ、systemd-networkdでWireGuardインターフェースを一度だけ設定してある
おかげで特定のトラフィックだけをVPN経由でルーティングしたり、VPN専用のSSID/VLANを別に用意したりできる
ただしドメインベースのルーティングは難しいことがあるので、必要ならローカルDNSオーバーライドが可能なプロキシをルーターに追加しようと思っている
ルールベースの地理的分割ルーティングにも対応していて便利だ
参考までに関連する記事はこのブログにある
スクリーンショットが見えなくて不便だったので、この記事が最後の後押しになりそうだ
こうしたブロックは簡単に回避できるが、もしImgurが消えたら多くのサイトが壊れるだろう
人々が検閲を回避してもトラフィック損失が大きくないなら、海外サーバーは権威主義的な規制に屈しなくてもよい、という点が重要だ
EUも似た方向に進んでいるようなので、検閲を拒否できるツールが広く普及すべきだ
Raspberry PiやミニPCにPiHoleと一緒に設定しておけば、家族の家のトラフィックを自分のIPへトンネリングできる
モバイルアプリでWireGuard設定ファイルを追加し、ポリシーエンジンで特定ドメインだけVPNインターフェースへルーティングするよう指定すればよい
自分はIPv6レンジをブロックする長いファイアウォールルールを作って一時的に対処したが、Cloudflareベースのサイトではブロックされた
UniFiがIPv6 WireGuardに対応してほしい
Redditはさらにひどく、NSFW投稿をしたことがあるユーザーのプロフィールすら見られない
そうすれば毎回VPNをオン・オフする手間なく自動で処理できる
たとえば年齢認証が必要なSNS、国ごとにブロックされるアプリ(Spotifyなど)、ニュースサイトの検閲のような場面で役立つはずだ
一般にはHTTP/Sリクエストにだけ適用されるが、ZScalerのようなベンダーは他のプロトコルにも拡張している
TailscaleではApp Connector機能がその役割を果たす
15分ほどで特定ドメインだけをVPNに送るよう構成でき、とてもうまく動いている
機内Wi-FiのようにVPNがブロックされる環境でもSSHは許可されるので、動的ポートフォワーディングとPACファイルを組み合わせて、機内エンターテインメントやトラッキングサイトは直接接続するように設定した
かなりうまく動く