Linux 下安装 wireguard 组网,实现内网穿透功能

因为家里宽带没有公网IP也不支持ipv6,一直使用frps 作为内网穿透的工具。后来发现了wireguard 将家里的服务器与具有公网IP的云服务器组网,实现内网穿透功能。这里介绍wireguard的安装以及本人用过的两种组网方式。

Linux 安装 wireguard

1. 开启IPV4流量转发功能

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以上不需要)

安装wireguard需要内核版本在5.0以上,一般都需要升级内核版本,这里介绍 centos 下升级内核

  • 下载最新内核版本

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的server端,组网IP 10.100.0.1
  • Peer2:家里局域网内的虚拟机(不具备公网IP),组网Ip 10.100.0.2,局域网IP 192.168.0.10
  • Peer3:放在公司的笔记本电脑,组网IP 10.100.0.5

一、 组网节点间直连方式

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

1. Peer1服务端配置

  • 配置连接加密的密钥

cd /etc/wireguard
wg genkey | tee privatekey | wg pubkey > publickey

  • 创建连接配置文件

在 /etc/wireguard/ 目录下创建 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

2. Peer2 Peer3 节点配置

  • 配置连接加密的密钥

cd /etc/wireguard
wg genkey | tee privatekey | wg pubkey > publickey

  • 创建连接配置文件

在 /etc/wireguard/ 目录下创建 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相互访问。

二、Peer2转发,访问内部局域网设备方式

直连的形式已经能够实现内网穿透的功能,但是,内网设备肯定不止一个需要访问,虽然也可以通过添加多个节点的形式,但那样就显得比较繁琐,并且每个设备都需要安装wireguard。这种是不合适的,因此我们需要将Peer2节点当作是内部局域网 wireguard组网的网关,让Peer1、Peer3等节点通过直接使用内部局域网IP的形式访问内部设备(例如 Peer3 ssh 进内网 35 设备,可以直接使用 ssh root@192.168.1.35)

1. 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

2. 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

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