51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

wireguard异地组网|异地内网互通|以腾讯云广州香港为例

目录

引子 {#i}

早就听说wireguard可以实现不同区域的机器内网互通,一直懒着没去搞,刚好上次跟一个朋友聊起这件事,他是用ZeroTier实现的不同地区的内网互通,刚好又聊到市面有的fake iplc就是这么操作的,那我们今天就来看看如何使用wireguard实现异地内网组网互通。

wireguard介绍 {#wireguard}

WireGuard 的白皮书中说到:

WireGuard: Next Generation Kernel Network Tunnel
谷歌翻译: WireGuard: 下一代网络内核隧道

你可以把它理解为 VPN (Virtual Private Network,虚拟专用网络)
这里并不是指科学上网,而是让员工更安全的访问公司内网数据的手段,常见于高校的教务系统登录当中。

但于传统 VPN 隧道不同的是,WireGuard 采用点对点连接,无服务端于客户端,谁先发起连接谁就是客户端。不仅如此,在 Linux 5.6 之后 WireGuard 被并入内核当中,其吞吐能力也是其他软件无法比拟的。还有就是,WireGuard 采用 UDP 连接,连接速度要更快,延迟更低,能够在网络故障恢复之后自动重连。

重点来了:

不过并不能很好的突破封锁,有握手所以特征明显,udp会被限流。仅仅当作虚拟专用网络来说还可以,要富强的话,你有其他更好的选择。

安装wireguard {#wireguard-2}

小白这里在腾讯云开了一台香港和广州实例来进行演示,系统为Debian 11。

sudo apt update && sudo apt install wireguard -y

安装完成之后,系统就会包含wg和wg-quick两个命令,可以通过--help查看。

配置 {#i-2}

这里需要说明下,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

服务端和客户端都需要创建,记录下当前目录生成的公钥和私钥,待会会用到

服务器端配置 {#i-3}

创建配置文件:
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]

客户端配置 {#i-4}

创建配置文件:
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]

效果 {#i-5}

我们可以看到,内网已经能ping通了,不过着延迟有点高啊,可能是UDP的原因......

再来看下路由和丢包:

虽然延迟有点高,倒是不丢包,可能没到晚高峰

最后来测个速吧:

假装自己是iplc {#iplc}

小白在香港端安装了一个ss,然后在广州端通过iptables转发流量。

速度还可以,不过应该活不长吧......

多客户端 {#i-6}

如果要创建多客户端,则每个客户端公私钥,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

最后 {#i-7}

再次强调,wireguard并不能很好的突破封锁,有握手所以特征明显,udp会被限流。仅仅当作虚拟专用网络来说还可以,要富强的话,你有其他更好的选择。

参考文献 {#i-8}

1.使用WireGuard实现异地组网
2.WireGuard 低成本异地组网
3.使用 WiregGuard 更安全的访问内网


赞(4)
未经允许不得转载:工具盒子 » wireguard异地组网|异地内网互通|以腾讯云广州香港为例