本家様 https://www.wireguard.com/
ほんとシンプルな VPN
公開鍵暗号方式を使ったVPN. VPNっていうよりはトンネルを作るっていうのが適切なのかも
WireGuard サーバに向けてのnicが追加され、OS上のアプリがそのnicを経由して繋がると. nicなのでsshの他にもsmbも通れると.
ただ注意点としては ユーザ認証 がない. ノートPCにWireGuardが入っていてそれを紛失したら....まぁそれはパスワードて同じことですが.
WireGuard/ubuntu20
WireGuard/RockyLinux9
WireGuard/RockyLinux8
WireGuard/interlink
より強い認証が必要ならGuacamoleが宜しいかと. 二段階認証も使えますから
[root@centos7 ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
[root@centos7 ~]# uname -r
3.10.0-1160.el7.x86_64
[root@centos7 ~]# yum install epel-release elrepo-release
[root@centos7 ~]# yum install kmod-wireguard wireguard-tools
もしkernelが「3.10.0-1160」以外なら dkmsで作れるようにします
[root@centos7 ~]# uname -r
3.10.0-1160.83.1.el7.x86_64
[root@centos7 ~]# yum install epel-release
[root@centos7 ~]# yum install dkms
[root@centos7 ~]# curl -o /etc/yum.repos.d/jdoss-wireguard-epel-7.repo https://copr.fedorainfracloud.org/coprs/jdoss/wireguard/repo/epel-7/jdoss-wireguard-epel-7.repo
[root@centos7 ~]# cat /etc/yum.repos.d/jdoss-wireguard-epel-7.repo
[root@centos7 ~]# yum install wireguard-dkms <-- dkms向けのソースがインストールされてdkms経由でkmodが用意されます
[root@centos7 ~]# dkms status
wireguard/1.0.20220627, 3.10.0-1160.83.1.el7.x86_64, x86_64: installed
[root@centos7 ~]# modinfo wireguard
filename: /lib/modules/3.10.0-1160.83.1.el7.x86_64/extra/wireguard.ko.xz
intree: Y
alias: net-pf-16-proto-16-family-wireguard
alias: rtnl-link-wireguard
version: 1.0.20220627
author: Jason A. Donenfeld <Jason@zx2c4.com>
description: WireGuard secure network tunnel
license: GPL v2
retpoline: Y
rhelversion: 7.9
srcversion: F54A3416733E9644E7DE623
depends: udp_tunnel,ip6_udp_tunnel
vermagic: 3.10.0-1160.83.1.el7.x86_64 SMP mod_unload modversions
signer: DKMS module signing key
sig_key: FF:5D:D7:E0:7B:75:09:DF:CD:CD:B3:69:BF:C6:D5:6E:C2:FD:E7:53
sig_hashalgo: sha256
[root@centos7 ~]# yum install wireguard-tools
現状は
[root@centos7 ~]# ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
link/ether 00:0c:29:f6:a0:09 brd ff:ff:ff:ff:ff:ff
[root@centos7 ~]# ip addr show dev ens192 scope global
2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:f6:a0:09 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.107/24 brd 192.168.0.255 scope global noprefixroute dynamic ens192
valid_lft 42252sec preferred_lft 42252sec
[root@centos7 ~]#
2つのnicが見える. 片方はループバックなので実質1つのnicを持ってます. ens192で 192.168.0.107/24 です.
ここにWireGuard 向けの仮想的なnic[wg0]を作ることになります
まずはWireGuardサーバのWireGuard 向け公開鍵を作ります
[root@centos7 ~]# cd /etc/wireguard/
[root@centos7 wireguard]# umask 077
[root@centos7 wireguard]# wg genkey > privatekey <--- 秘密鍵の作成
[root@centos7 wireguard]# wg pubkey < privatekey > publickey <--- 秘密鍵から公開鍵を作成
[root@centos7 wireguard]# ls -l
total 8
-rw-------. 1 root root 45 Feb 7 02:21 privatekey
-rw-------. 1 root root 45 Feb 7 02:22 publickey
[root@centos7 wireguard]#
次にnic「wg0」を作るのですが、設定ファイルはnicデバイス名を持たせて「/etc/wireguard/wg0.conf」となる
ここでは「wg0」を「10.10.10.0/24」に所属させ「10.10.10.1/24」を持たせる
[root@centos7 ~]# vi /etc/wireguard/wg0.conf
[Interface]
PrivateKey = XXXXXXXXXXXXX4CGo4YXokmdOeEVXDSGuWayNNYsglE= <--- この文字列は「/etc/wireguard/privatekey」の中身
Address = 10.10.10.1/32
ListenPort = 51820
[root@centos7 ~]#
っでupさせてみる
[root@centos7 ~]# wg-quick up /etc/wireguard/wg0.conf
[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -4 address add 10.10.10.1/24 dev wg0
[#] ip link set mtu 1420 up dev wg0
[root@centos7 ~]#
(確認)
[root@centos7 ~]# ip addr show dev wg0 scope global
5: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
link/none
inet 10.10.10.1/32 scope global wg0
valid_lft forever preferred_lft forever
[root@centos7 ~]#
っが再起動すると「wg0」は消えてしまいます. 永続的に存在せるには下記のようにします
[root@centos7 ~]# systemctl enable wg-quick@wg0
外から中のWireGuardサーバに通すために、外向けのIPの443 or 8080 or 8888 が、内部WireGuardサーバ「192.168.0.107」の51820portに繋ぐとかのポートフォワードをルータに設定しておく
流れとしてはクライアント側で公開鍵を作り、
それをWireGuardサーバに登録. その際WireGuardの独自LAN(ここでは 10.10.10.0/24)でのipアドレスと、WireGuardサーバの公開鍵、WireGuardサーバの表向けのIPとport番号を受領する.
クライアント側で独自LANのIP、WireGuardサーバの公開鍵、WireGuardサーバの表向けのIPとport番号を設定する
■windowsクライアント
https://www.wireguard.com/install/からwindowsパッケージを取得します
ダウンロードしたパッケージ「wireguard-installer.exe」(86kB)を起動させインストールを完了させます。
完了すると下記のような画面が表示されます
左のボックス内で右クリックから「空のトンネルを追加..」を選びます
「トンネルの編集」画面が表示され、クライアントの「公開鍵」と「秘密鍵」が表示されます. 名前欄に接続先に関する名称を入れて「保存ボタン」を押下します
この「公開鍵」と「秘密鍵」は右クリックから「空のトンネルを追加..」で毎回違った値を出します
元の画面に戻ります. 作った「chaperone-connect」が用意されました。
手続き的に次は、ここで表示されている公開鍵「JPjP77zkEh9kOARtOsInnytux5RYciZuqYvrfAXbczM=」をWireGuardサーバに登録します
■WireGuardサーバ
公開鍵「JPjP77zkEh9kOARtOsInnytux5RYciZuqYvrfAXbczM=」に持たせるipは「10.10.10.10/32」とします
そうなると「/etc/wireguard/wg0.conf」は下記のように追記して [Peer]項目がクライアントごとに増えます
[root@centos7 ~]# vi /etc/wireguard/wg0.conf
[Interface]
PrivateKey = XXXXXXXXXXXXX4CGo4YXokmdOeEVXDSGuWayNNYsglE=
Address = 10.10.10.1/32
ListenPort = 51820
[Peer]
PublicKey = JPjP77zkEh9kOARtOsInnytux5RYciZuqYvrfAXbczM=
AllowedIPs = 10.10.10.10/32
[root@centos7 ~]#
(設定を反映させる)
[root@centos7 ~]# systemctl restart wg-quick@wg0.service
windowsクライアント側には 受け取った公開鍵に振ったIPアドレス「10.10.10.10/32」と
WireGuardサーバの公開鍵「/etc/wireguard/publickey」の中身と
WireGuardサーバの表向けのIPとport番号、例えば「web.chaperone.jp」「8080」を伝える
■(再び)windowsクライアント
「編集」ボタンを押下して「トンネルの編集」画面を表示させて
[Interface]欄に「Address」項目を設置して割り当てられたIPアドレスを指定します
そして[Peer]欄を設けて、「PublicKey」項目にはWireGuardサーバの公開鍵を
「AllowedIPs」項目は行動範囲なip範囲. ここではWireGuardサーバ自身と内部のネットワークを指定してます
「Endpoint」項目はWireGuardサーバの表向けのIPとport番号を入力します
保存ボタンを押下すると元の画面に戻って下記のようになります. 「有効化」ボタンを押下すればVPN接続になります.
WireGuardサーバはルータ的な役割になります. なので、iptablesのFORWARDで今いる[10.10.10.0/24]から計算機がある[192.168.0.0/24]へ渡る必要がある.
iptablesは...ってfirewall-cmdで行うなら[wg0]の所属するzoneに「--add-masquerade」を入れればいいみたい
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/9/html/configuring_and_managing_networking/proc_configuring-firewalld-on-a-wireguard-server-using-the-command-line_assembly_setting-up-a-wireguard-vpn
こちらでは Yamahaルータ を使っている
っでportフォワードの設定ですが、[詳細設定]->[NAT]で「NATディスクリプターの一覧」から「設定」を押下します
画面下部の「静的IPマスカレードの設定」を広げて、「+」ボタンで一行を足して下記のように追記します
「内側アドレス」は内部で作ったWireGuardサーバのIPアドレス
「プロトコル」は「udp」
「ポート番号」は「https=51820」. これは外側から来たhttps要求を「内側アドレス」へport: 51820 に変換して渡してます.
外向けには https で運用してますよと言いながら、WireGuardを実は運営できるって感じです.
外からグローバルIP:443に繋げても何も表示されないです. 別に22番portで運用しても問題ないかも.
当然ながら443をhttpサービスで既に使っているなら別のport番号を当ててください.
YamahaルータではなくLinuxのfirewalldでルータを運用しているなら firewall-cmd で portフォワードを定義します
firewall-cmd --zone=external --add-forward-port=port=443:proto=udp:toport=51820:toaddr=192.168.0.107 --permanent
firewall-cmd --reload
これでexternalに届いた443/udpのリクエストは内部の「192.168.0.107:51820」へportフォワードされます.