2014年08月04日

IP over ICMP - Hans を使って ICMP だけで IP トンネルを掘る方法

久しぶりにタフな条件で遠隔地のネットワークを結ぶ IP トンネルを掘ることになりました。 与えられた条件は、一方の LAN からは ICMP (ping)以外はインターネットに接続することはできず、かつ、通信を行う双方の端末は NAT (ルーター)配下に存在しているというもの。 ええ、勿論開通させましたよ。 今日ご紹介する Hans を使ってね。

hans - ip tunnel over icmp

Hans - IP over ICMP の概要


Hans を使えばインターネット上に配置した(双方のネットワークから ICMP が到達する) Hans 中継サーバーを経由してファイヤーウォールの内側にいる端末間で IP トンネルを構築することが出来ます。 各端末は TUN デバイス(ネットワーク層をシュミレートする仮想 IP デバイス)に対して通信を行う為 IP ネットワークで動作するアプリケーションであれば特に意識せずそのまま利用することが可能です。

hans_ip_over_icmp_overview


1つの仮想ネットワークには最大で 253 個(24 bitのサブネットで中継サーバー用に1つ割り当てが必要)のクライアントが接続でき、IPアドレスの割り当ては自動で行われます。 接続時にパスフレーズによる認証(チャレンジ・レスポンス方式)が利用できますが ICMP ペイロードの暗号化は行われないのでトンネルを利用するアプリケーションがセキュアなトラフィックを生成・利用する必要があります。

プロジェクト・ページはこちら。

Hans - IP over ICMP
./hans -s 10.1.2.0 -p password ...


プラットホームには Mac OS (バイナリ版あり) 及び Linux (ソースコードからビルド)をサポート。 試験的なバージョンながら Windows 版バイナリも用意されていますよ。


Hans - IP over ICMP のインストールと設定


今日、僕が利用する OS は全て Linux。 まずは Hans ビルド(gcc-c++/g++)環境を作ります。

yum ならこう。

# yum install gcc-c++


Ubuntu (apt-get) の場合は g++ になるので注意。

$ sudo apt-get install g++


準備が出来たらプロジェクト・ページのリンクを辿り、GitHub 又は sourceforge からソースを落としましょう。

現時点で最新バージョンは 0.4.4。 tar ボールを解凍、make して hans バイナリが作られればビルド成功。 

[hans-server or client: ~]# tar xvzf hans-0.4.4.tar.gz
[hans-server or client: ~]# cd hans-0.4.4
[hans-server or client: hans-0.4.4]# make
[hans-server or client: hans-0.4.4]# ls
CHANGES  LICENSE  Makefile  README.md  VERSION  build  hans  osflags  src


まずはインターネット上に配置した hans 中継サーバーでサービスを起動してみましょう。

[hans-server: hans-0.4.4]# ./hans -s 10.1.2.0 -p join-password
./hans: opened tunnel device: tun0
./hans: detaching from terminal

※ -s オプションで仮想 IP ネットワーク・アドレス、-p オプションでクライアント接続時の認証パスワードを指定しています。


tun デバイスが作成され自動で IP アドレスが割り当てられているか確認しておきましょうか。

[hans-server: hans-0.4.4]# ifconfig tun0
tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
          inet addr:10.1.2.1  P-t-P:10.1.2.1  Mask:255.255.255.0
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1467  Metric:1
          RX packets:1018 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1039 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:500
          RX bytes:210350 (205.4 KiB)  TX bytes:148676 (145.1 KiB)


うまくいったみたい。

おっと、中継サーバーにはもう少し細工が必要。 まず、通常の ICMP パケットには応答しないよう次のコマンドを実行します。

[hans-server: ~]# echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all

 ※ # sysctl -w net.ipv4.icmp_echo_ignore_all=1 でも可。 設定を永続化(再起動時にも反映)する場合は /etc/sysctl.conf を編集して net.ipv4.icmp_echo_ignore_all = 1 を追記。


