两个 LAN 之间的 Wireguard 连接,以及路由器后面的 Wireguard 盒

两个 LAN 之间的 Wireguard 连接,以及路由器后面的 Wireguard 盒

我有两个家庭 LAN(相距 100 公里)通过互联网提供商路由器连接到互联网,并希望它们通过两台单板计算机(NanoPi R2S)与wireguard VPN 连接。 NanoPi R2S 板已经安装了armbian 和wireguard。

其中一个互联网连接具有静态和其他动态互联网 IP。两者都是在动态DNS中输入的,现在我有机会在nanopis上安装动态DNS客户端,因为路由器上的客户端不能很好地工作。我可以通过两个互联网路由器上的 NAT 虚拟服务器功能公开wireguard 计算机。

站点A:

  • 静态公网 IP AAAA 和名称 sitea
  • LAN 192.168.0.0/24,默认网关 192.168.0.1
  • NanoPi eth0 带 DHCP 预留 192.168.0.250

站点B:

  • 动态公共 IP BBBB 和名称 siteb
  • LAN 192.168.1.0/24,默认网关 192.168.1.1
  • NanoPi eth0 带 DHCP 预留 192.168.1.250

我认为站点 B 会建立从动态 IP 站点到站点 B 公开的服务器端口的连接。

那么站点 A (192.168.0.0/24) 上的所有计算机都应该有一条附加路由,该路由将通过 192.168.0.250 将流量引导至站点 B (192.168.1.0/24)。同样,站点 B (192.168.1.0/24) 上的所有计算机都应具有通过 192.168.1.250 引导站点 A (192.168.0.0/24) 流量的路由。那行得通吗?

我应该为 wg0 接口分配哪些 IP? 10.0.0.0/24?那么路线会是什么样子呢?那么如何路由 10.0.0.0/24 流量呢?我需要路由它吗?我应该如何配置wireguard?我想我不需要wireguard的确切命令。我只需要指导,如何组织流量(IP、路由)。

使用 eth0 和 wg0,NanoPi R2S 需要 eth0 来进行双向流量。我是否可以轻松地使用 NanoPi (lan0) 上的另一个以太网端口来增加吞吐量或将一个端口专用于wireguard,另一个端口专用于 LAN?如何?

如果我将设备(手机、笔记本电脑)从一个站点移动到另一个站点并连接到 WiFi/DHCP,情况又如何呢?我可能每次都必须输入路由,因为站点 A 中的路由会在另一个站点 B 上造成混乱,反之亦然。我知道其中一台路由器允许输入一些静态路由,但我需要弄清楚它们的用途。

答案1

解决方案非常简单,但是,我没有在互联网上找到任何关于如何制作此类站点到站点 VPN 的描述。因此,我决定在这里发布一个适合我的解决方案。

免责声明:此解决方案仅适用于 IPv4。由于我的 ISP 之一不提供任何 IPv6,因此我没有配置 IPv6。这还有待未来的改进。

IP转发

首先需要启用 IP 转发,因此 nanopi 会将流量从一个接口转发到另一个接口。一条线

net.ipv4.ip_forward=1

应该存在于/etc/sysctl.conf或 中的某个.conf文件中/etc/sysctl.d/。运行sysctl -pservice procps reload(取决于 Linux 发行版),或者重新启动以使更改生效。

钢丝卫士

我不会详细介绍如何配置wireguard。互联网上有很多这样的内容。我将只写一些在我的案例中使用的网络细节,并指出我在/etc/wireguard/wg0.conf.正如问题中提到的,有两个网站:

  1. 192.168.0.0/24nanopi 充当wireguard 服务器,接口10.0.0.1上带有wireguard 地址wg0
  2. 192.168.1.0/24nanopi 充当wireguard 客户端,接口10.0.0.2上带有wireguard 地址wg0

变化/etc/wireguard/wg0.conf有:

第一的,添加了一条指令来阻止 wg-quick 设置其 ip 规则和路由。一行Table = off添加到[Interface]部分:

Table = off

第二,添加一条路由以通过 VPN 连接引导流量。再次在[Interface]部分:

PostUp = ip route add 192.168.1.0/24 via 10.0.0.2 dev wg0
PreDown = ip route del 192.168.1.0/24 via 10.0.0.2 dev wg0

上面的行来自第一个站点,并告诉内核将另一个网络 () 的所有流量通过 device 路由到 VPN ()192.168.1.0/24另一端连接的 IP 。在另一个站点上,配置中的 IP 编号不同(、 和)。10.0.0.2wg0192.168.0.0/2410.0.0.1

