Wireguard是一个比OpenVPN更加先进的点对点VPN系统,作用是将分布在不同数据中心的VPS通过内网连接起来,这样就可以让多台VPS在一个更加安全和方便的局域网之内进行通信。例如VPS-1需要访问VPS-2的数据库,那么无需在VPS-2上开放3306端口,VPS-1直接就可以通过内网访问VPS-2的数据库。
在Debian 9上安装Wireguard
环境
- Linode
- Debian 9
注意
要在Linode上安装Wireguard必须要使用自定义内核,否则直接跟着官网的教程步骤,在运行 wg-quick up wg0 命令的时候会出现以下错误
1 2 3 4 5 6 |
root@jp:~# wg-quick up wg0 [#] ip link add wg0 type wireguard RTNETLINK answers: Operation not supported Unable to access interface: Protocol not supported [#] ip link delete dev wg0 Cannot find device "wg0" |
如果出现以上错误,那么就需要更换内核
更新系统内核(Linode必须)
更新源列表
打开/etc/apt/sources.list
1 |
nano /etc/apt/sources.list |
在最下方添加源地址(Debian 9,Debian 8把stretch改为jessie)
1 |
deb http://ftp.debian.org/debian stretch-backports main |
保存并退出
1 |
apt update |
更新源
安装新版内核
Debian 9,Debian 8把stretch改为jessie
1 |
apt-get install -t stretch-backports linux-image-amd64 |
查看所有已安装内核
1 |
dpkg -l|grep linux-image |
删除多余内核(可选)
一个内核大约200MB,如果不嫌占空间可以跳过此步骤
旧内核的名称用上面查看已安装内核命令中显示的内核名称填入即可
1 2 |
apt-get purge + 旧内核 apt-get purge linux-image-3.16.0-4-amd64 |
安装Linux-header
Debian 9,Debian 8把stretch改为jessie
1 |
apt-get install -t stretch-backports linux-headers-amd64 |
应用设置并重启生效
更新引导
1 |
update-grub |
如果上面这条命令没有任何返回内容,那么需要安装grub2,否则重启后无法引导系统
1 |
apt install grub2 |
清空缓存并重启
Linode用户记得在重启前按照这个教程把Boot Settings改为GRUB 2引导,然后再重启
1 2 |
apt-get clean reboot |
验证
重启后可以通过以下命令来验证是否成功更换内核
系统当前内核版本
1 |
uname -r |
如果显示的是之前安装的内核版本,那么说明内核更新成功了
安装Wireguard
更新源地址
1 2 3 |
echo "deb http://deb.debian.org/debian/ unstable main" > /etc/apt/sources.list.d/unstable.list printf 'Package: *\nPin: release a=unstable\nPin-Priority: 150\n' > /etc/apt/preferences.d/limit-unstable apt update |
安装Wireguard软件包
1 |
apt install wireguard |
验证
输入命令
1 |
modprobe wireguard && lsmod | grep wireguard |
如果输出显示如下,说明组件已经安装成功
1 2 3 |
wireguard 229376 0 ip6_udp_tunnel 16384 1 wireguard udp_tunnel 16384 1 wireguard |
否则有两种情况,一种是Linux-header没有安装,一种是先安装的wireguard,再安装的Linux-header,导致wireguard安装的时候配置失败。后一种情况可以通过以下命令重新安装wireguard来解决。
1 2 |
apt-get remove wireguard wireguard-dkms wireguard-tools apt-get install wireguard wireguard-dkms wireguard-tools |
配置Wireguard
Wireguard的核心是点对点,所以对于任何一台加入这个系统的VPS来说,自身永远是服务器,其他VPS对它而言永远是节点,所以要想在两台VPS之间建立连接,必须在两台VPS同时互为设置为节点才行,多台VPS的系统以此类推。
或者换个方式来说,VPS-1要和VPS-2建立连接,需要如下步骤
VPS-1
- 设置密钥、自身IP及配置信息,启用Wireguard服务
- 添加VPS-2为节点
VPS-2
- 设置密钥、自身IP及配置信息,启用Wireguard服务
- 添加VPS-1为节点
VPS-1&VPS-2
- ping对方内网ip,返回成功信息
- 连接建立
具体的设置方法如下
设置自身密钥
1 2 3 |
umask 077 wg genkey | tee privatekey | wg pubkey > publickey umask 022 |
设置自身IP及配置信息
进入/etc/wireguard/
打开文件
1 |
nano /etc/wireguard/wg0.conf |
写入如下内容
1 2 3 4 5 6 7 |
[Interface] PrivateKey = <Private Key> Address = 192.168.2.1/24, fd86:ea04:1115::1/64 ListenPort = 51820 PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; ip6tables -A FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE; ip6tables -D FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE SaveConfig = true |
其中<Private Key>可以通过 cat privatekey 获取并填入,Address是每个VPS唯一的识别标志,可以自己更改,但要保持在同一网段,/24和/64可以不写系统会自动补齐,IPV6地址是可选的可以不写,ListenPort是唯一需要在本机防火墙(UFW)上打开的端口,可以更改,需要填写到其他VPS的连接配置中。PostUp/PostDown是运行和停止时执行的iptables规则,用于打开和关闭转发和NAT。SaveConfig用于自动更新配置文件,之后添加节点只需要在命令行执行命令即可,无需再次编辑conf文件。
启用Wireguard服务
创建UFW规则,端口为之前conf文件中设定的本机监听端口
1 |
ufw allow 51820/udp |
开启服务
1 |
wg-quick up wg0 |
如运行出错,详文章顶部错误解决方法
停止服务
1 |
wg-quick down wg0 |
查询服务状态
1 |
wg |
立即保存配置到配置文件
1 |
wg-quick save wg0 |
设置重启后自动运行
1 |
systemctl enable wg-quick@wg0 |
验证
检查ufw规则
1 |
ufw status verbose |
检查连接状态
1 2 |
wg show ifconfig wg0 |
添加节点
建议不要手动在conf文件中写节点,可以使用命令行动态添加节点
1 |
wg set wg0 peer <Client Public Key> endpoint <Client IP address>:51820 allowed-ips 192.168.2.1,fd86:ea04:1115::1 |
其中<Client Public Key>就是节点的公钥,可以在节点VPS中运行 wg 查看或者使用 cat publickey 获取。endpoint就是节点的公网IP地址和端口,可以通过在节点VPS中运行wg查看。allowed-ips是节点的内网IP地址,即[Interface]的Address地址,IPV6地址是可选的,不建议初级用户填写,建议不要使用IP/64格式,直接使用IP,否则在添加第三个peer时会冲突。
检查是否成功添加节点信息
1 |
wg |
如果出现peer内容,则说明添加成功
添加成功后,保存当前状态至配置文件
1 |
wg-quick save wg0 |
Ping对方内网ip
在VPS-2(192.168.2.2)通过Ping命令测试连接VPS-1(192.168.2.1)
1 |
ping 192.168.2.1 |
返回Ping数据,连接成功。
这时通过wg命令,可以查看节点的连接和传输状态。
至此,Wireguard就安装并配置完成了。之后这两台VPS的互相访问只需要通过内网IP就可以了。
配置内网UFW规则
虽然VPS-1和VPS-2已经组成内网,也能够互相Ping,但是还是无法访问被UFW限制的端口,接着还需要在UFW里设置对我们的内网网关放行
UFW命令
1 2 3 4 |
#放行所有来自wg0网口的连接 ufw allow in on wg0 to any #仅放行wg0网口的3306端口连接 ufw allow in on wg0 to any port 3306 |
设置完成后,验证
1 |
ufw status |
输出,如果出现下方mark条目,说明设置成功
1 2 3 4 5 6 7 8 9 10 |
To Action From -- ------ ---- 22 ALLOW Anywhere 80 ALLOW Anywhere 443 ALLOW Anywhere Anywhere on wg0 ALLOW Anywhere 22 (v6) ALLOW Anywhere (v6) 80 (v6) ALLOW Anywhere (v6) 443 (v6) ALLOW Anywhere (v6) Anywhere (v6) on wg0 ALLOW Anywhere (v6) |
总结
在多台VPS的情景下,很多时候有跨VPS读写数据库或者文件的需求,但是为此专门去打开公网防火墙的各种端口总是觉得既不安全又划不来,有了wireguard,一切都变得简单了,只需打开一个端口,就可以让两台VPS互相无障碍访问,也不用时刻提心吊胆的怕开了各种敏感端口而被入侵。
参考
https://www.linode.com/docs/networking/vpn/set-up-wireguard-vpn-on-ubuntu/
https://www.wireguard.com/quickstart/
https://wiki.archlinux.org/index.php/WireGuard
8 comments