中継サーバーと LAN 内の端末間だで通信するだけなら必要ありませんが、LAN 間(NAT 配下の端末間)で通信するならば IP フォワードも有効にしておきましょう。

[hans-server: ~]# echo 1 > /proc/sys/net/ipv4/ip_forward

 ※ # sysctl -w net.ipv4.ip_forward=1 でも可。 設定を永続化する場合は /etc/sysctl.conf を編集して net.ipv4.ip_forward = 1 を追記。

これで中継サーバーの準備はおしまい。


クライアント側でも同様の手順でビルドし、次のコマンドで中継サーバーに接続します。 

[hans-client1: hans-0.4.4]# ($ sudo ) ./hans -c hans-server -p join-password
./hans: opened tunnel device: tun0
./hans: detaching from terminal

※ -s では無く、-c オプションで中継サーバーのホスト名又は IP アドレスを指定。


tun デバイスを確認してみるとクライアントには x.x.x.100 以降のアドレスが割り当てられていることが分かります。

[hans-client1: ~]$ ifconfig tun0
tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
          inet addr:10.1.2.100  P-t-P:10.1.2.101  Mask:255.255.255.0


もう一方の LAN 側にいる hans-client2 クライアントにもインストール、先にセットアップした hans-client1 に ssh 接続してみると・・・、

[hans-client2: ~]$ ssh hoge@10.1.2.100
hoge@10.1.2.100's password:
Last login: Mon Aug  4 21:52:26 2014 from 10.1.2.101
[hans-client1: ~]$


お、ICMP しかインターネットへの希望の無かった LAN 同士で IP 接続が出来ましたね!


ちなみに hans-server 上で ICMP パケットをキャプチャしてみると IP 接続要求イベントを検知する為に約1秒毎に ICMP を使ってハートビートしていることが分かります。

[hans-server: ~]# tcpdump -i eth0 -p icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
22:53:33 IP nat1.remote.co.jp > hans-server: ICMP echo request, id 39556, seq 45815, length 13
22:53:34 IP nat2.remote.co.jp > hans-server: ICMP echo request, id 61576, seq 5460, length 13
22:53:35 IP nat1.remote.co.jp > hans-server: ICMP echo request, id 39556, seq 45815, length 13
22:53:36 IP nat2.remote.co.jp > hans-server: ICMP echo request, id 61576, seq 5460, length 13
22:53:37 IP nat1.remote.co.jp > hans-server: ICMP echo request, id 39556, seq 45815, length 13
22:53:38 IP nat2.remote.co.jp > hans-server: ICMP echo request, id 61576, seq 5460, length 13
22:53:39 IP nat1.remote.co.jp > hans-server: ICMP echo request, id 39556, seq 45815, length 13
22:53:40 IP nat2.remote.co.jp > hans-server: ICMP echo request, id 61576, seq 5460, length 13
22:53:41 IP nat1.remote.co.jp > hans-server: ICMP echo request, id 39556, seq 45815, length 13
22:53:42 IP nat2.remote.co.jp > hans-server: ICMP echo request, id 61576, seq 5460, length 13
22:53:43 IP nat1.remote.co.jp > hans-server: ICMP echo request, id 39556, seq 45815, length 13


インターネット上にある hans 中継サーバーで iptables/MASQUERADE (Internet Tunneling Through ICMP)すれば ICMP しか使えない、例えば駅ナカにある誰でも接続はできるけどブラウザで認証しない限り ICMP (ping)しか利用出来ない公衆無線 LAN を使ってインターネットを楽しむなんてことも出来るかも・・・???


より良いトンネル・ライフを。


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

Raspberry Pi Model B+ (Plus)
Raspberry Pi Model B+ (Plus)
posted with amazlet at 14.08.04
raspberrypi.org
売り上げランキング: 495

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


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

コメントする

名前
 
  絵文字