ラズパイをACCESSPOINTにセットアップする方法(IP Forward編)

ラズパイにACCESSPOINT機能をインストールしておくと、ラズパイを有線LAN接続しておいて、インターネットに接続したい端末をラズパイACCESSPOINTに接続することで、インターネットを使用できるようにできます。

大まかに、Bridge機器としてセットアップする方法と、ラズパイにIPパケットをIPフォワードさせる方法があると思います。
本日は、ラズパイにIPパケットをIPフォワードさせる方法での設定をします。
ラズベリーパイ財団のWebサイトにあった設定方法をベースにしています。
IP forward の前までは、Bridge編と同じ内容です。
Rasbianは、2020-02-13-raspbian-buster.zip を使用しました。

 アクセスポイントには、DNSMasqとHostAPDが必要です。一度にインストールします。

sudo apt install dnsmasq hostapd
構成ファイルはまだ準備ができていないため、ソフトウェアを一旦、オフにします。
sudo systemctl stop dnsmasq 
sudo systemctl stop hostapd

静的IPアドレスを構成します。ワイヤレスネットワークに標準の 192.168.8.xxx IPアドレスを使用していることを前提とします。

サーバーにIPアドレス 192.168.8.100 を割り当てます。無線デバイスは wlan0 とします。

sudo vi /etc/dhcpcd.conf

interface wlan0
    static ip_address=192.168.8.100/24
    nohook wpa_supplicant
#interface eth0
#    static ip_address=0.0.0.0

wlan0 は開発環境LANのアドレスから変更するのであれば、通信がつながらなくなるので、eth0が必要になってくる。

eth0 を使わないのであれば、static_ip_address=0.0.0.0 を定義。DHCPでIPアドレス提供受けたい場合はコメントにする。

dhcpcdデーモンを再起動して、新しいwlan0構成をセットアップします。

sudo service dhcpcd restart




 DHCPサーバーの構成(dnsmasq)

DHCPサービスはdnsmasqによって提供されます。

デフォルト構成ファイルには必要ない多くの情報が含まれているので、名前を変更して、簡単に開始します。

sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.org

sudo vi /etc/dnsmasq.conf

interface=wlan0      # Use the require wireless interface - usually wlan0
dhcp-range=192.168.8.101,192.168.8.140,255.255.255.0,24h
dhcp-option=option:router,192.168.8.100       →ラスパイACCESSPOINTのIPアドレス
dhcp-option=option:dns-server,192.168.8.100   →ラスパイACCESSPOINTのIPアドレス

wlan0 を、24時間のリース時間で、192.168.8.101 から 192.168.8.140 のIPアドレスを提供します。

dnsmasq.conf の他の記述内容をインターネットなどで調べて追加できますが、基本、上記内容でOKです。

他のネットワークデバイス(eth0など)にヘッダーと提供アドレス範囲を含むセクションを追加して、DHCPサービスを提供できます。
ただし、domain-needed,bogus-privなどのオプションを下手に付けると名前解決できなくなるので、注意!!

dnsmasq を更新された構成を使用するためにリロードします。

sudo systemctl start dnsmasq

dnsmasq によるDNSキャッシュからの回答をコマンドで確認する

host rp0-bsf-apf   (rp0-bsf-apfはホスト名)
rp0-bsf-apf has address 127.0.1.1




 アクセスポイントホストソフトウェア(hostapd)の構成

初期インストール時、空のファイルの /etc/hostapd/hostapd.conf (hostapd構成ファイル)を編集します。

この構成では、ネットワーク名がNameOfNetworkで、パスフレーズがAardvarkBadgerHedgehogであるチャネル7を使用前提です。

名前とパスワードは引用符で囲まない。パスフレーズの長さは8〜64文字にする必要があります。

5 GHz帯域を使用するには、動作モードをhw_mode = gからhw_mode = aに変更できます。

vi /etc/hostapd/hostapd.conf

interface=wlan0
driver=nl80211
ssid=NameOfNetwork ← Wifi接続一覧に並ぶ表示内容になります
hw_mode=g
channel=7 ← つながりにくかったら、1~15での変更を検討します。(一般には,1,6,11)
wmm_enabled=0
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=AardvarkBadgerHedgehog
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
sudo vi /etc/wpa_supplicant/wpa_supplicant.conf

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=JP      ←COUNTRYコードが設定されていることも注意点

network={
        ssid="NameOfNetwork"  ←上記で設定したssid
        psk="oshigotoxxxx"    ←ssidに対応したパスフレーズ
        key_mgmt=WPA-PSK
}
次に、この構成ファイルの場所をシステムに伝える必要があります。
sudo vi /etc/default/hostapd

DAEMON_CONF="/etc/hostapd/hostsapd.conf" # コメントはずして、左記のようにする

場所が違っていると何時まで経っても、つながりません。

/etc/hostsapd.conf になっているサイトもあるので、注意!!

hostapd を有効にして、起動します。

sudo systemctl unmask hostapd 
sudo systemctl enable hostapd 
sudo systemctl start hostapd

ステータスを確認します。

sudo systemctl status hostapd 

● hostapd.service - Advanced IEEE 802.11 AP and IEEE 802.1X/WPA/WPA2/EAP Authenticator
   Loaded: loaded (/lib/systemd/system/hostapd.service; enabled; vendor preset: enabled)
   Active: activating (start) since Tue 2020-01-28 20:41:05 JST; 12ms ago  
