使用Wireguard设置家庭VPN服务

使用Wireguard设置家庭VPN服务

动机

对于像我这样对安全性有一定了解的极客,可能有很多原因想要设置家庭VPN服务:

  1. 通过屏幕共享访问您的家用计算机,而无需将其暴露在Internet上(从而不会暴露给潜在的犯罪分子)。
  2. 访问带有IP白名单的服务器。
  3. 在旅行时访问限制ip的内容,例如Netflix。
  4. 在不安全的WiFi网络下浏览。
  5. 在有限制的公司内网使用被限制的服务。

我有时会遇到上边这些情况,在我尝试过 OpenVPN之后,我决定尝试Wireguard,这是一种相当新的VPN软件,有望消除某些复杂性。 OpenVPN或IPSec,同时提供安全(快速)连接。如果您(像我一样)通常不做很多网络工作并且不了解所有来龙去脉,那么进行设置可能会有些棘手。

重要说明

对于Wireguard,没有专用的服务器或客户端,只有“peers”。对于此处描述的设置,一侧将充当服务器,另一侧将充当客户端,因此为了清楚起见,我将使用这些术语来描述它们。

安装Wireguard服务器

Wireguard的官方安装页面上包含有关许多不同平台的说明。我的Wireguard服务器位于RaspberryPi(运行Raspbian Buster)上,因此我遵循了Debian的说明,效果很好。

这些说明的其余部分应该可以在任何其他UNIX-y服务器上运行(或者,如果您的速度更高,甚至可以在Docker容器中运行Wireguard)。

安装完成后,我们可以继续进行。

配置Wireguard服务器,第1部分

生成私钥

在Wireguard服务器上运行wg genkey,然后将其复制,以便我们将其用于服务器配置文件。顾名思义,私钥应保持私密,以确保VPN连接的安全性。

对于此示例,我们将使用6NJepbdEduV97+exampleprivatekeydontusethis=-请勿 在您的实际设置中使用该密钥,而是生成您自己的密钥。

服务器配置文件

编辑(或创建)文件,/etc/wireguard/wg0.conf使其看起来像这样:

[Interface]
PrivateKey = 6NJepbdEduV97+exampleprivatekeydontusethis=
Address = 10.14.0.0/24
ListenPort = 51820

#replace eth0 with the interface open to the internet (e.g might be wlan0 if wifi)
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

在这里,我们将其10.14.0.0/24用作Wireguard服务器的“地址”。在/24 末意味着我们将要使用的所有IP地址的子网从10.14.0.1到10.14.0.254。

这是从我的家庭局域网一个独立的IP网络,并且应该不会与它重叠。然后,连接VPN客户端将使用该网络内的IP,并能够通过路由访问我的LAN,稍后我们将进行设置。

配置Wireguard客户端,第1部分

在我的示例中,我使用的是适用于macOSWireguard客户端,但所有客户端的配置文件格式均相同,因此您应该能够使用自己喜欢的任何版本。在前面提到的Wireguard安装页面上,有指向macOS,Android,iOS,Windows以及大量Linux和BSD的客户端的链接 。

首先,首先创建一个新隧道:

创建了一个新隧道

PrivateKey创建新隧道时,macOS客户端会填写该字段。如果您的客户端没有,则可以wg genkey 使用我们上面使用的命令在服务器上生成一个。它不应与服务器配置中使用的私钥相同。

复制生成的公共密钥(再次,MacOS的客户端自动生成对我们来说),所以我们可以把它的服务器配置。

配置Wireguard服务器,第2部分

在服务器上,/etc/wireguard/wg0.conf再次编辑。

在我们在步骤1中添加的配置下面,添加以下内容:

[Peer]
# My laptop (this is just a comment, change it to identify the device)
PublicKey = SOMETHINGSOMETHING+clientpublickeyhere=
AllowedIPs = 10.14.0.10/32

填写客户的公钥。

中的IP地址AllowedIPs决定10.14.0.0/24了应允许我们在服务器()上设置的子网内的哪个IP地址,客户端可以使用该IP地址。 10.14.0.10/32意味着客户端将必须使用IP 10.14.0.10,因此一次只能有一个活动连接。

我认为这是一个合理的配置。如果要连接多个设备,则应使用单独的公用/专用密钥,并为它们提供不同的IP地址。

