Dropbox

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
2018/08/01更新
どうも不調です。子機の一つが7月はじめに壊れ、親機として使っているものも似たような症状が出始めました。別のものに置き換え検討中
子機が壊れた経緯:
– 最初MacBookだけ不調になる。WiFiのアンテナマークはあるが接続が切れる、MacBookのWiFiオフオンで一時的に回復
– 他の機器は接続は切れないので気づかないがときおり遅いと感じるようになる
– 子機は、その状態になってしばらくして完全に立ち上がらなくなった。
保証期間内だし、そのうち交換してもらおうかと思っていたら、親機としてしようしている一台も上2つの状態になりました。
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

昨年くらいから出始めたメッシュ(MESH)対応のWiFiルーターに変更しました。以前はAppleのAirMacを複数で家の中のWiFiをカバーしていました。そのうち、徐々にAppleのルーターが故障して足りなくなった部分を小米のWiFiルーターをリピーターとして使用したりしていました。電波の強さは問題ないもののリピーターへの切り替えはシームレスでは無いので使い勝手は今一つです。

そこでMESHに注目しました。これは複数のWiFiルーターを接続して使用するものです。端末を持って移動して別のWiFiルーターのカバーするエリアに入った時にシームレスに切り替えを行ってくれるのが特徴です。

製品としてはGoogle Wi-FiやLinkSys Velopが有名です。Velopは中国でも入手可能ですが、結構なお値段です。そこで中国製のお手頃価格なものを探しました。いろいろと見つかりましたが、信用のおけるメーカーのものということでHonor(実質的にHuawei)荣耀分布式路由器というものを購入しました。値段は3個組で約800元、Velopの3分の1以下でした。

3個入っていますが、型番を見るとどれも同じようです。一つだけ設定プログラムを導入するためのQRコードが貼ってあったので、それを親機としました。Android携帯電話にHuaweiの設定プログラムを導入して設定するのはとても簡単でした。ルーターに三個のEthernetポートがありますが、どれをWAN側にするかも自動的に認識されますし使用形態も自動的に判断されます。我が家では中国電信のIP電話機能付きルーターの配下で所謂二重NAT構成にします。子機の設定まで含めて入力が必要だったのはSSIDとパスワード、各ルーターの名前だけでした。

DHCP関連の細かな設定をするためにはwebブラウザーでルーターにログインして行います。わたしの目的であるDHCP範囲の調整と静的IP Address割り当てだけではなく、DMZ, ゲストネットワーク他かなり細かい設定も可能です。特筆すべきはVPNルーターにもできることです。PPTPとL2TPが選べます。残念ながらL2TP/IPSecでは無いので、一般的にはPPTPを使用することになると思います。面白いのはVPN使用時のDNS設定をマニュアルにするとディフォルトで8.8.8.8が入っていることです。

おそらく最初からwebブラウザーで設定することもできると思います。それでも携帯電話のアプリを入れておくと簡単に状況が確認できますし、新しい端末がネットワークに入ると携帯電話の通知で知らされるので便利です。

もともとリピーターを必要としていたのでMESHを選んだのですが、実際に使用してみると親機の電波が家中に届いています。角のようなアンテナも生えていないのに大したものです。それでも、やや弱い部分があるので子機も設置しました。

実際に使ってみるとMESHを名乗っているのは伊達ではないことが分かります。親機から子機、子機から別の子機のエリアへ移動してもまったく意識することなく強い電波に接続されます。どの端末がどのルーターに現在接続しているかはwebブラウザーもしくは携帯電話アプリで簡単に確認できます。

それぞれの筐体にEthernetポートがあります。これも普通にパソコンなどを接続して使用できます。これでWiFiが不調になったMacBookが救われました。あと、初代Raspberry Piも活用できそうです。

xmmini_dlna

小米ルーターminiを全くルーターとしては使用せず純粋にDLNAを使用したメディア・サーバーとして構成してみました。たっぷりと音楽やら動画ファイルを入れるためにちょっと贅沢にIntelのSSDをUSB接続しました。OpenWrtが導入直後の状態ではUSBにデバイスが接続されたことはログを見ると分かりますが、USBストレージとしては認識されません。

