OpenWRTをRasPiで作る(うまくいったけどUSB-NICが不安定で実用にならない)

特殊な設定を適用したNATルーターが必要になった。
といっても、DHCPでアナウンスするDNS情報を上流から来ている情報と違うものを流すだけなんだけど。
調べてみると、近頃の市販のルーターが細かい設定できずにヘタレすぎるので、一台作ることにする。
手元に前にタダでもらったRasPi1があるので、これで。
もらってから、まったく使ってなかったのだけど、ケース付きで新品でもらったので何かに使わないと忍びない。
裏のシールには、1.0B1.1と書いてある。


NATルーターなので、Raspianをチマチマ設定するより、OpenWRTだろということで対応イメージがあるか本家を見てみる。
なくても、ARMなのでビルドはできるっしょ。
https://wiki.openwrt.org/toh/raspberry_pi_foundation/raspberry_pi
あるな。
Raspberry Pi 1: http://downloads.openwrt.org/chaos_calmer/15.05.1/brcm2708/bcm2708/
落とす。
http://downloads.openwrt.org/chaos_calmer/15.05.1/brcm2708/bcm2708/openwrt-15.05.1-brcm2708-bcm2708-sdcard-vfat-ext4.img.gz
sha256sumsも落として内容を確認する。

SHA256(config.diff)= be2898d15e47b23811b4ac14e8c11884b7efc7955e74bd5f78259141800eb1a4
SHA256(kernel-debug.tar.bz2)= 2bdba742bd26a883452b946b6ad179302346d3c441d3359628374a0f2befd83a
SHA256(openwrt-15.05.1-brcm2708-bcm2708-ext4.img)= 035779c6275fbc7bc04588efddfa66ef96dac60ce6b15ba059adccac1b89c8ed
SHA256(openwrt-15.05.1-brcm2708-bcm2708-Image)= 5582c64b9699ca528580b3f0a2b651fb915a67014126c97bc3662b093b1965d3
SHA256(openwrt-15.05.1-brcm2708-bcm2708-sdcard-vfat-ext4.img)= 13477fde473294a410512f173f1cfe181500bcac070ed29ee285c7f0c398dd80
SHA256(openwrt-15.05.1-brcm2708-bcm2708-sdcard-vfat-ext4.img.gz)= d7433d9e301716c64ef018fe595cc0cc62acebc731fe29c229f30ebb02cca804
SHA256(OpenWrt-ImageBuilder-15.05.1-brcm2708-bcm2708.Linux-x86_64.tar.bz2)= b7a5c0722383b407300dca27b3e74a4305c9f4434502617712e8948a93c2ce77
SHA256(OpenWrt-SDK-15.05.1-brcm2708-bcm2708_gcc-4.8-linaro_uClibc-0.9.33.2_eabi.Linux-x86_64.tar.bz2)= 88d867ea5da428bb5ea1c2a4bb3d7ddba7315ac68785e6470577a3517d226a50

$ shasum -a 256 openwrt-15.05.1-brcm2708-bcm2708-sdcard-vfat-ext4.img.gz
d7433d9e301716c64ef018fe595cc0cc62acebc731fe29c229f30ebb02cca804  openwrt-15.05.1-brcm2708-bcm2708-sdcard-vfat-ext4.img.gz

一致する。問題なし。
タイムスタンプは、15-Mar-2016 17:51なので、そんなに古いというわけでもない。
プロジェクトの正式リリースでは最新バージョンになる感じ。
展開する。

$ gzip -d openwrt-15.05.1-brcm2708-bcm2708-sdcard-vfat-ext4.img.gz
$ ls -lh openwrt-15.05.1-brcm2708-bcm2708-sdcard-vfat-ext4.img
-rw-r--r--@ 1 kinneko  staff    76M 12  2 10:52 openwrt-15.05.1-brcm2708-bcm2708-sdcard-vfat-ext4.img

