在Wireguard VPN中仅路由专用网络

在Wireguard VPN中仅路由专用网络

我在 NAT 路由器后面有几台主机,我想通过 wireguard VPN 访问它们。我可以成功配置专用网络,但仍然有些问题让我困惑。

我希望每位同事能够:

  • 172.9.9.*通过 VPN互相访问(通过wg0
  • 访问 VPN 之外的所有其他主机(通过eth0)。

以下是网络和当前配置的架构:

┌─────┐    ┌──────────┐    ┌─────┐
│  S  ├────┤ Internet ├────┤  A  │
└─────┘    └───┬──────┘    └─────┘
          ┌────┴─────┐
          │ NAT DHCP │
       ┌──┤  Router  ├──┐
       │  └──────────┘  │
       │                │
    ┌──┴──┐          ┌──┴──┐
    │  X  │          │  B  │
    └─────┘          └─────┘
  • S是 VPN 服务器,可通过静态 IP 在互联网上访问;
  • X是一个“计算服务器”,它可以访问互联网,但位于 NAT 后面,并且它的 IP 是动态的且无法提前知道;
  • A是想要连接的“远程客户端” X
  • B是想要连接的“本地客户端” X,并且它位于同一个本地网络中。

我想要这个A并且可以通过B连接到,但是所有这些主机都应该只在互相联系时使用 VPN,而不是在访问互联网时使用。XS

举例来说,A可以直接 ping google.com,但会X通过ping S

在搜索和阅读文档后,我仍然不清楚是否可以在不使用的情况下执行此操作iptables,以及是否可以仅使用 wireguard 配置来执行此操作。

当前配置如下:

## S wg0.conf

[Interface]
PrivateKey = S-private-key
Address = 172.9.9.1/24
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
ListenPort = 51820

[Peer]
# A
PublicKey = A-public-key
AllowedIPs = 172.9.9.100/32

[Peer]
# B
PublicKey = B-public-key
AllowedIPs = 172.9.9.101/32

[Peer]
# X
PublicKey = X-public-key
AllowedIPs = 172.9.9.10/32
# A wg0.conf

[Interface]
Address = 172.9.9.100/24
PrivateKey = A-private-key
DNS = 1.1.1.1

[Peer]
PublicKey = S-public-key
Endpoint = S-ip-address:51820
AllowedIPs = 0.0.0.0/0, ::/0

B的配置与类似A,但是IP172.9.9.101和私钥不同。

# X wg0.conf

[Interface]
Address = 172.9.9.10/24
PrivateKey = X-private-key
DNS = 1.1.1.1

[Peer]
PublicKey = S-public-key
Endpoint = S-ip-address:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25  # To keep the server reachable

此配置有效,所有主机都可以通过 VPN 相互访问,但我希望只有指向主机的流量172.9.9.*通过此 VPN。其他流量应由默认网关路由。

令我困惑的是,如果我改变配置A

AllowedIPs = 172.9.9.0/24

然后,对于A,包裹将按预期路由(例如,我可以curl ifconfig.me获取A的公共 IP),但如果我在 上执行相同操作X,它将不起作用,并且不会到达 的包裹172.9.9.0/24将无法投递。

编辑#1

忘了说了,如果在连接到 时X,本地客户端(例如)B不会将数据包发送到本地网络之外,那么B -> Router -> X和 就不会,我会很高兴B -> Router -> S -> Router -> X

答案1

设置AllowedIPs为您想要的 IP 地址路由到/通过对等点

在正常的中心辐射型配置中,在您的中心 (S) 上,您将为AllowedIPs每个对等点进行配置,仅当数据包使用对等点的 WireGuard IP 地址作为其目标地址时,才将数据包路由到每个对等点;在您的辐射点 (A、B 和 X) 上,您将配置AllowedIPs为您的 WireGuard 网络的 CIDR ( 172.9.9.0/24),仅当数据包使用另一个对等点的 WireGuard IP 地址作为其目标地址时,才将数据包路由到中心。

因此,在正常配置下,您可以使用 A 的 WireGuard IP 地址从 B 或 X 访问 A 172.9.9.100,使用 从 A 或 X 访问 B 172.9.9.101,使用 从 A 或 B 访问172.9.9.10X。

但是如果您还希望能够通过绑定到辐射器物理 NIC 的 IP 地址访问每个辐射器(例如eth0),则需要调整AllowedIPs集线器和辐射器上的以包含这些 IP 地址。

例如,如果 A 的eth0地址是198.51.100.65,B 的地址是192.168.0.66,X 的地址是192.168.0.88,则您可以将集线器的 WireGuard 配置中的对等体调整为:

## S wg0.conf
...

[Peer]
# A
PublicKey = A-public-key
AllowedIPs = 172.9.9.100/32
AllowedIPs = 198.51.100.65/32

[Peer]
# B
PublicKey = B-public-key
AllowedIPs = 172.9.9.101/32
AllowedIPs = 192.168.0.66/32

[Peer]
# X
PublicKey = X-public-key
AllowedIPs = 172.9.9.10/32
AllowedIPs = 192.168.0.88/32

并将AllowedIPs每个辐条的配置设置为:

AllowedIPs = 172.9.9.0/24
AllowedIPs = 198.51.100.65/32
AllowedIPs = 192.168.0.66/32
AllowedIPs = 192.168.0.88/32

AllowedIPs = 172.9.9.0/24, 198.51.100.65/32, 192.168.0.66/32, 192.168.0.88/32(请注意,如果愿意,您也可以在一行上指定所有块。)


使用您当前的配置(在AllowedIPs = 0.0.0.0/0X 上),当您curl 198.51.100.65从 X 运行时,发生的情况是 X 将发往 A(以及其他所有数据包)的数据包通过其 WireGuard 隧道路由到 S,然后 S 将这些数据包通过互联网以未加密的形式路由到 A(伪装成 S 自己的公共 IP 地址);作为响应,A 通过互联网将未加密的数据包发送到 S,S 通过其 WireGuard 隧道将这些数据包路由到 X。

如果你想确保 S永远不会将通过 WireGuard 网络传输的数据包路由到 Internet,您可以调整 iptables 规则来防止这种情况;类似下面的操作可能会奏效:

PostUp = iptables -A FORWARD -i wg0 -o wg0 -j ACCEPT; iptables -A FORWARD -i wg0 -o eth0 -j DROP; iptables -A FORWARD -i eth0 -o wg0 -j DROP

答案2

我的 DNS 出现了问题:使用AllowedIPs = 172.9.9.0/24允许我 ping 8.8.8.8,但不允许google.com

我解决了在允许的 IP 中包含接口 DNS 的问题,因此我通过 VPN 获得 DNS 解析,但流量不在 VPN 中:

[Interface]
...
DNS = 1.1.1.1

[Peer]
...
AllowedIPs = 172.9.9.0/24, 1.1.1.1/32

这并没有回答我的第二个问题:是否有可能不经过 而直接进行交流X。另一个答案有助于理解这一点。BS

编辑

看起来它也可以通过删除字段来工作DNS,因此它应该对两个接口使用相同的 DNS 服务器。

相关内容