pslaboが試したことの記録

はてなダイヤリーからはてなブログに引っ越してきました

この日記は現在実行中の減量記録を含む個人的なメモとして始めましたが、最近はコンピュータやガジェット、ハック、セキュリティネタのほうがメインになっております。

はてなダイヤリー時代はカテゴリ分けが適当だったのですが、これはそのうち直します。


OpenWRTで追加パッケージのインストールと設定作業を自動化してRaspberry Piでトラベルルータを作る

OpenWRTでRaspberry Piをルータ化する場合、Raspberry Pi2だとUSB WiFiドングルのドライバが標準イメージに含まれていないため、個別にインストールする必要があります。 しかしRaspberry PiNICポートはデフォルトでは192.168.1.1の固定アドレスがふられていて、DHCPサーバも動作していますので、以下のように設定変更する必要があります。

  • NICポートのIPアドレスを変更し、DHCPアドレスを無効化する
  • USB WiFiドングルを装着してドライバをインストールし、利用できる状態にする
  • USB WiFiドングルをWiFi APに設定し、LAN側に設定する
  • NICポートをWAN側に変更し、DHCPクライアントやPPPoEなどの設定に変更する

この作業自体は大した手間はかかりませんが、それでも意外にめんどくさいものです。そこで、この作業を自動化するスクリプトを書いてみました。以前の記事で作成していた手順では、追加パッケージは予めサイトからダウンロードする方法を紹介していましたが、この方法の場合は事前にダウンロードしておく必要はなく、指定したパッケージをスクリプトで自動的にインストールでき、手間なく環境構築できます。

スクリプトによって行われる操作

このスクリプトは以下の操作を自動的に実施します。

  1. 追加パッケージを動的に行うためにLAN(NICポート)をDHCPクライアントに設定する。
  2. NICポートがインターネットと疎通可能な状況になり次第、パッケージの追加インストールを行う。
  3. WAN側はDHCPクライアントに設定し、NICの接続先をWANに変更する
  4. WiFi APの設定を行い、LAN側のDHCP設定を固定IPアドレス割り当て+DHCPサーバにする

このため、OpenWRTのRaspberry Pi向けイメージをmicroSDHCに焼いて起動したのち、このスクリプトを実行すればすべての設定調整が完了します。 WiFi USBドングルのドライバは BUFFALO WLI-UC-GNM2 向けのドライバを opkg install でインストールしていますが、他のドングルを使っている場合はドライバを適切なものに変更してください。 Raspberry Pi3 以降の機種ではドライバのインストールは不要ですが、luci-i18n-base-ja を入れておくとUIが日本語になるので、これだけは入れておいて良いでしょう。

作成したスクリプト

設定調整が必要な箇所はスクリプト前半にまとめてあるので、ここを適切に書き換えるだけです。これを initconfig.sh などの名前で microSDHCに焼いておけば、OpenWRT起動後に /boot/initconifig.sh を実行してNICをLANに接続するだけで、すべての設定が完了します。

#!/bin/sh -x

# 設定内容
LAN_ADDR=192.168.4.1
LAN_MASK=255.255.255.0
WIFI_SSID=[設定するSSID名]
WIFI_PASS=[WPA-PSKのパスフレーズ]

# Rapsberry PiのLANポートをDHCPクライアントにするための設定を書き込む
uci set dhcp.lan.ra_management='1'
uci del network.lan.ipaddr
uci del network.lan.netmask
uci del network.lan.ip6assign
uci set network.lan.proto='dhcp'

uci commit
/etc/init.d/network restart

# 外部向けの疎通が確保できたらパッケージのインストールを行う
while :
do
  ping -c 1 www.google.com > /dev/null 2>&1
  if [ $? == 0 ]; then
    opkg update
    opkg install \
      kmod-mac80211 \
      kmod-rt2800-lib \
      kmod-rt2800-usb \
      kmod-rt2x00-lib \
      kmod-rt2x00-usb \
      rt2800-usb-firmware \
      libusb \
      usbutils \
      luci-i18n-base-ja
    break
  fi
done

# WiFiルータにするための設定を書き込む
uci set system.@system[0].zonename='Asia/Tokyo'

uci set dropbear.@dropbear[0].Interface=lan

uci set dhcp.lan.ra_management='1'
uci set network.lan.proto='static'
uci set network.lan.ipaddr=$LAN_ADDR
uci set network.lan.netmask=$LAN_MASK
uci set network.lan.ifname='wlan0'

uci set network.wan=interface
uci set network.wan.proto='dhcp'
uci set network.wan.ifname='eth0'

uci set wireless.radio0.disabled='1'
uci set wireless.radio0.country='JP'
uci set wireless.radio0.txpower='10'
uci set wireless.default_radio0.encryption='psk2'
uci set wireless.default_radio0.network='lan'
uci set wireless.default_radio0.ssid=$WIFI_SSID
uci set wireless.default_radio0.key=$WIFI_PASS
uci set wireless.default_radio0.wpa_disable_eapol_key_retries='1'
uci delete wireless.radio0.disabled='1'

uci commit
/etc/init.d/network restart

reboot