2013年04月05日

VPN over DNS - DNSプロトコルを利用するiodineでファイヤーウォール越しにVPN環境を構築する

iodineはファイヤーウォールの内側にいる自宅・社内LANのPCにアクセスする為に、DNSパケットを利用した仮想ネットワーク(VPN)を作成・通信する個性的なVPNユーティリティです。

iodine_05

僕はこういうツールが大好き。 だって、強敵(困難なVPNネットワーク構築環境)に打ち勝つには強力な武器を手に入れる必要がありますからね。

iodineの概要


遠隔地から自宅・社内LAN内のPCにアクセスしたいが外部から直接アクセスするのはファイヤーウォールを通過出来ないので無理、但し、LAN内の端末からはある程度自由にインターネットに接続可能。こんな状況よくありますよね。

iodine_03

このような場合、LANから外部への接続は容易であることを利用し、まず、お互いのPCがインターネット上にある中間・仲介サーバーに対してセッション(仮想IPネットワーク)を確立、後はここを通してIPパケットをやり取りするという方式が取られます。

同様の方式を採用した商用ソフトウェア(個人利用は無料)としてはLogMeIn社のVPNソリューション(LogMeIn Free/Pro, Hamachi)が有名ですが、専用のポートを利用する為、強力なファイヤーウォールであればこれでもVPNセッションを確立出来ない場合があります。

iodineも考え方は同じですが、よりファイヤーウォールから見て自然な通信に見えるよう、中間サーバーとのやり取りにDNSプロトコルを利用します。ドメイン名の名前解決に利用するDNSパケットであれば、ブラウジング程度の基本的なインターネット操作でも必ず必要になりますからファイヤーウォールを通過出来る可能性がより高いという訳です。

iodine_04

仕組み上、iodineを利用するには必ずお互いのPCが接続可能な外部サーバー、つまりグローバルIPアドレスをもったiodineサーバーが必要になるので注意下さい。


iodineのインストール


iodineのインストールはとても簡単です。もし、Ubuntuであればapt-getコマンドでバイナリ版をインストールすることが出来ます。

$ sudo apt-get install iodine

その他のディストリビューション向けにもバイナリ版が用意されています。 プロジェクト・ホームはこちら。

kryo.se: iodine (IP-over-DNS, IPv4 over DNS tunnel)

ソースからインストールする場合、tarボールを解凍してmakeします。

$ tar xvzf iodine-0.6.0-rc1.tar.gz
$ cd iodine-0.6.0-rc1
$ make

すると同じ場所にbinディレクトリが作成され、iodine(クライアント), iodined(サーバー)という2つの実行ファイルが作成されます。

$ cd ./bin
$ ls
iodine  iodined

RedHat Linux 4.x 以前ではSELinuxのバージョンが古いため、makeに失敗するので注意下さい(undefined reference to `setcon')。

この条件に該当してしまう人はICMPで同様のVPN機能を提供する Ping Tunnel の利用を検討してみて下さい。
(iodineはUDPの利用によるハイ・パフォーマンスも売りの一つですが、こちらはICMPを利用するので速度は遅いですけどね)

さあ、インストールできたら早速動かしてみましょう。


iodine VPNサーバーの起動、クライアントの接続


まずはサーバー側で次のコマンドを実行します。

server $ sudo /path/to/iodined -f 10.0.0.1 vpn-room1.com
Enter password: 
Opened dns0
Setting IP of dns0 to 10.0.0.1
Setting MTU of dns0 to 1130
Opened UDP socket
Listening to dns for domain vpn-room1.com

-fオプションはフォア・グラウンドでの起動で、無しであればターミナルからデタッチしてデーモンとして動作します。

10.0.0.1は仮想ネットワーク上でサーバー(iodined)が利用するIP。仮想IPネットワーク上のクライアントから見ればルーターですね。クライアントには連番で同一ネットワーク上のIPアドレスが付与されます。

最後のドメイン名はVPN接続用のパスワード。このドメイン名でDNSクエリーを受け付けた時にiodinedはVPNネットワークへのセッション確立を開始します(適当な名前でOK)。

起動するとパスワードの入力を求められますが、このパスワードはクライアントがセッションを確立(ログイン)するのに必要。

これでiodineによるVPN中間・仲介サーバーの容易が出来ました。後はこのDNSサーバーにクライアントから接続するだけです。

クライアント側では次のコマンドで接続を開始します。

client1 $ sudo ./iodine -f -r x.x.x.x(DNSサーバーのIPアドレス又はホスト名) vpn-room1.com
Enter password: 
Opened dns0
Opened UDP socket
Sending DNS queries for test.com to x.x.x.x
Autodetecting DNS query type (use -T to override).
Using DNS type NULL queries
Version ok, both using protocol v 0x00000502. You are user #0
Setting IP of dns0 to 10.0.0.2
Setting MTU of dns0 to 1130
Server tunnel IP is 10.0.0.1
Skipping raw mode
- snip -
Setting downstream fragment size to max 1186...
Connection setup complete, transmitting data.

うまくファイヤーウォールを通過できれば、"Connection setup complete"と表示されます。

10.0.0.2がクライアント1台目に割り当てられた仮想IPアドレス。同じようにしてもう一方のクライアント2(この例では10.0.0.3が割り当てられる)もDNSサーバーに接続しましょう。

尚、クライアント側で指定している -r オプションは可能であれば raw モードを使って高速通信を可能にする意味があります(バージョン 0.6 以降で利用可能)。

本当に通信出来るのか、一方のクライアントからピア側にpingを実行してみます。

$ ping 10.0.0.3
PING 10.0.0.3 (10.0.0.3) 56(84) bytes of data.
64 bytes from 10.0.0.3: icmp_req=1 ttl=64 time=35.8 ms
64 bytes from 10.0.0.3: icmp_req=2 ttl=64 time=29.3 ms
64 bytes from 10.0.0.3: icmp_req=3 ttl=64 time=28.8 ms
64 bytes from 10.0.0.3: icmp_req=4 ttl=64 time=28.7 ms

お、通信出来ていますね。もちろん、SSH、HTTPなどTCP含めてIPパケットのペイロードとしてやり取りできるデータは全て使えます。

iodine_02


Windows版も用意されているのが嬉しいところ。TAP32 driverドライバーが必要になるので、アーカイブに含まれるREADMEファイルの手順を参考にセットアップしましょう。

iodine_01


それでは、より良い仮想ネットワーク・ライフを!


すっきりわかった!VPN 改訂版 (すっきりわかったBOOKS)
ネットワークマガジン編集部
アスキー・メディアワークス
売り上げランキング: 249,748

OpenVPNで構築する超簡単VPN入門―Windows/Mac OS X/Linux対応
ケイズプロダクション
ラトルズ
売り上げランキング: 306,550

Posted by netbuffalo at 21:30│Comments(0)TrackBack(0)ネットワーク | ユーティリティ


この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/netbuffalo/4425063

コメントする

名前
URL
 
  絵文字