一、前言

因为家里宽带没有公网IP也不支持ipv6,一直使用 frps 作为内网穿透的工具。后来发现了 wireguard,于是就将家里的服务器与具有公网IP的云服务器组网,实现内网穿透功能。这里主要介绍 wireguard 的安装以及本人在用的两种组网方式,能够满足正常工作、学习所需了。

二、 安装 wireguard

wireguard 的安装,有内核版本的要求,所以低内核版本的系统,在安装时候需要先升级内核版本(5.0以上内核版本可以跳过)。因为本人使用的时 centos7 系统,所以这里介绍的升级内核是基于 centos7 的,其他系统请自行查阅。

1. 开启IPV4流量转发功能(中转的公网IP服务器必须配置)

echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
echo "net.ipv4.conf.all.proxy_arp = 1" >> /etc/sysctl.conf
sysctl -p

2. 内核版本升级(内核版本5.0以上不需要)

  • 下载最新内核版本
wget http://ftp.sjtu.edu.cn/sites/elrepo.org/linux/kernel/el7/x86_64/RPMS/kernel-ml-6.5.7-1.el7.elrepo.x86_64.rpm
  • 安装新内核
rpm -ivh kernel-ml-6.5.7-1.el7.elrepo.x86_64.rpm

3. 修改默认的内核版本(内核版本5.0以上不需要)

  • 查看当前实际的启动顺序
 grub2-editenv list
  • 查看内核插入顺序
grep "^menuentry" /boot/grub2/grub.cfg | cut -d "'" -f2
  • 设置默认的启动顺序
 grub2-set-default 'CentOS Linux (6.5.7-1.el7.elrepo.x86_64) 7 (Core)'
  • 重新创建内核配置
  grub2-mkconfig -o /boot/grub2/grub.cfg

4. 重启服务器

reboot
#重启成功后查看内核版本是否完成升级
uname -r

5. 安装wireguard

yum install epel-release https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm
yum install kmod-wireguard wireguard-tools -y

三、wireguard 组网方式

对于组网方式,这里只介绍本人常用的两种,也能够满足平时工作和学习所需。
现在以三个不同局域网的节点举例:

  • Peer1:腾讯云具备公网IP的服务端(其实不存在服务端客户端),组网IP 10.100.0.1
  • Peer2:家里局域网内的虚拟机(不具备公网IP),组网Ip 10.100.0.2,局域网IP 192.168.0.10
  • Peer3:放在公司的笔记本电脑(不具备公网IP),组网IP 10.100.0.5

1. 组网节点间直连

