WireGuard 是一个易于配置、快速且安全的开源组网,它利用了最新的加密技术。目的是提供一种更快、更简单、更精简的通用 VPN,它可以轻松地在树莓派这类低端设备到高端服务器上部署。
IPsec 和 OpenVPN 等大多数其他解决方案是几十年前开发的。安全研究人员和内核开发人员 Jason Donenfeld 意识到它们速度慢且难以正确配置和管理。
这让他创建了一个新的开源 VPN 协议和解决方案,它更加快速、安全、易于部署和管理。
WireGuard 最初是为 Linux 开发的,但现在可用于 Windows、macOS、BSD、iOS 和 Android。它仍在活跃开发中。
除了可以跨平台之外,WireGuard 的最大优点之一就是易于部署。配置和部署 WireGuard 就像配置和使用 SSH 一样容易。
看看 WireGuard 设置指南。安装 WireGuard、生成公钥和私钥(像 SSH 一样),设置防火墙规则并启动服务。现在将它和 OpenVPN 设置指南进行比较——有太多要做的了。
WireGuard 的另一个好处是它有一个仅 4000 行代码的精简代码库。将它与 OpenVPN(另一个流行的开源 VPN)的 100,000 行代码相比。显然,调试 WireGuard 更加容易。
不要因其简单而小看它。WireGuard 支持所有最新的加密技术,例如 Noise 协议框架、Curve25519、ChaCha20、Poly1305、BLAKE2、SipHash24、HKDF 和安全受信任结构。
由于 WireGuard 运行在内核空间,因此可以高速提供安全的网络。
这些是 WireGuard 越来越受欢迎的一些原因。Linux 创造者 Linus Torvalds 非常喜欢 WireGuard,以至于将其合并到 Linux Kernel 5.6 中,在 5.6 内核中包含 WireGuard 很有可能扩展 WireGuard 的采用,从而改变当前的 VPN 场景。
OpenWrt 可以被描述为一个嵌入式的 Linux 发行版。(主流路由器固件有 dd-wrt,tomato,openwrt,padavan四类)对比一个单一的、静态的系统,OpenWrt的包管理提供了一个完全可写的文件系统,从应用程序供应商提供的选择和配置,并允许您自定义的设备,以适应任何应用程序。
对于开发人员,OpenWrt 是使用框架来构建应用程序,而无需建立一个完整的固件来支持;对于用户来说,这意味着其拥有完全定制的能力,可以用前所未有的方式使用该设备。
wget https://raw.githubusercontent.com/yobabyshark/wireguard/master/wireguard_install.sh && chmod +x wireguard_install.sh && ./wireguard_install.sh
安装后配置文件目录(/etc/wireguard/)里的文件:
wireguard/
├── client.conf #客户端配置文件
├── cprivatekey #客户端私钥
├── cpublickey #客户端公钥
├── sprivatekey #服务端私钥
├── spublickey #服务端公钥
└── wg0.conf #服务端配置信息
如果在Centos7操作,注意跑下yum update(对内核版本有要求)
系统转发注意开启
net.ipv4.ip_forward = 1
wg show wg0 #查看wg0虚拟网卡当前状态
systemctl status wg-quick@wg0
systemctl restart wg-quick@wg0
开启关闭wg指令:
wg-quick up wg0
wg-quick down wg0
[Interface]
Address = 10.0.0.1/24
SaveConfig = true
PostUp = firewall-cmd --zone=public --add-port 3306/udp && firewall-cmd --zone=public --add-masquerade
PostDown = firewall-cmd --zone=public --remove-port 3306/udp && firewall-cmd --zone=public --remove-masquerade
ListenPort = 3306
PrivateKey = 4KQWlx+Md0I5uHj+D9DjJZAwpTFFjG7E03/9FFjjJ3o=
[Peer]
PublicKey = 6enJBddxwwaIrD4lV6g9Uiz+RDmh7NGmyYrFbGpJuF0=
AllowedIPs = 10.0.0.2/32
[Interface]
ListenPort = 8002 #本机监听 WireGuard 端口
PrivateKey = 填写本机的 privatekey 内容 #本机加密私钥
DNS = 1.1.1.1 #强制本机使用 DNS 服务器
MTU = 1300 #强制本机使用指定 MTU 值
#Table = 100 #强制本机将注入系统的路由的 table 指定为 100 ( 系统默认为 255 和 254 )
#PostUp = ip rule add from 10.10.1.0/24 table 100 ; ip rule add from 10.10.2.0/24 table 100
#PreDown = ip rule delete from 10.10.1.0/24 table 100 ; ip rule delete from 10.10.2.0/24 table 100
[Peer]
PublicKey = 填写对端的 publickey 内容 #本机加密的对端公钥(加密后数据仅对端可以解密)
AllowedIPs = 172.16.1.11/32 #本机允许的对端设备的 IP 地址段,其实就是在本机中这个虚拟网卡对端都有哪些设备 IP 地址(多 peer 不可重复)
Endpoint = another.domain.name:8001 #对端 WireGuard 的外部 IP(可以有一侧的 IP 地址是虚假的公网 IP)
PersistentKeepalive = 25 #当会话存在一端 IP 地址为 NAT 地址或虚假公网 IP 地址时,由该方阶段性每 25 秒发送 keepalive 报文保持会话的可用性,防止被设备终止。
1、如果你存在多个 [Peer] ,则在下面直接增加一个新的 [Peer] 栏目
2、如果多个 Peer 存在不同的 IP,请不要让 AllowedIPs 存在重叠的 IP 地址段(比如配置多个相同/24 只有一个生效)
3、Endpoint 既支持以域名的方式访问,也支持以 IP 的方式访问。
4、会话链接的建立只要保证两端数据在一台设备上成功协商,即使有一端 IP 地址后期变更过也不会影响 VPN 的稳定性。
5、使用命令 wg 可以看到当前服务的运行情况。
6、如果你是本来打算连服务器的移动端,则在配置中你需要将移动端的 "AllowedIPs =" 补写一条内容 0.0.0.0/0,::0 以允许所有流量
7、前面标注 # 的三条内容,作为 iproute2 的使用方式,通过指定路由条目的 table 与 ip rule 联动控制策略流量转发。
8、PreUp,PostUp,PreDown,PostDown 这四个命令参数,是作为 wg-quick 快速设置/删除接口之前/之后由 bash(1)执行的四条命令,常用于配置自定义 DNS 或防火墙规则。 特殊字符串 %i 作为变量替代所控制的 INTERFACE 配置名。 每个命令参数都支持多条命令,参数内的多条命令将按前后顺序依次执行。
软件和更新 勾选源代码后打开软件更新器,进行更新。
sudo apt install resolvconf
sudo apt-get update && sudo apt-get upgrade
sudo apt install wireguard
sudo apt install wireguard
WireGuard 作为一个内核模块运行,它被编译成一个 DKMS 模块。在成功的时候,你将看到下面的输出:
Running module version sanity check.
- Original module
- No original module exists within this kernel
- Installation
- Installing to /lib/modules/4.15.0-88-generic/updates/dkms/
depmod...
DKMS: install completed.
当你升级内核,WireGuard 模块将会针对新内核进行编译。
WireGuard 包含两个工具,名为wg和wg-quick,它允许你配置和管理 WireGuard 接口。
运行下面的命令,生成公钥和私钥:
wg genkey | sudo tee /etc/wireguard/privatekey | wg pubkey | sudo tee /etc/wireguard/publickey
文件将会被生成在/etc/wireguard目录。你可以通过使用cat或者less来查看文件。私钥永远不要共享给任何人。
现在密钥已经被生成好了,我们需要配置隧道设备,用来引导 VPN 流量。
这个设备可以通过命令行使用ip和wg或者通过文本编辑器创建配置文件来设置。
创建一个名为wg0.conf的文件,并且添加下面的内容:
sudo nano /etc/wireguard/wg0.conf
[Interface]
Address = 10.0.0.1/24
SaveConfig = true
ListenPort = 51820
PrivateKey = SERVER_PRIVATE_KEY
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o ens3 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o ens3 -j MASQUERADE
这个接口可以被命名为任何东西。不管怎么样,我们推荐使用类似wg0或者wg0进行命名。这个接口中的设置意义如下:
- Address - 一个使用逗号分隔的 v4 或者 v6 IP 地址列表,用于wg0接口。使用 局域网 IP 范围(10.0.0.0/8, 172.16.0.0/12 or 192.168.0.0/16)。
- ListenPort - WireGuard 将会接受进入连接的端口
- PrivateKey - 一个由wg genkey命令生成的私钥。(想要查看文件内容:sudo cat /etc/wireguard/privatekey)
4.SaveConfig - 当设置为 true 时,在关机时,当前接口状态将会被保存到配置文件中。- PostUp - 在接口启动时执行的命令或者脚本。在这个例子中,我们使用 iptables 来启用 伪装。 这将允许流量离开服务器,使得 VPN 客户端可以访问网络。 确保替换 -A POSTROUTING 后面的 ens3 为你的公开网络接口名称。你可以通过下面的命令很容易地找到这个接口:
ip -o -4 route show to default | awk '{print $5}'
PostDown - 在接口停用之前执行的命令或者脚本。一旦接口停止,iptables 规则将会被移除。
wg0.conf和privatekey文件不应该对普通用户可读。使用 chmod 将权限修改为 600。
sudo chmod 600 /etc/wireguard/{privatekey,wg0.conf}
一旦完成,使用配置文件中的指定配置,将wg0接口启用:
sudo wg-quick up wg0
这个命令将会产生类似下面的输出:
ip link add wg0 type wireguard
wg setconf wg0 /dev/fd/63
ip -4 address add 10.0.0.1/24 dev wg0
ip link set mtu 1420 up dev wg0
iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o ens3 -j MASQUERADE
运行wg show wg0来检查接口状态和配置:
sudo wg show wg0
输出:
interface: wg0
public key: r3imyh3MCYggaZACmkx+CxlD6uAmICI8pe/PGq8+qCg=
private key: (hidden)
listening port: 51820
你也可以运行ip a show wg0来验证接口状态:
ip a show wg0
输出:
4: wg0: mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
link/none
inet 10.0.0.1/24 scope global wg0
valid_lft forever preferred_lft forever
启用 WireGuard 开机启动,运行下面的命令:
sudo systemctl enable wg-quick@wg0
下面是热操作:
手动添加client:
wg set wg0 peer sVVhQ5Wqx3GGTMmpg0/hxrJdTUUiRpoBDMa1im+5zW8= allowed-ips 10.0.0.206/32
手动删除client:
wg set wg0 peer sVVhQ5Wqx3GGTMmpg0/hxrJdTUUiRpoBDMa1im+5zW8= allowed-ips 10.0.0.206/32 remove
保存client参数:
wg-quick save wg0
客户端采用刷过openwrt的路由器Newifi-D2(新路由3),先刷breed刷不死,然后刷固件下载:提取码: s35k
不要在luCI下安装wireguard,请手动安装:
BusyBox v1.30.1 () built-in shell (ash)
_______ ________ __
| |.-----.-----.-----.| | | |.----.| |_
| - || _ | -__| || | | || _|| _|
|_______|| __|_____|__|__||________||__| |____|
|__| W I R E L E S S F R E E D O M
-----------------------------------------------------
OpenWrt 19.07.0, r10860-a3ffeb413b
-----------------------------------------------------
root@OpenWrt:~# opkg update
一堆列表忽略,Signature check passed.结束
root@OpenWrt:~# opkg install wireguard luci-proto-wireguard luci-app-wireguard
root@OpenWrt:~# reboot
刷新web,在Status界面能看到WireGuard Status
Network里添加->Interfaces->Add new interface
随便起个名字,协议选 WireGuard 进行配置。
Linux(Centos/ubuntu等)同服务端一样安装就可以了,下面是其它系统的下载地址:
Windows客户端下载:https://github.com/WireGuard/wireguard-windows
Android客户端下载:https://github.com/WireGuard/wireguard-android
Mac、IO客户端下载:https://github.com/WireGuard/wireguard-apple
/etc/wireguard目录:
.
├── privatekey 内容:XXXXXe+Ecs/0JcllkOgLnVfFflxEqJYOdkxV04CLNnE=
├── publickey 内容:AAAAAx+Md0I5uHj+D9DjJZAwpTFFjG7E03/9FFjjJ3o=
└── wg0.conf
wg0.conf
[Interface]
Address = 10.0.0.1/24
SaveConfig = true
PostUp = firewall-cmd --zone=public --add-port 3306/udp && firewall-cmd --zone=public --add-masquerade
PostDown = firewall-cmd --zone=public --remove-port 3306/udp && firewall-cmd --zone=public --remove-masquerade
ListenPort = 3306
PrivateKey = AAAAAx+Md0I5uHj+D9DjJZAwpTFFjG7E03/9FFjjJ3o=
[Peer]
PublicKey = CCCCC+3g/kCwgbg2cUZH2WJ5blrW6aosCEtvHuxUrgM=
AllowedIPs = 10.0.0.2/32
使用命令查看本机的公key:
[root@iZ2ze40hk90drfbc9dtqdtZ ~]# wg
interface: wg0
public key: BBBBB/z51gbZi+knGMzWyOFoGfs1UaNMhsjw7w2Az8Rg=
private key: (hidden)
listening port: 3306
peer: CCCCC+3g/kCwgbg2cUZH2WJ5blrW6aosCEtvHuxUrgM=
endpoint: 124.64.18.88:24830
allowed ips: 10.0.0.201/32
latest handshake: 31 seconds ago
transfer: 666.75 MiB received, 2.00 GiB sent
[Interface]
PrivateKey = WPiQk5i65zJ1MBHZG43OPX5M0YklV2S1pSwQZiVGuWg=
Address = 10.0.0.201/24
DNS = 114.114.114.114
[Peer]
PublicKey = BBBBB/z51gbZi+knGMzWyOFoGfs1UaNMhsjw7w2Az8Rg=
Endpoint = 59.110.225.63:3306
AllowedIPs = 0.0.0.0/0
root@ren-PowerEdge-R940xa:/home/ren# wg
interface: wg0
public key: CCCCC+3g/kCwgbg2cUZH2WJ5blrW6aosCEtvHuxUrgM=
private key: (hidden)
listening port: 59423
fwmark: 0xca6c
peer: BBBBB/z51gbZi+knGMzWyOFoGfs1UaNMhsjw7w2Az8Rg=
endpoint: 123.123.123.123:3306
allowed ips: 0.0.0.0/0
latest handshake: 16 seconds ago
transfer: 27.76 MiB received, 9.31 MiB sent
主要的设置是用wg命令查看本机的公钥,设置在对端的peer:项里,私钥不需要的
[Interface]
PrivateKey = vi7+LYOExeLAAlyrpuOI/Aw0TZVREb27h6AgYECO4HQ=
Address = 10.77.0.1/16
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -I FORWARD -s 10.77.77.1/24 -d 10.77.77.1/24 -j DROP; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -D FORWARD -s 10.77.77.1/24 -d 10.77.77.1/24 -j DROP; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
ListenPort = 37858
DNS = 8.8.8.8
MTU = 1420
[Peer]
PublicKey = 4KThNd592NvY8R4ItzjhSaZu307isMitVD/jFvP9uwY=
AllowedIPs = 10.0.0.0/8
[Peer]
Publickey = 2KziQGZeB9E5vb8khTLtDBxzAR0bR5pfqliWpGurR00=
#AllowedIPs = 10.0.0.0/8
添加两个接口(WG0为wireguard协议、CNET为移动内网eth0.3接口):
添加WG0接口:
添加switch交换机3:
防火墙添加两条规则:
添加路由:
说明:
路由器有5个网络口,在openwrt里可以单独对每个网口进行指定,这样设置是把网口1设置为上连互联网端口接光猫上网口,并供网口3、4、5进行上网,网口2接光猫设置的移动内网口,自动获取移动内网地址,供远端反向接入移动内网使用。
具体步骤:
1、新增interface接口两个,1个是wireguard协议的外连接口,配置好向公网服务器连接的参数,进行wg连接,另1个是指定网口2为单独一个网络接口供防火墙进行转发
2、增加一个switch交换机,把CPU同网口2进行交换并屏蔽1、3、4、5网口
3、添加两条防火墙规则,1条是CNET转发规则,1条是wireguard转发规则,对包进行伪装
4、添加一条静态路由,对10.64.0.0/24的包进行路由转发
5、在服务端也需要添加一条静态路由,把100.64.0.0、24的包转发到wg0接口
以上就是应用在中国移动家宽的语音专网的内网转发应用的全部设置。
显示二维码给客户端
yum -y install qrencode
qrencode -t ansiutf8 < client.conf