[ USBストレージの設定 ]
参考ページ : OpenWrtメモ: USBメモリを使える様にする
# opkg update
# opkg install kmod-usb-storage

やっと /dev/sda が現れます。
# opkg install kmod-fs-vfat
# opkg install kmod-nls-cp437
# opkg install kmod-nls-iso8859-1

これで準備完了です。
mount -t vfat -o iocharset=utf8 /dev/sda2 /mnt
みたいな感じでマウントします。後ほどファイルのコピーやDBの構築でMac OS XやLinuxに接続するため取り回しやすいようにFAT32でフォーマットしました。また、日本語ファイル名を正しく取り扱うためにiocharset=utf8の指定が必ず必要です。英字のみのファイル名だけならば気にしなくても大丈夫です。

またせっかくSSDを接続するので小さなパティションにswapを確保しました。
# mkswap /dev/sda3
# swapon /dev/sda3

今のところswaponとmountはブート後に手動で行っています。fstabとか存在していないので、自動マウントは色々と手順を踏まなければなりません。そのうち気が向いたら試すことにします。

[ DLNAサーバーの導入 ]
opkg install minidlna
これだけで動きます。minidlnaと控えめな名前ですが、わたしの必要としている機能的には十分な内容です。そのまま/mntにメディア・ファイルを置くだけでサーバーとして機能しました。ただし既定値ですと小米ルーターをサーバーとして接続した端末(小米ルーターのOpenWrtからDHCPでIP Adderessを取得する端末)に対してDLNAサーバー機能を提供します。

わたしの場合は、既存の家庭内ネットワークに小米ルーターを接続し、家庭内ネットワークに接続している端末にDLNAサーバー機能を提供するため構成を変更しました。まずはOpenWrtの設定で家庭内ネットワークの無線LANに接続を行いました。ifconfigでインターフェース名を確認します。わたしの場合は2つの別々のネットワークに2.4GHzと5GHzのインターフェースを接続したのでwlan0とwlan1が現れました。-> (注:実際に使用すると2.4GHzの方はデータの流れ的にちょっと厳しいです。5GHzは概ね良好ですが、HDに映像でたまにカクカクします。有線接続が良いかも)

minidlnaの構成ファイル /etc/config/minidlna  の option interface ‘br-lan’ の部分を interface ‘wlan0′,’wlan1’ と書き換え /etc/init.d/minidlna restart を行います。これで目的の構成になりました。

ただし、沢山のファイルを持とうとするとminidlnaサーバーがDBを構築するのに時間がかかったり、不可能だったするそうです。解決するためには、別途Linuxマシンを用意して、そこにUSBストレージ上でDBを構築する方法が公式ガイドに書かれています。

公式ページ: OpenWrt MiniDLNA

このページのChaos Calmer Tips以下を忠実に実行すればLinuxマシンでのDB構築が出来ます。あまり頻繁にファイルを更新しなければ、この方法で大丈夫でしょう。同じ環境をLinux上に作成しファイルの入れ替えとDB再構築後にrsyncで同期するみたいな運用が楽で良いかも知れません。

[ DLNAクライアント ]
– VLC : 使いやすいです。macOS, iOS, Androidで使用しています。
– KODI (旧XBMC) : 定番ですが、ちょっと使い方に癖があります。Android STBで使用しています。VLCがテレビ対応すると楽なんですが、まあKODIがあれば大丈夫。日本語のタイトルが表示できない(KODIの問題では無いかも)。
– YAMAHA RX-V473 : 愛用のお値打ちAVアンプ。残念ながら動画の再生は出来ませんが、音楽再生には一部適していると思います。
– YAMAHA BD-S473 : ブルーレイディスク・プレーヤーです。最近あまり使っていないのでEthernetケーブルを接続してみました。動画だけ再生できて音楽はダメ。タイトルの表示が遅いし、たまにハングして電源コードを抜かなければならなくなる。期待はずれでした。

