古い PC とか使うと熱暴走が怖いし、いろいろ面倒になってきたので、OpenWRT 自体を公開しちゃう方法も調べてみた。(そのまま公開するかどうかは保留中)
WAN が一つなら問題ないけど、普段 IPv6 / DS-Lite を出口にしつつ、PPPoE への要求にだけ (DS-Lite 側じゃなくて) PPPoE 側で答えるようにするのは結構難しかった。
iptables で mark 付けたりして、うまくできるのかもしれないけど、よく分からなかった。
けっきょく mwan3 を使った。
DS-Lite と PPPoE に metric を振っておいて、policy と rule を作っていく。
ぜんぶ書きかえるのは面倒だったので、PPPoE は wanb_only という policy、DS-Lite 優先は wan_wanb という policy を流用した。
ルールは順番が大事なので、
config rule 'httpd' option dest_ip '0.0.0.0/0' option family 'ipv4' option proto 'tcp' option src_ip '192.168.1.1' option src_port '8080,8443' option sticky '0' option use_policy 'wanb_only' config rule 'default_rule_v4' option dest_ip '0.0.0.0/0' option family 'ipv4' option proto 'all' option sticky '0' option use_policy 'wan_wanb'
みたいな感じで、特例を先に書くみたい。
あとは普通に firewall で
config rule option name 'Allow-HTTP' option src 'pppoe' option family 'ipv4' option proto 'tcp' option dest_port '80 443' option target 'ACCEPT' config redirect option name 'http' option src 'pppoe' list proto 'tcp' option src_dport '80' option dest_port '8080' option dest 'lan' option target 'DNAT' option dest_ip '192.168.1.1'
みたいな感じでいいんじゃないかな。
lan から pppoe を通って出られるようになっていれば、 pppoe の zone の既定では input も forward も ACCEPT する必要がない。 いまどき input 開けてて問題なのかどうかは知らない。
LuCI を公開することはないだろうから、uhttpd は listen_http='0.0.0.0:80' になっているのを '192.168.1.1:80' とかに絞っておくほうが分かりやすそう。 私なら、そうしておいても絶対どっちがどっちか分からなくなる気がするけど。
LuCI で ddns の設定をしたりステータス確認ができたりするのは、やっぱり楽。
Let's encrypt の acme も LuCI から設定できるみたいだけど、こちらはディスクが一杯になりそうだから試していない。acme っていうパッケージを入れて設定ファイルから手作業でやって /etc/init.d/acme start して数分後に logread するのも、そんなに手間ではない。