投稿者「栗田 榛名」のアーカイブ

栗田 榛名 について

このサーバの管理人

Raspberry Pi 4B をサブネットワークのルータ(兼アクセスポイント)にする

久しぶりのtwitterログ以外のまともな記事です。

注意:

ド素人が生兵法でやってるので根本的に間違ってるかもしれません。て言うか多分何か変な間違いやってます。裏付け無しのままマネするのは止めといた方がいいと思います。

前提

ISPお仕着せのルータで構築されたネットワークに全く不満はないのです。
ただ一点、その環境を家族(と言うか親)も使うことを除けば。

それだけだったらルータのプライバシーセパレータでも使えば済む話なんですが、それをやると今度は自分の使用環境が著しく制約を受ける。自宅サーバの公開なんかやってるから。
従って、Windows共有のみならずdhcpやdnsまでローカルネット内のサービスが一切合切全部塞がれてしまうプライバシーセパレータは使えない。設計通りの挙動でそれ自体は全く問題ないけど。

でも、家族にこれらを全部見られるのも色々と面倒なので(お察しください)、「自分の管理下にある端末からは全部のホストが見えるが、そうでない端末には外部ネットワークにしか触らせたくない」という我ながらわがままな要求がここに発生する。

で、単純な解決法なら間に別のルータかませて別セグメント立てて、公開DNS使わせて137-139でも塞げば良いのでしょう。ところが手持ちのその種のルータは2.4GHz帯にしか対応しておらず、お約束通りどのチャンネルも混雑してる上に、どこかのアホタレAPが近場でch2なんかおっ立ててるせいでもうワケワカラン事になっている。そう言う自分も使用機器の都合で2.4GHz帯を完全停波はできないものの、せめて最低限の減力通信にして、速度が要る方は極力5GHz帯を使わせたい。・・・のだが、諸般の事情で家族の端末がそう常時ネットワークにぶら下がるわけでもなく、デュアルバンドのルータは「たったそれだけの事」の為に新規で購入するにはまだ少々お高い。

さて、ここに1個、お試しで買った後いささか中途半端で用途を失ったRaspberry Pi 4が有る。ご存知の通りrp4には有線LANと無線LANがついていて、無線LANは5GHz帯にも対応していて、きちんと設定してやればアクセスポイントにするのも可能。

ほな、それでええやんけ

ということで、作業に入る。

環境

Hardware: Raspberry Pi 4 Model B (4GB)
OS: Raspberry Pi OS with desktop (64bit) (bullseye)

わざわざdesktop版使ってるのはローカルで作業する用以上に、「なんかよくわからん怪しげな機械に電気が通ってる」という疑念を払拭するべく、テレビにくっつけて「これは皆で使えるデスクトップPCですよ」とカモフラージュする為なので、そういう問題がなければlite版使った方が多分軽量に仕上げられると思います。
※ 「自分が理解できない物」へのアレルギーがある(高齢の)家族持つといろいろ大変なのです

なお、わかりきってることとして sudo は省略します。必要に応じて使ってください。

最初にやること

1. OSインストールしてデスクトップ環境をまともに使えるようにしておく。
当たり前かもしれませんが、上記の偽装工作の為には絶対必要。特に「まともな解像度」と「まともな音量・音質」でYouTubeとかその辺のサイトを「日本語環境で」使えるようにしておくのと、CalcやWriterあたりの通り一遍のソフトも整備しておくのは、たとえハッタリ止まりになったとしても忘れちゃいけません。

冗談はさておき。

2. ipの固定化
用途の都合上、ルータからスタティックルートを張っておく必要もあるので、少なくともipv4は固定アドレスにしとかなきゃいけません。

>/etc/dhcpcd.conf
(略)
nohook wpa_supplicant
interface wlan0
static ip_address=192.168.BBB.1/24
static ip6_address=fd00:0:0:5::1/64
static routers=192.168.BBB.1
static domain_name_servers=8.8.8.8 1.1.1.1

※ 当然ですが各ipは各自の環境に合わせて変更すること

固定アドレスにする必要があるとか言っておいて、ほんとはeth0もここに書くべきなんだろうけど、dhcpcdはeth0のstaticを無視する、とする解説をほうぼうで見かけたのと、確かにeth0にはstaticが効かずにいつまでもdhcpを手放さないのと、業を煮やしてdenyinterfacesに書いたら「何故か」ipを全喪失した(=sshで作業できなくなった)ので、仕方なくLAN内のdhcpサーバからMACアドレス参照して特定のipを振るようにしてます。