[ トラブル ]
時々、小米ルーターmini自体がハングして電源コードを抜かなければならなくなります。ちょっと無理してるのかも知れません。ただいま原因の切り分け中ですが、OpenWrtでのDLNA構成例という意味では有効と思われますので、原因が判明する前に記事を公開することにしました。

追記) ハングの原因は小米ルーターminiのUSBポートの電力不足でした。IntelのSSDを直挿しするとマウントしなくても数時間放置するとハングします。電源付きのUSB Hubを使用することで安定稼働することが出来ました。ちなみに小米ルーター3にIntel SSDを直挿しした場合は24時間以上安定稼働します。

小米ルーターmini + OpenWrt + Softether VPN/StoneでRaspberry Pi3の置き換えを狙いましたが、残念ながら性能的に及ばす断念しました。普通に動画とかを見ることは十分に出来ますので、Raspberry Pi3設置前であれば納得して使用していたと思います。

小米ルーター青春版よりはかなり速くなりました。Softether VPNでの実環境で、もの凄く大雑把な数字で比較すると以下のような感じです。

Raspberry Pi3 1MB/s : 小米ルーターmini 700KB/s : 小米ルーター青春版 560KB/s

[ 電波の飛びが悪い問題 ]
小米ルーターmini + OpenWrtにおいてWiFiのチューニングに問題があります。実測したところ5GHzは問題ないようですが、2.4GHzの電波はオリジナル・ファームウェアに比べるとかなり弱いです。Raspberry Pi3と同じくらいの電波の強さですので、使えないことは無いです。OpenWrt Pandraboxというファームウェアを使用すると大丈夫のようですが、ちょっと古いです。OpenWrtように作ったStoneは動きましたので、何かしら自分のアプリケーションを動かすことは可能ですが、今ひとつわたし的なメリットは無さそうです。

これまた大雑把ですが、2.4HGzでオリジナル・ファームウェアで-40dBm出ている環境でOpenWrtにすると-70dBmになってしまいます。

小米ルーターminiの使いみちは検討中。

小米ルーターminiにもSoftether VPNとstoneを導入しました。小米ルーター青春版に入れたバイナリーは使えませんので改めてビルドしました。

ただし小米ルーター青春版で使用したSDKではターゲットがうまく設定出来ませんでした。何かしら方法があるのでしょうが、もっと簡単な、というかより正しいSDKの導入方法が見つかりました。といっても公式ガイドに書かれている方法なんですが、メモとして書き残しておきます。

OpenWrtのUsing SDKページに書かれているように各プラットフォーム別のビルド済SDKがあります。小米ルーターminiはramips/mt7620のページ以下にルーターに導入するバイナリーと共にビルド済のSDKが置いてあります。

使用したのはOpenWrt-SDK-15.05.1-ramips-mt7620_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-x86_64.tar.bz2です。

これを展開した後は、targetの選択が必要が無い以外は以前の記事と同じ手順です。

– 「小米ルーター青春版 + OpenWrtにSoftether VPNを導入する
– 「小米WiFiルーター青春版 + OpenWrtにstoneを導入する」 ひとつだけ訂正があります。 STAGING_DIR指定するのはopenwrt/staging_dir/以下のtargetから始まるディレクトリにしました。わたしの場合は”openwrt/staging_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2″です。

xiaomiyouthmini

小米ルーター青春版とmini

またまた小米ルーターで遊んでいます。小米ルーター青春版はモバイルバッテリーでも稼働できる手軽さはあるが性能的に限界があるし小米ルーター3にはOpenWrtが出ていないので今度は小米ルーターminiで再度Raspberry Pi3の置き換えに挑戦します。

まずはOpenWrtの導入編です。

ただし、小米ルーターmini+OpenWrtは普通には使えていますが、電波の飛びが弱いようです。これについては、改めて検証します。

[ 開発版ファームウェアの導入とSSHの有効化 ]
OpenWrtのガイドにはURLを使ったtelnetの有効化が書かれていますが最新の開発版ファームウェアでは使えませんでした。おそらく、OpenWrtのページにある古い開発版ファームウェア入れれば大丈夫でしょう。わたしは素直に小米の公式に従ってSSHを使用できるようにしました。

