我在 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,而不是在访问互联网时使用。X
S
举例来说,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.10
X。
但是如果您还希望能够通过绑定到辐射器物理 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/0
X 上),当您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
。另一个答案有助于理解这一点。B
S
编辑
看起来它也可以通过删除字段来工作DNS
,因此它应该对两个接口使用相同的 DNS 服务器。