プロキシと仮想環境の自作を図る
初級者がプログラムの作成に挑戦する記事の第二弾です。前回のプログラムは設定ファイルの解析器でした。今回は、プロキシと簡易仮想環境です。
動機
プログラム作成のきっかけは、最近、二週間近くインターネットから遮断されるという出来事があったからです。
その原因はプロバイダ料の滞納なので自業自得なのですが...
ただ奇妙なことに、同じプロバイダ契約にも拘らず、遮断されたのは有線回線だけで無線回線は生きていました。
その無線回線が普通に使えればよかったのですが、どうにも不安定で閲覧できるサイトとできないサイトがありました。
このようなことがあり、ネットワークの構成と設定を見直すことにしました。
その見直しの一環としてプログラム作成を行い、これについて一連の記事にしたいと思います。本記事では、プログラムの機能やその環境について説明します。
ネットワーク構成
まずは、我が家のネットワーク構成を説明します。
特徴は、ルーターが二段(外側、内側)に配置されている点です。
侵入対策
外側のルーターは、インターネットと家庭内ネットワークとを接続するためのものです。このルーターは、外部から内部への侵入を防ぐためのファイアーウォールも兼ねています。
具体的には、外側ルーターは二つあります。
一つは、NTTの光回線(有線)を経由してプロバイダに接続されています。
もう一つのはLTE回線(無線)を経由してプロバイダに接続されています。この無線回線は、前の大震災をきっかけに追加しました。
漏洩対策
内側のルーターは、内部から外部へ漏洩を防ぐためのものです。
私は心配性なので、インターネットに接続された環境下では、家電やウィルスなどが勝手に個人情報を流出させるのではないかと不安で仕方ありません。
なので、このルーターは防火壁と言うよりは、臆病で疑り深い私の精神を守るための心の壁です。
区画分割
ネットワークの全体は、三つの区画(緑、赤、橙)に分かれています。
各区画に合わせて、セグメント(データリンク層)とサブネット(ネットワーク層)を切っています。
安全区画
緑の区画は、普段の作業に使う端末やファイルサーバー、印刷機などが配置されています。
緑の区画は、基本的にはインターネットはもちろんのこと、他の区画とも遮断されています。
例外として、赤の区画のプロキシにだけは通信可能となっています。ただし、勝手に通信されると嫌なので、プロキシの設定を保存しないようにしています。ネット接続が必要なときは、設定を環境変数としてその都度手動で入力しています。面倒くさいですね!
非武装区画
赤の区画は、インターネットへの接続が必要なサーバー群が配置されています。
サーバー群には、二つのプロキシが含まれています。
烏賊
一つは、squidというWebプロキシです。
squidの主な役割は、有線回線、無線回線の振分けです。
具体的には、squidには待受けポートが二つ設けられており、各ポートごとに異なるルーターへ通信が振分けられます。つまり、squidサーバーのXXXX番ポートを指定すると有線回線を介してネットに接続され、YYYY番ポートを指定すると無線回線を介して接続されるようになっています。
振分け以外には、CONNECTによる単純な転送しか行わせていません。
玉葱
もう一つは、torという匿名プロキシです。
何故、匿名プロキシが必要かというと、metarなどの気象データを収集しているからです。
もちろん合法的かつ規約に則り行っていますが、それでも日本では逮捕される虞があります。
詳しくは、岡崎図書館事件で検索してみてください(もっとも、あれは登場人物全員があれなのがあれですが...)。
監獄
これら両プロキシは、chrootと名前空間の分離とによる簡易的な仮想環境下で作動しています(環境はプロキシごとに独立しています)。この仮想環境は、iproute2などのコマンドを組み合わせたシェルスクリプトで構築されています。
実験区画
橙の区画は、緑の区画よりも大幅に制限を緩めた区画です。一時的または緊急にネット接続が必要なときのために構築しました。UPnPによる動的なポート開放も行っています。その性格上、通常時は何も繋がれていません(プログラムの作動試験で使うことになるでしょう)。
何を作るか
今回のプログラム作成で対象とするのは、squidと仮想環境です。その理由を以下に示します。
squidを置換える理由
・squidは本来キャッシングなどの様々な機能を備えているが、それらの機能をほとんど使っていない。そのため計算資源が無駄になっている(吝い質なので気になります)。
・多機能ということは依存するライブラリも多くなる。そのため、アップデートに手間がかかる(特に、chroot環境だと面倒くさいです)。
仮想環境を書換える理由
・シェルスクリプトだとエラー処理や終了処理が難しい、気がします。
・何かかっこ悪い(シェバンが嫌い)。
まとめ
以上のように、今回は二つのプログラムの作成に挑戦します。
作成の順序は、プロキシからにしたいと思います。
その理由は、製作意欲が旺盛なうちに難易度の高いほうを作成したいからです(仮想環境は、単なる書換え作業にすぎないので簡単…だと思う)。
というわけで、次回は、プロキシの作成記事の予定です。途中で投げ出さずに無事に完成するといいですね!
うっかり
なお、序文に書いた「閲覧できるサイトとできないサイトがありました」という現象は、よくあるトラブルの一つで、だいたいは不適当なMTU値が原因です。
特に、ルーターでNATを行っている場合は、ICMP応答が送信元に到達したとしてもアドレスが一致しないので無視されてしまい、経路MTU探索が上手く働きません。
当初は、このトラブルの解決を有料記事にする予定だったのですが、原因を特定しないままに設定変更したら直ってしまいました(再現しない…)。