Raspberry Pi4でVPNを構築して外部から自宅NWにアクセスする2025

# 環境

以下の環境で設定しました。3時間くらい詰まったので、備忘録として残します。
PiVPN以外の事項（Raspberry Pi OSの設定）はこの記事では説明しません。

- Raspberry Pi 4
- Raspberry Pi OS 
- PiVPN + WireGuard
- OCN固定回線（グローバルIPあり、変動）
- ASUSルータの標準機能で以下を利用
    - IPアドレスをクライアントで固定（例えばRaspberry Piに192.168.0.81を固定で割り当てました）
    - DDNS（ルータの機能で、hoge.asuscomm.comのようなDDNSが取得可能）
    - ポートフォワーディング

# PiVPN設定方法

基本的に以下のサイトの通りやれば大丈夫ですが、PiVPNの設定が最新状況で違ったところもありました。
そのため、PiVPNの設定のみ、イチから記載します。

https://raspida.com/pivpn/

## 基本設定

基本設定は上記サイトと全く同じです。が、自分用メモとして記載しておきます。

1. PiVPNのインストール
`curl -L https://install.pivpn.io | bash`
2. DHCP Reservation
DHCPか静的IPかが聞かれています。
基本的にはRaspberry Piから静的IPを指定するので「No」を選ぶのですが、
私の環境ではASUSルータ側からRaspberry PiのIPアドレスを固定しており、DHCPを引き続き利用するため「Yes」を選択しました。
3. Choose a user
OS上にいるユーザしか選べません。インストール時に`hoge`というユーザを作成していたら、`pi`は出てこず、`hoge`しか出てこないと思います。
特に誰でインストールしても良いと思うので、`hoge`のままで進めます。
4. Installation mode
VPNと言っても色々あり、WireGuardとOpenVPNが選べます。
WireGuardがLinuxではナウでイケてるVPNなので、こちらを選択します。
「Proceed to upgrade?」は私の環境では聞かれませんでした。。
5. Default wireguard port
WireGuard、VPNソフトで使うポート番号です。デフォルトの51820のままにしました。
6. DNS Provider
DNSプロバイダです。クライアントで使うDNSを`1.1.1.1`にするか`8.8.8.8`にするか、という話です。
つまり、ぶっちゃけなんでも良いと思います。
私は↑↓でCloudFlareにして、Spaceを押して、Enterで確定しました。
7. Public IP or DNS
私の環境ではDDNSなので、「DNS Entry」で、自分のDDNSを入力しました。
7. あとは全部YESで抜ければOKです。rebootするので少し待ちます。

## /etc/sysctl.confの設定

上記サイトには「追記」で末尾に書いていますが、私は**この設定が必要**でした。

1. `sudo vi /etc/sysctl.conf`で開きます。
1. `net.ipv4.ip_forward=1`の行がデフォルトでコメントアウトされているので、コメントを外して有効化します。
1. viを閉じて`sudo sysctl -p`で有効化します。

## サーバ側の設定

ここで、上記サイトと手順が異なってきます。上記サイトでは、クライアントを追加していますが、先にサーバ側で設定します。

`sudo vi /etc/wireguard/wg0.conf`で、サーバ側の設定をします。
ファイルの内容を以下のように書きます。**一例なので、以下のポイントを参照して書き換えてください**
```
[Interface]
PrivateKey = FOO
Address = 10.133.100.1/24,fd11:5ee:bad:c0de::a85:6401/64
#replace eth0 with the interface open to the internet (e.g might be wlan0 if wifi)
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE; iptables -t nat -ATROUTING -s 10.133.100.0/24 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o wlan0 -j MASQUERADE; iptables -t nat -D POSTROUTING -s 10.133.100.0/24 -j MASQUERADE
MTU = 1420
ListenPort = 51820
```
書き換えのポイントは以下です。
- `Address = 10.133.100.1/24`の部分はそのままにします。
    - これが、WireGuardで割り当てるネットワーク…みたいなイメージです。
    - `ip -a`で、RasPiのネットワークインターフェースが見えるのですが、ここでも10.133.100.1/24を使っているのが見えます。
    - 他と被らなければ何でも良いのですが、触らぬ神に祟りなしでそのままにします。
- `#replace`、`PostUp`、`PostDown`の3行は追加してください。その際、`10.133.100.0/24`は、**Addressの部分と対応**させてください。
    - このおまじないをいれることで、WireGuardで割り当てるネットワークを自宅LANと共有する…みたいなことができます。
    - なので、正しくアドレスを指定しないと、正しく自宅LANに繋がりません。

## クライアントの追加

上記サイトでは「クライアントの設定変更も必要」とも見えますが、**私の環境では不要**でした。
そもそも、WireGuardで「10.133.100.0/24は自宅VPNと疎通OK」と設定しているので、クライアントのIPアドレスはデフォルトで割り振られる`10.133.100.x`で大丈夫、ということです
アプリ上の「Allowed IPs」は、「どの通信がこのVPNを抜けるか」という設定のようです※。ここを0.0.0.0/0、つまり全通信にしておけば、自宅LANにいるのと同じになります。
参考まで、設定後に自宅のサーバにつなぐと、Last Loginが見慣れぬIPになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3789636/4ce762db-7522-2e93-8282-d8c028ff9422.png)

※この部分は個人的に怪しいです。間違っていたらご指摘ください。

1. `pivpn add`でクライアントを追加
1. `pivpn -qr`でiPhoneで読み取って追加…など。

## 参考：トラブルシュート方法

### `pivpn -c`でクライアントがつながっているか確認

私は、iPhoneのアプリで「有効」と出ても通信できないケースがありました。
よくよく見ていると、IPアドレスが自宅と違っており、自宅のRasPiに正しくつながっていませんでした。
`pivpn -c`で接続状態、通信量などを見ることで、正常につながっているかが推測できます。

### ChatGPTに聞きましょう

私は「イチから設定する方法」を聞いて、sysctlの手順が抜けていることに気づきました。
壁打ち、質問しまくるのも良さそうです。

## 追記

グローバルIPがない場合や、ルータから穴あけできない場合は、Cloudflare Tunnelを使うと良さそうです。
（筆者の技術力では半分くらいしか理解しておらず、よく分からないゆえにセキュリティホールとなりえそうですが・・）

https://qiita.com/sey323/items/c9d43f2c930b8602c46c