– AndroidもしくはiOSの小米アプリから小米ルーターminiに一度アクセスして小米アカウントとルーターを関連付けます。
公式ページから開発版ファームウェアをダウンロードします。わたしの場合はバージョン2.11.25でした。
– ガイドに従いUSBメモリーにmiwifi.binというファイルネームでコピーし、ルーターに挿入しリセットボタンを押したまま電源オンで書き込みます。
– 開発版ファームウェアで立ち上がったら、次はSSHモジュールの導入です。
https://d.miwifi.com/rom/ssh からSSHモジュールをダウンロードする。
– これもUSBメモリーにmiwifi_ssh.binというファイルネームでコピーして、ルーターに挿入しリセットボタンを押したまま電源オンで書き込みます。
リブートするとsshでrootログイン出来るようになります。パスワードはファイルをダウンロードしたページに書かれています。

[ OpenWrtの導入 ]
特別なことはなく公式ページに従えば導入出来ます。
ssh root@192.168.31.1のようにしてルーターにログインします。
# cd /tmp
# wget <公式ページにリンクがあるバイナリーファイルのURL>
# cat /proc/mtd でOS1バティションがあることを確認する
# mtd -r write <バイナリーファイル名> OS1

以上でOpenWrtが起動します。例によってパスワードは無しWifiはオフで立ち上がります。青春版の時とは違いGUIインターフェースであるLuCIは最初から入っています。

以前、小米ルーター青春版をリピーターとして簡単に構成した時はかなり遅くて使う気になりませんでした(数値は取っていませんが)。

もうちょっと改善しないものかとrelaydを使用した構成を試してみました。速度もだいぶマシになりましたので、構成方法についてメモを残しておきます。

公式ガイドに従いますがOpenWrtのレベルの差によるものか、多少アレンジが必要でしたので全ての投入コマンドを書いておきます。

前提としてファームウェアの初期設定状態から構成を開始するものとします。

操作はPCからEthernetケーブルを白いEthernetコネクターに接続し”ssh root@192.168.1.1″でログインして行います。

[ wifiの活性化 ]
# uci set wireless.@wifi-device[0].disabled=0
# uci commit wireless
# wifi

[ 接続先のWifiネットワークの確認 ]
公式ガイドにあるiwlist scanの方は動かなかったです。
# iw dev wlan0 scan

[ wwanインターフェースの構成 ]
# uci set network.wwan=interface
# uci set network.wwan.proto=dhcp
# uci commit network

/etc/config/networkに該当のセクションが作成されます。

[ Wirelessネットワークを既存のWifiルーターに接続する ]
# uci set wireless.radio0.channel=11
# uci set wireless.@wifi-iface[0].network=wwan
# uci set wireless.@wifi-iface[0].mode=sta
# uci set wireless.@wifi-iface[0].ssid=xmff-relay
# uci set wireless.@wifi-iface[0].encryption=psk2
# uci set wireless.@wifi-iface[0].key=secret-key
# uci commit wireless

– “ssid=”には自分のWifiアクセスポイントのSSIDを記入します。
– “encryption=”はサンプルではpskになっていましたが、わたしの場合はpsk2にしないとダメでした。
– “key=”には自分のWifiアクセスポイントのパスワードを記入します。

構成は/etc/config/wirelessに反映されます。

# wifi down; wifi
で構成を有効にします。しばらくしてifconfigを投入するとwlan0に既存のwifiルーターから割り当てられたIP addressが確認できます。

[ relaydの導入 ]

小米ルーターが既存のwifiルーターを経由してインターネットに接続されたのでrelydモジュールを導入します。
# opkg update
# opkg install relayd

ルーターのブート時にrelaydが起動するようにします。
# /etc/init.d/relayd enable

[ relay用のインターフェースを作成 ]
# uci set network.stabridge=interface
# uci set network.stabridge.proto=relay
# uci set network.stabridge.network="lan wwan"
# uci commit network

/etc/config/networkに変更が反映されます。