小さいな。
SDに焼く。512MのSDがあったのでこれを使う。
環境はMac OSXから。
ディスクユーティリティでFATに初期化。

$ diskutil list
(snip)
/dev/disk4
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *500.7 MB   disk4
   1:                 DOS_FAT_32 UNTITLED                500.6 MB   disk4s1
$ df -h
Filesystem      Size   Used  Avail Capacity   iused   ifree %iused  Mounted on
(snip)
/dev/disk4s1   477Mi  984Ki  476Mi     1%       512       0  100%   /Volumes/UNTITLED

/dev/disk4はバッファキャッシュで、実体は/dev/rdisk4なので注意。

$ diskutil unmount  /Volumes/"NO NAME"
Volume NO NAME on disk4s1 unmounted
$ sudo dd if=openwrt-15.05.1-brcm2708-bcm2708-sdcard-vfat-ext4.img of=/dev/rdisk4
155648+0 records in
155648+0 records out
79691776 bytes transferred in 114.416721 secs (696505 bytes/sec)

OSXだと、conv=fsyncとかないのね。まぁいいか。

$ diskutil eject /dev/disk4
Disk /dev/disk4 ejected

SDを取り出す。


Raspiでシリアルは、GPIOでやるのね。
そもそもOpenWRTで、シリアルにコンソール出てるのかしらん?

GND - GND
TXD - GPIO15 (RXD)
RXD - GPIO14 (TXD)

という結線になるようだ。3.3Vが標準かしらん?


いきなりヘッドレスもメンドクサイので、HDMIケーブルでモニタをつなげて起動してみる。
基板上から見て、端子上、ラベル下でSDを差し込む。はみ出るのはダサい。
HDMIケーブルをモニタにつなげる。
USBキーボードをつなげる。
給電はUSBしかないのね。
microUSBケーブルで給電。ACは、初代Kindle Fireについてたのを使う。
赤いLEDが点灯して、起動メッセージがコンソールに流れる。他のLEDも点灯や点滅をはじめた。
遅い... SDが遅いのか、SoCが非力なのか。


起動途中のメッセージでEnter入れるとシェル出るみたいな表示がある。
Enter入れるとシェルに落ちた。
uciコマンドで現在の設定のバックアップを取る。

# cd /root
# uci show > setting.def

このままではどこにも接続されていないので、何もできない。
NICはLANに設定されていて、DHCPサーバーが動作している。
コンソールのキーボードが英語デフォルトなので、パイプが入力できない。
不便なので、なんとかする...
ダメだな。何もツールがないようだ。
はやいところリモートで入れるようにしないと。


コンソールから、uciコマンドで、NICの設定がサーバー構成になっているのを、クライアントに切り替える。

root@OpenWrt:~# uci set network.lan.proto=dhcp
root@OpenWrt:~# uci commit
root@OpenWrt:~# /etc/init.d/network restart

本体NICを外につながっているケーブルを接続する。
コンソールには、インターフェイスがアップしたメッセージしか出ない。
ifconfigで取れたIPアドレスを見る。br-lanに割り当てられるようだ。
なんでeth0でないのかと思ったら、デフォルト設定では、br-lanとeth0はブリッジ設定がされている。eth0はusb-bcm2708のUSB NICにつながっているようだ。br-lanは、内蔵HUBかなんかだろうか?


先ほど調べたアドレスでtelnetする。

$ telnet 192.168.51.87
Trying 192.168.51.87...
Connected to 192.168.51.87.
Escape character is '^]'.
 === IMPORTANT ============================
  Use 'passwd' to set your login password
  this will disable telnet and enable SSH
 ------------------------------------------


