🔖

ラズベリーパイでゲスト用に無線親局をセットアップする

2024/07/05に公開

ちょっとワケがあり、ラズベリーパイ5で無線親局をセットアップしました。

ついでに DHCPもラズパイ上で稼働させ、配布するDNSをCloudflareが提供する 1.1.1.1 for Families にすることで、マルウェアやアダルトサイトへのアクセスを遮断し最低限のセキュリティ機能も持たせました。

以下が手順です。

dhcpdをインストール

sudo apt install dhcpcd

dhcpd の設定

sudo vi /etc/dhcpcd.conf

以下を最後に追記(IPアドレスは実際に使うアドレスにします)

interface wlan0
static ip_address=192.168.2.1/24

この設定により、無線親機のインターフェース wlan0192.168.2.1 が割り当てられます。

hostapd のインストール

hostapd をインストール

sudo apt install hostapd

設定ファイルを編集

sudo vi /etc/hostapd/hostapd.conf

新規ファイルに以下を入力し保存。

interface=wlan0
driver=nl80211
hw_mode=b
channel=4
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wmm_enabled=1
country_code=JP
ieee80211ac=0
ieee80211d=1
ieee80211h=1
local_pwr_constraint=3
spectrum_mgmt_required=1
wpa=2
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP
ssid=raspiwifi
wpa_passphrase=(設定するパスワードを記述)

hostapd の設定

sudo vi /etc/default/hostapd

ファイル内の DAEMON_CONF の設定を以下のように変更。

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

起動設定

sudo systemctl unmask hostapd

再起動

sudo systemctl restart hostapd

dnsmasqのインストール

インストール

sudo apt install dnsmasq

設定ファイルの修正

sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.def
sudo vi /etc/dnsmasq.conf

/etc/dnsmasq.conf を以下のように入力し保存します。

interface=wlan0
dhcp-range=192.168.2.2,192.168.2.20,255.255.255.0,24h
dhcp-option=option:dns-server,1.1.1.3,1.0.0.3

この設定により、WiFi接続してきた子機に対して 192.168.2.2 〜 192.168.2.20 が割り当てられます。
もし足りない場合は範囲を広げてもいいでしょう。

また、上記設定ではDNSを 1.1.1.3,1.0.0.3 に設定していますが、このDNSはCloudflareが提供するDNSで、マルウェアを配布するサイトやアダルトサイトへのアクセスを遮断します。

こらこらアダルトサイトを遮断するとは何事だ、マルウェアだけ遮断しろやって方は 1.1.1.2,1.0.0.2 を、いやいや全部通せやマルウェア上等じゃいという方は 1.1.1.1,1.0.0.1 を設定すればOKです。

1.1.1.1 for Families について、詳しくはCloudflareのサイトをご覧ください。
1.1.1.1 for Families

iptables のインストール

sudo apt install iptables

IPマスカレードの設定

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

ゲスト用親機にする場合

ゲスト用として設定する場合は、ローカルアドレスへの転送を禁止する。

sudo iptables -A FORWARD -i wlan0 -d 10.0.0.0/8 -j DROP
sudo iptables -A FORWARD -i wlan0 -d 172.16.0.0/12 -j DROP
sudo iptables -A FORWARD -i wlan0 -d 192.168.0.0/16 -j DROP
sudo iptables -A FORWARD -i wlan0 -d 169.254.0.0/16 -j DROP

設定を保存

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

上記ファイルを rc.local から起動時に実行されるように追記。

sudo vi /etc/rc.local

/etc/rc.localexit の前に以下を追加。

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

パケットフォワードの設定

sudo vi /etc/sysctl.conf
# net.ipv4.ip_forward=1

上記の行の # を削除して保存。

再読み込み

sudo sysctl -p

ネットワークインターフェイスの設定

sudo vi /etc/network/interfaces

以下を追記

allow-hotplug wlan0
iface wlan0 inet static
    address 192.168.2.1
    netmask 255.255.255.0

デフォルトゲートウェイの設定

/etc/rc.local の exit の前に以下を追加。

ip route add x.x.x.x/x dev eth0

なお、 上記の x.x.x.x は有線LANが接続しているネットワークのネットワークアドレス。
例えば、有線LAN側のネットワークが 192.168.0.0/24 であれば、

