本家様 https://www.wireguard.com/
ほんとシンプルな VPN
公開鍵暗号方式を使ったVPN. VPNっていうよりはトンネルを作るっていうのが適切なのかも
WireGuard サーバに向けてのnicが追加され、OS上のアプリがそのnicを経由して繋がると. nicなのでsshの他にもsmbも通れると.
ただ注意点としては ユーザ認証 がない. ノートPCにWireGuardが入っていてそれを紛失したら....まぁそれはパスワードて同じことですが.
WireGuard/ubuntu20
WireGuard/RockyLinux9
WireGuard/RockyLinux8
*RHEL7/RHEL8系のマシンでWireGuardは使わない方がいいみたい. RHEL9系に行った方がよさげ
https://lists.zx2c4.com/pipermail/wireguard/2022-June/007664.html
WireGuard/interlink
WireGuard/log
より強い認証が必要ならGuacamoleが宜しいかと. 二段階認証も使えますから
centos7は 2024 年 6 月 30 日 にサポート終了なので別のOSで構築すべきですが、そうも言えないところもありますね.
サポートが切れているので基本「yum update」としても機能しないです.
その場合は CentOS/repo に記載の通り「/etc/yum.repos.d/CentOS-Base.repo」を修正してください.
[root@centos7 ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
[root@centos7 ~]# uname -r
3.10.0-1160.119.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 ~]# sed -i 's/enabled=1/enabled=0/' /etc/yum.repos.d/jdoss-wireguard-epel-7.repo
[root@centos7 ~]# yum install --enablerepo=copr:copr.fedorainfracloud.org:jdoss:wireguard wireguard-dkms -y <-- dkms向けのソースがインストールされてdkms経由でkmodが用意されます
[root@centos7 ~]# dkms status
wireguard/1.0.20220627, 3.10.0-1160.119.1.el7.x86_64, x86_64: installed
[root@centos7 ~]# yum install wireguard-tools
これでパッケージのインストールは完了です
firewalldは止めます. SELinuxは有効でも構いません.
[root@centos7 ~]# systemctl stop firewalld
[root@centos7 ~]# systemctl disable firewalld
[root@centos7 ~]# getenforce
Enforcing
[root@centos7 ~]#
セキュアブートは無効にします. このosではBIOSモードで作っているので無効でした.
[root@centos7 ~]# mokutil --sb-state
EFI variables are not supported on this system
[root@centos7 ~]#
[root@centos7 ~]# echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
[root@centos7 ~]# sysctl -p
現状は
[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: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether bc:24:11:d7:fb:30 brd ff:ff:ff:ff:ff:ff
[root@centos7 ~]# ip addr show dev ens192 scope global
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether bc:24:11:d7:fb:30 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.107/24 brd 192.168.0.255 scope global noprefixroute dynamic eth0
valid_lft 43152sec preferred_lft 43152sec
[root@centos7 ~]#
2つのnicが見える. 片方はループバックなので実質1つのnicを持ってます. eth0で 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 13 19:12 privatekey
-rw-------. 1 root root 45 Feb 13 19:12 publickey
[root@centos7 wireguard]#
[root@centos7 ~]# cat /etc/wireguard/publickey
hlRGpHDqrO247Hx/zyJaV/ZYdpb2PHLIb4kIuoPig1E= <-- 公開鍵
[root@centos7 ~]# cat /etc/wireguard/privatekey <-- 秘密鍵
2PXX51JlZiqu8CQaTHAZVIAyVToGGh+X4bKi6Z0CSUY=
[root@centos7 ~]#
次にnic「wg0」を作るのですが、設定ファイルはnicデバイス名を持たせて「/etc/wireguard/wg0.conf」となる
ここでは「wg0」を「10.10.10.0/24」に所属させ「10.10.10.1/24」を持たせる
[root@centos7 ~]# cat /etc/wireguard/privatekey
2PXX51JlZiqu8CQaTHAZVIAyVToGGh+X4bKi6Z0CSUY=
[root@centos7 ~]# vi /etc/wireguard/wg0.conf
[Interface]
PrivateKey = 2PXX51JlZiqu8CQaTHAZVIAyVToGGh+X4bKi6Z0CSUY= <--- この文字列は「/etc/wireguard/privatekey」の中身
Address = 10.10.10.1/32
ListenPort = 51820
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
[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 ~]# 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: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether bc:24:11:d7:fb:30 brd ff:ff:ff:ff:ff:ff
3: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/none
[root@centos7 ~]# ip addr show dev wg0 scope global
3: 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.service
Created symlink from /etc/systemd/system/multi-user.target.wants/wg-quick@wg0.service to /usr/lib/systemd/system/wg-quick@.service.
[root@centos7 ~]#
再起動しても上手くwg0が現れない場合は、手動で「wg-quick up wg0」を実行します. 手動が面倒なら crontabで@reboot枠で仕込む.
外から中の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」が用意されました。
手続き的に次は、ここで表示されている公開鍵「jvNVzJPFa3HnydxM7nvrOiaqp3zznx4nUHqeIbOk0zM=」をWireGuardサーバに登録します
■WireGuardサーバ
公開鍵「jvNVzJPFa3HnydxM7nvrOiaqp3zznx4nUHqeIbOk0zM=」に持たせるipは「10.10.10.10/32」とします
そうなると「/etc/wireguard/wg0.conf」は下記のように追記して [Peer]項目がクライアントごとに増えます
[root@centos7 ~]# vi /etc/wireguard/wg0.conf
[Interface]
PrivateKey = 2PXX51JlZiqu8CQaTHAZVIAyVToGGh+X4bKi6Z0CSUY=
Address = 10.10.10.1/32
ListenPort = 51820
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
# note-PC[HP EliteBook]
[Peer]
PublicKey = jvNVzJPFa3HnydxM7nvrOiaqp3zznx4nUHqeIbOk0zM= <--windowsクライアントの公開鍵
AllowedIPs = 10.10.10.10/32 <--windowsクライアントに割り当てたIPアドレス
[root@centos7 ~]#
設定を反映させる
[root@centos7 ~]# systemctl restart wg-quick@wg0.service
(上手く行かない場合は下記を実施する)
[root@centos7 ~]# wg-quick down /etc/wireguard/wg0.conf
[root@centos7 ~]# wg-quick up /etc/wireguard/wg0.conf
WireGuardサーバ側の設定は以上で完了です。
次に再度 windowsクライアント側での作業になります。
windowsクライアント側には 受け取った公開鍵に振ったIPアドレス「10.10.10.10/32」と
WireGuardサーバの公開鍵「/etc/wireguard/publickey」の中身「hlRGpHDqrO247Hx/zyJaV/ZYdpb2PHLIb4kIuoPig1E=」と
WireGuardサーバの表向けのIPとport番号、例えば「web.chaperone.jp」「443」を伝える
■(再び)windowsクライアント
「編集」ボタンを押下して「トンネルの編集」画面を表示させて
[Interface]欄に「Address」項目を設置して割り当てられたIPアドレスを指定します
そして[Peer]欄を設けて、「PublicKey」項目にはWireGuardサーバの公開鍵を
「AllowedIPs」項目は行動範囲なip範囲. ここではWireGuardサーバ自身と内部のネットワークを指定してます
「Endpoint」項目はWireGuardサーバの表向けのIPとport番号を入力します
保存ボタンを押下すると元の画面に戻って下記のようになります. 「有効化」ボタンを押下すればVPN接続になります.
WireGuardの中に入ってそのネットワーク上にあるDNSを参照したいなら、
windowsクライアントの設定で[Interface]欄に追加で
「DNS = 192.168.0.3」
とDNSを登録すればいいみたい。
こちらでは 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フォワードされます.