BusyBox v1.23.2 (2016-01-31 10:28:42 CET) built-in shell (ash)

  _______                     ________        __
 |       |.-----.-----.-----.|  |  |  |.----.|  |_
 |   -   ||  _  |  -__|     ||  |  |  ||   _||   _|
 |_______||   __|_____|__|__||________||__|  |____|
          |__| W I R E L E S S   F R E E D O M
 -----------------------------------------------------
 CHAOS CALMER (15.05.1, r48532)
 -----------------------------------------------------
  * 1 1/2 oz Gin            Shake with a glassful
  * 1/4 oz Triple Sec       of broken ice and pour
  * 3/4 oz Lime Juice       unstrained into a goblet.
  * 1 1/2 oz Orange Juice
  * 1 tsp. Grenadine Syrup
 -----------------------------------------------------
root@OpenWrt:/#


とりあえず、有線NATルーターにしてみる。
ドライバ類が何も入ってないので、追加しないとUSB-NICが使えない。
手元にあるのは、ASIXのチップが乗ったUSB-CDC Etherのドングル。台湾のビリオントンのもの。
こいつのドライバを入れる。
パッケージリストを最新に更新する。

root@OpenWrt:/# opkg update
Downloading http://downloads.openwrt.org/chaos_calmer/15.05.1/brcm2708/bcm2708/packages/base/Packages.gz.
Updated list of available packages in /var/opkg-lists/chaos_calmer_base.
Downloading http://downloads.openwrt.org/chaos_calmer/15.05.1/brcm2708/bcm2708/packages/base/Packages.sig.
Signature check passed.
Downloading http://downloads.openwrt.org/chaos_calmer/15.05.1/brcm2708/bcm2708/packages/luci/Packages.gz.
Updated list of available packages in /var/opkg-lists/chaos_calmer_luci.
Downloading http://downloads.openwrt.org/chaos_calmer/15.05.1/brcm2708/bcm2708/packages/luci/Packages.sig.
Signature check passed.
Downloading http://downloads.openwrt.org/chaos_calmer/15.05.1/brcm2708/bcm2708/packages/packages/Packages.gz.
Updated list of available packages in /var/opkg-lists/chaos_calmer_packages.
Downloading http://downloads.openwrt.org/chaos_calmer/15.05.1/brcm2708/bcm2708/packages/packages/Packages.sig.
Signature check passed.
Downloading http://downloads.openwrt.org/chaos_calmer/15.05.1/brcm2708/bcm2708/packages/routing/Packages.gz.
Updated list of available packages in /var/opkg-lists/chaos_calmer_routing.
Downloading http://downloads.openwrt.org/chaos_calmer/15.05.1/brcm2708/bcm2708/packages/routing/Packages.sig.
Signature check passed.
Downloading http://downloads.openwrt.org/chaos_calmer/15.05.1/brcm2708/bcm2708/packages/telephony/Packages.gz.
Updated list of available packages in /var/opkg-lists/chaos_calmer_telephony.
Downloading http://downloads.openwrt.org/chaos_calmer/15.05.1/brcm2708/bcm2708/packages/telephony/Packages.sig.
Signature check passed.
Downloading http://downloads.openwrt.org/chaos_calmer/15.05.1/brcm2708/bcm2708/packages/management/Packages.gz.
Updated list of available packages in /var/opkg-lists/chaos_calmer_management.
Downloading http://downloads.openwrt.org/chaos_calmer/15.05.1/brcm2708/bcm2708/packages/management/Packages.sig.
Signature check passed.

現在インストールされているパッケージのリストはこんな感じ。

