ラズベリーパイでゲスト用に無線親局をセットアップする
ちょっとワケがあり、ラズベリーパイ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
この設定により、無線親機のインターフェース wlan0
に 192.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.local
の exit
の前に以下を追加。
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.local
の exit
の前に以下を追記
( x,y はraspberry-pi ごとにユニークなアドレス。例: 10.0.0.1)
ifconfig eth0:0 10.0.x.y/16
一旦再起動
sudo reboot
再起動したら ifconfig
で eth0: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