因为一些原因将 Elasticsearch 部署在了另外一台机器上,之前两台 vps 是直接通过公网通迅的,只不过用防火墙限制了一下IP,但这终究是不安全的,想要靠谱还是要上VPN。但找了一找网上的VPN教程大多是 OpenVPN ,虽然 OpenVPN 很安全,但部署操作实在太复杂了,于是就一直这样鸽了下来。

今天,看到了 在 Ubuntu 18.04 上建立 WireGuard 隧道组建 VPS 大内网 这篇文章时真是茅塞顿开,于是参考这篇文章外加 官方文档Debian Wiki Wireguard 条目 使用 WireGuard 将自己的两台 VPS 组了一个私有网。

以下步骤均建议,同时连接两台VPS同步操作。

第一步:生成密匙

在服务端、客户端同时使用如下命令生成公钥与私钥。

wg genkey | tee privatekey | wg pubkey > publickey

Warning

请注意保护私钥。

第二步:手动配置

请参考以下配置文件模版,和 wg-quick 完成配置文件,并将配置文件写入 /etc/wireguard/wg0.conf

Server:

[Interface]
Address = 192.168.1.1/24
SaveConfig = true
ListenPort = 51820
PrivateKey = 服务端私钥

[Peer]
PublicKey = 客户端公钥
AllowedIPs = 192.168.1.0/24

Client:

[Interface]
Address = 192.168.1.2/24
PrivateKey = 客户端私钥

[peer]
PublicKey = 服务端公钥
Endpoint = 服务器地址:51820
AllowedIPs = 192.168.1.1/24

第三步:防火墙

服务端打开相应的监听端口,放行udp。

firewall-cmd --zone=public --add-port=51820/udp --permanent

根据实际需要,在服务端、客户端做出相应的防火墙配置。

Server:

firewall-cmd --new-zone=wg --permanent
firewall-cmd --zone=wg --add-interface=wg0 --permanent
firewall-cmd --zone=wg --add-masquerade --permanent
firewall-cmd --zone=wg --add-port=3000/tcp --permanent
firewall-cmd --zone=wg --add-port=4000/tcp --permanent
firewall-cmd --reload

Client:

firewall-cmd --new-zone=wg --permanent
firewall-cmd --zone=wg --add-interface=wg0 --permanent
firewall-cmd --zone=wg --add-port=9200/tcp --permanent
firewall-cmd --reload

第四步:确认通道已连接

服务端、客户端同时启动 wireguard。

wg-quick up wg0

查看 ip 地址,并互 ping 对方主机,如果能 ping 通,说明隧道已经建立。

$ ip addr
3: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
    link/none
    inet 192.168.1.1/24 scope global wg0
      valid_lft forever preferred_lft forever

$ ping 192.168.1.2
PING 192.168.1.2 (192.168.1.2) 56(84) bytes of data.
64 bytes from 192.168.1.2: icmp_seq=1 ttl=64 time=1.74 ms
64 bytes from 192.168.1.2: icmp_seq=2 ttl=64 time=1.59 ms
64 bytes from 192.168.1.2: icmp_seq=3 ttl=64 time=1.64 ms
64 bytes from 192.168.1.2: icmp_seq=4 ttl=64 time=1.66 ms
64 bytes from 192.168.1.2: icmp_seq=5 ttl=64 time=1.100 ms
^C
--- 192.168.1.2 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 11ms
rtt min/avg/max/mdev = 1.587/1.725/1.998/0.149 ms

可使用 wg show 查看相应信息。

# wg show
interface: wg0
  public key: 服务端公钥
  private key: (hidden)
  listening port: 51820

peer: 客户端公钥
  endpoint: 客户端地址:客户端当前端口
  allowed ips: 192.168.1.0/24
  latest handshake: 59 seconds ago
  transfer: 135.63 KiB received, 209.95 KiB sent

如果测试没有问题,并需要长期保持隧道,使用 [email protected] 实现自启。

wg-quick down wg0 && \
systemctl start [email protected] &&\
systemctl enable [email protected]