Wireguard 搭建异地组网


共计 3543 个字符,预计需要花费 9 分钟才能阅读完成。

前言

之前就一直听说 Wireguard 可以进行异地组网,但是多次尝试发现只能达到点对点通信的效果,需要在每台机器上搭建客户端显然是不合理的。并且由于搭建了 tailscale,并且是基于 wireguard 的,所以就没再折腾了。

最近因为群友提到这个,所以又折腾了一下,并且互相交流了一番,发现果然可以实现异地组网。但是,组网却比 tailscale 麻烦上许多,并且有些出现的问题可能很难发现。但是基于本人多次尝试,发现了一个对自己来说比较方便的搭建方式。

服务器搭建wg-easy

1. 安装wireguard内核

由于使用的是 centos7 服务器,默认内核不支持 wireguard。

如果不进行安装可能出现如下日志:

Mon May 27 03:19:09 UTC 2024: Starting Wireguard /etc/wireguard/wg0.conf
[#] ip link add wg0 type wireguard
RTNETLINK answers: Not supported
Unable to access interface: Protocol not supported
[#] ip link delete dev wg0
Cannot find device "wg0"
Adding iptables NAT rule

运行如下命令安装即可:

yum update && \
yum install epel-release elrepo-release -y && \
yum install yum-plugin-elrepo -y && \
yum install kmod-wireguard wireguard-tools -y

2. 加载模块

如果不进行如下命令操作,可能后续会出现能 ping 通,但是不能够进行 ssh 或者 http 访问的情况。

sudo modprobe iptable_filter && \
sudo modprobe ip6table_filter

3. 安装wg-easy

wg-easy 是一个可以快速搭建 wireguard 服务端的项目,提供了一个方便的 ui 界面,生成客户端只需要在界面生成,然后即可下载配置文件。

当然了,之前因为没有搭建成功也是由于它的弊端,因为他的配置文件不能手动修改,所以就导致客户端配置了路由,但是服务器不知道往哪里发的问题

所以,搭建 wg-easy 只是为了过度。

version: '3.1'
services:
  wg-easy:
    image: weejewel/wg-easy:nightly
    container_name: wg-easy
    environment:
      - WG_HOST=<Server IP>
      - PASSWORD=<PASSWORD>
      - WG_ALLOWED_IPS=10.8.0.0/24
      - WG_PERSISTENT_KEEPALIVE=25
      - WG_DEFAULT_DNS=114.114.114.114
      - UI_TRAFFIC_STATS=true
    volumes:
      - /home/docker/wireguard:/etc/wireguard
    network_mode: "host"
    # 51820 为 wireguard 数据传输的端口,51821 为 wg-easy 端口
    # ports:
    #   - 51820:51820/udp
    #   - 51821:51821/tcp
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    privileged: true
    restart: unless-stopped

这里需要注意的配置有三个:

  • WG_HOST:填写服务器 IP
  • PASSWORD:访问 wg-easy 的密码
  • WG_ALLOWED_IPS:客户端路由地址,即客户端下载配置文件都会携带该配置

安装wireguard客户端

创建客户端配置文件

访问 ip:51821,然后输入密码即可进入 wg-easy 图形界面,如下图所示。(如果需要配置反代可以自行配置)

Wireguard 搭建异地组网

/>

wireguard 官方客户端下载地址:https://www.wireguard.com/install/#ubuntu-module-tools

windows安装

在网页端点击下载,然后导入配置文件即可。

Wireguard 搭建异地组网

/>

移动端安装

直接扫码即可导入配置。

Wireguard 搭建异地组网

/>

linux安装

在 linux 上,个人喜欢使用 docker 进行安装。当然,如果使用的依然是 centos,那么还需要像上面那样安装 wireguard 内核

下载配置文件,将其修改为 wg0.conf,然后放在 /home/docker/wireguard 目录下。

再运行如下命令:

docker run -d \
--privileged \
--net=host  \
--restart=always \
--name wireguard-client \
--cap-add NET_ADMIN \
--cap-add SYS_MODULE \
-v /home/docker/wireguard/wg0.conf:/etc/wireguard/wg0.conf \
--restart unless-stopped \
cmulk/wireguard-docker:alpine

异地组网

如果按上面的步骤,应该可以实现点对点进行通信,即连接上的客户端会像这样出现红点。

Wireguard 搭建异地组网

/>

比如网络情况如下,并且需要移动端能够实现移动端直接输入服务器 A 和服务器 B 的内网 ip 即可访问服务。

Wireguard 搭建异地组网

/>

要实现上述目的,要进行如下操作。

1. 保证移动端路由

Wireguard 搭建异地组网

/>

这里显示的配置意思是,wireguard 会代理 10.8.0.0/24, 172.21.9.0/24, 172.30.1.0/24, 172.26.1.0/24, 172.20.2.0/23 的流量,将所有匹配的流量都发往服务器。

2. 修改服务器配置

例如我的内网设备为 gw 这台设备,当服务器收到 172.21.9.0/24, 172.30.1.0/24, 172.26.1.0/24, 172.20.2.0/23 请求时,需要将其转发到 gw 设备上。

修改对应的 AllowedIPs 即可。

Wireguard 搭建异地组网

/>

删除 wg-easy 容器。

wg-easy 的作用在这里就结束了,它的作用就是为了方便地生成客户端地配置,现在客户端基本已经配置好了,并且需要修改 wg0.conf,而它会覆盖配置,所以需要删除。

docker rm -f wg-easy

运行如下命令:

docker run -d \
--privileged \
--net=host  \
--restart=always \
--name wireguard-client \
--cap-add NET_ADMIN \
--cap-add SYS_MODULE \
-v /home/docker/wireguard/wg0.conf:/etc/wireguard/wg0.conf \
--restart unless-stopped \
cmulk/wireguard-docker:alpine

3. 修改客户端配置

如果内网设备为路由器,不需要进行该操作。

首先内网设备需要开启 ipv4 转发,运行 cat /proc/sys/net/ipv4/ip_forward 如果结果为 1,表示转发已开启。

否则需要修改 /etc/sysctl.conf 文件,将 #net.ipv4.ip_forward=1 修改为 net.ipv4.ip_forward=1。再执行 sysctl -p

另外,wg0.conf 需要添加如下配置:

PostUp   = iptables -A FORWARD -i client_route -j ACCEPT; iptables -A FORWARD -o client_route -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; iptables -A FORWARD -i eth0 -j ACCEPT; iptables -A FORWARD -o eth0 -j ACCEPT; iptables -t nat -A POSTROUTING -o client_route -j MASQUERADE
PostDown = iptables -D FORWARD -i client_route -j ACCEPT; iptables -D FORWARD -o client_route -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE; iptables -D FORWARD -i eth0 -j ACCEPT; iptables -D FORWARD -o eth0 -j ACCEPT; iptables -t nat -D POSTROUTING -o client_route -j MASQUERADE

Wireguard 搭建异地组网

/>

如果不添加上面的配置,将服务路由到其他服务器,因为没有进行源地址 nat 转换,即使数据发送到了服务器 A/B 上,数据也回不来,因为它不知道 10.8.0.0/24 的路由。照上面的配置,在发送到其他服务器时,会将源地址转换成内网设备的地址。

Tips:清朝云网络工作室

阅读剩余
THE END