jsmodemを使ってみる

はじめに

jslinuxを使ってみてその完成度の高さに驚いたものの,ネットワークが動いてないのは残念だと思っていました.そう思いつつ自分でネットワーク廻りを作るのはしんどいなぁとぐぐって見つけたのがjsmodemです.youtubeを使った説明もあって,どんなことができるのか見てみることができます.でもそこはやはり自分でやってみないとつまらないので,自前環境で動かしてみました.これはそのまとめのメモです.

準備

サーバとしてvmware上のx86ベースのcentos5.6を使いました.まずはgitをインストールして

$ wget http://dag.wieers.com/rpm/packages/rpmforge-release/rpmforge-release/rpmforge-release-0.5.2-2.el5.rf.i386.rpm
$ sudo rpm -ivh rpmforge-release-0.5.2-2.el5.rf.i386.rpm
$ sudo vi /etc/yum.repos.d/rpmforge.repo

# s/enabled=1/enabled=0/
# ↑ファイル内の変更点

$ sudo yum install git --enablerepo=rpmforge

jsmodemを落として動かしてみたら.socatがないと.これは

$ sudo yum install socat

で解決ですが,python26も必要と言われます.これは

$ sudo rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm
$ sudo vi /etc/yum.repos.d/epel.repo

# s/enabled=1/enabled=0/
# ↑ファイル内の変更点

$ sudo yum install python26 --enablerepo=epel
$ sudo yum install python26-numpy --enablerepo=epel

として解決.後は2080ポートにアクセスするので,vmwareでnat設定を変更して,母艦の2080ポート向けの通信をcentosの2080ポートに届けます.

動かしてみる

どうもsocatは一度セションが切れるとプロセスが終了するようなので,serve.shを起動するのではなく,その中身のコマンドをひとつづつ母艦で実行しながら動作確認してる段階です.

$ sudo socat -d -d PTY,link=/dev/jsppp,raw,echo=0 TCP-LISTEN:2001
$ sudo pppd /dev/jsppp debug noauth passive 10.0.5.1:10.0.5.2
$ python2.6 websockify -D --web=./ 2080 127.0.0.1:2001

↑は実際には別シェルから実行して試しています.socatだけ工夫すればここまでしなくてもよいと思うのですが,まだ確認してません.
jslinuxが立ち上がったら,rootでログインして

# ./ppp_up
# ifconfig -a
...
ppp0      Link encap:Point-to-Point Protocol                                    
          inet addr:10.0.5.2  P-t-P:10.0.5.1  Mask:255.255.255.255              
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1            
          RX packets:20 errors:0 dropped:0 overruns:0 frame:0                   
          TX packets:22 errors:0 dropped:0 overruns:0 carrier:0                 
          collisions:0 txqueuelen:3                                             
          RX bytes:1360 (1.3 KiB)  TX bytes:1203 (1.1 KiB)

となるのを確認します.これでppp接続ができました.次は母艦側で外に出る設定をします.

$ sudo /sbin/iptables -F
$ sudo /sbin/iptables -t nat -F
$ sudo /sbin/iptables -t mangle -F
$ sudo /sbin/iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 192.168.63.129
# echo 1 > /proc/sys/net/ipv4/ip_forward

eth0と192.168.63.129は私のvmwareでの設定になります.個々の環境に依存する値で,外,つまりインターネットに向いている側のインタフェース名とそのIPアドレスを指定します.これで外に出られるようになりました.後は名前解決が必要なので,

# cat /etc/resolv.conf
search localdomain
nameserver 192.168.63.2

などと設定します.最初は母艦のアドレスを指定したのですがそれでは動きませんでした.ここで記載しているIPアドレスは母艦の/etc/resolv.confに指定されていた私のvmwareでの例です.これで名前解決もできるので

# ping www.perl.com                                                             
PING www.perl.com (207.171.7.72): 56 data bytes                                 
64 bytes from 207.171.7.72: seq=0 ttl=127 time=103.510 ms                       
64 bytes from 207.171.7.72: seq=1 ttl=127 time=107.590 ms                       
64 bytes from 207.171.7.72: seq=2 ttl=127 time=112.811 ms

となって外に出れていることが分かります.ちなみに,母艦上でもpingを実行すると

$ ping www.perl.com
PING www.perl.com (207.171.7.72) 56(84) bytes of data.
64 bytes from mt.perl.org (207.171.7.72): icmp_seq=1 ttl=128 time=107 ms
64 bytes from mt.perl.org (207.171.7.72): icmp_seq=2 ttl=128 time=105 ms
64 bytes from mt.perl.org (207.171.7.72): icmp_seq=3 ttl=128 time=110 ms

のような値になるので,体感できるほど遅いなどということはありません.

おわりに

いやー,ホントに面白いですね.dhcpとかと組み合わせて複数のjslinuxをぶら下げられるサーバ作ってみようかな.dotcloudとかに.
あ,後.jslinux.jsでwebsocketをlocalhost:2080にコネクトするようハードコードされていたので,書き直して使っています.

// modem.connect('localhost', 2080);
modem.connect(location.hostname, 2080);

セキュリティ対策なのかな?