通过WireGuard实现内网穿透

简介

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

WireGuard APP

IOS

WireGuard APP

Windows

windows-client

快速开始

下面我们通过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),随系统自动启动。在后台自动运行。

《通过WireGuard实现内网穿透》上有9条评论

  1. 请教博主,我想两端使用OpenWrt路由器组成LAN-LAN,请问这种情况下该怎么设置呢?能否出个教程啊

  2. 教程非常好、能否在增加一个节点、这个节点的网段和前两个不一样,模拟远程办公,aliyun节点,办公室thinkpad1节点~办公室服务器think pad2节点,家里macos节点,

    家里要直接访问think pad2上面的服务,关键think pad2节点和ip和目前案例ip都不一样

发表评论

邮箱地址不会被公开。 必填项已用*标注