第三,充当wireguard 客户端的第二台wireguard 计算机Endpoint在本节中定义了[Peer],而充当服务器的第一台wireguard 计算机则没有。该端点是公共 IP 和端口,可以访问服务器 nanopi。在路由器上,服务器 nanopi 必须暴露在互联网上才能允许传入连接。在服务器wireguard计算机所在的站点上,互联网路由器应具有NATPort forwarding类似的东西。在wireguard 连接的端口上应该有UDP,转发到wireguard 服务器IP 和端口的IP 和端口。我不会在这里展示这一点,因为每个路由器都有不同的 GUI 用于设置。

路由和 DHCP

现在,当wireguard连接工作时,您应该能够通过VPN访问另一个站点上的nano pi。登录192.168.0.250( 10.0.0.1on wg0) 时,应该能够 ping(或登录)10.0.0.2,反之亦然。但是,两个网络上的其他客户端不知道如何通过 VPN 到达那里。他们有一个默认网关,转发所有不属于本地网络的流量。由于来自其他站点的地址不是本地地址,因此应通过 VPN 的所有流量都会通过 ISP 路由器传至互联网。

一种方法是在网络上的每个设备上添加自定义静态路由。有些人允许这样做,但很多人不允许。 Windows 或 Linux 计算机可以选择添加路由。在 Android 设备上这已经是一个问题了。因此,应该找到其他解决方案,不需要在每台设备上设置静态路由。

如果 ISP 路由器具有添加自定义路由的选项,则可以添加此类路由。我无法在这里展示到底如何实现这一点。一般来说,来自另一个站点的所有地址(例如192.168.0.0带有网络掩码24255.255.255.0应重定向到192.168.1.250)。

如果不可能,我建议在 nanopi 上设置 DHCP 服务器并在 ISP 路由器上禁用 DHCP 功能。isc-dhcp-server几乎可以安装在所有 Linux 发行版上,并且该服务器可以向网络上的所有客户端发送正确的路由信息​​,只要它们使用 DHCP。我不会详细介绍 DHCP 服务器配置。这是一个示例/etc/dhcp/dhcpd.conf

default-lease-time 600;
max-lease-time 7200;

option subnet-mask 255.255.255.0;
option broadcast-address 192.168.0.255;
option routers 192.168.0.1;
option domain-name "localdomain";
option domain-name-servers 192.168.0.250;

option rfc3442-classless-static-routes code 121 = array of integer 8;
option ms-classless-static-routes code 249 = array of integer 8;

option rfc3442-classless-static-routes 24, 192, 168, 1, 192, 168, 0, 250, 0, 192, 168, 0, 1;
option ms-classless-static-routes 24, 192, 168, 1, 192, 168, 0, 250, 0, 192, 168, 0, 1;

subnet 192.168.0.0 netmask 255.255.255.0 {
    range 192.168.0.150 192.168.0.229;

    default-lease-time 86400;
    max-lease-time 172800;
}

host staticip {
    default-lease-time 86400;
    max-lease-time 172800;

    hardware ethernet aa:bb:cc:dd:ee:ff;
    fixed-address 192.168.0.4;
}

dhcp 配置中的所有内容都非常标准。 DHCP 正在分配从192.168.0.150到 的地址192.168.0.229。根据您的喜好更改它。

我应该指出这些行option rfc3442...option ms-classless...。它们定义 DHCP 发送路由信息的选项。一种适用于遵循 RFC 3442 的客户端,另一种适用于使用其他选项的 Microsoft 客户端。这些数字24, 192, 168, 1, 192, 168, 0, 250, 0, 192, 168, 0, 1的含义如下:

  1. 第一个静态路由:
    • 24- 网络掩码大小
    • 192, 168, 1- 上面定义的网络掩码的前缀
    • 192, 168, 0, 250- 上面定义的网络的网关
  2. 第二条静态路由:
    • 0- 网络掩码大小(默认网关)
    • 没有网络,因为上面的掩码是0
    • 192, 168, 0, 1- 上面定义的网络的网关

此处还必须提供默认路由,因为如果通过 DHCP 接收此信息,则默认路由应在客户端上被忽略。

dchp 配置文件的末尾有一个示例,说明如何为将拥有静态 IP 地址的客户端进行 DHCP 预留。输入您的硬件以太网 (MAC) 地址和所需的 IP。

防火墙