systemd-networkdでやる方法もあるみたいですが、IPv6対応がそもそもできないみたいなのと、やってるうちに何がどう絡んでるのかさっぱりわからない事態になってきたので一旦放棄。
この後作業が泥沼化した一因が、最後にまた書いてある通りIPv6対応です。近頃はIPv6対応のサービスも増えてきたようで、元々「有るものは使わなきゃ損」「畳とナントカは新しいのに限る」性分なものだから、全端末にグローバルユニキャストアドレスが振られることを最終目標にしたので。結局できてないけど。基本的に近年のWindowsをいじくり回せる程度の知識があれば難しいことは何もないはずなんですが、IPv6対応は私にゃ理解の粋を超えていたようです。

ここからがお楽しみの時間。

3. hostapd
$ apt install hostapd

>/etc/hostapd/hostapd.conf
interface=wlan0
driver=nl80211
ssid=SSID5
country_code=JP
ieee80211d=1
ieee80211h=1
hw_mode=a
channel=100
auth_algs=1
ieee80211n=1
require_ht=1
ht_capab=[MAX-AMSDU-3839][HT40-][HT40+][SHORT-GI-20][SHORT-GI-40][DSSS_CCK-40]
ieee80211ac=1
vht_capab=[MAX-AMSDU-3839][SHORT-GI-80]
#0=帯域40MHz 1=帯域80MHz
vht_oper_chwidth=1
vht_oper_centr_freq_seg0_idx=106
wpa=2
wpa_passphrase=passphrase
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP
wmm_enabled=1
wpa_pairwise=TKIP

$ systemctl enable hostapd
当たり前だけどSSIDとpassphraseは各自の状況によって変更すること。

4. dnsmasq
$ apt install dnsmasq

>/etc/dnsmasq.conf
interface=wlan0
dhcp-authoritative
local=/local/
domain=local
expand-hosts
no-resolv
no-poll
domain-needed
bogus-priv
bind-interfaces

## for DHCPv4
dhcp-range=192.168.BBB.11,192.168.BBB.20,255.255.255.0,24h
dhcp-option=option:router,192.168.BBB.1
#dhcp-option=option:dns-server,8.8.8.8,1.1.1.1
dhcp-option=option:dns-server,192.168.BBB.1
dhcp-option=option:ntp-server,210.173.160.27,210.173.160.57,210.173.160.87
server=8.8.8.8
server=1.1.1.1

## for DHCPv6
enable-ra
ra-param=eth0,0,0
dhcp-range=::,constructor:wlan0,ra-stateless,slaac,24h
dhcp-option=option6:information-refresh-time,6h
dhcp-option=option6:dns-server,2001:4860:4860::8888,2606:4700:4700::1111
server=2001:4860:4860::8888
server=2606:4700:4700::1111

$ systemctl enable dnsmasq
このAPにぶら下がるクライアントのDNSにはローカルでなくPublic DNSを強制します。その必要がなかったら自前のDNSでも上流ルータでも何でも構いません。
NTPにはmfeed.ad.jpの公開サーバ。ほんとはntp.mfeed.ad.jpのラウンドロビンが推奨かつ充分なのだけど、dnsmasqにそれ書くとエラーになります。

5. sysconfig

>/etc/sysctl.conf
net.ipv4.conf.default.rp_filter=1
net.ipv4.conf.all.rp_filter=1
net.ipv4.tcp_syncookies=1
net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1
net.ipv4.conf.all.accept_redirects = 1
net.ipv6.conf.all.accept_redirects = 1
net.ipv4.conf.all.send_redirects = 1
net.ipv4.conf.all.accept_source_route = 1
net.ipv6.conf.all.accept_source_route = 1
net.ipv6.conf.eth0.accept_ra = 2
net.ipv6.conf.wlan0.accept_ra = 0
net.ipv6.conf.all.disable_ipv6 = 0
net.ipv6.conf.default.disable_ipv6 = 0

最後の4行に言及してる記事が全然見当たらない(さんざん堂々巡りを繰り返した末にやっとたどり着いた)のは、どういうわけなんだろう?
うちの環境では、これ設定するまで頑としてIPv6ルータとしては動作しませんでした。IPv4はつながるのにIPv6では出て行かれない不思議なアクセスポイント。

