Ubuntu 22.04 安装 Wireguard

Ubuntu 22.04 Install Wireguard

Posted by BlueFat on Sunday, December 31, 2023

环境

wireguard服务器:

  • 外网
    • 网卡接口:ens192
    • IP: 139.38.120.136
  • 内网
    • 网卡接口:ens160
    • IP: 192.168.77.3
    • wireguard网段: 10.78.0.0/24 注:不可与双方内网网段重复

netplan网络配置信息

cat /etc/netplan/00-installer-config.yaml 
# This is the network config written by 'subiquity'
network:
  ethernets:
    ens160:
      dhcp4: false
      addresses: 
        - 192.168.77.3/24
    ens192:
      dhcp4: false
      addresses: 
        - 139.38.120.136/27
      nameservers:
        addresses: 
          - 223.5.5.5
      routes:
        - to: default
          via: 139.38.120.1
  version: 2

安装WireGuard

sudo apt update
sudo apt install wireguard

生成服务器密钥

cd /etc/wireguard/
umask 077
sudo wg genkey | tee server_privatekey | wg pubkey > server_publickey

生成客户端密钥

sudo wg genkey | tee client01_privatekey | wg pubkey > client01_publickey

多客户端可以继续生成

sudo wg genkey | tee client02_privatekey | wg pubkey > client02_publickey

这将生成私钥(privatekey)和公钥(publickey)。重复此步骤以创建每个客户端的密钥对。

查看服务器及客户端公钥和私钥

# cat server_privatekey # 查看服务器私钥
MHPAamCyw3rqmM3DJmFqmWIwA+RhWnuG8DnaEZosxUo=
# cat server_publickey # 查看服务器公钥
VPcKzPGliNCec7GTRgLaeiQSuC8yi4uxg/SbG+j1zWs=

# cat client01_privatekey # 查看客户端1私钥
wMbJl9ax4QNqZBWiPFxcxJ4jEN93fMADHDSzPbgMW3A=
# cat client01_publickey # 查看客户端1公钥
ibz1Kxq+v0BnrPKRdtTlXr/M+uSBxpLGAjW53kSa+yY=

# cat client02_privatekey # 查看客户端2私钥
ILNBhnS8+gU47zqMRH+uYeX4mBoqNUf6btsaB7i9zl0=
# cat client02_publickey ## 查看客户端2私钥
IMzdIQ0MHauPh+UBIqsaWfFFdRPFpseoeLfqzmW5tDE=

配置Wireguard服务端

启用内核转发

echo net.ipv4.ip_forward >> /etc/sysctl.conf

sysctl -p

iptables FORWARD 默认策略是DROP, 虽然可以修改,但不推荐这样做

root@wireguard:~# iptables -L -n -v | grep FORWARD 
Chain FORWARD (policy DROP 166 packets, 7508 bytes)

服务端配置文件

创建一个配置文件,例如 /etc/wireguard/wg0.conf,并将以下内容添加到文件中(请替换 PrivateKey服务器私钥PublicKey客户端公钥

vim /etc/wireguard/wg0.conf
[Interface]
# 服务器私钥
PrivateKey = MHPAamCyw3rqmM3DJmFqmWIwA+RhWnuG8DnaEZosxUo=
Address = 10.78.0.1
ListenPort = 51820
PostUp = echo 1 > /proc/sys/net/ipv4/ip_forward
PostUp = iptables -A FORWARD -i %i -j ACCEPT
PostUp = iptables -t nat -I POSTROUTING -o ens160 -j MASQUERADE
PreDown = iptables -t nat -D POSTROUTING -o ens160 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT

[Peer]
# 客户端1公钥
PublicKey = ibz1Kxq+v0BnrPKRdtTlXr/M+uSBxpLGAjW53kSa+yY=
AllowedIPs = 10.78.0.2/32

Peer]
# 客户端2公钥
PublicKey = IMzdIQ0MHauPh+UBIqsaWfFFdRPFpseoeLfqzmW5tDE=
AllowedIPs = 10.78.0.3/32

启动WireGuard服务

sudo wg-quick up wg0

wireguard 会自动添加两条路由

使用以下命令停止服务:

sudo wg-quick down wg0

配置防火墙规则

如果有防火墙,确保允许WireGuard流量。例如,使用 ufw注意是放行udp

sudo ufw allow 51820/udp
sudo ufw allow from 10.78.0.0/24 to any port 22 # 允许vpn网段主机连接wireguard服务器ssh
sudo ufw enable

开机自动启动

配置系统重启后自动启动WireGuard

sudo systemctl enable wg-quick@wg0

客户端连接

