我有两个家庭 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 -p
或service procps reload
(取决于 Linux 发行版),或者重新启动以使更改生效。
钢丝卫士
我不会详细介绍如何配置wireguard。互联网上有很多这样的内容。我将只写一些在我的案例中使用的网络细节,并指出我在/etc/wireguard/wg0.conf
.正如问题中提到的,有两个网站:
192.168.0.0/24
nanopi 充当wireguard 服务器,接口10.0.0.1
上带有wireguard 地址wg0
。192.168.1.0/24
nanopi 充当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.2
wg0
192.168.0.0/24
10.0.0.1
第三,充当wireguard 客户端的第二台wireguard 计算机Endpoint
在本节中定义了[Peer]
,而充当服务器的第一台wireguard 计算机则没有。该端点是公共 IP 和端口,可以访问服务器 nanopi。在路由器上,服务器 nanopi 必须暴露在互联网上才能允许传入连接。在服务器wireguard计算机所在的站点上,互联网路由器应具有NAT
或Port forwarding
类似的东西。在wireguard 连接的端口上应该有UDP,转发到wireguard 服务器IP 和端口的IP 和端口。我不会在这里展示这一点,因为每个路由器都有不同的 GUI 用于设置。
路由和 DHCP
现在,当wireguard连接工作时,您应该能够通过VPN访问另一个站点上的nano pi。登录192.168.0.250
( 10.0.0.1
on wg0
) 时,应该能够 ping(或登录)10.0.0.2
,反之亦然。但是,两个网络上的其他客户端不知道如何通过 VPN 到达那里。他们有一个默认网关,转发所有不属于本地网络的流量。由于来自其他站点的地址不是本地地址,因此应通过 VPN 的所有流量都会通过 ISP 路由器传至互联网。
一种方法是在网络上的每个设备上添加自定义静态路由。有些人允许这样做,但很多人不允许。 Windows 或 Linux 计算机可以选择添加路由。在 Android 设备上这已经是一个问题了。因此,应该找到其他解决方案,不需要在每台设备上设置静态路由。
如果 ISP 路由器具有添加自定义路由的选项,则可以添加此类路由。我无法在这里展示到底如何实现这一点。一般来说,来自另一个站点的所有地址(例如192.168.0.0
带有网络掩码24
或255.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
的含义如下:
- 第一个静态路由:
24
- 网络掩码大小192, 168, 1
- 上面定义的网络掩码的前缀192, 168, 0, 250
- 上面定义的网络的网关
- 第二条静态路由:
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
用户的回答@nobody
isc-dhcp-server
解释从头开始设置 DHCP 服务器。
DHCP服务器DNSMasq
如果使用DNSMasq
DHCP 服务器,则添加此配置声明可能会奏效。这是站点 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