现在,一个网络的客户端应该能够通过wireguard VPN 访问另一网络上的客户端,前提是防火墙允许流量通过。

如果您的 VPN 计算机上有防火墙(例如 nanopi),它可能不允许流量进入。根据您的偏好和环境的安全要求制定防火墙规则。您可以打开 VPN 计算机上需要通过的每个单独端口,也可以打开所有端口(如果处于受信任的环境中)。一种方法是使用firewall-cmd命令。这是一个例子:

# set "trusted" as a default zone
firewall-cmd --set-default-zone=trusted

# see in which zones the interfaces are
firewall-cmd --get-active-zones

# you may have to remove eth0 from the zone where it belongs to (public in this case)
firewall-cmd --permanent --zone=public --remove-interface=eth0
# add eth0 to trusted zone
firewall-cmd --permanent --zone=trusted --add-interface=eth0

# you may have to remove wg0 from the zone where it belongs to (public in this case)
firewall-cmd --permanent --zone=public --remove-interface=wg0
# add wg0 to trusted zone
firewall-cmd --permanent --zone=trusted --add-interface=wg0

# reload the new config
firewall-cmd --reload

然后,每个设备上都有防火墙可以阻止传入流量。通常,Windows 防火墙仅允许来自“本地网络”的某些连接。另一个站点不在本地网络上,因此服务器将阻止通过 VPN 传入的连接。您必须192.168.1.0/24为阻止特定连接的每个规则添加另一个网络(例如)。例如,对于 Windows 共享,您必须更改计算机共享上端口 135-139 和 445 的所有传入规则。同样,您必须更改访问共享的计算机上的传出规则。

我当然会建议花一些时间来微调防火墙,而不是仅仅将其关闭。

我希望说明足够清楚,并有助于设置站点到站点 VPN,或者至少给出如何设置的想法。需要一些网络和管理方面的知识。

答案2

太长了;博士我写了一个脚本来帮助生成线卫加上systemd配置。

Wireguard 配置生成器

您可以尝试使用我的脚本生成 Wireguard 站点和客户端配置jtmoon79/wireguard-site-to-site.sh。这Wireguard 站点到站点生成器应该准确生成您需要的配置和命令,包括 Linux 系统调整和systemctl服务命令。这些systemctl命令将systemd守护进程配置为将 Wireguard 接口和路由作为服务进行控制。

从使用消息来看:

Generate Wireguard IPv4 VPN site-to-site configuration files and commands.
The user is expected to selectively copy+paste+run the highlighted output.

Usage:

    wireguard-site-to-site.sh OFFSET FQDN_SITE1 SITE1_NET SITE1_DNS FQDN_SITE2 SITE2_NET

For example:

    wireguard-site-to-site.sh 34 "my-site1.this-domain.org" 192.168.1.0/24 192.168.1.1 "my-site2.that-domain.org" 192.168.2.0/24

在你的情况下,运行命令

./wireguard-site-to-site.sh 12 A.A.A.A 192.168.0.0/24 192.168.0.1 B.B.B.B 192.168.1.0/24

(12任意,替换A.A.A.A, B.B.B.B)

/etc/wireguard/wg12.conf该脚本将为两个 Wireguard 端点输出示例。就像是:

# /etc/wireguard/wg12.conf
#
# site-to-site tunnel for
# endpoint A.A.A.A:51012 (Wireguard server) (you are here)
# endpoint B.B.B.B:51012 (Wireguard client)
#
# Manually generated by wireguard-site-to-site.sh on Wed 02 Nov 2022 07:57:55 PM PDT

[Interface]
Address = 10.12.12.1/24
ListenPort = 51012
MTU = 1420
PrivateKey = iMHb+YRCT/3iCIeEIWoGsNje7oMzlBI3akApxm4r718=

PreUp = set -x; sysctl -w net.ipv4.ip_forward=1; ([[ -e /sys/kernel/debug/dynamic_debug/control ]] && (modprobe wireguard && echo module wireguard +p > /sys/kernel/debug/dynamic_debug/control)) || true

PostUp = set -x; iptables -v -t nat -I POSTROUTING 1 -o eth0 -j MASQUERADE -m comment --comment 'wireguard-a-wg12' && iptables -v -I INPUT 1 -i %i -j ACCEPT -m comment --comment 'wireguard-b-wg12' && iptables -v -I FORWARD 1 -i eth0 -o wg12 -j ACCEPT -m comment --comment 'wireguard-c-wg12' && iptables -v -I FORWARD 1 -i %i -o eth0 -j ACCEPT -m comment --comment 'wireguard-d-wg12' && iptables -v -I INPUT 1 -i eth0 -p udp --dport 51012 -j ACCEPT -m comment --comment 'wireguard-e-wg12'