现在,你的WireGuard服务端已经配置完成。你可以将 PublicKey替换成服务器公钥,PrivateKey 替换为每个客户端的公钥,并根据需要为每个客户端创建配置文件。确保在客户端上安装WireGuard软件,并使用生成的配置文件连接到服务器。

[Interface]
PrivateKey = wMbJl9ax4QNqZBWiPFxcxJ4jEN93fMADHDSzPbgMW3A=
Address = 10.78.0.2/32

[Peer]
PublicKey = VPcKzPGliNCec7GTRgLaeiQSuC8yi4uxg/SbG+j1zWs=
AllowedIPs = 192.168.77.0/24
Endpoint = 139.38.120.136:51820
PersistentKeepalive = 25

其他环境

情况一 防火墙模式

服务器没有外网IP, 通过防火墙端口映射的

wireguard服务器配置同上,然后防火墙端口映射下就OK了

<USG6580>display current-configuration | include 192.168.10.8
2023-11-30 02:06:27.870 +08:00
 nat server wireguard protocol udp global 189.6.145.90 3443 inside 192.168.10.8 3443 no-reverse

情况二 前置转发服务器

wireguard配置同上,另配置下面

如果你的WireGuard服务器没有公网IP,而是通过前置服务器进行转发,你需要在前置服务器上进行端口转发和网络地址转换(DNAT)配置。以下是配置的一般步骤:

1.在前置服务器上进行端口转发

在前置服务器上使用 iptablesufw 等工具进行端口转发。假设你的WireGuard服务器监听在UDP端口51820上,前置服务器的有公网IP地址,则可以使用以下命令进行端口转发:

iptables -t nat -A PREROUTING -p udp --dport 51820 -j DNAT --to-destination 192.168.77.3:51820
iptables -A FORWARD -p udp --dport 51820 -j ACCEPT

确保上述的 192.168.77.3:51820 是WireGuard服务器在局域网中的局域网IP地址和端口。

确保启用IPv4转发,你可以编辑 /etc/sysctl.conf 文件,确保 net.ipv4.ip_forward 被设置为1,并执行 sudo sysctl -p

2.在WireGuard服务器上配置NAT(跳过)

在WireGuard服务器上,确保启用IP转发:

sudo sysctl -w net.ipv4.ip_forward=1
# 这里在wireguard配置文件配置过了 不用再配置了

然后,你可能需要添加NAT规则,将来自WireGuard客户端的流量进行NAT处理:

sudo iptables -t nat -A POSTROUTING -s 10.78.0.0/24 -o ems160 -j MASQUERADE
# 这里在wireguard配置文件配置过了 不用再配置了

3.Wireguard 防火墙

ufw allow 51820/udp

4.Wireguard 服务器路由

注意

默认路由必须指向前置转发服务器,不然 ping不通 (重点)

这样配置后,前置服务器上的流量将通过端口转发被重定向到WireGuard服务器,而WireGuard服务器上的返回流量将通过NAT处理返回到前置服务器,再返回到原始的WireGuard客户端。确保你的前置服务器上的防火墙规则也允许WireGuard流量。

增加可访问网段

注意要添加访问网段所在网卡要做snat或MASQUERADE 如这里的192.168.1.0/24 在ens192网卡接口上,所以加多一条nat规则 然后在客户端AllowedIPs 添加多新的网段

[Interface]
# 服务器私钥
PrivateKey = MHPAamCyw3rqmM3DJmFqmWIwA+RhWnuG8DnaEZosxUo=
Address = 10.78.0.1
ListenPort = 51820 
PostUp = iptables -A FORWARD -i %i -j ACCEPT
PostUp = iptables -t nat -I POSTROUTING -o ens160 -j MASQUERADE
PostUp = iptables -t nat -I POSTROUTING -o ens192-j MASQUERADE
PreDown = iptables -t nat -D POSTROUTING -o ens160 -j MASQUERADE
PreDown = iptables -t nat -D POSTROUTING -o ens192 -j MASQUERADE 
PostDown = iptables -D FORWARD -i %i -j ACCEPT

[Peer]
# 客户端1公钥
PublicKey = ibz1Kxq+v0BnrPKRdtTlXr/M+uSBxpLGAjW53kSa+yY=
AllowedIPs = 10.78.0.2/32,192.168.1.0/24

Peer]
# 客户端2公钥
PublicKey = IMzdIQ0MHauPh+UBIqsaWfFFdRPFpseoeLfqzmW5tDE=
AllowedIPs = 10.78.0.3/32,192.168.1.0/24

参考

使用WireGuard技术实现外部节点与公司内网服务互访