节点间直连是指,peer2 和 peer3 能通过组网IP互相访问,添加任意节点都能够通过组网IP互相访问。流量主要通过 Peer1 服务端转发实现,因此 Peer1 一定要开启内核流量转发功能(1. 开启IPV4流量转发功能

A. Peer1服务端配置

  • 配置连接加密的密钥
cd /etc/wireguard
wg genkey | tee privatekey | wg pubkey > publickey
  • 创建连接配置文件
#进入wireguard根目录
cd /etc/wireguard
#创建组网配置文件 wg0.conf
touch wg0.conf

将下面的配置写入到刚才创建的 wg0.conf 配置文件中。

[Interface]
PrivateKey = Peer1 刚才生成的私钥
Address = 10.100.0.1/24
PostUp = iptables -A FORWARD -i %i -j ACCEPT; 
PostUp = iptables -A FORWARD -o %i -j ACCEPT; 
PostUp = iptables -t nat -A POSTROUTING -o %i -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT;
PostDown = iptables -D FORWARD -o %i -j ACCEPT; 
PostDown = iptables -t nat -D POSTROUTING -o %i -j MASQUERADE
ListenPort = 51820

[Peer]
PublicKey = Peer2 节点生成的公钥 publickey
AllowedIPs = 10.100.0.2/24
PersistentKeepalive = 15

[Peer]
PublicKey = Peer3 节点公钥 publickey
AllowedIPs = 10.100.0.5/24
PersistentKeepalive = 15
  • 启动 wg 虚拟接口 wg0
 wg-quick up wg0

B. Peer2 Peer3 节点配置

  • 配置连接加密的密钥
cd /etc/wireguard
wg genkey | tee privatekey | wg pubkey > publickey
  • 创建连接配置文件
#进入wireguard根目录
cd /etc/wireguard
#创建组网配置文件 wg0.conf
touch wg0.conf

将下面的配置写入到刚才创建的 wg0.conf 配置文件中。

[Interface]
PrivateKey = 刚才生成的私钥
Address = Peer2或 Peer3的组网IP(10.100.0.2/24)

[Peer]
PublicKey = Peer1 节点公钥 publickey
Endpoint = Peer1公网IP:Peer1监听端口
AllowedIPs = 10.100.0.0/24
PersistentKeepalive = 15
  • 启动wg 虚拟接口 wg0
wg-quick up wg0

注:上面就是直连方式的配置,Peer2 与 Peer3 在直连方式种,配置除了组网IP和私钥的不同,其他都是相同的。流量经过Peer1转发,实现Peer2与 Peer3 直接通过组网IP相互访问。

2. Peer2 转发流量到内网设备

直连的形式已经能够实现内网穿透的功能,但是,还是有一些不足之处。因为,内部局域网中肯定不止一个设备需要访问,虽然也可以通过添加多个节点的形式,但那样就显得比较繁琐,并且每个设备都需要安装 wireguard。这种是不合理的,因此我们需要将 Peer2 节点 当作是内部局域网 wireguard 组网的网关,让Peer1、Peer3等节点通过直接使用内部局域网IP的形式访问内部设备。
例如:Peer 3 如果想远程登录内网IP地址为 192.168.1.35 的设备时(这里需要注意,Peer 3 的设备内网网段不能跟 Peer 2 的一样,虽然我没试过,但是直觉告诉我应该会有问题。。。),可以直接使用:ssh root@192.168.1.35

A. Peer1 配置优化

[Interface]
PrivateKey = Peer1 刚才生成的私钥
Address = 10.100.0.1/24
PostUp = iptables -A FORWARD -i %i -j ACCEPT; 
PostUp = iptables -A FORWARD -o %i -j ACCEPT; 
PostUp = iptables -t nat -A POSTROUTING -o %i -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT;
PostDown = iptables -D FORWARD -o %i -j ACCEPT; 
PostDown = iptables -t nat -D POSTROUTING -o %i -j MASQUERADE
ListenPort = 51820

[Peer]
PublicKey = Peer2 节点生成的公钥 publickey
AllowedIPs = 10.100.0.2/24,192.168.0.0/24
PersistentKeepalive = 15

[Peer]
PublicKey = Peer3 节点公钥 publickey
AllowedIPs = 10.100.0.5/24
PersistentKeepalive = 15

B. Peer2配置优化

[Interface]
PrivateKey = Peer2 生成的私钥
Address = 10.100.0.2/24
PostUp = iptables -A FORWARD -i %i -j ACCEPT
PostUp = iptables -A FORWARD -o %i -j ACCEPT
#这里的-s 后面为组网IP --to-source 后面为Peer2所在内网的IP地址
PostUp = iptables -t nat -A POSTROUTING -s 10.100.0.0/24 -j SNAT --to-source 192.168.0.10
PostDown = iptables -D FORWARD -i %i -j ACCEPT
PostDown = iptables -D FORWARD -o %i -j ACCEPT
PostDown = iptables -t nat -D POSTROUTING -s 10.100.0.0/24 -j SNAT --to-source 192.168.0.10 

[Peer]
PublicKey = Peer1 节点公钥 publickey
Endpoint = Peer1公网IP:Peer1监听端口
AllowedIPs = 10.100.0.0/24
PersistentKeepalive = 15

C. Peer3 配置优化

[Interface]
PrivateKey = Peer3生成的私钥
Address = 10.100.0.5/24

[Peer]
PublicKey = Peer1 节点公钥 publickey
Endpoint = Peer1公网IP:Peer1监听端口
#要注意的是,Peer2内网IP网段不能跟Peer3的内网网段一样
AllowedIPs = 10.100.0.0/24,192.168.0.0/24
PersistentKeepalive = 15

配置结束后重启三台设备上的 wireguard 服务,就能够在Peer1和 Peer3上面通过内部设备IP直接访问Peer2内部局域网的设备了!