読者です 読者をやめる 読者になる 読者になる

はっとてっくろぐ

パソコン、ガジェット、漫画、アニメ、バイクなどなど

Raspberry Pi 3 アクセスポイント化 〜hostapd〜

Linux Raspberry Pi

Linuxには無線NICを使ってアクセスポイント化するソフトウェア「hostapd」がありますが、御存知の通り、Raspberry Pi 3は無線LANが内蔵されていますので、アクセスポイント化したいと思います。

 

最終的な構成は、

クライアント→(wlan0)RP3(eth0)→BBR→インターネット

となります。

※BBRは環境によってはない場合もあると思います。

 

 

動かした人はいるでしょうか

 

いました!

FRILLIPさんという方が動かせたそうなので、参考にさせて頂きました。

 

frillip.com 

 

 

NIC確認

 

ifconfigで確認すると、wlan0、wlan1が確認できます。

wlan0が無線LAN、wlan1がおそらくBluetoothでしょう。

 

 

ドライバ

 

結論から言いますと、無線NICのドライバを探してきて入れるという作業は必要ありませんでした。

 

NICによっては、公式あるいは非公式のドライバを入れないと、アクセスポイントとして動作しないものが結構あるはずですが、Raspberry Pi 3 (OS:Raspbian jessie)では特にその必要はなさそうです。

 

 

hostapdインストール

 

apt-getでインストールしていきます。

後述しますが、apt-getでインストールする場合のhostapdのバージョンは2.3でした。数年前はapt-getでインストールするとバージョンが1.xが入るので、必ず最新版のソースからインストールするという作業が必要だったと思いますが、v2.3なのでそのまま進めます。

 

お詳しい方や、最新版が良い方は、ソースからインストールするのが良いかもしれません。

 

では、apt-getでインストールします。パッケージリスト更新してからインストールします。

$ sudo apt-get update
$ sudo apt-get install hostapd

 

これだけで終わりです!

 

バージョン確認してみます。v2.3の様です。

 

$ hostapd -v
hostapd v2.3
User space daemon for IEEE 802.11 AP management,
IEEE 802.1X/WPA/WPA2/EAP/RADIUS Authenticator
Copyright (c) 2002-2014, Jouni Malinen <j@w1.fi> and contributors

 

 

無線NIC wlan0の設定変更

 

無線LANクライアント設定変更

 

wlan0はデフォルトで無線LANのクライアントとして動作してしまっていますので、設定を変更します。

/etc/network/interfacesファイルを編集します。

 

まず現状の確認。

 

$ cat /etc/network/interfaces

〜抜粋〜
allow-hotplug wlan0 iface wlan0 inet manual
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
〜抜粋〜

 

それでは、編集します。

 

$ sudo vi /etc/network/interfaces

〜抜粋〜

allow-hotplug wlan0

iface wlan0 inet manual
#wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
〜抜粋〜

 

wpa-confの先頭に「#」を付けてコメントアウトするだけです。

 

wlan0のIPアドレス変更

 

初期設定の記事でも触れましたが、IPアドレスを固定で割り振る場合は、/etc/dhcpcd.confを編集します。

 

最終行に以下を追記します。

 

$ sudo vi /etc/dhcpcd.conf

〜抜粋〜

interface wlan0
static ip_address=10.0.0.1/24

 

wlan0のIPアドレスは、本アクセスポイントに接続するクライアントが最初にアクセスするゲートウェイになりますので、プライベートアドレスかつ、有線NICとは別のIPアドレス帯にします。

今回は、wlan0側を10.0.0.1としました。eth0側は別のIPアドレス帯にしてます。

 

サービス再起動しておきます。

 

$ sudo service dhcpcd restart

 

 

hostapd設定

 

hostapdの設定を変更します。参考にさせて頂いたブログのままでOKですが、赤字の箇所だけ変更しておけば基本的にはOKです。

 

$ sudo vi /etc/hostapd/hostapd.conf

# This is the name of the WiFi interface we configured above

interface=wlan0



# Use the nl80211 driver with the brcmfmac driver

driver=nl80211



# This is the name of the network

ssid=Pi3-AP



# Use the 2.4GHz band

hw_mode=g



# Use channel 6

channel=6



# Enable 802.11n

ieee80211n=1



# Enable WMM

wmm_enabled=1



# Enable 40MHz channels with 20ns guard interval

ht_capab=[HT40][SHORT-GI-20][DSSS_CCK-40]



# Accept all MAC addresses

macaddr_acl=0



# Use WPA authentication

auth_algs=1



# Require clients to know the network name

ignore_broadcast_ssid=0



# Use WPA2

wpa=2



# Use a pre-shared key

wpa_key_mgmt=WPA-PSK



# The network passphrase

wpa_passphrase=raspberry



# Use AES, instead of TKIP

rsn_pairwise=CCMP

 

 

変更箇所は、上から、SSID名(ssid)、無線のチャネル(channel)、パスフレーズ(wpa_passphrase)です。

 

SSID名は、お好きなものを記載下さい。

 

チャネルについては、2.4GHz帯ですので、1〜14chの内から記載下さい。

他のアクセスポイントと干渉しない様にするのがベストです。1か6か11にしておくのが一般的なようです。(調査するソフトなどもありますが本記事では割愛いたします。)

 

パスフレーズにつきましては、8文字以上63文字以下を入力して下さい。

(テスト様に短い文字列いれたらうまくいかず、文字数制限を忘れていました(笑))

 

 

念のためconfigファイルを指定しておきます(不要かも)

/etc/default/hostapdに上記ファイルを記載しておきます。

 

$ sudo vi /etc/default/hostapd

DAEMON_CONF="/etc/hostapd/hostapd.conf"

 

 