PostDown = set -x; iptables -v -t nat -D POSTROUTING -o eth0 -j MASQUERADE -m comment --comment 'wireguard-a-wg12' && iptables -v -D INPUT -i %i -j ACCEPT -m comment --comment 'wireguard-b-wg12' && iptables -v -D FORWARD -i eth0 -o wg12 -j ACCEPT -m comment --comment 'wireguard-c-wg12' && iptables -v -D FORWARD -i %i -o eth0 -j ACCEPT -m comment --comment 'wireguard-d-wg12' && iptables -v -D INPUT -i eth0 -p udp --dport 51012 -j ACCEPT -m comment --comment 'wireguard-e-wg12'

# B (site 2 client)
[Peer]
PublicKey = yOkGU/rjUZgwViFbhlmEXdAvQvnoZvsCc77ZwZ/7fAo=
PresharedKey = vCHGe3nr2WkD/SVP0H5XhA64F4jzACZ+aJhZmv2QBkE=
AllowedIPs = 10.12.12.0/24
# this network is implied
#AllowedIPs = 192.168.0.0/24
AllowedIPs = 192.168.1.0/24
# unsetting Endpoint treats the peer as a client (and this host as a server)
#Endpoint = B.B.B.B:51012
PersistentKeepalive = 59

# test connection:
#     ping 10.12.12.2

# This WireGuard configuration should create 5 iptables rules.
# To list the rules by line number:
#    iptables --list --line-numbers
#    iptables --list --table nat --line-numbers
# In case of duplicate or bad rules, delete each rule individually. For example:
#    iptables --delete FORWARD 10
#    iptables --delete --table nat POSTROUTING 10
# Rules added by this configuration are denoted by the comment sequence "wireguard".

该脚本还提供systemctl以下命令:

systemctl enable [email protected]
systemctl daemon-reload
systemctl start wg-quick@wg12
systemctl status wg-quick@wg12

路线呢?

按原样,两个 Wireguard 主机将相互了解。但其他计算机不会知道还有另一个网络可以访问。

因此,当站点 A 的计算机(称为 A2)想要访问站点 B 的计算机(称为 B2)时,计算机 A2 需要路由:

  • 网络192.168.1.0/24
  • 网关192.168.0.250

现在,当 A2 尝试访问 B2(例如 )时192.168.1.3,A2 会将这些 IP 数据包发送给附近的 Wireguard 服务器(例如 )192.168.0.250。该服务器将通过 Wireguard 隧道发送数据包。然后对等 Wireguard 服务器将转发到 B2 192.168.1.3,。

可以使用适当的route命令手动配置 A2。我建议先让这个工作起来;使用命令配置 A2route并 ping B2。 IIRC,您还必须route在 B2 上进行配置,以便它知道将回复数据包发送到 A2 的位置。

当 A2 手动设置有效时,然后进行集中设置。大多数情况下,路线信息是从中央服务器推送的。有多种方法可以“推送”该 IP 路由。大多数情况下,路由信息是从网络的 DHCP 服务器推送的。

DHCP服务器isc-dhcp-server

用户的回答@nobodyisc-dhcp-server解释从头开始设置 DHCP 服务器。

DHCP服务器DNSMasq

如果使用DNSMasqDHCP 服务器,则添加此配置声明可能会奏效。这是站点 A 声明:

# add route to Site B network 192.168.1.0/24 via Site A wireguard server gateway at 192.168.0.250
# due to odd DNSMasq DHCP behavior, must also distribute the default route 0.0.0.0 (presuming gateway 192.168.0.1) (https://ral-arturo.org/2018/09/12/dhcp-static-route.html)
dhcp-option=121,192.168.1.0/24,192.168.0.250,0.0.0.0/0,192.168.0.1

这是B站声明:

# add route to Site A network 192.168.0.0/24 via Site B wireguard server gateway at 192.168.1.250
# due to odd DNSMasq DHCP behavior, must also distribute the default route 0.0.0.0 (presuming gateway 192.168.1.1) (https://ral-arturo.org/2018/09/12/dhcp-static-route.html)
dhcp-option=121,192.168.0.0/24,192.168.1.250,0.0.0.0/0,192.168.1.1

相关内容