添加完后,我们就可以启动来启动Wireguard服务器了sudo wg-quick up wg0

这将输出如下内容:

[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -4 address add 10.14.0.0/24 dev wg0
[#] ip link set mtu 1420 up dev wg0
[#] iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

完成后,通过运行来检查服务器状态sudo wg。那应该输出如下:

interface: wg0
  public key: ASDFJKASDFSERVERPublicKEyHERE=
  private key: (hidden)
  listening port: 51820

peer: SOMETHINGSOMETHING+clientpublickeyhere=
  allowed ips: 10.14.0.10/32

从状态信息中复制服务器的公钥,以便我们可以使用它来配置客户端。

配置Wireguard客户端,第2部分

现在服务器正在运行,我们拥有配置客户端所需的一切。

编辑我们之前创建的隧道,并将配置更改为以下内容(保留我们先前设置的私钥,使其与服务器配置中的公钥匹配):

[Interface]
PrivateKey = SOMETHINGSOMETHING+clientprivatekeyhere=
Address = 10.14.0.10/32
DNS = 10.42.0.1

[Peer]
PublicKey = ASDFJKASDFSERVERPublicKEyHERE=
AllowedIPs = 0.0.0.0/0, ::/0
Endpoint = you.example.net:51820

在采用此配置供您自己使用时,需要注意一些重要事项:

  1. PublicKey必须的公共密钥服务器。每一方都有自己的 私有密钥和其他方面的公共密钥。

  2. Address[Interface]的上部分客户应该匹配 AllowedIPs在组[Peer]服务器上的一节。

  3. AllowedIPs客户端上的IP地址确定通过VPN连接路由的IP地址。在这里,我们0.0.0.0/0用作通配符,要求所有 流量都通过VPN发送。由于动机部分中所述的原因2-5,这就是您所需要的。如果您只想通过VPN访问您的家庭LAN,并使用常规网络连接进行其他操作,请填写其网络,例如192.168.1.0/24

    ::/0 对于IPv6也是一样。

  4. DNS条目定义了尝试通过VPN访问网络时将使用的DNS服务器。在此示例中,这是我的家庭局域网中路由器的IP地址。

  5. Endpoint是主机名(或IP地址)加上可以访问Wireguard服务器的端口号。如果您拥有普通的家庭局域网,则需要在家庭路由器中设置端口转发,以使Wireguard服务器可从Internet访问。

    路由器之间的实现方式不同,因此我无法提供更多细节。

    如果您没有静态IP,则可能还需要设置动态DNS。

最后的润色

为了允许连接到Wireguard服务器的客户端连接到您的LAN(和Internet),您需要将服务器配置为充当路由器。

在Raspbian上,这是通过编辑/etc/sysctl.conf和编辑 net.ipv4.ip_forwardsay来完成的net.ipv4.ip_forward=1。如果该行尚不存在,请添加它。

对于IPv6路由,也请net.ipv6.conf.all.forwarding=1在同一文件中进行设置。

您还希望Wireguard在重新启动时自动启动。在Raspbian上,这是通过运行以下命令完成的:

sudo systemctl enable wg-quick@wg0

完成此操作后,尝试重新启动以查看所有内容是否正确加载,并确保正确加载了我们启用的IP转发。

重启后,运行sudo wg应该会提供与以前相同的输出,表明Wireguard服务器正在按预期运行。

试试看

完成所有操作后,您应该可以在MacOS上进行连接,这可以通过此激活按钮(已编辑的敏感详细信息)实现:

连接对话框,不活动

如果一切顺利,您应该会看到信息更改,以指示数据正在通过VPN连接流动,如下所示:

连接对话框,活动中

如您所见,我已经设置了多个隧道配置,一个转发所有流量,另一个仅提供对家庭LAN的访问。

interface: wg0
  public key: ASDFJKASDFSERVERPublicKEyHERE=
  private key: (hidden)
  listening port: 51820

peer: SOMETHINGSOMETHING+clientpublickeyhere=
  endpoint: 11.22.44.88:55393
  allowed ips: 10.14.0.10/32
  latest handshake: 51 seconds ago
  transfer: 284.68 KiB received, 421.42 KiB sent
评论

Steve

登录过29天

分享&发布