自宅でフレッツ光ネクストを契約しており、Raspberry PiにPPPoEとかFirewallとかWi-Fiアクセスポイントとかを一任してみた。案外継続して使えているので、設定を書いておく。ラズパイの型は3 model Bで結構古いので、インターフェースが100Mしかない。多分、無線区間の方がボトルネックになっていそうだけど、在宅勤務する分には今のところ困ってはいない。

ONUにラズパイ直結しているだけの構成:NGN - ONU - Pi -(Wi-Fi)- 各Device

OS

Arch Linux ARM なんとなく、触ったことがないDistroでやってみようかと Installationに従ってインストール。 とりあえずipv4のみ設定してみた。v6設定とIPoEも後でやりたい 以下、基本的にArch Wikiに全部書いてあるのでそのままやるだけ。丁寧なWikiが充実していて初心者にお勧めのDistroでした。

systemd-networkd

ONU側のインターフェース(eth1)とWi-Fi側のインターフェース(wlan0)の設定を入れる。(上の構成には書いていないがeth0は宅内有線LAN用にしている。eth1はUSBからrj45生えている) この表の通り方法はいくつかあるが、Defaultで入っているsystemd-networkdを使用した。PPPサポートしていないので、別途pppdを使う必要があるけど、デフォルトから変更しないことを優先したかった。 この辺を参考に以下のファイルをつくる。

  • /etc/systemd/network/wlan0.network
[Match]
Name=wlan0

[Network]
Address=192.168.0.1/24
  • /etc/systemd/network/eth1.network
[Match]
Name=eth1

[Network]
IPv6AcceptRA=yes

NGNからRouter Advertisementでv6アドレスが降ってくるので、yesにする(デフォルトyesかもしれない)。 (たしか)プロバイダ契約前後で、NGNのv6アドレスからプロバイダのv6アドレスに変わるのを観測したりした。

ppp

プロバイダにはPPPoEで接続するのでpppパッケージをインストール。pacman -S pppで入ったはず。 以下はソフトイーサ社のフレッツ用 PPPoE 実験用アクセスポイントの設定例

  • /etc/ppp/peers/softether
plugin pppoe.so
eth1
name open@open.ad.jp
persist
defaultroute
usepeerdns
noauth
  • /etc/ppp/chap-secrets
open@open.ad.jp *       open

Configure the ppp_generic module to load on boot. See Kernel modules#Automatic module loading with systemd for more information.

とWikiには書いてあるけど無くても問題なくロードされるように見える。 (ただ、一度rebootするまでkernel moduleがロードされていなくてstartできなかった) systemctl start ppp@peersの設定ファイル名で問題なければenable
一応systemd-networkd-wait-eth1-online.serviceをAfter,Requireしておいた。

hostapd

Raspberry PiからWi-Fi飛ばすための設定。
Configuration見て設定。他にもググれば色々出てきたのでどれかを見て設定した。

  • /etc/hostapd/hostapd.conf
interface=wlan0
ssid=任意のSSID
driver=nl80211
country_code=JP3
hw_mode=g
channel=11
max_num_sta=10
wpa=2
auth_algs=1
wpa_pairwise=CCMP
wpa_key_mgmt=WPA-PSK
wpa_passphrase=任意の文字列
logger_stdout=-1
logger_stdout_level=2
ieee80211n=1
wmm_enabled=1
ht_capab=[HT40][SHORT-GI-20][DSSS_CCK-40]

項目全部理解してないので、不要な設定が含まれていかもしれない。passphraseはクリアテキストで書かない方法もあるらしい。
systemctl enable hostapdで設定完了。

dnsmasq

Wi-Fi配下のホストにDHCPとDNS提供する用。systemd-networkdでもDHCPserverがあるので使う必要はないが、わざわざdnsmasqを使った理由は忘れた。

  • /etc/dnsmasq.conf
bind-dynamic
dhcp-range=interface:wlan1,192.168.0.2,192.168.0.20,12h
interface=wlan0,eth0

rebootしたときにunknown interfaceでdnsmasq起動失敗することがあったが(多分systemdの起動順の問題でインターフェースが上がる前にdnsmasqを上げようとした?)、bind-dynamicを入れたことでインターフェースが準備できたら動的に上がるようになったので解決(多分。)
/etc/systemd/system/dnsmasq.service.d/override.confに以下設定入れてもよいかもしれない。

[Unit]
After=systemd-networkd-wait-online.service

iptables

FirewallとNat設定。 Simple stateful firewallを参考に。

  • /etc/iptables/iptables.rules
# Generated by iptables-save v1.8.7 on Sun Apr 17 09:47:20 2022
*nat
:PREROUTING ACCEPT [9608:2405220]
:INPUT ACCEPT [2000:134803]
:OUTPUT ACCEPT [1925:131155]
:POSTROUTING ACCEPT [9:2145]
-A POSTROUTING -o ppp0 -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
-A POSTROUTING -o ppp0 -j MASQUERADE
COMMIT
# Completed on Sun Apr 17 09:47:20 2022
# Generated by iptables-save v1.8.7 on Sun Apr 17 09:47:20 2022
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [9476:1262027]
:TCP - [0:0]
:UDP - [0:0]
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -i wlan0 -j ACCEPT
-A INPUT -i eth0 -j ACCEPT
-A INPUT -m conntrack --ctstate INVALID -j DROP
-A INPUT -p udp -m conntrack --ctstate NEW -j UDP
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j TCP
-A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable
-A INPUT -p tcp -j REJECT --reject-with tcp-reset
-A INPUT -j REJECT --reject-with icmp-proto-unreachable
-A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i wlan0 -j ACCEPT
-A FORWARD -i eth0 -j ACCEPT
COMMIT
# Completed on Sun Apr 17 09:47:20 2022

TCP、UDPのChainは今のところ使われていない。固定IPでもないのでポート空けることもなさそう。

ip_forwardの設定も忘れず行う。
Enable packet forwardingの通り、以下を作ってrebootする。後でv6設定もする予定なのでv6も有効化した(ip6tablesもenableした)

  • /etc/sysctl.d/30-ipforward.conf
net.ipv4.ip_forward=1
net.ipv6.conf.default.forwarding=1
net.ipv6.conf.all.forwarding=1

当初-A POSTROUTING -o ppp0 -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtuを入れていなかったため、一部のサイトに到達できずに嵌った。(NETCONの問題ネタになった。)
LAN内にmtu設定できればいいのでは?と考えて、DHCPでmtu設定配布してみたが(dnsmasqでoption26)、Windowsは設定受け取らないらしい(?)し、WSLなどで更にNW挟むと結局問題は残る。
対処については、こことかここに書いてあるは流石Arch Wiki。自分も読んだはずなのに、後で困ったら思い出すだろうとか思って設定しなかった。もちろん思い出さなかった。

その他

sshdのListenAddressをwlan0のみに変更(iptablesでDropするので必要はないはずだが一応)

ListenAddress 192.168.0.1
ListenAddress fe80::xxxx:xxxx:xxxx:xxxx%wlan0

v6でListenAddress fe80::xxxx:xxxx:xxxx:xxxxと書いたらBindに失敗した。ググったところリンクローカルを使う時は必ずインターフェースを指定する必要があった。勉強になりました。

やり残し

systemd-resolvedが動いているがよくわからない
iptablesのstateを雰囲気で使っている
TrafficをMonitorする
v6対応する。IPoEとv4 over v6も設定する
systemd-networkdがDHCPv6でDNSサーバー設定できない気がする
pppのkernel moduleをみる
UnitファイルのWants,After,Require