あっかぎのページ

Raspberry Piルーター化2

Raspberry Piをルーター化するお話。

hostapdでつまづく

家の1階に使っている無線LANルーターの調子が悪いので、Raspberry Piを使ってルーター化。

以前に上の記事で作ったRaspberry Piのルーターが安定していたので、1階もRaspberry Piでルーター化をしようとしてハマりました。今回はそのハマった作業をメモ。

hostapdで立ち上げようとすると

Configuration file: /etc/hostapd/hostapd.conf
nl80211: Could not configure driver mode

hostapdがnl80211のドライバーが無くてご立腹。

今回使ったBUFFALOのWLI-UC-GNMというUSB無線LANのドライバー周りでうまく動作しませんでした。そこで、今回やった動作するまでの一連の流れを記録します。

上は新しいWLI-UC-GNM2なので、この問題はないかもしれないです。これ以下の話は、古い版のWLI-UC-GNMについてです。

参考情報

まずはRaspberry Piのルーター化の参考情報です。

  1. Raspberry Piの無線LANアクセスポイント化
  2. Raspberry Pi をWi-Fiアクセスポイント&ルーター化する

1つ目はRaspberry Piをルーター化するための情報がわかりやすくまとまっています。ドライバーに問題がなければこれだけでうまくいきます。

2つ目はnl80211のドライバーの対処方法が書いています。

手順

次の流れで設定していきます。

  • IPアドレス設定
  • DHCPサーバー(isc-dhcp-server)の設定
  • hostapdの設定
  • ドライバーのインストール
  • ルーティング(iptablesなど)
  • 動作確認

IPアドレス設定

$ sudo vi /etc/network/interfaces
source-directory /etc/network/interfaces.d

auto lo
iface lo inet loopback

iface eth0 inet manual

allow-hotplug wlan0
iface wlan0 inet static
address 192.168.20.1
netmask 255.255.255.0
pre-up iptables-restore < /etc/iptables.ipv4.nat

eth0はLANケーブル、wlan0はUSB無線LANです。addressは好きな固定IPを割り振ってください。

DHCPサーバー(isc-dhcp-server)の設定

続いてDHCPサーバーの設定です。

$ sudo apt-get install isc-dhcp-server
$ sudo vi /etc/dhcp/dhcpd.conf

13,14行目をコメントアウト

option domain-name "example.org";
option domain-name-servers ns1.example.org, ns2.example.org;
->
#option domain-name "example.org";
#option domain-name-servers ns1.example.org, ns2.example.org;

20行目のコメント外す

#authoritative;
->
authoritative;

ファイルの末尾に次を追加します。

ping-check true;

subnet 192.168.20.0 netmask 255.255.255.0 {
        option routers 192.168.20.1;
        option broadcast-address 192.168.20.255;
        option subnet-mask 255.255.255.0;
        option domain-name "local";
        option domain-name-servers 8.8.8.8,8.8.4.4;
        default-lease-time 600;
        max-lease-time 7200;
        range 192.168.20.1 192.168.20.254;
}

次にdhcpサーバーのINTERFACES設定をwlan0にします。

$ sudo vi /et/default/isc-dhcp-server
#INTERFACES=""
->
INTERFACES="wlan0"

ここまでは参考1の手順そのままです。

hostapdの設定

hostapdをインストールしてRaspberry Piがアクセスポイントとなるようにしていきます。

$ sudo apt-get install hostapd

新しくhostapdの設定ファイルを作ります。

$ sudo vi /etc/hostapd/hostapd.conf

以下の設定ファイルを作ります。ssidとwpa_passphraseには自分で好きな名前とパスワードをつけてください。

interface=wlan0
ssid=pi
hw_mode=g
channel=3
wpa=2
wpa_passphrase=raspberry
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP
driver=nl80211

最後のdriverの行は、WLI-UC-GNMを使う時に必要です。それ以外のUSB無線LANなら自動読み込みで動作することもありますので、不要のときはdiriver行の削除か行頭に’#’でコメントアウトしてください。

次にhostpadに設定ファイルの場所を教えてあげます。

$ sudo vi /etc/default/hostapd

次のDAEMON_CONF行に設定ファイルの場所を記載します。最終行のDAEMON_OPTSと間違えやすいので注意します。

#DAEMON_CONF=""
->
DAEMON_CONF="/etc/hostapd/hostapd.conf"

ドライバーのインストール

USB無線LANがWLI-UC-GNMだとhostapdがそのままでは動きません。

$ sudo hostapd /etc/hostapd/hostapd.conf
Configuration file: /etc/hostapd/hostapd.conf
nl80211: Could not configure driver mode
...

上のようなエラーが出るので、nl80211のドライバーで動くようにします。

最初にhostapdの公式ページから最新のソースファイルを持ってきます。

ソースファイルのダウンロードをしてからapt-getで必要なパッケージを事前にインストールします。コンパイル用に.configにライブラリーのオプションを追加してmakeします。

$ wget https://w1.fi/releases/hostapd-2.5.tar.gz
$ tar zxvf hostapd-2.5.tar.gz
$ sudo apt-get libnl-genl-3-dev libssl-dev
$ cd hostapd-2.5/hostapd
$ cp defconfig .config
$ echo CONFIG_LIBNL32=y >> .config
$ make

10分くらいかかりますので、コンパイルが終わるのを待ちます。
コンパイルが終わるとapt-getでインストールしたhostapdと、今コンパイルしたものとを入れ替えます。

$ sudo mv /usr/sbin/hostapd /usr/sbin/hostapd.org
$ sudo cp hostapd /usr/sbin/

ルーティング(iptablesなど)

次にルーターとして動作できるようにルーティングの設定です。

$ sudo vi /etc/sysctl.conf

28行目のコメントを外します。

#net.ipv4.ip_forward=1
->
net.ipv4.ip_forward=1

パケットフォワーディングできるようにします。

$ sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"

次に、iptablesでルーティングの設定です。

$ sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
$ sudo iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
$ sudo iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT

このルーティング設定を保存します。

$ sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"

このルーティング設定を最初の/etc/network/interfacesで読み込んでいます。

ここまでできたら一旦再起動します。

$ sudo reboot

動作確認

設定ができているので、再起動してルーター化します。

$ sudo ifconfig wlan0 192.168.20.1 netmask 255.255.255.0 up
$ sudo /etc/init.d/isc-dhcp-server start
$ sudo hostapd /etc/hostapd/hostapd.conf

これでエラーが出ずにhostapdのログが出れば成功です。

スマホなどでWi-Fiを探してみて、自分で設定したssidが出てきちんとWiFiでネット接続できれば完了です。

hostapdがうまく動作していることが確認できれば、Ctrl + Cで一旦ストップしてデーモンで動作させます。

$ sudo service hostapd start

あとは、再起動しても自動実行できるように起動スクリプトに登録します。

$ sudo update-rc.d hostapd defaults
$ sudo update-rc.d isc-dhcp-server defaults

これで次回から再起動したときも、設定せずに自動でルーター機能が動作します。