突破口(前編)

一息ついたところで本題に戻ろう。オレはそう、yahoo にアクセスしようとしたら google につながりました、本当に有難う御座いました。のようなちょっとしたユーモアをやりたかったんだ。つまるところ、DNS解決に割り込みを入れたい、ということ。ただ、nikovideo.jp とか、dilbert.comとか、ほら、他多数の毎日巡回を楽しみにしているサイトには、今までどおりつながってもらわないと困る。何処へアクセスしても google にしかつながらないよ! ってのじゃあ、ユーモアというより、ただのネットワーク障害だろ?
前回、ARPテーブルの書き換えが案外簡単に行なえること、それによって通信の宛先をそらすことが出来るってことを書いた。コレだけをみると、単にDNSサーバの参照先をオレ様のPCにして、嘘のDNS応答を送ってやればいいように思える。ただ、残念なことにコレには多くの問題がある。まず、前述の nikovideo.jp につながんないよ!って問題が発生する。nikovideo.jpとか、その他多数のサイトには問題なくつながって欲しいので、本当のDNS応答を返さなきゃならない。なのに、何てことだ、オレはnikovideo.jpのIPアドレスが何かなんて覚えちゃいないし、オレ自身今日何処のサイトを見てまわるかなんて知ったこっちゃない!!これでは正しい応答が返せるワケがない…。もうひとつの大きな問題が、一般のご家庭では DNS Server = Default Gateway なことが多いってところだ。すなわち、仮に正しいDNS応答が返せたところで、そこから先は手の打ちようがない。(全てのHTTPパケットのヘッダを書き換えてフォワードしてやれよって? ハハッ冗談はよしてくれ)*1。これではDNS応答どころか、他の通信までぶっ潰してしまう最悪の状態に陥る。
それじゃあ、もう、DNSの宛先をオレ様PCに変えるのはよしといた方いいのだろうか? しかし…覚えているだろうか、私の幾つか前の投稿にて、DNS応答を返すための二つの大きな課題を提示した。「対象端末が名前解決を試みた後、DNSの返信より前に、返信を行なう必要がある。」「返信には2byteの正しいID情報が必要。」後者2byteのIDをあてずっぽうで当てるには平均して33000回ぐらいのリトライが必要になる。それをDNSサーバの応答より先に行なわなければならない。しかも、オレには標的のPCがいつ、Yahooにアクセスしようとするかなんて知りえもしないのだ。一寸WireSharkで調べたところ、我が家のネットワーク環境ではDNSの応答に約0.25秒かかっている。仮に0.01秒毎に1発、DNS偽装応答を絶え間なく投げたところで、その応答が成功する確率は0.76%。コレでは、現実的とは言えない…(しかも散々システムリソースを食いつぶした結果がこれだよ)。まあ、その、何だ、そのときの投稿でも直後に「はあ…、コレは、DNS要求がブロードキャストされるか、こっちがミラーリングポートにでもつながってない限り無理だ。」って書いて落胆してたワケだが…。だが、ちょっと、待て。ここにとんでもないヒントが隠されていることにお気づきだろうか?
おさらいしよう。DNS要求はDNSサーバに対して名前解決のための要求を投げることだ。DNSサーバはIPで指定されるものなのでARPの偽装応答によってMACアドレスを差し替えることが出来る。ここまではいい。問題は、オレがDNS要求を知る必要があり、DNSサーバもDNS要求を知る必要があるということだ。そうでないと、正しい方の解答が得られず、嘘の解答も教えられない。でも差し替えられるMACはひとつのみ。一つのみで二人にパケットを投げるMAC、そんな都合の良いMACは…あるじゃあないか!
「FF-FF-FF-FF-FF-FF」ブロードキャストMAC。ネットワーキングではブロードキャストといえばIPのサブネット以下を F にすればいいような、IPベースのことばかり教わるので、ついつい影が薄くなってしまうのだが、MACにもブロードキャストは存在する。そして都合の良いことに、DNS要求は宛先のMACがブロードキャストMACであろうと、有効なものとして扱われ、正しい応答が帰ってくるのだ!ウォウ!ダディクール
さて、ここでようやく一つの大きな課題がクリアされたのだが…コレほど投稿の間隔があいてしまったのは、実のところブロードキャストMAC云々の問題ではない*2、もう一つの問題、「一般のご家庭では DNS Server = Default Gateway」であり、DNSサーバをブロードキャストMACにする以上、ディフォルトゲートウェイをつぶしてしまう結果となり、全てを台無しにしてくれるという、こちらの問題のせいだ。そして、この問題を今日、ようやく解決したである。ってなところで今日はもう遅いので次回にまわすとしよう。(まあ誰が楽しみにしていることやら…)

*1:コレがどれほどの手間とシステムリソースを食うことか!一寸考えただけでもヒンディ語でも勉強した方が身のためだって感じるよ

*2:ブロードキャストMACのアイディアは実のところARP偽装応答を成功させたその日のうちに持っていた