[ インターフェースLANにgatewayと dnsを設定 ]
# route -n | grep UG
これは既存のルーターのgatewayアドレスの確認ためです。分かっている場合は必要なし。

# uci set network.lan.gateway=192.168.1.1
# uci set network.lan.dns=192.168.1.1
# uci commit network

192.168.1.1の部分は自分のWifiルーターのIP addressに変更します。

[ DHCPを無効にする ]

既存のWifiルーターのDHCPを使用しますので小米ルーターのDHCPは無効にします。

# uci set dhcp.lan.ignore=1
# uci commit dhcp

[ firewallを調整 ]
# uci set firewall.@zone[0].forward=ACCEPT
# uci set firewall.@zone[0].network="lan wwan"
# uci commit firewall

ここまでの設定で白いEthernetコネクターに接続したPCから既存のWifiルーターを通してインターネットに接続可能です。引き続きWifiアクセスポイントを設定し、WifiからWifiへのリピーターとして機能するようにします。

[ Wifiアクセスポイントの設定 ]
# uci set wireless.@wifi-iface[1].device=radio0
公式ガイドでは上のようなコマンドで設定するようにガイドされていますが、”uci: Invalid argument”と言われてしまいます。正しいコマンドが分からなかったので構成ファイルを直接編集しました。
# vim /etc/config/wireless
以下の設定を追加しました。
config wifi-iface
option device 'radio0'
option mode 'ap'
option ssid 'RepeaterWirelessNetwork'
option encryption 'psk2'
option key 'RepeaterWirelessPassword'
option network 'lan'

‘RepeaterWirelessNetwork’と’RepeaterWirelessPassword’は、適当に変更します。

[ 設定の有効化 ]
/etc/init.d/dnsmasq restart
/etc/init.d/firewall restart
wifi down; wifi

[ 小米ルーターのIP address変更 ]
わたしの場合は必要ありませんでしたが、もし既存のWifiと小米ルーターのIP addressサブネットが同じ場合は以下のコマンドで違うサブネットに変更します。
# uci set network.lan.ipaddr=192.168.2.1
# uci commit network
# reboot

[ 小米ルーターへのログイン ]
Wifi、Ethernet接続ともにDHCPで既存のWifiアクセスポイントからIP Addressが割り当てられます。このため、そのままでは元々小米ルーターが持っているIP Addressにはアクセス出来ません。わたしの場合は2つの方法でアクセスしています。
– PCのIP Addressを手動で小米ルーターのサブネットに合わせて設定する。わたしの場合は192.168.1.10に設定してssh root@192.168.1.1を実行しています。
– 小米ルーター自身もwlan0が既存のWifiルーターからDHCPでIP Addressを取得しています。ここに対して別のPCからsshでアクセスすることも出来ます。Wifiルーターなどで静的にIP Addressを設定できれば、この方法が簡単で良いです。

[ パフォーマンス ]
決して速いとは言えませんが、それを承知の上で使用すれば実用的に使うことは出来ます。iPod touchのSpeedtestで試したところ、直接既存のWifiアクセスポイントに接続して30Mbpsくらい出ている状態で小米ルーター青春版のリピーターから接続すると10Mbpsくらいが限界のようでした。

小米ルーター青春版+OpenWrtを設定中に外部からのアクセスを不能にしてしまいました。OpenWrtを入れた状態ではリセットボタンの長押しでの回復は不可能ですので、シリアルポートを使用してコンソールにアクセスしてリカバリーしました。

I lost the access into the Xiaomi Wifi router + OpenWrt. Hardware reset button does not work to reset configuration under OpenWrt. Then I hooked up serial port to use console for recovery action.

xmyouth_opener

PDAオープナー(死語?)でカバーを開けます。Ethernetコネクター側をこじると簡単に開きます。

Opened router cover by using plastic tool. The cover can be opened from Ethernet connector side easily.

xmyouthserialport

基板上のシリアルポートはスルーホールが開いているだけです。ピンアサインは以下のようにOpenWrt Wikiに書かれている。

Serial port pins assignment on the mother board is as follows.

