Webプロキシ(L7プロキシ)の作成
初級者がプログラムの作成に挑戦する記事の第二弾の第二回です。前回の「まとめ」で述べたように、まずはプロキシから作成しました。
本題に入る前に
一月いっぱいで倉庫の仕事を首になってしまいました。
年末に風邪を引き一週間ほど寝込みました。時間給なので働かなければ生活が立ち行かなくなります。そこで、年始からは不休で働いていました。
しかし、無理がたたったのか、流感に罹ってしまい再び一週間ほど寝込みました。
その結果、出勤日数が規程を下回り、アルバイト契約が更新されませんでした。
と言う訳で、無職になってしまいました。プログラミングしほうだいです。やったね!
使用言語
今回もC言語です。理由は、ネットワーク、マルチスレッドおよびI/O多重化の全てに対応しているのがC言語だけだったからです。...本当は、GoやRustに挑戦してみたかったのですが、参考書籍を買う余裕がありませんでした。
どのようなプロキシを作成したか?
通信の中継
プロキシの最も基本的な機能の一つです。前回の記事に書いたように、私のネットワーク環境では、プロキシは、二つの防火壁の間に配置されます。プロキシは、壁の内側のクライアントからの要求を外部のサーバーに転送し、そのサーバーからの応答をクライアントに転送します。
これにより、隔離されているクライアントが外部と通信できるようになります。
経路の振分け
複数の受付ポートを設けて、各ポートごとにゲートウェイを切替える機能です。
この機能は、プロキシとマシンの経路制御とにより実現されます。
マシンの経路制御
NICに対し、複数(ゲートウェイと同数)のアドレス(10.0.1.1/24, 10.0.1.2/24)を割振ります。
各アドレスごとに経路表を作成し、その経路表に所望のゲートウェイ(10.0.2.1, 10.0.2.2)を各々設定します。
プロキシ
プロキシからサーバーへ送信を行う際に、所望のゲートウェイに対応したアドレスを送信元アドレスに設定します。
例えば、ポート5001で受付けた要求にゲートウェイ10.0.2.1を使いたい場合は、そのゲートウェイ10.0.2.1に対応するアドレス10.0.1.1を送信元アドレスとしてデータを送信します。
これにより、受付ポートごとにゲートウェイが切り替えられます。
並行処理
今時のCPUは、たくさんのコアを備えています(私のパソコンは2コアですが...)。これらを有効に活用するために、マルチスレッドによる処理を行うようにしました。ただし、マルチスレッドの効果が薄い場合(同期の負担が重い場合)は、I/Oの多重化により処理します。
本プログラムでは、以下の3種類のスレッドを動かしています。
ここから先は
¥ 300
古往今来得ざれば即ち書き得れば即ち飽くは筆の常也。と云うわけで御座います、この浅ましき乞食めに何卒皆々様のご慈悲をお願い致します。