Cntrl PID: 1963 (hostapd) 
    Tasks: 1 (limit: 4915) 
   Memory: 128.0K 
   CGroup: /system.slice/hostapd.service  
           mq1963 /usr/sbin/hostapd -B -P /run/hostapd.pid -B /etc/hostapd/hostsapd.conf

hostapd がエラーになる場合がある。ラズパイの種類やRasbianのバージョンに拠るのか?

一応、hostapd エラーの対応

sudo vi /etc/rc.local で exit 0 の上に以下を追記

service dnsmasq stop 
sleep 8 
service dnsmasq start

dnsmasqを一旦止めて、数秒まってから再起動しています。

設定確認ポイント

/etc/hostapd/hostapd.conf 
/etc/wpa_supplicant/wpa_supplicant.conf

interfacesの対応

vi /etc/network/interfaces

auto eth0 wlan0
iface eth0 inet manual
iface wlan0 inet manual

dhcpcd.confの対応

sudo vi /etc/dhcpcd.conf

denyinterfaces wlan0 ←wlan0 を消さないとACCESSPOINTになってこない
interface eth0       ←wlan0 を開発環境から変更するのであれば、eth0 は必要になってくる
interface wlan0
    static ip_address=192.168.8.100/24

hostapd の再インストール(うまく動かなっかったら、検討[自己責任で])

(Rasbian Stretchの場合、Ver古かったので実施した:Rasbian Busterは2.8 だったので、良しとした)

hostapdの公式ページから最新のソースファイル(※エントリー作成時点でv2.9)を持ってきます。

https://w1.fi/hostapd/ の下部表示を確認して、最新のリリースを取得します。

pwd 
/home/pi 
wget https://w1.fi/releases/hostapd-2.9.tar.gz 
tar zxvf hostapd-2.9.tar.gz       ←すごくたくさん出力されます

apt-getで必要なパッケージをインストール

sudo apt-get install libnl-genl-3-dev libssl-dev
 (続行しますか? に y 入力)

.configにオプションを追加してmakeします。

cd hostapd-2.9/hostapd 
cp defconfig .config 
echo CONFIG_LIBNL32=y >> .config 
make

コンパイルが終わったら、hostapdファイルを差し替えます。

sudo mv /usr/sbin/hostapd /usr/sbin/hostapd_v2.6org 
sudo cp hostapd /usr/sbin/ 
sudo ifdown wlan0 
sudo ifup wlan0 
sudo reboot       ←ifdown,ifupが効かなかったら、リブート

hostapd実行し、指定SSIDでアクセスポイントが立ち上がっているのを確認

sudo /usr/sbin/hostapd /etc/hostapd/hostapd.conf

うまく動けば、スマホ、WindowsパソコンからでもSSIDにパスフレーズ指定して、接続を確認できる

WPA2でパスワード強度を強化する設定wpa_passphraseユーティリティを使用して、暗号化されたPSKを生成できます。 これは、SSIDとパスワードを取得し、暗号化されたPSKを生成します。 wpa_passphrase “testing”入力でパスワードを求められます。 (SSIDが”testing”で、パスワードが”testingPassword”) 出力は次のとおりです。

wpa_passphrase "testing" 

network={ 
        ssid="testing" 
        #psk="testingPassword" 
        psk=131e1e221f6e06e3911a2d11ff2fac9182665c004de85300f9cac208a6a80531
 }

「#psk=”testingPassword”」は、コメント化していますが、セキュリティを強化するためには、最終ファイルからこの行を削除する必要があります。
出力された文字列を基にして足りない項目を補完し、/etc/wpa_supplicant/wpa_supplicant.conf ファイルに追記します。
追記後のファイルは次のような感じ。

vi /etc/wpa_supplicant/wpa_supplicant.conf 

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev 
update_config=1 
country=JP 

network={ 
        ssid="testing" 
        #psk="testingPassword" 
        psk=87918c1e7c4e8fxxxxx‥‥‥‥‥‥‥‥‥‥xxxxx2b4b1fd524ab6d76 
        proto=RSN 
        key_mgmt=WPA-PSK 
        pairwise=CCMP 
        auth_alg=OPEN
 }




ルーティングとマスカレードを追加する

/etc/sysctl.confを編集して、次の行のコメントを解除します。

sudo vi /etc/sysctl.conf

net.ipv4.ip_forward=1

eth0のアウトバウンドトラフィックのマスカレードを追加します。

sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

iptablesルールを保存します。

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

/etc/rc.localを編集し、これを「exit 0」のすぐ上に追加して、ブート時にこれらのルールを再現します。

sudo vi /etc/rc.local

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

/usr/sbin/hostapd /etc/hostapd/hostapd.conf

再起動して、ワイヤレスデバイスが有効化されると、ネットワークに接続できるようになる。

reboot

hostapd構成で指定したネットワークSSIDが存在し、指定したパスワードでアクセスできる。

Raspberry PiアクセスポイントでSSHが有効になっている場合は、piアカウントからSSH接続できます。

まとめ

ラズパイにACCESSPOINT機能をインストールしました。
ラズパイをインターネットに対して、有線LAN接続しておいて、
インターネットに接続したい端末を、ラズパイACCESSPOINTに接続することで、インターネットを使用できるようにできます。

ラズパイをACCESSPOINTにする方法は2つあります。
今回はIPフォワードでした。
この方法はRasbianの公式HPに紹介されていた方法を試しながら、はまったところはググりながら動作するところまでたどり着きました。

もうひとつはBridgeさせる方法です。

また、さらにそこにMotioneyeをインストールすることで、ドライブレコーダーに仕立てることもできます。