DHCPサーバ選定

 

dnsmasq (DHCPサーバ+DNSサーバ)

 

こちらは使わないことにしました。

参考サイトではこちらをインストールして、DHCPサーバとDNSサーバを動かしていますが、なんやかんや名前解決が失敗する場合がありましたので、使うのやめました。。

 

isc-dhcp-server(DHCPサーバ)

 

こちらをインストールします。

DNSサーバについては使用しません。

 

理由としては、前述の通り失敗したからなのですが、DHCPで配布するDNSサーバのIPアドレスをインターネット上のDNSサーバとすることもできるので良しとします。

 

ということで今回DNSサーバは入れません!

 

手抜きです!(爆)

 

 

isc-dhcp-server インストール

 

apt-getでインストールするだけです。

 

$ sudo apt-get install isc-dhcp-server

 

 

isc-dhcp-server 設定変更

 

設定ファイルの最終行に追記します。

 

$ sudo vi /etc/dhcp/dhcpd.conf

〜抜粋〜

subnet 10.0.0.0 netmask 255.255.255.0 {
   range 10.0.0.50 10.0.0.150;
   option domain-name-servers 8.8.8.8, 8.8.4.4;
   option domain-name "test-ap.com";
   option routers 10.0.0.1;
   option broadcast-address 10.0.0.255;
   default-lease-time 600;
   max-lease-time 7200;
}

 

上記は、wlan0のIPアドレス帯が10.0.0.1の場合ですので、環境に合わせて変更下さい。

ドメイン名は適当につけました。

配布するIPアドレスは.50〜.150にとりあえずしてます。

 

DNSサーバについては、Googleがインターネット上に公開しているパブリックDNSサーバのIPを指定しました。8.8.8.8と8.8.4.4の2つを登録しています。

 

次に使用するインタフェースを指定します。

 

$ cat /etc/default/isc-dhcp-server

〜抜粋〜

INTERFACES=""

 

デフォルトは上記の通りなので、ここでインタフェースwlan0を指定します。

 

$ sudo vi /etc/default/isc-dhcp-server

〜抜粋〜

INTERFACES="wlan0"

 

サービスを起動します。

 

$ sudo service isc-dhcp-server start

 

 

iptables 設定

 

iptablesファイアウォールの設定とNATの設定をします。

 

$ sudo iptables -A INPUT -p icmp -j ACCEPT
$ sudo iptables -A INPUT -i eth0 -j ACCEPT $ sudo iptables -P INPUT DROP
$ sudo iptables -P FORWARD DROP
$ sudo iptables -P OUTPUT ACCEPT $ 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

こんなところでしょうか。

2個目がざるな気もしますが(笑)

落ち着いたら修正します。ひとまず、赤字の箇所だけで動作しますので、黒字箇所はおこのみで修正下さい。

 

※最初しぼってしぼってとやっていたら、sshが切れてしまいました。。

 sshが繋がらなくなったら場合は、電源切ってやりなおしてください。

 

動作問題なさそうなら、現状のiptablesの設定をファイルに落とし込みます。

 

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

 

起動時にiptablesの設定を読み込ませます。rc.localでも良いでしょうが、参考サイトの通り、dhcpcd-hooksに追加します。

 

$ sudo vi /lib/dhcpcd/dhcpcd-hooks/70-ipv4-nat

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

 

 

ルーティング有効化

 

net.ipv4.ip_forwardを0から1に書き換えます。

 

$ sudo vi /etc/sysctl.conf

net.ipv4.ip_forward=1

 

 

起動!

 

設定色々変えましたので再起動します。

 

$ sudo reboot

 

hostapdもisc-dhcp-serverもサービス起動する設定に自動でなっていましたので、動くはずです。

 

動きました!

 

が、問題発生!

 

再起動した際に、動く時と動かない時がある。。

プロセス見てみると、どうもisc-dhcp-serverの方が起動に失敗する時があるようです。

 

うーむ。。

 

なんだかんだ試した結果、

 

他のサービスとバッティングしてそうな気がしたので、

isc-dhcp-serverのサービス起動をやめて、遅延させて起動することにしました。

 

 

isc-dhcp-serverの起動方法修正

 

デフォルトは以下の通り自動で起動します。

ランレベルの確認のため以下インストール

 

$ sudo apt-get install sysv-rc-conf

 

$ sudo sysv-rc-conf --list | grep isc
isc-dhcp-ser 0:off 1:off 2:on 3:on 4:on 5:on 6:off

 

自動起動をオフにします。

 

$ sudo sysv-rc-conf

 

isc-dhcp-serverまで移動して、Xを全てオフにしていきます。

 

オフになりました。

 

$ sudo sysv-rc-conf --list | grep isc
isc-dhcp-ser 0:off 1:off 2:off 3:off 4:off 5:off 6:off

 

rc.localから起動させることにします。

念のため10秒まってから起動します。(もっと短くても大丈夫そうでしたが)

 

注意点としては、exit 0 の上に記載します。

 

$ sudo vi /etc/rc.local

〜抜粋〜

sleep 10s;/etc/init.d/isc-dhcp-server start &



exit 0

 

再起動します

 

$ sudo reboot

 

成功!!

とりあえず大丈夫そうです!!

 

 

課題

 

ステルスSSIDができません。。

 

そういえば前もできないなーで終わっていた気がします。

 

/etc/hostapd/hostapd.confの

ignore_broadcast_ssid=0

ignore_broadcast_ssid=1

に変えればいいだけみたいですが。

見えちゃってます。2にしても変わらず。
結局0に戻しました。

 

とりあえず一旦終了。

 

 

最後に

 

実際は2週間前くらいに設定したので設定漏れあったらすみません。。

 

 

ではまた!