あとufwも適宜必要なポートを開けてやりましょう。(意外とここでハマる、けどlog見りゃだいたい気付く)
ここまでで、変に欲張らなければ5GHz帯(のみ)対応のwifiアクセスポイントが完成しているはずです。

問題はここから。
市販のルータにぶら下がった端末は、黙っててもdhcpでIPv6のグローバルアドレスを取得できていたのです。それが上記の例ではご覧の通りユニークローカルアドレスしか振られない。そのように書いてあるから当たり前っちゃ当たり前なんですが、DHCPv6でなんかこうシュッとした感じにならないかな、と期待したわけですよ。無理だったけど。市販のルータが何もしなくてもそこまで出来てるのは、どこの仕様の問題なんだろうなァ。
多分「IPv6パススルー」がキーワードなんだろうけど、やり方がさっぱり見つからないのは現時点でRaspberry Piには無理ってことなんだろうか。

以下は失敗例なので、興味有る人だけどうぞ。

dhcrelay

$ apt install isc-dhcp-dhcrelay
$ dhcrelay -6 -u eth0 -l wlan0

ともかくwlan0がグローバルアドレスを取れなきゃ何も始まらないわけで、しかしその為には何らかの形で上位ルータからwlan0にプレフィックスを渡さなきゃならんわけで。よろしい、ならば上位ルータから取ってやる。
どうやらdhcrelayがそういう役に立つらしいんですが、wlan0にぶら下がったPCのdhcprequestがupするばかりで何も起きず、関係ないeth0からのrequestを処理できないって文句がsyslogに並ぶ始末。
たまにルータからdownしてきたlogも発生することはするんですが、だからと言ってwlan0にもクライアントにも、グローバルアドレスが振られることは一度として無かったのでした。

ついでに言うと、ローカルに立ってる別のDHCPv6サーバの配信(dhcp option)も反映されたことはなかったので、極端な言い方をすれば何の為にある物なのかまったくわからずじまい。

parprouted

$ apt install parprouted
$ parprouted eth0 wlan0

dhcrelayとセットで使うものらしいのですが、dhcrelay以上に何やってるのかわからず(arp scanだかlistenだかかけまくってるのは辛うじてわかったが)、もちろんプロセスの有無で何か有意な変化も見られず。

radvd
dnsmasqと競合するからそっちのdhcpサーバを切る必要があるのですが、わざわざ切って立ち上げてみたところでグローバルアドレスを振らないのは変わらず、結局お蔵入り。

上記3件、試しにdhcpcdのstaticにグローバルアドレス(らしきもの)を書いてみたら、アドレスはその通りつくんだけど、それだけじゃデフォルトゲートウェイは張られませんでした。当たり前か。
※ IPv6環境ではGWを手動で指定することはできないらしい(常識か?)

と言うか、今回のような環境ではユニークローカルアドレス(fd00::/8)を割り当てるのが正解なんだろうか。(実際これで外を見に行ける)

ufw
どうもallow bootpsしてやる必要があるらしいのですが、やるやらないに関わらずdnsmasqの設定値通りにIPv4/v6とも振られたし、グローバルアドレスは取らないのでした。

ところで直接関係有るかどうか、syslogに時々ufwが80/tcpだの443/tcpだの、果ては53/udpとか一見まとも(かつallowしてる)のトラフィックまで片っ端からblockしまくるログを吐くので、ついカッとなって

ufw route allow in on wlan0 out on eth0
ufw route allow in on eth0 out on wlan0

してやったものの、それでも効果なくてやっぱり時々blockしてるみたいです。まあこっちは端末側で見てる限り支障を生じてないみたいなので放っておくことにします。
と言うか疲れたよパトラッシュ。タイムセールか何かバーゲンの時に、まともな製品買うべきなんでしょうな、多分。

Raspberry Pi 4 導入記 (戦い済んで)

結論を先に言います。
「ラズパイ殺すに工具は要らぬ reboot一発あればいい」

島行ったりナニしたりしばらく放置してたんですが、満を持してsync3発の後rebootをかけたら

それっきり奴は帰ってこなかった
何時間もかけてddrescueしてたimgも屁の役にも立たず。

ダメだこりゃ。orz