マニアックな仕事:DNSを扱うプログラミング
当社のIT事業はマニアックな仕事のご相談が多いのが特徴で、特にネットワーク関連は、よそではほぼ断られるだろうというような相談を、「こうすれば、こういう条件だけれどもできる」という感じに返答するのが特徴です。実際これまでも、「これはネットワーク的に無理でしょう」という要件を、「ハッカーならこうする」というような、非常にトリッキーな方法で実現したりしてきました。多くの場合、本当はネットワーク構成を根本からやり直せばすんなりできるケースが多いのですが、大抵は実運用ですでにバリバリに使っていて、構成変更などとても無理、けれどもこういう機能を何とか実現したい、という感じで、マニアックなご相談がやってくるわけです。
残念ながら、ほとんどが特注品ですので、ここで具体的に紹介できないのですが、他のネットワーク機器をだますような感じで強引に実現するようなものも多く、パケットを直に扱うのはもちろん、強引にパケットの中身を書き換えたりすることも少なくありません。まあ、不正接続検知/排除システム「IntraGuardian2」もそんな技術を使って実現していますし、他の多くの製品もパケットを直接扱って実現しています。
前置きが長くなりましたが、今回ご相談いただいたのはDNS(Domain Name System)とHTTP(HyperText Transfer Protocol)を使った、非常にトリッキーな振り分けというかリダイレクトです。2回ほど要件を伺いながら、実現方法を提案し、「もう、そうやってとりあえず乗り切るしかない」という感じで、本当にやることになりそうです。私もメンバーも知恵を出しながら、まさかこの方式にはならないだろうと思っていたくらい、怪しげな方法です。
私の場合、相談を受けるとまずプロトタイプを作って実験してみます。今回の場合はまずDNSの部分で本当に実現できるかどうかの目処をつけておきたかったので、私の3冊目の著書「C言語によるTCP/IPセキュリティプログラミング」でも紹介した、DNSプロキシのソースを切り出し、プロトタイプを作ってみました。もちろんDNSプロキシのままでは動かないので、今回向けの機能を試行錯誤しながら組み込み、実験して、基本的には問題なく動くことを確認しました。基本的にはこの状態までやっておかないと、見積はしたくないのです。「こう作れば必ずできる」というものならすぐに見積を検討できますが、「試行錯誤してみないとわからない」というタイプは、見積もって発注をいただいても、実はできなかったということになる心配があるからです。できないことを見積もるのは詐欺みたいなものです。
その後、さすがにベースが7年くらい前のソースで、今となっては気になる部分も多いので、書き直しながら、並列処理などを最適化しました。まだもう少し工夫できそうなのですが、とりあえず実用レベルで動くだろうという状態のソースまでは仕上がったので、いつ発注がかかっても大丈夫、という感じです。しばらく連続稼働させることと、せっかくなのでDNS負荷テストツールも作ってみようかと考えています。
正式に受注する前に、よくそこまでやるな、と思われるかも知れませんが、こういう姿勢がノウハウの蓄積につながります。仕事になるならないは別にして、興味がわいたらまず作って試してみるのです。それがそのまま仕事になればラッキーというくらいの気持ちです。そうやって蓄積したものがたくさんあるので、大抵のプロトタイプは数時間でそれらしく動かせますし、多少真面目にやっても、片手間で2・3日で大丈夫でしょう。最近はマニアックな本が売れないので、著書にすることは難しくても、ソースや経験はちゃんと残ります。
ということで、久しぶりにプログラミングを楽しんでいます!