2012年08月03日

iPhone(脱獄無し)+Ubuntuで自作テザリング環境(HTML5, WebSocket, VPS)を構築する

前回紹介したiOS-HTML5-Tethering(iOS+HTML5+WebSocketを使ったテザリング・セット)、面白かったですね。

44

実はあれからも、もっと高速化・UDP通信(特にDNS)が出来ないものかと触っていたんですが、最近は猫も杓子もMac OSばっかりでつまらないし、クライアントにUbuntuを使いつつ、iOSテザリング(脱獄無し)に再チャレンジしてみましましたよ。

HTML5+WebSocket+仮想ネットワークI/Fによるテザリングの基礎知識


テザリングの基本的な仕組みは前回の記事の通りです。ですので、まずはこちらで基本的な仕組みを確認しましょう。

何故iPhone(iOS)+HTML5+WebSocketで脱獄無しにテザリング出来るのか?
$ wget http://www.secdev.org/projects/scapy/files/scapy-latest.tar.gz $ tar xzf scapy-latest.tar.gz ...

続いて今回の構成。Ubuntu(厳密にはXubuntu 11.10/Kernel 3.xを使ってます)をWiFiアクセス・ポイント化、仮想ネットワーク・インタフェース(/dev/net/tun)を経由でiPhone(WebSocket)とデータの送受信を行います。

08
クリックで拡大


UbuntuのWiFiアクセス・ポイント化も以前に記事にしているので、こちらも確認しておきましょう。

Ubuntuで無線LANルーターを構築する


Ubuntu(クライアントPC)側テザリング環境の構築


まずは、WiFiアクセス・ポイントの準備をします。次のコマンドでhostapdをインストール。

$ sudo apt-get install hostapd

設定ファイルも用意します。僕のラップトップ(VAIO)の場合、設定はこんな感じ。

$ vi /etc/hostapd/hostapd.conf 
interface=wlan0
driver=nl80211
ssid=XUBUNTU
hw_mode=g
channel=7
wpa=2 # WPA2
wpa_passphrase=mypassword
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP

特にdriverの部分は機器によって異なるので注意して下さいね。

起動確認は次のコマンド。ここではとりあえず起動すればOK。iPhone側で見ると、XUBUNTUというAPが見えるはずです。

$ sudo hostapd /etc/hostapd/hostapd.conf
  Configuration file: /etc/hostapd/hostapd.conf
  Using interface wlan0 with hwaddr 2c:81:58:xx:xx:xx and ssid 'XUBUNTU'

起動が確認出来たら停止しておきましょう。

続いてWiFi接続したiPhoneにIPアドレスを設定(リース)する為にDHCPサービス(isc-dhcp-server)をインストール。

$ sudo apt-get install isc-dhcp-server

初期設定ファイルを移動し、新しく設定ファイルを作ります。

$ sudo mv /etc/dhcp/dhcpd.conf /etc/dhcp/dhcpd.conf.org
$ sudo vi /etc/dhcp/dhcpd.conf


設定ファイルの内容は次の通り。

ddns-update-style none;
default-lease-time 600;
max-lease-time 7200;
INTERFACES="wlan0";
option domain-name "";
max-lease-time 7200;
log-facility local7;
 
subnet 10.0.0.0 netmask 255.255.255.0{
  range 10.0.0.100 10.0.0.110;
#  option routers 10.0.0.254; WiFi AP
  option domain-name-servers 8.8.8.8, 8.8.4.4; # DNS server
}

WiFiルータ構築記事と比べるとoption routersを使わない点が異なります。これを指定するとiPhoneのトラフィックがこちら(Ubuntu)に向かってきてしまいます。
(DNSサーバのアドレスも必要無いですけどね)

INTERFACEで指定している無線インタフェース名は通常wlan0です。気になる人はifconfigコマンドで確認しましょう。

さあ、ここまで準備出来たら、次の手順でWiFiアクセス・ポイントを起動してみましょう。

