简介
Wireguard
是一个新兴的开源 VPN 工具,具有速度快、性能高、配置简单、使用安全的优势,目前已经加入Linux内核 (>= 5.6) 代码中。
通过Wireguard可以将广域网上的主机连接起来,形成一个局域网。只需要有一台具有固定公网IP的服务器,就可以将其作为我们搭建的局域网的中心节点,让其他的主机(不论是否有公网IP,不论是否在NAT内),都通过这个中心节点和彼此相连。由此就构建了一个中心辐射型的局域网,实现了内网穿透等功能。
本文将讲解如何使用Wireguard搭建中心辐射型拓扑的网络。
准备
使用WireGuard组网,需要有一台具有公网IP的服务器。我这里准备了一台阿里云的服务器(Centos7)。
安装
WireGuard 没有服务端和客户端的区别,要加入WireGuard组成的网络,都需要下载并安装对应的软件。
CentOS7
yum install epel-release elrepo-release
yum install yum-plugin-elrepo
yum install kmod-wireguard wireguard-tools
Android
IOS
Windows
快速开始
下面我们通过wireguard组建一个最简单的网络,该网络只有两个节点。
这两个节点分别是aliyun(阿里云服务器,有公网IP,操作系统:CentOS7)、thinkpad(笔记本电脑,无公网IP,操作系统:Windows10)
创建两组密钥对
wireguard组建的网络中有多少个节点,就需要创建多少组密钥对。
当前示例有2个节点,需要生成2组密钥:
wg genkey | tee aliyun_privatekey | wg pubkey > aliyun_publickey
wg genkey | tee thinkpad_privatekey | wg pubkey > thinkpad_publickey
执行以上两条命令后,会在执行命令的当前文件夹自动生成4个文件:
├── aliyun_privatekey
├── aliyun_publickey
├── thinkpad_privatekey
└── thinkpad_publickey
aliyun_privatekey:aliyun节点的私钥文件
aliyun_publickey:aliyun节点的公钥文件
thinkpad_privatekey:thinkpad节点的私钥文件
thinkpad_publickey:thinkpad节点的公钥文件
配置aliyun节点
aliyun节点是CentOS7操作系统,通过上面的三行命令安装好WireGuard后,输入wg --version
如果正确显示版本号则说明安装成功。
注:首次安装后需重启服务器。
开启IP地址转发
查看是否开启
sysctl net.ipv4.ip_forward
如果显示net.ipv4.ip_forward = 1
则说明已开启IP地址转发,显示net.ipv4.ip_forward = 0
则说明没有开启IP地址转发。
开启IP地址转发
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
echo "net.ipv4.conf.all.proxy_arp = 1" >> /etc/sysctl.conf
sysctl -p /etc/sysctl.conf
设置IP地址伪装
# 允许防火墙伪装IP
firewall-cmd --add-masquerade
# 检查是否允许伪装IP
firewall-cmd --query-masquerade
# 禁止防火墙伪装IP
firewall-cmd --remove-masquerade
创建配置文件
在/etc/wireguard/
创建aliyun.conf
文件。内容如下:
[Interface]
# Name = aliyun
Address = 192.168.168.1/24
ListenPort = 51820
PrivateKey = <aliyun_privatekey文件中的内容>
[Peer]
# Name = thinkpad
PublicKey = <thinkpad_publickey文件中的内容>
AllowedIPs = 192.168.168.2/32
配置项说明
[Interface]
定义当前节点的配置
# Name
这是 INI 语法中的标准注释,用于展示该配置部分属于哪个节点。
Address
定义当前节点应该对哪个地址范围进行路由。如果是常规的客户端,则将其设置为节点本身的单个 IP(使用 CIDR 指定,例如 192.168.168.10/32);如果是中继服务器,则将其设置为可路由的子网范围。
例如:
常规客户端,只路由自身的流量:Address = 192.168.168.10/32
中继服务器,可以将流量转发到其他节点(peer):Address = 192.168.168.1/24
ListenPort
当前节点是中继服务器时,需要通过该参数指定端口来监听传入 VPN 连接,默认端口号是51820
。常规客户端不需要此选项。
注意在系统防火墙和服务器安全组中放行该端口。大部分连不通都是端口原因。
PrivateKey
当前节点的私钥,所有节点(包括中继服务器)都必须设置。不可与其他服务器共用。
[Peer]
定义对等节点(其他节点)的配置。可以有多个。
中继服务器必须将所有的节点(除了自身节点)定义为对等节点(peer)。其他的节点只需定义中继服务器作为对等节点(peer)。
PublicKey
对等节点(peer)的公钥,所有节点(包括中继服务器)都必须设置。
AllowedIPs
如果对等节点(peer)是常规的客户端,则将其设置为节点本身的单个 IP;如果对等节点(peer)是中继服务器,则将其设置为可路由的子网范围。可以使用,
来指定多个 IP 或子网范围。该字段也可以指定多次。
启动aliyun节点
wg-quick up aliyun
停止服务使用:
wg-quick down aliyun
启动后,会看到如下提示:
[#] ip link add aliyun type wireguard
[#] wg setconf aliyun /dev/fd/63
[#] ip -4 address add 192.168.168.1/24 dev aliyun
[#] ip link set mtu 1420 up dev aliyun
如果看到提示如下错误:
[#] ip link add aliyun type wireguard
RTNETLINK answers: Operation not supported
Unable to access interface: Protocol not supported
[#] ip link delete dev aliyun
Cannot find device "aliyun"
说明你是首次安装,还没有重启服务器,需要先重启后再试。
配置thinkpad节点
安装
thinkpad节点是Windows操作系统,需要下载并安装windows客户端(我下载的是:wireguard-amd64-0.5.3.msi)。默认会安装到:C:\Program Files\WireGuard
。
新建空隧道
如果你提前配置好了配置文件,也可以选择从文件导入,我这里选择“新建空隧道”:
名称填写:thinkpad,然后把以下内容粘贴进入:
[Interface]
# Name = thinkpad
Address = 192.168.168.2/32
PrivateKey = <thinkpad_privatekey文件中的内容>
[Peer]
# Name = aliyun
PublicKey = <aliyun_publickey文件中的内容>
Endpoint = 1.1.1.1:51820
AllowedIPs = 192.168.168.0/24
PersistentKeepalive = 25
跟aliyun节点配置相比,有这些不同:
[Interface]中Address设置的单一IP,表示当前节点的IP。去掉了ListenPort项(当前节点是中继服务器时才需要)。PrivateKey填写的是thinkpad_privatekey文件中的内容。
[Peer]中增加了Endpoint项,该项通常指定中继服务器的公网IP,当然有稳定公网 IP 的节点也可以指定。PublicKey填写的是aliyun_publickey文件中的内容。PersistentKeepalive = 25
表示每隔 25 秒发送一次 ping 来检查并维持连接(如果本节点没有固定的公网IP,必须指定)。
测试连接
中继服务器(aliyun)开启服务:wg-quick up aliyun
thinkpad节点点击“连接”按钮:
正常情况下,两个节点可以互相ping通。
调试
查看节点信息
wg show aliyun
查看UDP端口是否打开
可以查看这篇文章:《测试UDP端口是否打开》
更多
以后台服务运行
CentOS7
systemctl enable wg-quick@aliyun.service
systemctl start wg-quick@aliyun.service
其中的aliyun要换成你自己的节点名字,例如有的是wg0
查看服务状态:
systemctl status wg-quick@aliyun.service
停止服务:
systemctl stop wg-quick@aliyun.service
卸载服务:
systemctl disable wg-quick@aliyun.service
Windows
windows中正常安装后,打开程序运行后会在系统托盘上留下图标。如果不希望通过启动UI方式来连接,可以使用以下命令生成一个系统服务(前提是需要提前写好配置文件):
#生成并启动wireguard服务
C:\Program Files\WireGuard\wireguard.exe /installtunnelservice "C:\path\to\some\myconfname.conf"
#卸载wireguard服务
C:\Program Files\WireGuard\wireguard.exe /uninstalltunnelservice myconfname
命令中的C:\path\to\some\myconfname.conf
就是你的配置文件的所在路径。
启动服务后,wireguard将创建一个与配置文件同名的新网络适配器。系统服务中也会生成对应的服务(名字为:WireGuardTunnel$myconfname),随系统自动启动。在后台自动运行。
请教博主,我想两端使用OpenWrt路由器组成LAN-LAN,请问这种情况下该怎么设置呢?能否出个教程啊
抱歉,我也不会
博主,代码不是开源的吗?手机侧必须得安装APP?有源码吗?开源级别是什么了?
Wireguard是开源的,安卓APP有没有开源不清楚
上面wg-quick down wg0应该是wg-quick down aliyun吧?
谢谢提醒,已更正
教程非常好、能否在增加一个节点、这个节点的网段和前两个不一样,模拟远程办公,aliyun节点,办公室thinkpad1节点~办公室服务器think pad2节点,家里macos节点,
家里要直接访问think pad2上面的服务,关键think pad2节点和ip和目前案例ip都不一样
可以的,只需要保证其中一台有公网IP即可
用阿里云服务器做中继流量不够啊