使用 WireGuard 和 Raspberry Pi 作为服务器设置简单的 VPN

因为 WireGuard 将成为一部分 在即将推出的 Linux 内核 5.6 中,我决定看看如何最好地将这个 VPN 与我的集成 Raspberry Pi 上的 LTE 路由器/接入点.

Оборудование

  • 具有 LTE 模块和公共 IP 地址的 Raspberry Pi 3。 这里会有一个VPN服务器(下文中称为 边缘行者)
  • 必须使用 VPN 进行所有通信的 Android 手机
  • Linux 笔记本电脑只能在网络内使用 VPN

连接到 VPN 的每台设备都必须能够连接到所有其他设备。 例如,如果笔记本电脑和手机都属于 VPN 网络,那么手机应该能够连接到笔记本电脑上的 Web 服务器。 如果设置非常简单,那么您可以考虑将桌面连接到 VPN(通过以太网)。

考虑到有线和无线连接随着时间的推移变得越来越不安全(有针对性的攻击, KRACK WPA2破解攻击 и 针对 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 手机上安装了该应用程序 线卫VPN 来自官方 Google 应用商店目录。

钥匙的安装

对于对等方身份验证,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

一个小细节:作为我使用的 DNS 服务器 dnsmasq 绑定到网络接口 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 [email protected]

笔记本电脑上的客户端配置

在笔记本电脑上创建配置文件 /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
  • 通过设置 AllowedIPs10.200.200.0/24,我们只使用VPN来访问内部网络。 到所有其他 IP 地址/服务器的流量将继续通过“正常”开放通道。 它还将使用笔记本电脑上预先配置的 DNS 服务器。

对于测试和自动启动,我们使用相同的命令 wg-quick и systemd:

$ sudo wg-quick up wg0
$ sudo systemctl enable [email protected]

在 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).

您可以将其转换为二维码,而不是将文件复制到移动设备:

$ sudo apt install qrencode
$ qrencode -t ansiutf8 < mobile.conf

QR 码将以 ASCII 形式输出到控制台。 您可以从 Android VPN 应用程序扫描它并自动设置 VPN 隧道。

结论

与 OpenVPN 相比,设置 WireGuard 简直是神奇。

来源: habr.com

添加评论