一、前言
因为家里宽带没有公网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