互联网网关作为辐条

互联网网关作为辐条

我有一个 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/0192.168.60.0/24Address=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(让我免于两周徒劳的搜寻……)

相关内容