一、前言

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

二、 安装 wireguard

wireguard 的安装,有内核版本的要求,所以低内核版本的系统在安装时候需要先升级内核版本(5.0以上内核版本可以跳过)。本文最后会介绍 Centos7 升级内核的步骤方法,其他系统请自行查阅资料。内核升级有风险,请谨慎升级!

  • 开启内核流量转发
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
echo "net.ipv4.conf.all.proxy_arp = 1" >> /etc/sysctl.conf
sysctl -p
  • centos 7 安装 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 一定要开启内核流量转发功能

  • Peer 1 节点配置
# 进入配置目录
cd /etc/wireguard
# 生成加密的密钥
wg genkey | tee privatekey | wg pubkey > publickey
# 创建组网配置文件 wg0.conf,具体配置参考下面
touch wg0.conf
# 配置修改完成后,启动wg0接口
wg-quick up wg0

将下面的配置写入到刚才创建的 wg0.conf 中去,里面的私钥和公钥以及组网IP,根据自己的配置替换

[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
  • Peer2 和 Peer3 节点配置
# 进入配置目录
cd /etc/wireguard
# 生成加密的密钥
wg genkey | tee privatekey | wg pubkey > publickey
# 创建组网配置文件 wg0.conf,具体配置参考下面
touch wg0.conf
# 配置修改完成后,启动wg0接口
wg-quick up wg0

将下面的配置写入到刚才创建的 wg0.conf 中去,里面的私钥和公钥以及组网IP,根据自身配置修改。

[Interface]
PrivateKey = Peer2 或者 Peer3 生成的私钥
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

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

2. Peer2 节点作为网关,转发内网设备

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

  • 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
  • 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
  • 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内部局域网的设备了!

四、升级内核

  • 下载最新内核版本
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
  • 设置默认的内核版本启动顺序
# 查看当前实际的启动顺序
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
  • 重启服务器
reboot
#重启成功后查看内核版本是否完成升级
uname -r