見出し画像

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種類のスレッドを動かしています。

ここから先は

2,429字 / 3画像

¥ 300

古往今来得ざれば即ち書き得れば即ち飽くは筆の常也。と云うわけで御座います、この浅ましき乞食めに何卒皆々様のご慈悲をお願い致します。