$ sudo ifconfig wlan0 up
$ sudo ifconfig wlan0 10.0.0.254 netmask 255.255.255.0
$ sudo hostapd /etc/hostapd/hostapd.conf

  Configuration file: /etc/hostapd/hostapd.conf
  Using interface wlan0 with hwaddr 2c:81:58:xx:xx:xx and ssid 'XUBUNTU'
$ sudo /etc/init.d/isc-dhcp-server start
  * Starting ISC DHCP server dhcpd                               [ OK ] 

ここまで問題無ければ、iPhoneからXUBUNTUというアクセス・ポイントが見え、

51

接続すると10.0.0.100というアドレスがDHCPサービスからリースされるはずです。

07

ここからはiOS-HTML5-Tetheringで使うPython系のフレームワークをインストール。

まずは、tornado。

$ sudo apt-get install python-setuptools
$ sudo easy_install tornado

IPパケットの生成に利用するscapy。

$ sudo apt-get install wget
$ wget http://www.secdev.org/projects/scapy/files/scapy-latest.tar.gz
$ tar xzf scapy-latest.tar.gz 
$ cd scapy-2.1.0/
$ sudo python setup.py install


テザリング・アプリケーションですが、iOS-HTML5-Tetheringに含まれるclient-ws-server.pyはMac OSが前提なのとDNSパケット(UDP)の取り扱いが出来無いので、こちらから僕が用意したnetbuffalo-client-ws-server.pyをダウンロードしましょう。

netbuffalo-client-ws-server.pyのダウンロード

これで準備はおしまい!、と言いたいところなんですが、実は先程インストールしたscapyというライブラリでDNSパケットを取り扱うとデータが壊れてしまう(DNS RR prematured end)、という問題があるのでこちらミラー)からパッチをダウンロードします。

このdns.patchファイルをpatchコマンドで適用しておきます。

$ cd /usr/local/lib/python2.7/dist-packages/scapy/layers/
 (環境によってpythonのバージョン、パスは異なります)
$ sudo patch < /path/to/dns.patch 

さあ、これで本当にUbuntu側の準備はおしまい。

テザリング・アプリケーションを次のコマンドで起動します。
(起動するとデフォルト・ゲートウェイを仮想ネットワークに向けてしまうので、サーバ側の準備が出来るまでは止めておきましょう)

$ sudo python netbuffalo-client-ws-server.py
  Tunneling device: gr0
  Server started.

起動するとgr0という仮想(TUN)インタフェースを作成し、送受信待ち状態になります。

gr0       Link encap:不明なネット  ハードウェアアドレス 00-00-00-00-00-00-00
          inetアドレス:10.0.0.1  P-t-P:10.0.0.1  マスク:255.255.255.0
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  メトリック:1

少し技術的な話をすると、このnetbuffalo-client-ws-server.pyでは仮想ネットワーク・インタフェース(gr0)で受信したIPパケットのうち、マルチキャスト、ブロードキャスト、UPnPなどのパケットは上位(3G回線)には転送しません。
通過させたく無い宛先アドレスがあれば、ファイルを編集して、IPADDR_DST_DENYに追加して下さい。

IPADDR_DST_DENY = ['224.0.0.251', '255.255.255.255', '239.255.255.250', '10.0.0.255']


インターネット接続サーバ(VPS)側テザリング環境の構築


これは基本前回の記事と同様なので、フレームワーク(Node.js, npm, tornado, scapyなど)のインストール手順は割愛して、注意点・変更だけ書きますね。

まずは、クライアントと同様にscapyにdns.patchを適用します。

$ cd /usr/lib/python2.x/site-packages/scapy/layers/
 (環境によってpythonのバージョン、パスは異なります)
$ sudo patch < /path/to/dns.patch 

続いて、iOS-HTML5-Tetheringをgitかzipファイルでダウンロードし、iOS-HTML5-Tethering/server/public/index.htmlを編集します。
変更するのはhost.remoteとhost.localの値。

host.remote = "ws://yourhost.com:port/websocket/";
host.local = "ws://10.0.0.254:6354/websocket";

