Buffalo WSR-600DHPにOpenWRTを入れる
ヨドバシカメラで購入したバッファロールータをOpenWRT化してみる
SDNコントローラからコントロール可能な無線APが作りたかったので、OpenWRTを使ってみることにする。はじめはHostapdを使ってWhitebox switch的なものを作ろうとしていたが、2.4Ghzと5Ghzの両方をしゃべれるチップセットがかなり入手しにくかったのであきらめてOpenWRTを使うことにする。
OpenWRTにはOpen vSwichを入れることができるので、OpenFlowと連携が可能になる。また、市販のルータを使って実装できるのでかなり便利。
自分のルータがOpenWRTに対応しているかどうかはここで見ることができる。
https://wiki.openwrt.org/toh/start
ここではBuffaloのWSR-600DHPを使用する。
準備として以下のことを行う。
OpenWRTのファームウェアのダウンロード
OpenWRTのファームウェアは以下の公式サイトからダウンロードできる。
先ほどの対応機器一覧の画面から自身のルータを選び、その中にリンクのあるbinファイルをダウンロード。 公式サイトを読むと、ダウンロードしたbinファイルをルータの管理画面(WebUI)の「ファームウェア更新」のところでアップロードすればOpenWRTになると書いてあるが、今回のBuffaloルータだとそれが失敗してしまった。ほかのファームウェアでもやってみてだめだったので、別の方法を探すことにする。 参考にしたのは以下のサイト
http://www.srchack.org/article.php?story=20160503003415488
このサイトではtftpサーバからルータを起動しているようだ。
サイトにしたがってopenwrt-ramips-mt7621-wsr-600-initramfs-kernel.binを入手
以下のサイトにあった。(自力で探しても見つからなかった....)
「Tftp64」というWindowsをftpサーバに変えてくれるツールを使う。
その後は下記の手順に従う。
- 上記でダウンロードしたbinファイルの名前をfirmware_WSR-600DHP.ramに変更する。
- tftpサーバを(アドレス:192.168.11.168)で公開する(サーバ上に上記.ramファイルを置く)
- Windows PC(tftpサーバ)とバッファロールータをLANケーブルでつなげる。
- Buffalloルータの電源を「AOSS」ボタンを押しながら入れる
これでBuffalloルータがOpenWRTとして起動してくれる。
あとはtelnetでルータに入り(192.168.1.1)以下のコマンドを実行
# fw_setenv dual_image 0
# sysupgrade -n openwrt-ramips-mt7621-wsr-600-squashfs-sysupgrade.bin
openwrt-ramips-mt7621-wsr-600-squashfs-sysupgrade.binはアップグレード用のファイルなので
https://downloads.openwrt.org/chaos_calmer/15.05/ramips/mt7621/
このあたりから適宜ダウンロードしてルータに配置する。
最後にsshでログインできるようにrootパスワードを設定
# passwd root
iptables -t nat -D POSTROUTING 1
iptables -t nat -A POSTROUTING -p TCP -s 192.168.122.0/24 -d 153.153.145.156/32 -j MASQUERADE --to-ports 1024-65535
ip netns exec test ip route
ip netns exec test route add default gw 192.168.122.1
gohanを触ってみる
以下からgohanのバイナリソースをダウンロードし、中身を解凍する。
https://github.com/cloudwan/ansible-gohan/releases
# unzip gohan_linux-amd64.zip
# cd gohan_linux-amd64
# ./gohan server --config-file etc/gohan.yaml
これだけで一応gohanが動き始める。以下のurlにアクセスして動きを確かめることができる。
初期状態ではID: admin Passward: admin でログインが可能。
ちなみにURLの最後のスラッシュを書き忘れるとページが表示されないので、ご注意を。
続いてetcdと連携させる。
gohan設定した情報を分散key/valueストアであるetcdに書き出し、etcdの情報を元にシステムを構築する仕組みを作ってみる。
Ubuntuへetcdをインストール
# curl -L https://github.com/coreos/etcd/releases/download/v2.0.9/etcd-v2.0.9-linux-amd64.tar.gz -o etcd-v2.0.9-linux-amd64.tar.gz
#tar xzvf etcd-v2.0.9-linux-amd64.tar.gz
#cd etcd-v2.0.9-linux-amd64
#cp etcd /bin/
#cp etcdctl /bin/
etcdのインストールが完了したので、etcdを起動する。
#etcd
gohanとの連携のために./etc/gohan.yamlファイルを編集し、etcdの項目のコメントアウトを外し、gohanをリスタートする。
ためしにgohanのwebUIから[network]や[server]の項目を追加し、etcdのに書き込まれていることを確認する。etcdctlコマンドを使うと/config/v2.0/以下にUIで設定したnetworks/id1が書き込まれていることがわかる。
# etcdctl ls --recursive
/monitoring
/gohan
/gohan/cluster
/gohan/cluster/lockstate
/gohan/cluster/lockmonitoring
/gohan/cluster/sync
/config
/config/v2.0
/config/v2.0/networks
/config/v2.0/networks/id1
/config/v2.0/servers
/mykey
/state
また、同じくetcdctlコマンドでwebUIから設定した内容を確認することができる。
# etcdctl --peers=http://127.0.0.1:4001 get /config/v2.0/networks/id1
{"body":"{\"description\":\"mizukoshi-description\",\"id\":\"id1\",\"name\":\"mizukoshi\",\"tenant_id\":\"tenant12\"}","version":1}
githubで公開されているpython-etcdを使えば、pythonプログラム内でetcdを扱うことができて非常に便利だった。
dockerを使ってみる
Docker1.9をインストールすることにする。ついでにDocker ComposeとDocker Machineも一緒に入れてみる。
最新版のDockerをインストールする。
# curl -sSL https://get.docker.com/ | sh
インストールを完了しバージョンの確認を行う。 以下のようにVersion: 1.9.1がダウンロードされている。
# docker version
Client:
Version: 1.9.1
API version: 1.21
Go version: go1.4.2
Git commit: a34a1d5
Built: Fri Nov 20 13:12:04 UTC 2015
OS/Arch: linux/amd64
Server:
Version: 1.9.1
API version: 1.21
Go version: go1.4.2
Git commit: a34a1d5
Built: Fri Nov 20 13:12:04 UTC 2015
OS/Arch: linux/amd64
続いてdocker-composeをインストールする。これも最新の1.5.2をインストールする。
# curl -L https://github.com/docker/compose/releases/download/1.5.2/docker-compose-Linux-x86_64 > /usr/local/bin/docker-compose
# chmod a+x /usr/local/bin/docker-compose
docker-machineをインストールする。
# wget https://github.com/docker/machine/releases/download/v0.5.4/docker-machine_linux-amd64
# mv docker-machine_linux-amd64 /usr/local/bin/docker-machine
# chmod a+x /usr/local/bin/docker-machine
今回はインストールのみなのでここまで。