dreamstime_s_44863393
© Rawpixelimages | Dreamstime.com – Antivirus Themed Concepts And Blue Background Photo

『とあるアンチウィルスルータの開発 その2』は、安価なブロードバンドルータを使いそこそこの速度でアンチウィルス機能を実現する方法について書いてみます。しかし、この機能(ファンクション)はシステム全体の機能からすると重要度は低かったりするのですが、アイディアと実装、そして重要度の違いというシステム設計をする上であまり明らかにされない隠れた部分についてもなるべく触れるようにしてみます。

img3bb399d7619d17048ea52簡単に図に書いてみました。Aは利用者で、Eが日頃使っているメールサーバとなります。
Bが今回開発したアンチウィルスルータ(長いのでAVR : Anti Virus Routerと略します)、Cはゲートウェイタイプの透過型アンチウィルス装置(アプライアンス)、Dはメールの中継サーバとなります。

簡単に書くと電子メール用(smtp & pop3)のプロキシを作成したという感じです。

プロキシっぽい動作をするものとしてsocksやdelegateも早い段階で検討したのですが、smtpとpop3というプロトコルには相手先(接続先のメール サーバ)を指定する構文がないことから、利用を断念しました(delegateは接続先が固定されているなら使えます)。
httpであればプロトコルの中に接続先の情報(URL)があるのですが、smtpとpop3はすでにメールサーバに接続している(セッションを張っている)状態での取り決めなので、httpプロキシと同様の方法は使えません。

実装について、私が当初考えていたのはDサーバとAVR間でVPNを張ってしまう方法でした。暗号化しないVPN(IPoverIP)を使えばAVRでのスループットを落さず、メールの中継サーバも不要となりシンプルで高速な実装が可能となります。

しかしこの案はルータ開発チームにより却下されてしまいます。
理由はVPNの機能を組み込むにはTCP/IPスタックに手を入れることになるので、今回の開発納期では実装が難しいという事でした。つまりアプリケーション層でなんとか対応させたいという事で、急遽プロキシ方式に決まったというのが真相です。

AVRとサーバ間のハートビート、複数の中継サーバがあった場合どのサーバを使うか、簡単な認証、そして最終接続先のメールサーバの指定…etc. 独自にプロトコルを作成しAVRに実装させると同時に中継サーバの仕様書も作成していきます。

開発期間を短縮するために、仕様書の作成と同時並行でテスト&デバック用シミュレータ(Perlで作成)を使いAVRとサーバ側双方を作成しました。
※2つのシミュレータ間で通信させることでプロトコルそのものもデバックが可能となります。

この新規プロトコルの作成、動作モードの変移図、エラーリカバリー方法等、ルータチームとサーバチームが一体となり細かい実装を検証し決定していきます。このような作業にはプロトタイプ手法が適しています。とにかく作る!そして、動かしてみて検証してプログラムのバグと同時に仕様のバグもあぶり出す… このようにして開発が進んでいきました。

このシステムは、アンチウィルス機能をルータが持っているように見せて、実はセンター側でウィルス(マルウェア等)のチェック&除去作業を行っている訳ですが、実はこれだけでシステム全体としての拡張性や耐障害性を実現することはできません。開発チームがプロトコル実装に没頭しているときに、私は全く違う事を考え仕様を練りなぜかエクセルでお金の計算をしていました(苦笑)。

次回はお金の計算とは? これ以外に必要(重要!?)な仕様って何? 実際に本番運用するために必要な隠された仕様について書いてみます。