Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
8
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

自宅の外から自宅のラズパイにVPN(WireGuard)でアクセスしよう

はじめに

パンデミックが発生した後、2020/04にDELL XPS 13(9300)を購入しました。
ラップトップPCとして、性能に不満はないです。
画面は広い(1920x1200)し、キーボードも良いですし、言うことないです。

ただ、巨大なデータを処理をする上では、やはり力不足ですし、
自宅の デスクトップPC を使いたいと思うことが出てくるはずです。
(今は仕事で外出することが一切ないので今後を見越してのことです)
そこで、自宅外から自宅内にVPNを張ってログインできる環境を作っておくことにしました。

VPN に何をつかうか?

最初は、自宅ルータのYamaha RTX830をVPNサーバとして、でiPhoneをVPNクライアントとして
接続を試したのですが、全然接続できませんでした...

たぶん、IKEv1/v2の違い、ISPのフィルタ、携帯事業者のフィルタ、設定間違い...などが
考えられると思うのですが、もう疲れました。

そう思ってGoogle先生に聞いてみると、WireGuardでVPNごしに自宅サーバ開発できる環境を作った
WireGuardを使ったVPN構築方法をとても分かりやすく解説してくださっていました。

そこで、Yamaha RTX830の配下に置いたラズパイ(Raspberry Pi 4 Model B)に
WireGuardをインストールして、宅外に持ち出したDELL XPS 13(9300)(Ubuntu 20.04-LTS)と
VPNを構築することにします。

1. Wireguardのインストール

WireGuardはPeer to Peer接続なので、サーバ/クライアントの概念はありません。
つまり、WireGuard はラズパイにもラップトップPCにもインストールする必要があります。

1-1. ラズパイへのWireguardインストール

ラズパイへのインストール方法については、WireGuard-Raspiに説明してくれています。

$ sudo apt-get update
$ sudo apt-get upgrade 
$ sudo apt-get install raspberrypi-kernel-headers
$ echo "deb http://deb.debian.org/debian/ unstable main" | sudo tee --append /etc/apt/sources.list.d/unstable.list
$ sudo apt-get install dirmngr 
$ wget -O - https://ftp-master.debian.org/keys/archive-key-$(lsb_release -sr).asc | sudo apt-key add -
$ printf 'Package: *\nPin: release a=unstable\nPin-Priority: 150\n' | sudo tee --append /etc/apt/preferences.d/limit-unstable
$ sudo apt-get update
$ sudo apt-get install wireguard 
$ sudo reboot

1-2. Ubuntu 20.04-LTSへのWireguardインストール

aptでインストールできるので簡単です。

$ sudo apt update
$ sudo apt install wireguard

2. Wireguardのためのパケット転送設定

Wireguardのためのパケット転送設定があります。

2-1. ラズパイでのWireguard設定

パケット転送できるように設定しておきます。
これは、WireguardはUDPでP2Pのトンネルを張るのですが、
自宅外のラップトップPCからホームネットワークにアクセスするために、
ラズパイ側はNATボックスとしても動作させるからです。

$ sudo perl -pi -e 's/#{1,}?net.ipv4.ip_forward ?= ?(0|1)/net.ipv4.ip_forward = 1/g' /etc/sysctl.conf 
$ sudo reboot

きちんと設定されたかどうか確認します。

$ sysctl net.ipv4.ip_forward 
net.ipv4.ip_forward = 1

3. VPN用鍵生成

VPN用の秘密鍵と公開鍵を生成します。
ラズパイとラップトップPCの両方で鍵を生成します。

プロトコルとしてはP2Pですが、
便宜上、ラズパイ側をserverとし、ラップトップPCをclientとしておきます。

3-1. ラズパイ側の鍵生成

$ mkdir wgkeys
$ cd wgkeys/
$ umask 077
$ wg genkey > server_private.key
$ wg pubkey > server_public.key < server_private.key

3-2. ラップトップPC側の鍵生成

$ mkdir wgkeys
$ cd wgkeys/
$ umask 077
$ wg genkey > client_private.key
$ wg pubkey > client_public.key < client_private.key

