IIJmioひかりでVPN（DS-Lite回線にラズパイでPPPoE接続を追加してPiVPNでWireguard）更新版

[IIJmioひかりでVPN（DS-Lite回線にラズパイでPPPoE接続を追加してPiVPNでWireguard）](https://qiita.com/exthnet/items/1fec4257181798884f24) ではbullseyeで環境を構築したが、流石にOSが古すぎるためか、その後aptやらなんやらで躓きまくったため、OSをbookwormに変更して（再インストールして）再設定してみた。自分用の作業メモとしても記録しておく。

https://qiita.com/exthnet/items/1fec4257181798884f24

# はじめに
そもそも何がしたかったのか、については前の記事を参照。ここでは省略。

# ネットワーク構成
背景は省略。前の記事と基本的に同じだが、eth0のIP設定をやめてこういう構成にした。

![おうちネットワーク構成2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199517/dc00fcba-85f8-5388-a901-f6a810a7c479.png)

bookwormではIP設定のデフォルトがnmcliになっていた。全然使っていないのでちょっと躓いたが、たいした問題ではなかった。eth1にIPv4を適当に振れば良いだけ。

`sudo nmcli connection show`で確認したら`Wired connection 2`がeth1に対応していたため、
```
sudo nmcli connection modify 'Wired connection 2' ipv4.method manual ipv4.addresses 192.168.1.16/24 ipv4.gateway 192.168.1.1 ipv4.dns 192.168.1.1,8.8.8.8
sudo nmcli connection reload
sudo nmcli connection up 'Wired connection 2'
```
こんな感じにIPを設定した。

eth0についてはIPを振る必要なんてそもそもなかったことに気がついたため、放置。

# PPPoE
例によって`apt`で`pppoe`と`pppoeconf`をインストールし、`sudo pppoeconf`で設定。

ppp0の接続に使うネットワークインターフェイスをeth0にすることや、接続時のIIJのネットワーク設定に気を付ければ、あとは適当で大丈夫だと思われる。
IIJ光のpppoeの設定は[こちら](https://help.iijmio.jp/answer/64701593016128427c4c8a4b/)などを見ればわかる。
前の記事ではpppoe接続時と切断時にゲートウェイを更新する設定をしていたのだが、どうやらあのroute設定は行わなくてもpon/poffでうまく切り替わってくれるようだ。（pppoeconf時の選択肢にそれらしいものがあったか？）うまく行かなかったら再度設定することにしよう。

（iptablesの設定を厳しくしすぎた状態で弄って「なんでデフォルトルート設定は正しそうなのにネットワークに出られなくなるんだ？」としばらく悩んだのはまた別の話。）

ちなみにplogというコマンドでpppoeの状況（最新のログ？）が確認できるはずなのだが、やってみたらエラーした。rsyslogがデフォルトインストールされていないのが問題だったようなので追加インストールした。

# PiVPN
[公式サイト](https://www.pivpn.io/)にあるように`curl -L https://install.pivpn.io | bash`すればインストールできる。設定は`/etc/pivpn/wireguard/setupVars.conf`を弄れば良いので、ある程度は適当で良い。

今回はフル設定（一部隠蔽）を掲載しておく。なんか適当にやったらipv6の設定も入ってしまったが、まぁ特に害はないだろうということで放っておく。
```bash:/etc/pivpn/wireguard/setupVars.conf
PLAT=Raspbian
OSCN=bookworm
USING_UFW=0
IPv4dev=ppp0
IPv6dev=ppp0
IPv4addr=pppoe接続時のIPにあわせる/32
IPv4gw=pppoe接続時のGWにあわせる
useNetworkManager=true
install_user=ラズパイのユーザ名にあわせる
install_home=ラズパイのユーザのホームディレクトリにあわせる
VPN=wireguard
pivpnPORT=51820
pivpnDNS1=9.9.9.9
pivpnDNS2=149.112.112.112
pivpnHOST=このラズパイに外から接続できるように設定したDDNSのホスト名にあわせる
INPUT_CHAIN_EDITED=0
FORWARD_CHAIN_EDITED=0
INPUT_CHAIN_EDITEDv6=0
FORWARD_CHAIN_EDITEDv6=0
pivpnPROTO=udp
pivpnMTU=1420
pivpnDEV=wg0
pivpnNET=10.53.235.0
subnetClass=24
pivpnenableipv6=1
pivpnNETv6="fd11:5ee:bad:c0de::"
subnetClassv6=64
ALLOWED_IPS="0.0.0.0/0, ::0/0"
UNATTUPG=1
INSTALLED_PACKAGES=(dnsutils grepcidr bsdmainutils wireguard-tools qrencode unattended-upgrades)
```

pivpnHOSTについては、個人的に固定ドメインを持っているので、そのサブドメイン名を設定した。value-domainを利用しているため、cronでこんな感じで回して対応。cronで回すのが良いのかpppoeの接続時スクリプトで回すのが良いのかという話であるが、まぁとりあえずということで。
```bash
#!/bin/bash
ip=`ip addr show ppp0|grep inet|awk '{print $2}'`
if [ -n "${ip}" ]; then
    wget "https://dyn.value-domain.com/cgi-bin/dyn.fcg?d=ドメイン名&p=パスワード&h=サブドメイン名&i=${ip}"
fi
```

あとは前の記事と同様に、pppoe接続開始時にスクリプトを呼び出すように設定しておき……
```bash:/etc/ppp/ip-up.d/10dsl-provider
#!/bin/sh
sudo /etc/pivpn/wireguard/update.sh
sudo wg-quick down wg0
sudo wg-quick up wg0
```

```bash:/etc/pivpn/wireguard/update.sh
#!/bin/bash
inet=`ip addr show ppp0|grep inet|awk '{print $2}'`
gw=`ip route|grep ppp0|grep kernel|awk '{print $1}'`

cat <<EOF > /etc/pivpn/wireguard/setupVars.conf
PLAT=Raspbian
OSCN=bookworm
USING_UFW=0
IPv4dev=ppp0
IPv6dev=ppp0
IPv4addr=${inet}/32
IPv4gw=${gw}
省略
EOF
```

`/etc/wireguard/wg0.conf`にiptables設定を書き足して完了。
```bash
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o ppp0 -j MASQUERADE
```

現在のiptablesの設定はこんな感じ。完璧かは知らない。　→　追記2にて修正
```bash:/etc/iptables/rules.v4
*filter
:INPUT DROP [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A FORWARD -i wg0 -j ACCEPT
-A FORWARD -o wg0 -j ACCEPT
-A INPUT -i lo -j ACCEPT
# established
-A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
# DNS return
-A INPUT -p udp --sport 53 -j ACCEPT
# inner
-A INPUT -i eth1 -j ACCEPT
# applications
-A INPUT -i ppp0 -p udp --dport 51820 -j ACCEPT
-A INPUT -i ppp0 -p tcp --dport 80 -j ACCEPT
-A INPUT -i ppp0 -p tcp --dport 443 -j ACCEPT
-A INPUT -j LOG --log-prefix "[iptables] "
-A INPUT -i ppp0 -j DROP
COMMIT
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
# masquerade to pppoe
-A POSTROUTING -o ppp0 -j MASQUERADE
COMMIT
```


# その他
- `apt update`したらgpg関係で躓いた。解決方法はネットにいくらでもある。こちらとか：[Debian 12 bookworm - Sionの日記](https://debikuro.hatenablog.com/entry/2023/06/17/051453)


# 追記 1
いつの間にか、起動時にUSB LANアダプタが認識されないという問題が発生するようになっていた。困ったので、ppp立ち上げ時に認識されていなかったらunbind/bindしてあげるようにした。ついでにDNSの更新も。多分コレで大丈夫だと思うんだけど、どうだろう……。
```bash:/etc/ppp/ip-up.d/10dsl-provider
#!/bin/sh

# if USB-LAN is not working, rebind it
st=`nmcli device show eth1 | grep STATE | awk '{print $2}'`
if [ $st -ne 100 ]; then
    echo "rc.local: $st ne 100"
    echo -n "1-1.2" > /sys/bus/usb/drivers/usb/unbind
    sleep 5
    echo -n "1-1.2" > /sys/bus/usb/drivers/usb/bind
fi

sudo /etc/pivpn/wireguard/update.sh
sudo wg-quick down wg0
sudo wg-quick up wg0

# update ddns
ip=`ip addr show ppp0|grep inet|awk '{print $2}'`
if [ -n "${ip}" ]; then
    wget -O - "https://dyn.value-domain.com/cgi-bin/dyn.fcg?d=ドメイン名&p=パスワード&h=サブドメイン&i=${ip}"
fi
```

# 追記 2
`pivpn -d`コマンドを実行したらPOSTROUTING設定が足りないと指摘された。さらにVPNから内部LANへのアクセスがうまく通らないことに気がついた。そのためrules.v4ファイルの末尾のnat部を修正。これで外から内部LANが見えるようになった気がする。
（VPNネットワークからppp0=外側回線へのMASQUERADEと、VPNネットワークからeth1=内部LANへのMASQUERADEを追加した。ついでにログも出すようにして様子見。）
```bash:/etc/iptables/rules.v4
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 10.53.235.0/24 -o ppp0 -j MASQUERADE
-A POSTROUTING -s 10.53.235.0/24 -o eth1 -j MASQUERADE
-A POSTROUTING -o ppp0 -j MASQUERADE
-A POSTROUTING -j LOG --log-prefix "[iptables-pr] "
COMMIT
```

流石にsyslogやkern.logを汚しすぎるので、rsyslogの設定でiptablesのログを別ファイルに出すようにした。
ログのrotate設定もテキトーに記述。
```bash:/etc/rsyslog.d/10-iptables.conf
:msg,contains,"[iptables" /var/log/iptables.log
& stop
```
```bash: /etc/logrotate.d/iptables
/var/log/iptables.log {
  rotate 3
  weekly
  compress
  missingok
  notifempty
  create 640 root adm
}
```

# 追記 3
追加でwifi APもたててみた。
本体のwifiでやったら何故かタブレットから繋げないという問題が発生したので、手元に転がっていた古いUSB WiFiドングルを繋いで設定。
やったことは、nmcliで適当に設定して、iptablesでパケットが通るようにしたくらい。セキュリティ設定回りの変更はnmtuiを起動してGUIで弄った方が簡単そう。

```bash
$ nmcli connection add type wifi ifname wlan1 con-name rpi_ap2 autoconnect yes ssid 任意のSSID 802-11-wireless.mode ap 802-11-wireless.band bg ipv4.method shared wifi-sec.key-mgmt wpa-psk wifi-sec.pairwise ccmp wifi-sec.proto rsn wifi-sec.psk "任意のパスワード"
$ sudo iptables -A INPUT -i wlan1 -j ACCEPT
```

（様子を見て、使えそうならちゃんとiptalbes-saveする。）