引子
早就听说wireguard可以实现不同区域的机器内网互通,一直懒着没去搞,刚好上次跟一个朋友聊起这件事,他是用ZeroTier实现的不同地区的内网互通,刚好又聊到市面有的fake iplc就是这么操作的,那我们今天就来看看如何使用wireguard实现异地内网组网互通。
wireguard介绍
WireGuard 的白皮书中说到:
WireGuard: Next Generation Kernel Network Tunnel
谷歌翻译: WireGuard: 下一代网络内核隧道
你可以把它理解为 VPN (Virtual Private Network,虚拟专用网络)
这里并不是指科学上网,而是让员工更安全的访问公司内网数据的手段,常见于高校的教务系统登录当中。
但于传统 VPN 隧道不同的是,WireGuard 采用点对点连接,无服务端于客户端,谁先发起连接谁就是客户端。不仅如此,在 Linux 5.6 之后 WireGuard 被并入内核当中,其吞吐能力也是其他软件无法比拟的。还有就是,WireGuard 采用 UDP 连接,连接速度要更快,延迟更低,能够在网络故障恢复之后自动重连。
重点来了:
不过并不能很好的突破封锁,有握手所以特征明显,udp会被限流。仅仅当作虚拟专用网络来说还可以,要富强的话,你有其他更好的选择。
安装wireguard
小白这里在腾讯云开了一台香港和广州实例来进行演示,系统为Debian 11。
sudo apt update && sudo apt install wireguard -y
安装完成之后,系统就会包含wg和wg-quick两个命令,可以通过–help查看。
配置
这里需要说明下,wireguard无所谓谁是服务端谁是客户端,服务端只要有公网IP即可,方便起见,我们这边采用香港实例服务端。
开启内核的转发:
echo 1 > /proc/sys/net/ipv4/ip_forward echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf sysctl -p
创建密钥:
wg genkey | tee privatekey | wg pubkey > publickey
服务端和客户端都需要创建,记录下当前目录生成的公钥和私钥,待会会用到
服务器端配置
创建配置文件:
vim /etc/wireguard/wg0.conf
[Interface] ListenPort = 10086 # Wireguaed 端口 ,防火墙要放行 Address = 192.168.0.1/24 #VPN服务端的IP地址 PrivateKey = UPwBIfk/Fe8UjIWCEMwzi9GD9xhKZ3CI0ayq2y5NHks= #服务器的私钥 # 下面两条是放行的iptables和MASQUERADE PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE # 节点 [Peer] PublicKey = MXjTupqCjZIBLQPyYPYfEYbJmhVTY2SjDEtcEE1wxm8= #节点公钥 AllowedIPs = 192.168.0.2/32 #节点IP地址
这里需要注意的一点是,如果你的主网卡地址不是eth0,请使用ifconfig命令,查看主网卡名称,在配置文件中做相应修改。
启动服务:
wg-quick up wg0
开机自启:
systemctl enable [email protected]
客户端配置
创建配置文件:
vim /etc/wireguard/wg0.conf
[Interface] PrivateKey = +MB7RdpB+HgkpiZ/r1K6tY1Z374LIX6uDLtJ/4ka5mQ= #客户端私钥 Address = 192.168.0.2/32 #客户端IP [Peer] PublicKey = nt+u43nhOjlj4AT1+qWUbWPd+Ej4uyPJ9IdIzUiMLQM= #服务器节点公钥 AllowedIPs = 192.168.0.1/24 #服务器节点IP Endpoint = 43.129.188.91:10086 #服务器节点公网IP地址:端口 PersistentKeepalive = 25 #链接保持间隔
启动服务:
wg-quick up wg0
开机自启:
systemctl enable [email protected]
效果
我们可以看到,内网已经能ping通了,不过着延迟有点高啊,可能是UDP的原因……
再来看下路由和丢包:
虽然延迟有点高,倒是不丢包,可能没到晚高峰
最后来测个速吧:
假装自己是iplc
小白在香港端安装了一个ss,然后在广州端通过iptables转发流量。
速度还可以,不过应该活不长吧……
多客户端
如果要创建多客户端,则每个客户端公私钥,IP不能相同,然后在服务端上增加Peer即可。只需要修改PublicKey。
下面是服务器端多Peer例子
[Interface] PrivateKey = 你的私钥 Address = 192.168.0.2/24 # 本机IP,24代表着255.255.255.0,当然这IP不能乱填哈 PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE ListenPort = 10086 # 监听端口 [Peer] # 这是客户端的配置 PublicKey = 客户端公钥 AllowedIPs = 192.168.0.3/32 # 客户端的IP,不要冲突。我不是很理解/32是什么意思 [Peer] # 这是客户端2的配置 PublicKey = 客户端2的公钥 AllowedIPs = 192.168.0.4/32 # 客户端的IP,不要冲突。
可以看到,只需要增加一个Peer即可。增加客户端不需要修改原有客户端的配置。
完成后,重启WireGuard,不过可能会造成其余客户端的几秒钟连接中断。
systemctl restart wg-quick@wg0
最后
再次强调,wireguard并不能很好的突破封锁,有握手所以特征明显,udp会被限流。仅仅当作虚拟专用网络来说还可以,要富强的话,你有其他更好的选择。
参考文献
1.使用WireGuard实现异地组网
2.WireGuard 低成本异地组网
3.使用 WiregGuard 更安全的访问内网