自宅Router設定
自宅でフレッツ光ネクストを契約しており、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