DSMのパッケージ「VPN Server」は、PPTP・OpenVPN・L2TP/IPSecに対応しており、ポート制限のあるv6プラス環境下でもOpenVPNであれば、簡単にVPNサーバーとして使用することが出来ます。
ですが、通信速度は決して速くないので、高速VPNと言われているWireGuardをNASで運用できないかやってみました。
事前準備
仮想マシンとして今回「Ubuntu Server22.04LTS」を使用しますが、「Ubuntu Server20.04LTS」と基本的に同じなので記事を参考に事前に準備をしておいてください。
また、外部からアクセスできるようにDDNSを設定、Ubuntu Serverは固定IPアドレスに設定、OpenVPN同様、WireGuardで使用するポートを、UDPでアクセスできるようルーターを設定(ポート開放)する必要があります。
v6プラス環境であれば、事前に使用できるポートを確認して、WireGuardで使用するポート番号を決めましょう!
v6プラス環境でのポート開放は、コチラの記事を参考にして下さい。
仮想マシンのUbuntu Server22.04LTSに接続
Virtual Machine Managerから、ブラウザを使用したnoVNC接続でも出来ますが、テキストファイルの編集やテキストのコピペができた方がスムーズなので、WindowsであればTera Term、MacOSXではターミナルを使ってSSH接続から作業を行った方が良いと思います。
Ubuntu Server22.04LTSのパッケージの更新
SSH接続でサーバーに接続したらログインし、パッケージの更新を行って念のため再起動しておきます。
$ sudo apt update
$ sudo apt upgrade
$ sudo reboot now
WireGuardのインストール
Ubuntu Server20.04LTSより、WireGuardがサポートされているので、コマンドひとつでインストールできます。
$ sudo apt install wireguard
$ sudo reboot now
インストールして再起動したら、/etc/wireguardのディレクトリが作成されているか確認しておいてください。
WireGuardの設定
VPN接続にあたり、サーバー側の設定とクライアント側の設定が必要ですが、今回はサーバーとクライアントの設定ファイル作成まで行います。
鍵の作成
WireGuardは、公開鍵暗号方式で端末同士を接続するので、秘密鍵と公開鍵を作成します。
秘密鍵は作成した自身が持つ鍵で、公開鍵は秘密鍵を使い作成しペアに渡す鍵となります。
また、鍵や設定ファイルの保存先など、解かり易くするため、スーパーユーザー権限で/etc/wireguardのディレクトリに移動してから作業を進めます。
$ sudo su
# cd /etc/wireguard
サーバー側の鍵を作成
# wg genkey > server.key
# wg pubkey > server.pub < server.key
鍵の名前は、特に決まりはありません。
クライアント側の鍵を作成
# wg genkey > peer1.key
# wg pubkey > peer1.pub < peer1.key
以上の作業で、/etc/wireguardのディレクトリ内に4つの鍵ファイルが作成されます。クライアント側の鍵をpeer1としたのは、ピアが複数になる事を想定してなので、「iphone.key」や「winpc1.key」など、どのデバイス用なのか解り易くしても良いかと思います。
Ubuntu Serverの設定(パケット転送)
クライアントからVPNサーバーだけではなく、自宅のLAN内のデバイスにもアクセスできるよう、Ubuntu Serverのsysctl.confを編集しパケット転送を許可する設定を行います。
sysctl.confの編集
viでも構いませんが、私はnanoが使いやすいのでnanoを使ってsysctl.confを編集します。
# nano /etc/sysctl.conf
ファイルの内容で「#net.ipv4.ip_forward=1」の行を探して、頭の#を削除します。
編集し上書き保存したら、下記コマンドで設定を反映させます。
# sysctl -p
WireGuardの設定ファイルを作成
各デバイス用に設定ファイルを作成しますが、事前にNIC・ポート番号・鍵のテキストを調べておきます。
NIC・IPアドレスの確認
下記コマンドでネットワークインターフェース情報を表示し、NIC・IPアドレスを確認します。
# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether **:**:**:**:**:** brd ff:ff:ff:ff:ff:ff
inet 192.168.50.10/24 brd 192.168.50.255 scope global ens3
valid_lft forever preferred_lft forever
inet6 ****:**:****:****:**:****:****:****/64 scope global dynamic mngtmpaddr noprefixroute valid_lft 2591989sec preferred_lft 604789sec
inet6 ****:**:****:****:**:****:****:****/64 scope link
valid_lft forever preferred_lft forever
表示された情報の青字部分がNIC名となります。
鍵のテキストを確認
catコマンドで、作成した鍵のテキストを表示します。
# sudo cat server.key
こんな感じに鍵のテキストが表示されます。下記はサンプルですよ。
mJHF4jHAHNRwVLfFBUX4yazkmbZzl0FpGQiE/qVK5ms=
上記のテキストが設定ファイルで必要になるので、作成した4つの鍵のテキストをコピーし、作業している端末でメモ帳やテキストファイルなどで保存しておきます。
端末 | 鍵 |
server.key | ●●● |
server.pub | *** |
peer1.key | ▲▲▲ |
peer1.pub | ■■■ |
サーバー側の設定ファイルを作成
今回は、下記のサンプル設定で進めますので、自分の環境に合わせて置き換えて下さい。
DDNS | a-key.myds.me |
使用するポート | 51820 |
NIC | ens3 |
サーバー側のローカルアドレス | 192.168.50.0/24 |
WireGuardサーバーのIPアドレス | 10.0.0.1/32 |
クライアント側のローカルアドレス | 192.168.1.0/24 |
WireGuardクライアントのIPアドレス | 10.0.0.2/32 |
設定ファイル名は、***.confとなりますが、***がWireGuardのNIC名になるようで、公式サイトや先人の方々を参考にwg0.confといたします。
また、設定ファイルの配置は、/etc/wireguard/wg0.confとなりますので、引き続きカレントディレクトリは/etc/wireguardで作業しております。
# nano wg0.conf
下記内容を参考に設定ファイルを作成します。
#サーバー側の設定
[Interface]
Address = 10.0.0.1/32
ListenPort = 51820
PrivateKey = ●●●
#パケットを転送するための、iptablesのルール
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o ens3 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o ens3 -j MASQUERADE
#クライアントの情報
[Peer]
#peer1
PublicKey = ■■■
AllowedIPs = 10.0.0.2/32
PrivateKey = の●●●に、server.key(秘密鍵)のテキストを貼り付けます。
PublicKey = の■■■は、peer1.pub(公開鍵)のテキストを貼り付けます。
※■■■は、server.pub(サーバー側の公開鍵)ではありません!
iptablesのルールでは、青字の部分がNIC名になるので、適切に置き換えて下さい。
編集が終わったら、保存してnanoを終了します。
クライアント側の設定ファイルを作成
クライアント側の設定は、各端末で多少異なりますが、設定ファイルさえ出来れば後は簡単です。
ここでは、設定ファイルまで作成し各端末別の接続方法は別記事にします。
クライアント側の設定ファイルは、テキストファイルで作成して問題ありません。
ファイル名は、わかりやすくpeer1.confといたします。
#クライアント側の設定
[Interface]
PrivateKey = ▲▲▲
Address = 10.0.0.2/32
#サーバー側の情報
[Peer]
PublicKey = ***
AllowedIPs = 10.0.0.0/24, 192.168.50.0/24
Endpoint = a-key.myds.me:51820
PrivateKey = の▲▲▲に、peer1.key(秘密鍵)のテキストを貼り付けます。
PublicKey = の***は、server.pub(公開鍵)のテキストを貼り付けます。
クライアント側の設定ファイルも出来上がりました。
この設定ファイルは、クライアント端末で使用するので、何かしらの方法でクライアント端末へ移す必要があります。
なので、初めからクライアント端末で設定ファイルを作成するのが楽です。
設定時は同じローカルエリアいると思うので、クライアント端末からSSH接続で作業すれば、鍵のコピーも容易ですね。
WireGuardの起動
設定が完了したので、手動でのWireGuard起動と、自動起動の設定を行います。
手動での起動コマンド
WireGuardを下記コマンドで起動します。
# wg-quick up wg0
現在の状況を確認
# wg
上手く起動できれば、設定した内容が表示されると思います。
自動起動の設定
このままでは、再起動時にwg-quickでWireGuardをスタートさせなくてはいけないので、UbuntuServer起動時に自動でWireGuardがスタートする様に設定します。
# systemctl enable wg-quick@wg0
以上で、一通りのサーバー側での作業は終了いたしました。
まとめ
NASのパッケージで行うより、コマンド操作が多くハードルは高いと思いますが、手順通りに行えば難しく無いと思います。
最後にもう一度確認ポイントをまとめておきます。
あとは、クライアント端末にWireGuardのアプリをインストールして、クライアント側設定ファイルをインポートすれば、NASのVPNサーバーで外部から接続できる様になります。
コメント