UART console
From the J1:
1 —— VCC
2 —— RX
3 —— GND
4 —— TX

xmyouth_pins

ボードにピンをたてました。

Soldered pins on the board.

xmyouth_serialcable

シリアルポートUSB変換コネクターを接続(VCCは接続しない方が良い気がします)してMac OS Xのコンソール・コマンドを起動し、ルーターの電源を入れるとブート・メッセージが表示されます。ブートが終了したころを見計らってreturnキーを押すとプロンプトが表示されます。シリアルポートUSB変換ケーブルについてはRaspberry Pi関連の情報を探すと沢山見つかります。

Hooked up serial to USB cable to the router board and started console command on the Mac OS X. Boot messages appeared when powered up the router. Press return key to show command prompt. Serial to USB cable is same to Raspberry Pi. You can find the cable information on the internet.

OpenWrtを導入時の状態に戻すのは以下のコマンドを投入するだけです。

To reset OpenWrt configuration, just need to enter following commands.

# fastboot
# reboot -f

追記)
ピンが邪魔で蓋が完全に閉まらない。ピンの台座のプラスチックを壊して根本からピンを曲げないと行けない感じ。

小米ルーター青春版にOpenWrtを入れて、そこにsoftetherとstoneを入れて、Raspberry Pi3で稼働しているルーターの置き換えをねらってみました。結果的には置き換えるには今ひとつな結果でした。

xiaomi_youth

目的の環境を構築することは出来ました。接続もスムーズでYoutubeをHD画像で再生も出来ますが、どうもファイルのダウンロードなどでRaspberry Pi3より速度が劣ることが感覚的にも分かります。色々とテストしてみましたが、数字的にも今ひとつな事が確認できました。

以下のテストは何度か試してみたうちの最大値です。

[ 実環境 – softether、接続先のsoftetherが稼働しているサーバーからのscpによるファイル転送 ]

Raspberry Pi3 1.1MB/s
小米ルーター青春版 560KB/s

[ 実環境 – stoneによるproxy接続で接続先サーバーからのwebによるファイルダウンロード ]

Raspberry Pi3 3.1MB/s
小米ルーター青春版 890KB/s

テスト回数も少ないので数字の信頼度は低いですが、ネットワークの速度より低い所で小米ルーター青春版がボトルネックになっていることは間違いありません。

次にローカル環境で単純なNAT機能付きのルーターとして稼働させ小米ルーター青春版と小米ルーター3でscpによる比較を行いました。前のテスト同様に最大値です。

[ ローカルテスト - scp ]

小米ルーター3 - 5GHz 1.4MB/s
小米ルーター3 – 2.4GHz 1.1MB/s
小米ルーター青春版 640KB/s

テスト方法はかなり適当ではありますが、小米ルーター青春版に能力の限界があることは確かです。

小米ルーター青春版は手のひらサイズでモバイルバッテリーでも稼働できる事がメリットです。その方向での活用方法を考えるとドローンを飛ばすときのWiFiエクステンダーくらいしか無いかも知れません。

小米ルーター3は青春版より性能的に優秀そうなので、これにOpenWrtが入れられるようになるれば、またRaspberry Pi3への置き換えに挑戦したい。もしくは小米ルーター3と同じチップセットを使用している小米ルーターminiを入手して試してみたい。

小米WiFiルーター青春版は小型ながらsoftetherまで動かすことが出来ました。ただ動いただけではなく、メモリーの使用状況やCPUの稼働率を見ると何とか実用的に稼働できそうです。そこで欲張ってパケットリピーターstoneも動かしてみることにしました。

参考webサイト:
stone version 2.3e stoneの公式ページです。
La Fonera 上で stone を走らせてみる 開発者の方の記事です。
OpenWrt – Cross Compile OpenWrt公式WiKiのCross Compileのための設定です。

[ Cross Compileのための設定 ]

SDKの導入が終わっていることを前提とします。詳しくは「小米ルーター青春版 + OpenWrtにSoftether VPNを導入する」をご覧ください。