root@OpenWrt:/# opkg list_installed
base-files - 157.2-r48532
brcm2708-gpu-fw - 20150210-1
busybox - 1.23.2-1
dnsmasq - 2.73-1
dropbear - 2015.67-1
firewall - 2015-07-27
fstools - 2016-01-10-96415afecef35766332067f4205ef3b2c7561d21
ip6tables - 1.4.21-1
iptables - 1.4.21-1
jshn - 2015-11-08-10429bccd0dc5d204635e110a7a8fae7b80d16cb
jsonfilter - 2014-06-19-cdc760c58077f44fc40adbbe41e1556a67c1b9a9
kernel - 3.18.23-1-f3144d3f6bd4032509c8ac6728e75f4b
kmod-hid - 3.18.23-1
kmod-hid-generic - 3.18.23-1
kmod-input-core - 3.18.23-1
kmod-input-evdev - 3.18.23-1
kmod-ip6tables - 3.18.23-1
kmod-ipt-conntrack - 3.18.23-1
kmod-ipt-core - 3.18.23-1
kmod-ipt-nat - 3.18.23-1
kmod-ipv6 - 3.18.23-1
kmod-lib-crc-ccitt - 3.18.23-1
kmod-nf-conntrack - 3.18.23-1
kmod-nf-conntrack6 - 3.18.23-1
kmod-nf-ipt - 3.18.23-1
kmod-nf-ipt6 - 3.18.23-1
kmod-nf-nat - 3.18.23-1
kmod-nf-nathelper - 3.18.23-1
kmod-nls-base - 3.18.23-1
kmod-ppp - 3.18.23-1
kmod-pppoe - 3.18.23-1
kmod-pppox - 3.18.23-1
kmod-slhc - 3.18.23-1
kmod-sound-arm-bcm2835 - 3.18.23-1
kmod-sound-core - 3.18.23-1
kmod-usb-core - 3.18.23-1
kmod-usb-hid - 3.18.23-1
libblobmsg-json - 2015-11-08-10429bccd0dc5d204635e110a7a8fae7b80d16cb
libc - 0.9.33.2-1
libgcc - 4.8-linaro-1
libip4tc - 1.4.21-1
libip6tc - 1.4.21-1
libiwinfo - 2015-06-01-ade8b1b299cbd5748db1acf80dd3e9f567938371
libiwinfo-lua - 2015-06-01-ade8b1b299cbd5748db1acf80dd3e9f567938371
libjson-c - 0.12-1
libjson-script - 2015-11-08-10429bccd0dc5d204635e110a7a8fae7b80d16cb
liblua - 5.1.5-1
libnl-tiny - 0.1-4
libubox - 2015-11-08-10429bccd0dc5d204635e110a7a8fae7b80d16cb
libubus - 2015-05-25-f361bfa5fcb2daadf3b160583ce665024f8d108e
libubus-lua - 2015-05-25-f361bfa5fcb2daadf3b160583ce665024f8d108e
libuci - 2015-08-27.1-1
libuci-lua - 2015-08-27.1-1
libxtables - 1.4.21-1
lua - 5.1.5-1
luci - git-16.018.33482-3201903-1
luci-app-firewall - git-16.018.33482-3201903-1
luci-base - git-16.018.33482-3201903-1
luci-lib-ip - git-16.018.33482-3201903-1
luci-lib-nixio - git-16.018.33482-3201903-1
luci-mod-admin-full - git-16.018.33482-3201903-1
luci-proto-ipv6 - git-16.018.33482-3201903-1
luci-proto-ppp - git-16.018.33482-3201903-1
luci-theme-bootstrap - git-16.018.33482-3201903-1
mtd - 21
netifd - 2015-12-16-245527193e90906451be35c2b8e972b8712ea6ab
odhcp6c - 2015-07-13-024525798c5f6aba3af9b2ef7b3af2f3c14f1db8
odhcpd - 2015-11-19-01d3f9d64486ac1daa144848944e877e7f0cb762
opkg - 9c97d5ecd795709c8584e972bfdf3aee3a5b846d-9
ppp - 2.4.7-6
ppp-mod-pppoe - 2.4.7-6
procd - 2015-10-29.1-d5fddd91b966424bb63e943e789704d52382cc18
rpcd - 2015-01-10-f00890cd6eb47ad9bb5da0fb6c50aedc8406e7c5
ubox - 2015-11-22-c086167a0154745c677f8730a336ea9cf7d71031
ubus - 2015-05-25-f361bfa5fcb2daadf3b160583ce665024f8d108e
ubusd - 2015-05-25-f361bfa5fcb2daadf3b160583ce665024f8d108e
uci - 2015-08-27.1-1
uhttpd - 2015-11-08-fe01ef3f52adae9da38ef47926cd50974af5d6b7
uhttpd-mod-ubus - 2015-11-08-fe01ef3f52adae9da38ef47926cd50974af5d6b7
usign - 2015-05-08-cf8dcdb8a4e874c77f3e9a8e9b643e8c17b19131

