一、前言
因为家里宽带没有公网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内部局域网的设备了!