====== WireGuard VPN の利用 ====== [[https://www.wireguard.com/|{{:mae3xx_ope:use_wireguard_vpn:wireguard_logo.png?800|WireGuard - extremely simple yet fast and modern VPN}}]] v4.1.0 および v2.9.4rc7 から、[[https://www.wireguard.com/|WireGuard]] VPN を追加しました。\\ WireGuard については [[https://speakerdeck.com/fadis/zuo-tuteli-jie-suruwireguard|作って理解するWireGuard - Speaker Deck]] が詳しいです。 [[https://speakerdeck.com/fadis/zuo-tuteli-jie-suruwireguard|{{{{:mae3xx_ope:use_wireguard_vpn:wireguard_00.png|作って理解するWireGuard - Speaker Deck より}}]] \\ WireGuard を使用することで、 * 固定アドレスが割り当てられないモバイル回線であっても、DynamicDNS 無しでリモートからアクセス可能。 * インターネット側に対しては全ポートを閉じておいても、リモートからアクセス可能。 * [[https://ja.wikipedia.org/wiki/%E3%82%AD%E3%83%A3%E3%83%AA%E3%82%A2%E3%82%B0%E3%83%AC%E3%83%BC%E3%83%89NAT|キャリアグレードNAT]] されたアドレスしか取得できないモバイル回線であっても、リモートからアクセス可能。 となります。 また、他の VPN (IPSec, OpenVPN 等) と比較して**設定が非常に簡単**なので、設定で悩まされることなく VPN 環境を構築可能です。 ※ v4.4.0β12 から、[[.wireguard_webui:start]]((現状 1ピアのみ、クライアント側としての利用を想定))を用意しました。 \\ ===== 設定例 ===== ==== 構成 ==== MA-E350/xx の LTE 回線経由でインターネット上のサーバーに WireGuard VPN で接続する例です。 {{:mae3xx_ope:use_wireguard_vpn:wireguard_01.png?400|}} \\ WireGuard に割り当てるアドレスは下記のとおりとします。 |< 20em 10em 10em >| ^ 機器 ^ アドレス ^ | サーバー | 10.100.0.1 | | MA-E3xx | 10.100.0.10 | \\ ==== 設定 ==== === 鍵ペア生成 === == サーバー側 == [[https://www.wireguard.com/quickstart/|WireGuard QuickStart]] を参考に、鍵ペアを作成します。 root@server:/etc/wireguard# umask 077 root@server:/etc/wireguard# wg genkey | tee privatekey | wg pubkey > publickey root@server:/etc/wireguard# ls -l total 8 -rw------- 1 root root 45 May 30 13:56 privatekey <--- 秘密鍵 -rw------- 1 root root 45 May 30 13:56 publickey <--- 公開鍵 それぞれこのようなファイルが生成されます。 eJIfe+fVRyhAHf1IKN0IyKLTauAgpwo0LbqqgFXP/0Y= DPxHokFmmbPcTjTmRFVVMw2emP3m+jvP2fYcN/wzzhk= \\ == クライアント側 == 同様に、MA-E350 側でも鍵ペアを生成します。 root@plum:/etc/wireguard# umask 077 root@plum:/etc/wireguard# wg genkey | tee privatekey | wg pubkey > publickey root@plum:/etc/wireguard# ls -l total 8 -rw------- 1 root root 45 May 30 14:03 privatekey -rw------- 1 root root 45 May 30 14:03 publickey クライアント側も同じような秘密鍵・公開鍵が生成されます。 gDDRpKqXCGQuIGv76rH5hT/5Mk0vxtZSqKou0sMpO3U= Ysc6tYtcfuHwkpkzlwXkQxNBnq7+DJOcOh+xYRIwymo= \\ === 設定ファイル作成 === "wg0" の設定ファイルを作成します。 == サーバー側 == [Interface] # サーバー側秘密鍵 PrivateKey = eJIfe+fVRyhAHf1IKN0IyKLTauAgpwo0LbqqgFXP/0Y= Address = 10.100.0.1 ListenPort = 51820 [Peer] # クライアント側公開鍵 PublicKey = Ysc6tYtcfuHwkpkzlwXkQxNBnq7+DJOcOh+xYRIwymo= AllowedIPs = 10.100.0.10/32 == クライアント側 == [Interface] # クライアント側秘密鍵 PrivateKey = gDDRpKqXCGQuIGv76rH5hT/5Mk0vxtZSqKou0sMpO3U= Address = 10.100.0.10 [Peer] # サーバー側公開鍵 PublicKey = DPxHokFmmbPcTjTmRFVVMw2emP3m+jvP2fYcN/wzzhk= EndPoint = www.example.jp:51820 AllowedIPs = 10.100.0.0/24 PersistentKeepAlive = 30 必要な設定ファイルはこれだけです。\\ IPSec や OpenVPN に比較して圧倒的に簡単ですね。 \\ "Interface" には自身の設定、"Peer" には対向側の設定をします。 |<55em 7em 10em 23em 15em>| ^ セクション ^ 項目名 ^ 設定内容 ^ 備考 | |Interface|PrivateKey|自身の秘密鍵| | |:::|ListenPort|待受ポート番号|サーバー側で必須((51820がデフォルト))| |:::|Address|WireGuard アドレス| | |Peer|PublicKey|対向側公開鍵| | |:::|EndPoint|対向側IPアドレス:ポート番号|クライアント側で必須| |:::|AllowedIPs|WireGuard経由で通信するネットワーク| | |:::|PersistentKeepAlive|NAT を保持するための KeepAlive 送信間隔 [秒]|NAT配下のクライアント側で必須| \\ ==== 接続 ==== サーバ側、クライアント側ともに "wg-quick" コマンドで立ち上げることができます。 * サーバー側 root@server:/etc/wireguard# wg-quick up wg0 [#] ip link add wg0 type wireguard [#] wg setconf wg0 /dev/fd/63 [#] ip address add 10.100.0.1 dev wg0 [#] ip link set mtu 1420 up dev wg0 [#] ip route add 10.100.0.10/32 dev wg0 * クライアント側 root@plum:/etc/wireguard# wg-quick up wg0 [#] ip link add wg0 type wireguard [#] wg setconf wg0 /dev/fd/63 [#] ip address add 10.100.0.10 dev wg0 [#] ip link set mtu 1420 up dev wg0 [#] ip route add 10.100.0.0/24 dev wg0 \\ ==== 確認 ==== WireGuard 経由でアクセスできるか試してみます。 === クライアントからサーバー === root@plum:/etc/wireguard# ping 10.100.0.1 PING 10.100.0.1 (10.100.0.1) 56(84) bytes of data. 64 bytes from 10.100.0.1: icmp_seq=1 ttl=64 time=315 ms 64 bytes from 10.100.0.1: icmp_seq=2 ttl=64 time=61.6 ms 64 bytes from 10.100.0.1: icmp_seq=3 ttl=64 time=61.0 ms ^C --- 10.100.0.1 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2003ms rtt min/avg/max/mdev = 61.026/145.997/315.278/119.700 ms === サーバーからクライアント === root@server:/etc/wireguard# ping 10.100.0.10 PING 10.100.0.10 (10.100.0.10) 56(84) bytes of data. 64 bytes from 10.100.0.10: icmp_seq=1 ttl=64 time=552 ms 64 bytes from 10.100.0.10: icmp_seq=2 ttl=64 time=45.8 ms 64 bytes from 10.100.0.10: icmp_seq=3 ttl=64 time=45.0 ms 64 bytes from 10.100.0.10: icmp_seq=4 ttl=64 time=63.8 ms 64 bytes from 10.100.0.10: icmp_seq=5 ttl=64 time=62.6 ms ^C --- 10.100.0.10 ping statistics --- 5 packets transmitted, 5 received, 0% packet loss, time 4003ms rtt min/avg/max/mdev = 45.055/154.100/552.982/199.601 ms \\ SSH でリモートログインしてみます。 root@server:/etc/wireguard# ssh -l user1 10.100.0.10 user1@10.100.0.10's password: user1@plum:~$ 双方向ともアクセス可能になりました。\\ 今回の例では、クライアント側はキャリアグレードNATされる回線であり、下記のIPアドレスが割り当てられた状態です。 root@plum:/etc/wireguard# ifconfig ppp0 ppp0 Link encap:Point-to-Point Protocol inet addr:100.71.46.31 P-t-P:10.64.64.64 Mask:255.255.255.255 UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1 RX packets:29 errors:0 dropped:0 overruns:0 frame:0 TX packets:31 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:3 RX bytes:3796 (3.7 KB) TX bytes:3620 (3.6 KB) このような状況でもリモートアクセスが可能で、なおかつ NAT 配下にいるのでポートスキャンや SSH ブルートフォースアタックなどをされる心配がないため、\\ 固定 IP アドレスをもらえる回線よりもむしろ安全で良いのかな、という気もします。 \\ ===== TIPS ===== ==== MA-E3xx で PPP 経由で自動接続させる ==== === v4.x 系(Ubuntu 18.04LTS) の場合 === systemd の service (wg-quick@.service) を有効化することで対応可能です。 root@plum:~# systemctl enable wg-quick@wg0 Created symlink /etc/systemd/system/multi-user.target.wants/wg-quick@wg0.service → /lib/systemd/system/wg-quick@.service. root@plum:~# \\ === v2.x 系(Ubuntu 14.04LTS) の場合 === /etc/ppp/ip-up.d/ に wg-quick を呼び出すスクリプトを作成しておくことで、PPP 接続と同時に WireGuard 接続することができます。 #! /bin/sh # # ip-up script for WireGuard if [ "$PPP_IFACE" = "ppp0" ]; then logger -t ip-up "$PPP_IFACE up -> up WireGuard." (sleep 5 && wg-quick up wg0 && ping -c 10 10.100.0.1) & fi \\ ==== 複数拠点を収容する ==== サーバー側の "Peer" セクションを追加することで対応可能です。 [Interface] # サーバー側秘密鍵 PrivateKey = eJIfe+fVRyhAHf1IKN0IyKLTauAgpwo0LbqqgFXP/0Y= Address = 10.100.0.1 ListenPort = 51820 [Peer] # クライアント側公開鍵 0 PublicKey = Ysc6tYtcfuHwkpkzlwXkQxNBnq7+DJOcOh+xYRIwymo= AllowedIPs = 10.100.0.10/32 [Peer] # クライアント側公開鍵 1 PublicKey = OyMpcsHfBKpkSnxl9J3rZWpU2zkgfusZnf/pkdJ6ix4= AllowedIPs = 10.100.0.11/32 [Peer] # クライアント側公開鍵 2 PublicKey = vKjYvuQ4qqgFZi9H0CrJ2UW4opg9YWS5eMCGz/B8Kwg= AllowedIPs = 10.100.0.12/32 \\ ==== 拠点間接続をする ==== "Peer" の "AllowedIPs" にネットワークをカンマ区切りで設定することで可能となります。 == 172.16.0.0/16 へのルーティングを有効化する場合 == [Interface] PrivateKey = eJIfe+fVRyhAHf1IKN0IyKLTauAgpwo0LbqqgFXP/0Y= Address = 10.100.0.1 ListenPort = 51820 [Peer] PublicKey = LU9wj74KIc5ND+F76Amw9GyrLrwgLmBT9JOxTEaPqAY= AllowedIPs = 10.100.0.10/32, 172.16.0.0/16 \\ ==== LAN 内の機器に WireGuard 経由でアクセスしたい ==== LAN 内の機器にリモートからアクセスしたいけど、LAN 内の機器のルーティング変更はさせてもらえない、とか \\ ルーティングを変更するのは面倒くさい、、、とか、ありますね。 {{:mae3xx_ope:use_wireguard_vpn:wireguard_03.png?1000|}} \\ MA-E3xx 側の WireGuard 設定ファイルに、PostUp/PreDown で WireGuard のアドレスをソースとしたパケットに対する MASQUERADE ルールを追加するだけで可能です。 [Interface] PrivateKey = kEZJD3XwR4C93FQV4k3kxKXZN4lb3BteQ8QmidevC08= Address = 10.100.0.10 PostUp = iptables -t nat -A POSTROUTING -s 10.100.0.0/24 -j MASQUERADE PreDown = iptables -t nat -D POSTROUTING -s 10.100.0.0/24 -j MASQUERADE [Peer] PublicKey = 27XZDfokt17uJZ+pvGXIRqLk2RMiPk55d12rzdDzAVY= EndPoint = www.example.jp:51820 AllowedIPs = 10.100.0.0/24 PersistentKeepAlive = 30 \\ サーバー側には LAN 内のアドレスへのルーティングを追加しておきます。 [Interface] PrivateKey = CGqjI+42V0TFA699Rf5SRd/+HWmUnwFudhh+vjToGWw= ListenPort = 51820 Address = 10.100.0.1 [Peer] # MA-E3xx PublicKey = PgXan/MXjXWQkwesEqkVUN1ggg6XyB8f86yr96ZiDio= AllowedIPs = 10.100.0.10/32, 192.168.253.0/24 ※ MA-E3xx の LAN、192.168.253.0/24 へのルーティングを追加しています。 === テスト === Internet 上のサーバー側から LAN 内の機器にアクセス可能か試してみます。 root@server:~# traceroute 192.168.253.2 traceroute to 192.168.253.2 (192.168.253.2), 30 hops max, 60 byte packets 1 10.100.0.10 (10.100.0.10) 1117.021 ms 1116.872 ms 1116.762 ms 2 192.168.253.2 (192.168.253.2) 1116.687 ms * 1116.487 ms root@server:~# ping -c 5 192.168.253.2 PING 192.168.253.2 (192.168.253.2) 56(84) bytes of data. 64 bytes from 192.168.253.2: icmp_seq=1 ttl=63 time=610 ms 64 bytes from 192.168.253.2: icmp_seq=2 ttl=63 time=47.5 ms 64 bytes from 192.168.253.2: icmp_seq=3 ttl=63 time=45.4 ms 64 bytes from 192.168.253.2: icmp_seq=4 ttl=63 time=43.7 ms 64 bytes from 192.168.253.2: icmp_seq=5 ttl=63 time=70.6 ms --- 192.168.253.2 ping statistics --- 5 packets transmitted, 5 received, 0% packet loss, time 4006ms rtt min/avg/max/mdev = 43.751/163.511/610.198/223.556 ms 問題なくアクセスできることが確認できました。 \\ ==== 今回作成したサーバーにスマートフォンでアクセスする ==== クライアント用の設定を作成し、iPhone, Android アプリ用に設定を QR コードで出力することができます。 [参考] [[https://wiki.debian.org/Wireguard#A3._Import_by_reading_a_QR_code_.28most_secure_method.29|Mobile clients Configuration - Debian Wiki]] {{:mae3xx_ope:use_wireguard_vpn:wireguard_02.png?400|これはダミー設定なので実際に使用することはできません。}} \\