インストール可能なパッケージのリストからASIX用のkmodを探す。

root@OpenWrt:/# opkg list | grep asix
kmod-usb-net-asix - 3.18.23-1 - Kernel module for USB-to-Ethernet Asix convertors
kmod-usb-net-asix-ax88179 - 3.18.23-1 - Kernel module for USB-to-Ethernet ASIX AX88179 based USB 3.0/2.0 to Gigabit Ethernet adapters.

インストールする。関連する依存パッケージもインストールされる。

root@OpenWrt:/# opkg install kmod-usb-net-asix kmod-usb-net-asix-ax88179
Installing kmod-usb-net-asix (3.18.23-1) to root...
Downloading http://downloads.openwrt.org/chaos_calmer/15.05.1/brcm2708/bcm2708/packages/base/kmod-usb-net-asix_3.18.23-1_brcm2708.ipk.
Installing kmod-libphy (3.18.23-1) to root...
Downloading http://downloads.openwrt.org/chaos_calmer/15.05.1/brcm2708/bcm2708/packages/base/kmod-libphy_3.18.23-1_brcm2708.ipk.
Installing kmod-usb-net (3.18.23-1) to root...
Downloading http://downloads.openwrt.org/chaos_calmer/15.05.1/brcm2708/bcm2708/packages/base/kmod-usb-net_3.18.23-1_brcm2708.ipk.
Installing kmod-mii (3.18.23-1) to root...
Downloading http://downloads.openwrt.org/chaos_calmer/15.05.1/brcm2708/bcm2708/packages/base/kmod-mii_3.18.23-1_brcm2708.ipk.
Installing kmod-usb-net-asix-ax88179 (3.18.23-1) to root...
Downloading http://downloads.openwrt.org/chaos_calmer/15.05.1/brcm2708/bcm2708/packages/base/kmod-usb-net-asix-ax88179_3.18.23-1_brcm2708.ipk.
Configuring kmod-libphy.
Configuring kmod-mii.
Configuring kmod-usb-net.
failed to find a module named usbnet
Configuring kmod-usb-net-asix-ax88179.
Configuring kmod-usb-net-asix.

ドライバモジュールを追加したので再起動する。

root@OpenWrt:/# reboot

telnetで再接続して作業を継続する。
起動メッセージには見えている。

root@OpenWrt:/# dmesg | grep six
[    9.689286] asix 1-1.3:1.0 eth1: register 'asix' at usb-bcm2708_usb-1.3, ASIX AX8817x USB 2.0 Ethernet, 00:10:60:2b:a4:05
[    9.706144] usbcore: registered new interface driver asix

NICにケーブルを差し込む。
コンソール表示に、USBまわりがなんか頻繁にリセットされている状況が出てくる。
パワー足りてないか...
とりあえず、USBキーボードを外してみる。
頻度は下がったけど、リセットはおさまらない。
電源を1Aにパワーアップすることにする。
安定した感じ。
追加したUSB-NICは、eth1として認識しているようだ。

root@OpenWrt:/# dmesg | grep eth1
[    9.699322] asix 1-1.3:1.0 eth1: register 'asix' at usb-bcm2708_usb-1.3, ASIX AX8817x USB 2.0 Ethernet, 00:10:60:2b:a4:05

いまのところ、設定がないのでOpenWRTでは認識していない。
ここからの設定はブラウザでLuciを使った設定のほうが楽そうなので、そちらに切り替える。


