由于WireGuard 将成为未来Linux 5.6内核的一部分,因此我决定了解如何最好地将此VPN与Raspberry Pi上的LTE路由器/接入点集成。设备
- 具有LTE模块和公共IP地址的Raspberry Pi 3。将会有一个VPN服务器(以下简称edgewalker)
- 应该使用VPN进行所有通信的Android手机
- 仅在网络内部使用VPN的Linux笔记本电脑
连接到VPN的每个设备都必须能够连接到所有其他设备。例如,如果两个设备都是VPN的一部分,则电话应该能够连接到便携式计算机上的Web服务器。如果设置非常简单,则可以考虑通过VPN连接到VPN和桌面。鉴于有线和无线连接的安全性越来越小(针对性攻击,针对WPA2黑客的KRACK攻击和针对WPA3的Dragonblood攻击),我认真考虑了在我的所有设备上使用WireGuard的可能性,无论它们在什么环境下工作。软件安装
WireGuard 为大多数Linux,Windows和macOS发行版提供了预编译的软件包。Android和iOS应用程序通过应用程序目录交付。我拥有最新的Fedora Linux 31,并且在安装之前我懒得阅读手册。我只是找到了软件包wireguard-tools
,安装了它们,然后我不明白为什么什么都不起作用。进一步的研究表明,我没有安装软件包wireguard-dkms
(带有网络驱动程序),并且不在我的发行版存储库中。如果我阅读了说明,则将采取正确的步骤:$ sudo dnf copr enable jdoss/wireguard
$ sudo dnf install wireguard-dkms wireguard-tools
我已经在Raspberry Pi上安装了Raspbian Buster分发工具包,那里已经有一个软件包wireguard
,请安装它:$ sudo apt install wireguard
在Android手机上,我从Google App Store的官方目录中安装了WireGuard VPN应用程序。密钥安装
对于主机身份验证,Wireguard使用简单的私钥/公钥方案对VPN主机进行身份验证。您可以使用以下命令轻松创建VPN密钥:$ wg genkey | tee wg-laptop-private.key | wg pubkey > wg-laptop-public.key
$ wg genkey | tee wg-server-private.key | wg pubkey > wg-server-public.key
$ wg genkey | tee wg-mobile-private.key | wg pubkey > wg-mobile-public.key
这给了我们三个密钥对(六个文件)。我们不会在配置文件中引用这些文件,而是在此处复制内容:每个键在base64中为一行。为VPN服务器(Raspberry Pi)创建配置文件
配置非常简单,我创建了以下文件/etc/wireguard/wg0.conf
:[Interface]
Address = 10.200.200.1/24
ListenPort = 51820
PrivateKey = <copy private key from wg-server-private.key>
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o wwan0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o wwan0 -j MASQUERADE
[Peer]
# laptop
PublicKey = <copy public key from wg-laptop-public.key>
AllowedIPs = 10.200.200.2/32
[Peer]
# mobile phone
PublicKey = <copy public key from wg-mobile-public.key>
AllowedIPs = 10.200.200.3/32
几点评论:- 在适当的位置,您需要使用键从文件中插入行
- 我的VPN使用内部范围
10.200.200.0/24
- 对于命令
PostUp
/ PostDown
我有一个外部网络接口wwan0,您可能还有另一个接口(例如eth0)
通过以下命令可以轻松解除VPN网络:$ sudo wg-quick up wg0
一个小细节:作为用于dnsmasq
绑定到网络接口的DNS服务器br0
,我还将设备添加wg0
到允许的设备列表中。在dnsmasq中,这是通过向配置文件添加带有网络接口的新行来完成的/etc/dnsmasq.conf
,例如:interface=br0
interface=wg0
另外,我添加了iptable规则,以允许到侦听UDP端口的流量(51280):$ sudo iptables -I INPUT -p udp --dport 51820 -j ACCEPT
现在一切正常,我们可以将VPN隧道设置为自动启动:$ sudo systemctl enable wg-quick@wg0.service
笔记本电脑上的客户端配置
在笔记本电脑上,/etc/wireguard/wg0.conf
使用相同的设置创建一个配置文件:[Interface]
Address = 10.200.200.2/24
PrivateKey = <copy private key from wg-laptop-private.key>
[Peer]
PublicKey = <copy public key from wg-server-public.key>
AllowedIPs = 10.200.200.0/24
Endpoint = edgewalker:51820
笔记:- 您需要指定公共IP或VPN服务器的主机,而不是edgewalker
- 通过设置
AllowedIPs
为10.200.200.0/24
,我们仅使用VPN访问内部网络。到所有其他IP地址/服务器的流量将继续通过“正常”开放渠道。还将使用笔记本电脑上的预配置DNS服务器。
对于测试和自动启动,我们使用相同的命令wg-quick
和systemd
:$ sudo wg-quick up wg0
$ sudo systemctl enable wg-quick@wg0.service
在Android手机上设置客户端
对于Android手机,创建一个非常相似的配置文件(我们称之为mobile.conf
):[Interface]
Address = 10.200.200.3/24
PrivateKey = <copy private key from wg-mobile-private.key>
DNS = 10.200.200.1
[Peer]
PublicKey = <copy public key from wg-server-public.key>
AllowedIPs = 0.0.0.0/0
Endpoint = edgewalker:51820
与笔记本电脑上的配置不同,电话必须将我们的VPN服务器用作DNS服务器(字符串DNS
),并且还必须通过VPN隧道(AllowedIPs = 0.0.0.0/0
)传递所有流量。您可以将文件转换为QR码,而不是将文件复制到移动设备:$ sudo apt install qrencode
$ qrencode -t ansiutf8 < mobile.conf
QR码将作为ASCII输出到控制台。您可以从Android VPN应用程序对其进行扫描,然后自动配置VPN隧道。结论
与OpenVPN相比,设置WireGuard太神奇了。