ubuntu搭建wireguard
简介
wireguard是一款VPN软件, 可以用来异地组网
wireguard搭建非常简单,但它的缺点是客户端与客户端之间不能直连,只能通过服务器来中转
1. 安装
apt install wireguard # 安装wireguard
apt install openresolv # 安装相关的依赖包
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf # 开启linux内核转发功能
# echo "net.ipv6.conf.all.forwarding = 1" >> /etc/sysctl.conf # 开启ipv6转发,可选
sysctl -p # 使配置生效
2. 配置服务端
# 进入配置目录
cd /etc/wireguard/ # 如果不存在这个目录,则先创建这个目录, 默认情况下wireguard会读取这个目录下的配置文件
# 生成公钥和私钥
umask 077 # 设置权限
wg genkey > privatekey # 生成私钥key
wg pubkey < privatekey > publickey # 从私钥导出公钥
# wg genkey | tee privatekey | wg pubkey > publickey # 或者直接一次性生成公钥和私钥
# 服务器配置
vim wg0.conf # 创建配置文件 wg0.conf, 并写入以下内容
[Interface]
Address = 10.100.1.1/24 # 在VPN中本机ip
DNS = 8.8.8.8 # NDS地址
# SaveConfig = true # 自动保存配置,不建议开启,因为有时候当连接出现问题时会自动删除一些配置项
# 启动和停止服务时在路由表里设置的转发规则,其中eth0是网卡名
# 网卡名可以通过 ip route list default 来查看, dev后面的字符串就是网卡名
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
ListenPort = 8502 # 服务器端口号
PrivateKey = 0I3pQ1p13xknL5p9eMxVAEh9g79/PkHRWqJV+IHbHmE= # 服务器(本机)生成的 privatekey
[Peer]
PublicKey =yKYOQGmP/nNKi2z50btY2hKo2lNMFbCqCqvT5ruhByY= #对端(客户端)的 Publickey
AllowedIPs = 10.100.1.2/32 # 对端虚拟IP地址
PersistentKeepalive = 120 # 心跳,每隔多少秒自动连接一次服务器,一般不需要开启
# 如果需要多台设备连接到服务器,则继续增加peer即可
[Peer]
# linux客户端
PublicKey = acvAcZQkKJdrdCKy0ghsdQoYKf9Aoh9d9eF59CSnJSU= # 客户端公钥
AllowedIPs = 10.100.1.3/32 # 客户端ip
PersistentKeepalive = 120
3. 启动服务端
# linxu下相关命令
wg-quick up wg0 # 启动
wg-quick down wg0 # 停止
wg # 查看wg的运行状态
systemctl enable wg-quick@wg0 # 设置开机启动
4. 客户端配置
客户端下载
官网下载地址 https://www.wireguard.com/install/
win系统
win系统在新建隧道的时候会自动生成publickey和privatekey
假设我这里自动生成的privatekey和publickey是
publickey: yKYOQGmP/nNKi2z50btY2hKo2lNMFbCqCqvT5ruhByY=
privatekey: +GCWhaO6w50VmvscAGCQZXQf7n8WK4Kit/pt8AsKaVw=
则配置文件文件为:
[Interface]
PrivateKey = +GCWhaO6w50VmvscAGCQZXQf7n8WK4Kit/pt8AsKaVw= # win系统自动生成
Address = 10.100.1.2/32 # 在VPN中的ip地址
DNS = 8.8.8.8 # DNS地址, 必须要填,否则上不了网
[Peer]
PublicKey = hRtkgLuxK8coZbimv3TfjDgoXKdPrkje9D+h3V16gWQ= # 服务端publickey
AllowedIPs = 0.0.0.0/0 # 要进行流量转发的网段, 0.0.0.0/0表示所有网段
Endpoint = 157.255.219.143:8502 # 服务器的公网ip和端口
#PersistentKeepalive = 120 # 心跳,每个多少秒自动连接一次服务器
linux系统
首先也要安装这两个包
apt install wireguard # 安装包
apt install openresolv # 安装相关的依赖包
linux系统客户端和win系统的配置差不多, 只是多了一步生成公钥publickey和私钥privatekey
wg genkey > privatekey # 生成私钥key
wg pubkey < privatekey > publickey # 从私钥导出公钥
假设我这里生成的 公钥publickey 和 私钥privatekey 是
publickey: acvAcZQkKJdrdCKy0ghsdQoYKf9Aoh9d9eF59CSnJSU=
privatekey: eOwccK1QtZvxFa17TGIQx22PbUBDWcSlBdi+TqtWbVQ=
则我这里的配置应该为
vim wg0.conf
[Interface]
PrivateKey = eOwccK1QtZvxFa17TGIQx22PbUBDWcSlBdi+TqtWbVQ= # win系统自动生成
Address = 10.100.1.3/32
DNS = 8.8.8.8 # DNS地址, 必须要填,否则上不了网
[Peer]
PublicKey = hRtkgLuxK8coZbimv3TfjDgoXKdPrkje9D+h3V16gWQ= # 服务端publickey
AllowedIPs = 0.0.0.0/0 # 要进行流量转发的网断, 0.0.0.0/0表示所有网断
Endpoint = 157.255.219.143:8502 # 服务器的公网ip和端口
#PersistentKeepalive = 120 # 心跳,每个多少秒自动连接一次服务器
5. 排除部分网段不走服务器(按需设置)
wg目前默认没有排除某个网段的设置, 不过我们可以通过代码来计算出排除某些网段后的网段
# python代码
from ipaddress import ip_network
start = '0.0.0.0/0'
# 需要排除的ip或者ip段, 这些网段或ip的流量不走服务器
exclude = ['10.0.0.0/8', '172.16.0.0/32']
result = [ip_network(start)]
for x in exclude:
n = ip_network(x)
new = []
for y in result:
if y.overlaps(n):
new.extend(y.address_exclude(n))
else:
new.append(y)
result = new
print(','.join(str(x) for x in sorted(result)))
之后在客户端的配置里修改 AllowedIPs的值即可
[Interface]
PrivateKey = +GCWhaO6w50VmvscAGCQZXQf7n8WK4Kit/pt8AsKaVw=
Address = 10.100.1.2/32
DNS = 8.8.8.8
[Peer]
PublicKey = hRtkgLuxK8coZbimv3TfjDgoXKdPrkje9D+h3V16gWQ=
# 要进行流量转发的网断, 把这个值修改为计算出来的值即可
AllowedIPs = 0.0.0.0/5,8.0.0.0/7,11.0.0.0/8,12.0.0.0/6,...
Endpoint = 157.255.219.143:8502 # 服务器的公网ip和端口
#PersistentKeepalive = 120 # 心跳,每个多少秒自动连接一次服务器
使用
搭建好后, 各个节点之间可以通过虚拟ip像访问局域网里的机器一样访问彼此了