ami_GS's diary

情報系大学院生の備忘録。ネットワークの勉強にハマっています。

Raspberry Piのアクセスポイント化 & ルータ化がうまくいかない時はこの通りにやればおk

はじめに

こんにちは。RPiのアクセスポイント化、ルータ化で詰まっていた情弱です。
今回、自分がはまっていた所を解決してくれた記事(英語)を見つけたので、それに沿って手順を書いて行きますね。

必要なステップ
  1. ワイヤレスアダプタ固定IPアドレス
  2. DHCPサーバのインストール及び構築
  3. アクセスポイントデーモン(hostapd)のインストール及び構築
  4. Wifiイーサネット間のルーティング設定


この例では、192.168.42.n のIPアドレスWifiネットワーク、192.168.1.nをイーサネット側のIPアドレスとして使います。

ワイヤレスアダプタ固定IPアドレス

"/etc/network/interfaces"を編集します。

sudo emacs /etc/network/interfaces

次に、
"allow-hotplug wlan0" 以外のwlan0、wpaに関する行をコメントアウトし、以下のように固定IPアドレスの設定をします。(/etc/network/interfacesの後半部分)

allow-hotplug wlan0
iface wlan0 inet static
address 192.168.42.1
netmask 255.255.255.0
gateway 192.168.1.1

#iface wlan0 inet manual
#wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
#iface default inet dhcp

DHCPサーバのインストール及び構築

DHCPサーバをインストールします

sudo apt-get install isc-dhcp-server

設定

sudo emacs /etc/dhcp/dhcpd.conf

"option domain-name"の部分(2行)をコメントアウトし、"authoritative"の部分をアンコメントします。

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

# If this DHCP server is the official DHCP server for the local
# network, the authoritative directive should be uncommented.
authoritative;

そして同ファイルの最後に以下のモノを加えてください

subnet 192.168.42.0 netmask 255.255.255.0 {
    range 192.168.42.10 192.168.42.50;
    option broadcast-address 192.168.42.255;
    option routers 192.168.42.1;
    default-lease-time 600;
    max-lease-time 7200;
    option domain-name "local";
    option domain-name-servers 8.8.8.8, 8.8.4.4;
    }

次に以下を設定します。

sudo emacs /etc/default/isc-dhcp-server

そして、INTERFACES=""  →  INTERFACES="wlan0"   と書き加えてください。

これを終えたら、次のコマンドでdhcpサーバを再起動します。

sudo service isc-dhcp-server restart

wifiドングルを指してからでないとdhcpサーバが起動しないので注意!

アクセスポイントデーモン(hostapd)のインストール及び構築

インストール

sudo apt-get install hostapd


以下の様にWifiネットワークの設定を書きます。

sudo emacs /etc/hostapd/hostapd.conf
interface=wlan0
driver=nl80211
#driver=rtl871xdrv  #最後に説明します
ssid=MyPi
hw_mode=g
channel=6
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=raspberry
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP

そして、上記の設定を/etc/default/hostapdから読み込むようにします。

sudo emacs /etc/default/hostapd
DAEMON_CONF="/etc/hostapd/hostapd.conf"

Wifiイーサネット間のルーティング設定

以下をアンコメントしてフォワーディング設定をします。

sudo emacs /etc/sysctl.conf
# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1
echo 1 > /proc/sys/net/ipv4/ip_forward

以下のコマンドでRPiをルータにする設定をします。

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 iptables-save > /etc/iptables.ipv4.nat #ルーティングテーブルのセーブ

なお、hostapd.confを書き換えた場合はこれをもう一度行ってください


最後に、起動時にルーティングテーブルの読み込みを行うようにします。

sudo emacs /etc/network/interfaces

以下を最後の行に加えてください

pre-up iptables-restore < /etc/iptables.ipv4.nat

これでうまくいかない場合.....

“hostapd.conf”に"driver="が2行ありましたね、そこが肝になってきます。
それぞれが使っているUSBのWifiドングルにより、どちらを使うかが決まってきます。


どちらが使えるかは、以下のコマンドでわかります

sudo apt-get install iw
iw list

"nl80211 not found"
という出力が出た場合、"driver=nl80211"は使えません。"driver=rtl871xdrv"を使いましょう。


さらに、rtl871xdrvを使う場合は、使うべきhostapdも変わってきます。
以下のように設定するだけでOKです!

wget http://www.adafruit.com/downloads/adafruit_hostapd.zip 
unzip adafruit_hostapd.zip 
sudo mv /usr/sbin/hostapd /usr/sbin/hostapd.ORIG 
sudo mv hostapd /usr/sbin
sudo chmod 755 /usr/sbin/hostapd

これでアクセスポイント(SSID:MyPi)を見つけられるはずです。

以上。

日本語の記事では"driver=nl80211"を扱った記事がたくさんあったのですが、"driver=rtl871xdrv"を扱ったものが無くて全然構築が出来ずに困っていたわけです。

これで皆もRPiをアクセスポイントに出来る!やったね!!