环境
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.在前置服务器上进行端口转发
在前置服务器上使用 iptables
或 ufw
等工具进行端口转发。假设你的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