我有一个 Wireguard VPN 设置,基本上如下所示:
P1 ---- S ---- P ---- LAN
Px -----|
- S(ip 192.168.60.1)是在 Ubuntu 20.04 上运行的 WG 服务器,启用了 ufw,具有公共 IP(使用 wg0 接口)。
- P(ip 192.168.60.2)是在 CGNAT 后面运行的 WG 对等体,没有公共 IP,连接到自己的 LAN。
- P1..Px 是其他 WG 对等体(ip 192.168.60.1x)。
Ufw 具有以下配置:
To Action From
-- ------ ----
22/tcp ALLOW Anywhere
51820/udp ALLOW Anywhere
Anywhere on eth0 ALLOW FWD Anywhere on wg0
Anywhere on wg0 ALLOW FWD Anywhere on eth0
Anywhere on wg0 ALLOW FWD Anywhere on wg0
我想要实现所有来自 P1..Px 对等体的流量都通过 P 路由。
我尝试了以下操作,但没有成功:
在 P1 上,我将 S 的 AllowedIPs 设置为 0.0.0.0/0。在 SI 上,将 P 的 AllowedIPs 设置为 0.0.0.0/0。- 此配置使 S 无法通过 eth0 访问(并且仍然不会将任何内容路由到 P)。
在 P1 上,我将 S 的 AllowedIPs 设置为 0.0.0.0/0。在 SI 上尝试根据源 IP 配置基于策略的路由:
sudo ip rule add from 192.168.60.0/24 lookup 200 sudo ip route add default via 192.168.60.2 dev wg0 table 200
这可以防止 P1 连接到 192.168.60.0/24 以外的任何设备。
答案1
您可能应该从Table=off
在 S 和 P 上的 wg-quick conf 中开始使用。的值AllowedIPs=
不会导致它们的路由/策略路由规则发生变化。
编辑:实际上,除非出于某些原因,Table=
您需要将 P 上AllowedIPs=
的 S改为 ,否则可以不做任何改动,例如需要将来自其自身的流量路由到 S。您不需要自己处理 P 上的路由和路由规则,因为即使是前缀也应该配置必要的路由。下一段可能不适用于您的需要——尽管它可能为您提供一些关于事物如何运作的额外见解。0.0.0.0/0
192.168.60.0/24
Address=192.168.60.2/24
你可能应该使用额外的 IP 子网标准普尔,例如
192.168.59.0/30
。这样可以省去需要额外 IP 规则的麻烦。192.168.60.0/24
不过请记住在 P 上添加 的子网路由,与 一样Table=off
,内核只会为字段中的前缀添加前缀路由Address=
。顺便说一下,充分利用PostUp=
(和PreDown=
)。
我认为您不想将源自 S 本身的流量路由到 P,因此您可能需要以下 IP 规则:
# ip rule add iif wg0 from 192.168.60.0/24 lookup 200
如果你确实需要路由除 ssh 和 wireguard 服务器回复 P 之外的流量,你还可以:
# ip rule add iif lo lookup 200
# ip rule add iif lo ipproto tcp sport 22 lookup main
# ip rule add iif lo ipproto udp sport 51820 lookup main
注意:您不能只匹配from 192.168.60.1
第一条规则中添加的地址而忽略其他两条规则,因为对于非回复流量,源地址通常(如果不是总是)根据决定的路由来选择 - 此时尚未设置。
请注意,命令的顺序通常决定优先级,因此请确保在“子集”规则之前添加“超集”规则,否则后者将被前者覆盖。
并且最好保持table 200
空白直到所有需要的规则都到位,否则主机的远程访问可能会被切断。
最后,nexthop 在到 L3 隧道的路由中毫无意义:
# ip route add default dev wg0 table 200
PS 确保您不仅允许防火墙中的 IP 转发,而且还使用 sysctl 启用它。
答案2
由于声誉太低,我无法发表评论,但我在尝试实现类似目标时偶然发现了这篇文章。
目前还不完全清楚 OP 是否希望将本地流量保持在本地(即访问网络打印机)或者设置是否实际上希望将所有流量发送到 Wireguard。
如果要实现前者,请参阅如何通过 Wireguard 路由所有公共流量但不路由本地流量?
答案3
互联网网关作为辐条
我们有一个运行着 WireGuard 的端点,即端点 A,我们希望从该端点访问互联网。但是,在这种情况下,要从端点 A 访问互联网,WireGuard 流量需要经过两个跳跃:一个通过 VPN 集线器主机 C;第二个通过集线器的辐条主机 β。但是,虽然我们希望将主机 β 用作端点 A 的互联网网关,但我们不希望主机 C 也这样做 — 主机 C 本身可以根据需要使用站点 C 的默认路由访问互联网。带有互联网网关辐条的集线器
在我们的 WireGuard 网络中,端点 A 的 IPv4 地址为 10.0.0.1,IPv6 地址为 fd10:0:0:1::1;主机 C 的 IPv4 地址为 10.0.0.3,IPv6 地址为 fd10:0:0:3::1;主机 β 的 IPv4 地址为 10.0.0.2,IPv6 地址为 fd10:0:0:2::1。主机 C 的公共 IP 地址为 192.0.2.3,允许端点 A 和主机 β 各自建立到它的 WireGuard 隧道。
终点 A
在端点 A 上,当 WireGuard 网络启动时,我们希望通过主机 C 发送所有 Internet 流量,因此我们在端点 A 的 WireGuard 配置中为主机 C 配置 AllowedIPs = 0.0.0.0/0, ::/0:
# /etc/wireguard/wg0.conf
# local settings for Endpoint A
[Interface]
PrivateKey = AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEE=
Address = 10.0.0.1/32, fd10:0:0:1::1/64
ListenPort = 51821
# remote settings for Host C
[Peer]
PublicKey = jUd41n3XYa3yXBzyBvWqlLhYgRef5RiBD7jwo70U+Rw=
Endpoint = 192.0.2.3:51823
AllowedIPs = 0.0.0.0/0, ::/0
0.0.0.0/0 是整个 IPv4 空间,而 ::/0 是整个 IPv6 空间。(如果您不关心 IPv6 流量,则可以从此配置和其他 WireGuard 配置中省略 IPv6 地址和地址块。)
主机C
在主机 C 上,我们希望将发往 10.0.0.1 或 fd10:0:0:1::/64 的所有流量发送到端点 A,并将通过我们的 WireGuard 网络的所有其他流量发送到主机 β。因此,我们在主机 C 上配置 WireGuard,其端点 A [Peer] 部分为 AllowedIPs = 10.0.0.1/32、fd10:0:0:1::/64,其主机 β [Peer] 部分为 AllowedIPs = 0.0.0.0/0、::/0。
但是,由于我们不希望主机 C 的所有流量都流向主机 β(仅希望流量通过 WireGuard 网络转发),因此我们通过接口的 Table = 123 设置将此 WireGuard 接口的路由配置为使用自定义路由表。然后,我们使用 PreUp 命令添加策略路由规则,指示主机仅将此表用于来自此 WireGuard 接口的流量(ip rule add iif wg0 table 123 priority 456):
# /etc/wireguard/wg0.conf
# local settings for Host C
[Interface]
PrivateKey = CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCGA=
Address = 10.0.0.3/32, fd10:0:0:3::1/64
ListenPort = 51823
Table = 123
# IPv4 forwarding & routing
PreUp = sysctl -w net.ipv4.ip_forward=1
PreUp = ip rule add iif wg0 table 123 priority 456
PostDown = ip rule del iif wg0 table 123 priority 456
# IPv6 forwarding & routing
PreUp = sysctl -w net.ipv6.conf.all.forwarding=1
PreUp = ip -6 rule add iif wg0 table 123 priority 456
PostDown = ip -6 rule del iif wg0 table 123 priority 456
# remote settings for Endpoint A
[Peer]
PublicKey = /TOE4TKtAqVsePRVR+5AA43HkAK5DSntkOCO7nYq5xU=
AllowedIPs = 10.0.0.1/32, fd10:0:0:1::/64
# remote settings for Host β
[Peer]
PublicKey = fE/wdxzl0klVp/IR8UcaoGUMjqaWi3jAd7KzHKFS6Ds=
AllowedIPs = 0.0.0.0/0, ::/0
主机B
与之前的站点网关作为 Spoke 场景类似,在主机 β 上,我们希望将发往 10.0.0.0/24 和 fd10::/56 网络的所有流量通过主机 C 发送回去 — — 因此,我们在主机 β 的 WireGuard 配置中将其用作主机 C 的 AllowedIPs 设置:
# /etc/wireguard/wg0.conf
# local settings for Host β
[Interface]
PrivateKey = ABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBFA=
Address = 10.0.0.2/32, fd10:0:0:2::1/64
ListenPort = 51822
# IPv4 forwarding
PreUp = sysctl -w net.ipv4.ip_forward=1
# IPv4 masquerading
PreUp = iptables -t mangle -A PREROUTING -i wg0 -j MARK --set-mark 0x30
PreUp = iptables -t nat -A POSTROUTING ! -o wg0 -m mark --mark 0x30 -j MASQUERADE
PostDown = iptables -t mangle -D PREROUTING -i wg0 -j MARK --set-mark 0x30
PostDown = iptables -t nat -D POSTROUTING ! -o wg0 -m mark --mark 0x30 -j MASQUERADE
# IPv6 forwarding
PreUp = sysctl -w net.ipv6.conf.all.forwarding=1
# IPv6 masquerading
PreUp = ip6tables -t mangle -A PREROUTING -i wg0 -j MARK --set-mark 0x30
PreUp = ip6tables -t nat -A POSTROUTING ! -o wg0 -m mark --mark 0x30 -j MASQUERADE
PostDown = ip6tables -t mangle -D PREROUTING -i wg0 -j MARK --set-mark 0x30
PostDown = ip6tables -t nat -D POSTROUTING ! -o wg0 -m mark --mark 0x30 -j MASQUERADE
# remote settings for Host C
[Peer]
PublicKey = jUd41n3XYa3yXBzyBvWqlLhYgRef5RiBD7jwo70U+Rw=
Endpoint = 192.0.2.3:51823
AllowedIPs = 10.0.0.0/24, fd10::/56
PersistentKeepalive = 25
请注意,在主机 β 的主机 C 配置中,我们还添加了 PersistentKeepalive = 25 设置。这可确保主机 β 在主机 C 和主机 β 之间的任何 NAT(或仅出口)防火墙上打开一个漏洞,从而允许端点 A 通过 WireGuard 网络发起与主机 β 的连接。如果主机 C 和主机 β 之间没有 NAT 或仅出口防火墙,则可以省略此设置(但如果这样做,请确保将主机 C 的 WireGuard 配置设置为在其主机 β 的端点设置中包含主机 β 的公共 IP 地址)。
另请注意,我们在主机 β 的 WireGuard 配置中包含了一些 iptables 规则。当主机 β 将数据包转发到站点 B 时,这些 iptables 规则会伪装来自 WireGuard 网络的数据包。如果站点 B 的 LAN 路由器(或每个单独的端点)已配置为将发往 WireGuard 网络 (10.0.0.0/24) 的流量路由回主机 β,则可以省略这些规则。
测试一下
在每个主机(端点 A、主机 C 和主机 β)上启动我们配置的 WireGuard 接口后,我们可以从端点 A 运行 cURL(或常规网络浏览器)通过我们的 WireGuard 网络访问 Google(或任何其他互联网网站):`` $ curl google.com
301 已移动... ```参考 :
复制粘贴自https://www.procustodibus.com/blog/2022/06/multi-hop-wireguard/#internet-gateway-as-a-spoke(让我免于两周徒劳的搜寻……)