OpenWrtの公式ガイドにあるようにstaging dirのtoolchainにパスを通し、環境変数STAGING_DIRを設定します。わたしの場合は以下のような設定を ./.bash_profile に入れました。
PATH=$PATH:$HOME/.local/bin:$HOME/bin:$HOME/openwrt/staging_dir/toolchain-mipsel_24kec+dsp_gcc-5.3.0_musl-1.1.15/bin

export PATH

STAGING_DIR=$HOME/openwrt/staging_dir/toolchain-mipsel_24kec+dsp_gcc-5.3.0_musl-1.1.15

export STAGING_DIR
openwrt以下の部分はTarget Systemによって変わります。

[ stoneのビルド ]
stoneの公式ページよりソースコード一式をダウンロードし展開します。

$ wget http://www.gcd.org/sengoku/stone/stone-2.3e.tar.gz
$ tar xvf stone-2.3e.tar.gz
$ cd stone-2.3d-2.3.2.7/

Makefileを少々変更しなければなりません。以下、変更部分のみです。

fon:
$(MAKE) CC="mipsel-openwrt-linux-gcc" FLAGS="-O -Wall -DPTHREAD -DUNIX_DAEMON -DPRCTL -D_GNU_SOURCE $(FLAGS)" LIBS="-lpthread $(LIBS)" stone
mipsel-openwrt-linux-strip stone

fon-pop:
$(MAKE) CC="mipsel-openwrt-linux-gcc" TARGET=fon pop_stone

fon-ssl:
$(MAKE) CC="mipsel-openwrt-linux-gcc" SSL_LIBS="-lssl -lcrypto" TARGET=fon ssl_stone

fon用の設定を流用しました。
– “-D_GNU_SOURCE”を追加。これは通常のLinux用にmakeするときも必要かもです。
– CC=の部分を”mips-linux-uclibc-gcc”から”mipsel-openwrt-linux-gcc”に書き換える。
– mips-linux-uclibc-stripをmipsel-openwrt-linux-stripに書き換える。

以上でmake fonは通るようになりました。ところがmake fon-sslを実行するとopenssl/crypto.hが無いと言って怒られます。

確かにSTAGING_DIR以下を探しても見つかりません。というか$STAGING_DIR/usr/以下にはinludeとlibがありますが空っぽです。探してみると~/openwrt/staging_dir/target-mipsel_24kec+dsp_musl-1.1.15/usrには全てのファイルが揃っているようです。正しい解決方法は分かりませんが、とりあえずスタティック・リンクを貼ってみました。

$ cd ~/openwrt/staging_dir/toolchain-mipsel_24kec+dsp_gcc-5.3.0_musl-1.1.15
$ mv usr usr.xx
$ ln -s ~/openwrt/staging_dir/target-mipsel_24kec+dsp_musl-1.1.15/usr ./usr

再びstoneに戻ってmake fon-sslでstoneが出来上がりです。

$ cd ~/stone-2.3d-2.3.2.7/
$ make fon-ssl

[ 導入 ]
単純に/usr/bin/にstoneをおきました。使い方については、ここでは詳しくは書きません。
/etc/init.d/にスクリプトを置けばLuCIからコントロール可能と思います。わたしの場合は常に起動しますので単純に/etc/rc.localから起動することにしました。

GitHubにOpenWrt用のSoftetherバッケージがありますので、やり方が分かってしまえば難しくはありません。実際の手順を記述したサイトも沢山見つかります。それでも最初は色々と分からないこともあり時間がかかります。何かの参考のために現時点での有効な手順を記述しておきます。

参考webサイト:
Techie blog – Setting up Softether VPN on OpenWRT : 使われているSDKが古いことを除けば完璧な手順書です。
OpenWrt build system – Installation : OpenWrtの公式ガイド、ここの手順に従って最新のSDKを導入しました。
el1n/OpenWRT-package-softether : GitHubのOpenWrt Softetherパッケージです。