同じセグメントに接続されたMacのブラウザから、ターゲットのIPアドレスを指定して開く。
Luciのログイン画面が表示される。
「No password set!」と出てくるので、その下のリンク「Go to password configuration...」からパスワードを設定する。
設定すると、telnetの接続ができなくなり、sshでの接続に限定される。
sshからは、rootでの接続になってしまうようなので、パスワード認証は不許可にして、自分の端末の公開鍵を登録して、鍵認証でないとログインできないようにしておく。
Router Passwordを入力。
SSH Accessの設定を行う。
interfaceはunspecified。Password authenticationとAllow root logins with passwordのチェックは外す。SSH-Keysに公開鍵をコピペする。
Save&Applyボタンを押す。
telnetで接続できなくなったのを確認する。

$ telnet 192.168.51.87
Trying 192.168.51.87...
Connected to 192.168.51.87.
Escape character is '^]'.
Login failed.
Connection closed by foreign host.

sshで公開鍵認証で接続できるのを確認する。

$ ssh root@192.168.51.87
The authenticity of host '192.168.51.87 (192.168.51.87)' can't be established.
RSA key fingerprint is 5c:5e:97:8a:e3:1a:02:ad:ca:07:94:99:8d:51:65:7c.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.51.87' (RSA) to the list of known hosts.


BusyBox v1.23.2 (2016-01-31 10:28:42 CET) built-in shell (ash)

  _______                     ________        __
 |       |.-----.-----.-----.|  |  |  |.----.|  |_
 |   -   ||  _  |  -__|     ||  |  |  ||   _||   _|
 |_______||   __|_____|__|__||________||__|  |____|
          |__| W I R E L E S S   F R E E D O M
 -----------------------------------------------------
 CHAOS CALMER (15.05.1, r48532)
 -----------------------------------------------------
  * 1 1/2 oz Gin            Shake with a glassful
  * 1/4 oz Triple Sec       of broken ice and pour
  * 3/4 oz Lime Juice       unstrained into a goblet.
  * 1 1/2 oz Orange Juice
  * 1 tsp. Grenadine Syrup
 -----------------------------------------------------
root@OpenWrt:~#


Luciから、Network->Intafacesの設定を開く。
現在はLANセグメントに、br-lanが有効になっている。
追加したUSB-NICをWAN側に設定していく。
Add new intarface... ボタンを押す。
Name of the new interfaceはWANに。
Protocol of the new interfaceは、DHCP Clientに。
Cover the following interfaceをeth1にして、Submitボタンを押す。
Interfaces - WANに遷移するので、Firewall SettingsだけWANにチェックを入れて、Save&Applyボタンを押す。
Interfacesに戻るとWANにIPアドレスが割り当てられているのがわかる。


LAN側を変更するので、設定を仮変更する。
まずWANのFirewallの設定を変更しておく。
・Input reject->accept
・Output accept そのまま
・Forward reject->accept
・Masquerading チェック外す
・MSS clamping チェック外す
Save&Applyボタンを押す。
Luciの接続アドレスをUSB NIC側のものに変更する。
LAN側の設定をDHCPサーバーに変更する。
NICのケーブルを外しておく。
InterfacesからLANのEditボタンを押す。
General SetupのProtocolをStatic addressに変更し、Switch protocolボタンを押す。
IPv4 addressを192.168.128.1に。
IPv4 netmaskを255.255.255.0に。
IPv4 gatewayを192.168.128.1に。
IPv4 broadcastを255.255.255.255に。
DHCP Serverの設定はデフォルトのままさわらない。
Save&Applyボタンを押す。
LAN側にMacのケーブルを接続しなおして、192.168.128.1を宛先にLuciを開く。
WAN側のFirewall設定をもとにもどしておく。
これでNATルーターとしての構成はできた。
Mac側からのNAT接続も問題なく外に出られる。
しかし、ASIXドライバのMIIが応答がなくなって、しょっちゅうリセットしている。
これはよくない感じだ。
ASIXドライバは安定していると思うのだけど、このままでは使えない。
電気足りないか...
カニNICとかなら通るのかねぇ...