4. VPN用鍵設定

4-1. ラズパイ側の鍵設定

/etc/wireguardディレクトリを作成し、そこに設定ファイル(wg0.conf)を置きます。

$ sudo mkdir /etc/wireguard/
$ sudo vim /etc/wireguard/wg0.conf
[Interface]

# 1. VPNの仮想的なネットワークで使うIPアドレスを設定します。
# 今回はわかりやすいように10.0.0.1/24で設定しました。
Address = 10.0.0.1/24

# 2. WireGuard を listen させるポート。ルータのポート開放に使うので適当に変えます。
# ポート番号は何でも良いです。
ListenPort = 1194

# 3. wgコマンドで生成した秘密鍵(サーバ側)を文字列で記入します。
PrivateKey = <server private key>

# 4. replace eth0 with the interface open to the internet (e.g might be wlan0 if wifi)
# 起動時と終了時に動くコマンドがかけます。ひとまずnatするための呪文だと思っておきましょう。
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

[Peer]

# 5. wgコマンドで生成した公開鍵(クライアント側)を文字列で記入します。
PublicKey = <client public key>

# 6. わかりやすくするためにクライアントの仮想IPを 10.0.0.2/32 に設定します。
# サーバへの接続許可IPに追加します。
AllowedIPs = 10.0.0.2/32

複数の Peer から接続できるようにするためには、
[Peer]の項目をそのクライアントの分だけ増やしてあげればOKです。

4-2. ラップトップPC側の鍵設定

ラップトップPC側もラズパイと同様に設定します。

$ sudo mkdir /etc/wireguard/
$ sudo vim /etc/wireguard/wg0.conf

ただし、ラップトップ側にはNAT設定は不要です。

[Interface]

# 1. wgコマンドで生成した秘密鍵(クライアント側)を文字列で記入する
PrivateKey = <client private key>

# 2. クライアントの仮想IP
Address = 10.0.0.2/24

[Peer]

# 3. serverの公開鍵を文字列で記入します
PublicKey = <server public key>

# 4. サーバの仮想IP(10.0.0.1/32)を、クライアントへの接続許可IPに追加します。
# あと、ホームネットワークのアドレス空間も追加します。
AllowedIPs = 10.0.0.1/32,192.168.0.0/24

# 5. サーバのグローバルIP(FQDNでも良い)と
# ListenPort(サーバ側で1194と決めたやつ)を設定します。
Endpoint = <server global ip address>:1194

5. Wireguard(ラズパイ)の自動起動

ラズパイ(サーバ)側で以下のようにして WireGuard を起こします。

$ sudo wg-quick up wg0
[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -4 address add 10.0.0.1/24 dev wg0
[#] ip link set mtu 1420 up dev wg0
[#] iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

ラズパイの起動時にWireGuardも自動的に開始するようにします。

$ sudo wg-quick down wg0
$ sudo systemctl enable wg-quick@wg0
$ sudo systemctl start wg-quick@wg0

6. ホームルータでのポート転送

Yamaha RTX830でポート転送の設定をしておきます。
外側で受信したポート番号11194をラズパイのポート番号1194に変換して転送します。

pp select 1
ip filter 200100 pass * <ラズパイのIPアドレス> udp * 1194
pp1# ip pp secure filter in ... 200100
no pp select
nat descriptor type 1000 masquerade
nat descriptor masquerade static 1000 1 <ラズパイのIPアドレス> udp 11194=1194

お使いのホームルータに合わせて設定してください。

7. VPN接続・切断

ラップトップPCからWireguardでVPN接続するときは、
以下のようにコマンドを実行します。

$ sudo wg-quick up /etc/wireguard/wg0.conf

VPN接続を切断するときは以下です。

$ sudo wg-quick down /etc/wireguard/wg0.conf

まとめ

以上で、自宅外から自宅のホームネットワークに接続できるようになりました。
これで、デスクトップPCにアクセスできるようになり、膨大なデータ処理も快適にできます。

デスクトップPCを常時起動させておくのはちょっと...という場合は、

を読んでみてください。

References

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
8
Help us understand the problem. What are the problem?