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
のような値になるので,体感できるほど遅いなどということはありません.