最初、Techi blog – Setting ip Software VPN on OpenWRTの手順に忠実に従ってSoftetherのコンパイルまで完了しましたが、残念ながらこのページで使用しているSDKバージョン”barrier_breaker”には小米ルーターで使用するtargetが入っていませんでした。同じmipsのCPUは含まれているので実際のバイナリーは使用できるかも知れませんが作成したパッケージの導入が出来ませんでした。ここは最新のSDKを使うべきでしょう。またGitHubのOpenWRT-softetherのページやその他の手順書にはsvnでSDKを構築するようになっていますが、現在OpenWrtのサイトのsvnサービスは停止しています。公式手順にあるようにgitコマンドを使用します。

[ SDKの導入 ]
テストではubuntuも使用していましたが、以下の手順はParallels下のCnetOS 7を使用しています。公式ガイドOpenWrt build systemに書かれていることをそのまま実行するだけです。一応、投入したコマンドを書いておきます。

$ sudo yum update
$ sudo yum install subversion binutils bzip2 gcc gcc-c++ gawk gettext flex ncurses-devel zlib-devel zlib-static make patch unzip perl-ExtUtils-MakeMaker glibc glibc-devel glibc-static quilt ncurses-libs sed sdcc intltool sharutils bison wget git-core openssl-devel xz
$ git clone https://github.com/openwrt/openwrt.git
$ cd openwrt

これで最新のstbaleバージョン(わたしの場合は’多分’Chaos Calmer 15.05.1)が導入されました。

[ softetherパッケージの作成 ]
PC上でクロスコンパイルを行いルーター上で動かすためのパッケージを作成します。そのための仕組みは全てSDKに含まれていますし、softetherのコードを完璧にSDKに一体化するための手順が出来上がっていますので、これも手順通りにコマンドを打ち込むだけで大丈夫です。

$ sudo yum install readline-devel
手順書には出てきませんがsoftetherのビルド中にreadlineが無くてエラーしましたので、予め入れておくと良いです。

$ echo "src-git softethervpn https://github.com/el1n/OpenWRT-package-softether.git" >> feeds.conf.default
$ ./scripts/feeds update
$ ./scripts/feeds install softethervpn

以上で準備完了。構成に入ります。

$ make defconfig
$ make menuconfig

まずはTarget Systemを選択しなければなりません。これがなかなか難しいのですが、小米ルーター青春版での答えを書いておきます。
menuconfig
Target Systemで”Ralink RT288x/RT3xxx”を選択、Subtargetで”MT7628 based boards”を選択します。上のキャプチャのようになります。

次にNetwork/VPN/softethervpnを選択すれば構成は完了です。

$ make prepare V=s

ネットワーク環境など不安があるので詳しい経過メッセージを表示するためにV=sを指定しました。このステップは私の環境で2時間弱の時間を要しました。

$ make package/softethervpn/compile V=s

これでパッケージの作成が完了です。わたしの場合”./bin/ramips/packages/softethervpn/softethervpn_4.19-9605_ramips.ipk”が出来上がったパッケージです。これをscp等でルーターの/tmp/にコピーします。

$ scp ./bin/ramips/packages/softethervpn/softethervpn_4.19-9605_ramips.ipk root@192.168.1.1:/tmp/

[ ルーターでの導入作業 ]
ルーターにrootログインします。

# opkg update
# opkg install zlib libpthread librt libreadline libncurses libiconv-full kmod-tun libopenssl
# opkg install /tmp/softethervpn_4.19-9605_ramips.ipk

これでvpnserver, vpnbridge, vpnclientが走り出しました。わたしはvpnbridgeだけを使用するのでLuCIのSystem/Startupからvpnserverとvpnclientを停止し、また自動起動をDisableにしました。

面白いのはバイナリーは一つだけでvpncmdまで共用されています。どうやって実現しているのか時間があれば調べてみたいです。また通常ですと日々沢山のログを吐き出すので容量の小さなサーバーではログ管理をどうしようかと思っていましたが、まったくログを吐かないようになっていました。

[ softetherの設定 ]
細かいことは書きませんが、とりあえずsoftetherの設定にて仮想ハブをすでに存在するブリッジbr-lanに接続し、LuCIからルーターのLANに設定されているIP Addressを調整することによりパケットが流れるようになりました。