host.remoteにはインターネット接続サーバ(VPS)のURLを指定します(port番号はこの後に起動するWebSocketサーバのポート番号)。
host.localのIPアドレスは先程UbuntuのWiFiインタフェースに指定した10.0.0.254ですよ。

最後にiOS-HTML5-Tethering/server/ws-server.pyですが、これも僕が用意したnetbuffalo-ws-server.pyを使いましょう。

netbuffalo-ws-server.pyのダウンロード

netbuffalo-ws-server.pyではsniff()では無くconf.L2listen()を利用する事によるインターネット側パケット解析(キャプチャ)の高速化及びUDPデータの転送処理が追加されています。

また、このファイルでは以下の部分を環境に合わせて変更します。

ETH_0_IP_ADDR = '10.202.43.31' # グローバルIPアドレス
OUTBAND_ETH_IFACE  = 'eth0' # グローバルIPアドレスのインタフェース名
・・・
print "Server started."
wsServer.listen(8282) # WebSocketサーバのポート番号

さあ、これでサーバ側の準備も終わりです。次のコマンドでテザリング・サービスを起動しましょう。

$ sudo node iOS-HTML5-Tethering/server/fs-server.js
$ sudo python iOS-HTML5-Tethering/server/netbuffalo-ws-server.py


Ubuntu+iPhone(脱獄無し)でテザリング!高速化の効果は?


テザリング・アプリケーション(netbuffalo-client-ws-server.py)を起動、Ubuntuに用意したWiFiアクセス・ポイントにiPhoneを接続後、iPhoneのブラウザ(Safari)からインターネット接続代理(VPS)サーバのURLにアクセス(http://yourhost.com)しましょう。
※fs-server.jsで80番以外のポートを指定した場合はURLでポート番号の指定も必要。

上手くいくとiPhoneのブラウザでサーバ側、ローカル側ともにグリーン表示になるはずです。

BlogPaint

何かインターネットに関わるアプリケーションを使ってみて下さい。netbuffalo-client-ws-server.pyからパケットの送受信状況が出力されるはずです。

71659.42 TX PACKET: IP/TCP 10.0.0.1:47570 > x.x.x.x:ssh PA / Raw
71659.57 RX PACKET: IP/TCP x.x.x.x:ssh > 10.0.0.1:47570 PA / Raw
71659.61 TX PACKET: IP/TCP 10.0.0.1:47570 > x.x.x.x:ssh A
71659.87 DROP PACKET: DENY DST: IP/UDP 10.0.0.1:x > 255.255.255.255:x
71684.61 TX PACKET: IP/TCP 10.0.0.1:47570 > x.x.x.x:ssh PA / Raw
71685.88 RX PACKET: IP/TCP x.x.x.x:ssh > 10.0.0.1:47570 PA / Raw

この出力部分もコメントアウトすると多少は早くなるかもしれませんね。

DNSパケットも使えるので、前回と比べるとすごく快適。

速度も以前はssh接続がタイムアウト扱いなるほど遅かったんですが今回は大丈夫。

どれくらいの速度が出ているのか通信速度計測サービスを使って測定してみると・・・、

24

うーん、下りはギリギリ我慢出来る100〜150Kbps程度でした。。

上りは高速であることからも、サーバ側のパケット送信・受信パケット解析部分が遅いことが想像できます。

40

余計なトラフィックが流れない専用中継サーバを用意、インターネット側パケットの中継・解析処理をC言語などでシンプルに書き、より効率的に処理できればもっと早くなりそうです。

ということでt.freeの性能に勝つにはもっと工夫が必要ですね・・・もう飽きてきたのでこれ以上は研究しませんけど。。。

それでは!


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

ルーター自作でわかるパケットの流れ
小俣 光之 
技術評論社 
売り上げランキング: 18267

Posted by netbuffalo at 18:29│Comments(0)TrackBack(0)ネットワーク | Linux


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

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

コメントする

名前
URL
 
  絵文字