2011/05/02

Proxy越えをするDNS Server

Proxy越えをするDNS Serverを作った。Perlの Net::DNS::Nameserver を利用した。
これとsquidの多段Proxyを組み合わせれば、AndroidのProxy対応していないHTTPアクセスするアプリを全てProxy越えさせることが可能なはず。

ダウンロードはここのwebnamed-*.tgz。
webnamed + 逆USBテザリング + squid透過Proxyを組み合わせて、DMZのProxy越えができるかを検証しようと思う。

* 仕組み

既存のLAN内のDNS Server ... Default DNS Server
作ったDNS Server ... Slave DNS Server (webnamed)
外部CGI Server上のCGI ... Resolver CGI (resolver.cgi)

1) Slave DNS ServerがDNS queryを受信する。
2) アドレス解決のDNS query の場合、Resolver CGI にDomain Nameを送信して、アドレスを取得する。
3) アドレス解決以外の DNS queryまたは 2) でアドレスが未解決の場合は、Default DNS ServerへDNS queryをforwardする。
4) Slave DNS Serverが 2) または 3) の結果を返信する。


* なぜwebnamedが必要か

まずAndroidにProxy設定をせずにProxy越えするには、DMZのHTTP ProxyへProxy用のHTTP Headerを含むHTTP Requestを投げる必要がある。これにはAndroidのWebブラウザからのHTTP Requestを、一旦squidのTransparent Proxyに投げる。次にsquidからDMZのHTTP Proxyへ投げれば解決する。

だが、WebブラウザはHTTP Proxyを通すことを認識していないため、WebブラウザのDNS Resolverが動いてしまう。Firewall内のDNS Serverは、外部DNS Serverへアドレス解決を参照しない運用になっていることが多いため、大抵DNS queryが失敗するだろう。
そこで、このDNS queryに対して適切に返答するために、今回作ったDNS Serverが必要になる。


* resolver.cgi について

resolver.cgi は私のレンタルサーバに配置した。
webnamed のデフォルトの設定だとそのレンタルサーバに接続する。別のサーバに配置することも簡単にできる。
Google App Engineの利用を最初に考えたものの、InetAddress.getHostAddress() が禁止されていたので断念した。
広告入りの無料サーバでも動作するが、CGIへの直接アクセスは(できるけど)規約違反になることがあるので確認が必要。


* 他に方法はないのか

Google先生への質問スキルが低いのか、似たような物が見つからなかった。
あるいは、もっと別の解決方法が存在するのか、単に需要がないのか。
ご存知の方がいたら教えてください。

0 件のコメント:

コメントを投稿