ip route add 192.168.0.0/24 dev eth0

のように設定すれば、192.168.0.0/24 への通信は全て eth0 を通じて出ていくことになる。
これを設定しておかないと、デフォルトゲートウェイへの通信ができず、うまくインターネットに出ていけない...気がする。

再起動して確認

再起動

sudo reboot

電源ブチ切りへの対応

Raspberry Piは稼働している状態で電源を引っこ抜いたり停電が発生すると、高確率で次回起動しません。 そうならないように、本番稼働ではSDカードを ReadOnly にしておきます。

ReadOnlyを有効にする。
ReadOnlyにするには以下のコマンドを実行。

sudo raspi-config nonint enable_overlayfs
sudo reboot

再起動後はオーバーレイファイルシステムが有効になっており、ファイルを保存しても、それはメモリ上のファイルシステムへの変更であるため、再起動後には変更が失われている点に注意してください。 プログラムの更新など行う場合は、

ReadOnlyを無効化する。

sudo raspi-config nonint disable_overlayfs
sudo reboot

上記でもとの writable なファイルシステムに戻りますが、ブートパーティションを分けていて、ブートパーティションの更新もしたい場合は、追加で再起動後に以下を実行する必要があります。

sudo mount -o remount,rw /boot

メンテナンス目的で Cloudflare Zero Trust をインストールする手順

ここから先は私の環境でのことなので、必ずしも実施する必要はありません。
ただ、もしCloudflare Zero Trust を使っている場合は以下を実施しておくと、離れた場所にいても遠隔からログインできるのでメンテしやすいという利点があります。

ネットワークエイリアスを作っておく

/etc/rc.localexit の前に以下を追記
( x,y はraspberry-pi ごとにユニークなアドレス。例: 10.0.0.1)

ifconfig eth0:0 10.0.x.y/16

一旦再起動

sudo reboot

再起動したら ifconfigeth0:0 が存在することを確認する。

CloudFlareコンソールで、対象の RaspberryPi 用にトンネルを作る

詳細は以下を参照。
Cloudflare Zero Trust ダッシュボードでトンネルを作成

プライベートネットワークは 10.0.x.y/32 として作る。
( x,y はraspberry-pi ごとにユニークなアドレス)

cloudflared をインストール

RaspberryPiはアーキテクチャが armhf 。 armやarm64ではインストールに失敗するので注意。

curl -L --output cloudflared.deb https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-armhf.deb &&  sudo dpkg -i cloudflared.deb

サービスインストールする。
なお、このコマンドはデバイスごとにユニークなパスフレーズを含むので、 「CloudFlareコンソールで、対象の RaspberryPi 用にトンネルを作る」で表示されるインストールコマンドをコピーしてそのまま実行する。
(xxxxxx はデバイスごとに異なる。)

sudo cloudflared service install xxxxxxxxxxxxxxxxxxxxxxxxxxxxx

疎通確認

ping は通らないので、 sshなどで接続する。

ssh 10.0.x.y

( x,y はraspberry-pi ごとにユニークなアドレス)

OS自動アップデートの設定

手で定期的にアップデートする事もできますが、メンテナンスも大変なので自動アップデートを推奨します。

/etc/cron.d/os-update のようなファイルを新規で作成し、以下を入力して保存します。

  • 以下は毎週日曜日の午前2時〜3時台にかけて、アップデート処理をする設定です。
  • 一旦、書き込み可能なモードで再起動して、アップデート完了後にリードオンリーに戻しています。
0 2 * * 0 /usr/bin/raspi-config nonint disable_overlayfs && /usr/sbin/reboot
15 2 * * 0 /usr/bin/apt update > /var/log/apt-update.log 2>&1
30 2 * * 0 /usr/bin/apt upgrade -y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" > /var/log/apt-upgrade.log 2>&1
0 3 * * 0 /usr/bin/apt autoremove -y > /var/log/apt-autoremove.log 2>&1
10 3 * * 0 /usr/bin/raspi-config nonint enable_overlayfs && /usr/sbin/reboot

全ての作業を終えたら、RaspberryPi をリードオンリーにして再起動しておきましょう。

sudo raspi-config nonint enable_overlayfs
sudo reboot

以上で完了です。お疲れ様でした。

Discussion