我已经设置了一个 Google Cloud 部署,其大致配置如下:
- 节点 B,地址为 10.0.0.6,默认路由是通过 10.0.0.1
- 节点 V,是 VPN 服务器,位于同一子网 10.0.1.0
另外,我有一个节点 Q 和 Q',它们位于我的家庭网络中(路由器后面),并作为对等节点连接到 VPN。Q 具有静态 IP 地址 10.168.0.240,由 VPN 分配为静态 IP。
Q' 无关紧要,只要 Q 和 Q' 连接到 VPN 时能够成功通信。
通过 IP 转发和 iptables,我已经能够进行设置,使得 VPN 允许来自客户端的流量将其用作到一般互联网的网关,并且我已经确认 Q 可以通过这种方式直接寻址 B(这是通过 openvpn 的push-routes
指令实现的)。
我遇到的问题是这样的:我希望 B 能够直接寻址 Q。我并不特别关心它使用什么 IP 地址来寻址,但无法通过 VPN 机器上的侦听器使用端口转发。我希望在 B 上设置路由表等,以便它通过 VPN 服务器将数据包寻址到 10.168.0.240,并让服务器将这些数据包转发到其tun0
接口。
我怀疑最后一部分已经起作用了,但使用tcpdump
i 可以确认 B 上的请求永远traceroute 10.168.0.240
不会到达 V -- 除非 i 包含类似 的指令-g 10.0.1.0
。但是,atraceroute 10.0.1.0
确实到达了 V,并且ping 10.0.1.0
也能正常工作。
B的配置如下:
$ ip route list default via 10.0.0.1 dev eth0 10.0.0.1 dev eth0 scope link 10.168.0.0/24 via 10.0.1.0 dev eth0
我怀疑我对路由的中级知识缺少一个关键部分。我认为也许度量/首选项设置(我找不到太多文档)可以解决这个问题;但是,所有来源似乎都表明更具体的路由是首选。第三条路线似乎是最具体和最适合这条路线的。
我该如何配置 B 以确保其发往虚拟子网的数据包通过服务器路由?这可能不是全部需要的,但这似乎是我目前无法解决的一个具体步骤。
谢谢!
答案1
我发现了这个问题,它是特定于平台的(GCP)。
在 Google Cloud 上,有一种定制的机制,用于构建使用特定 IP 或其他实例作为下一跳路由器的路由(一些文档那里)。
我必须使用 Terraform 并以此方式设置特定路由,并CanIPForward
在两个实例上启用特殊图形。之后,它就iptables
起作用了,我不必在任何一个实例上设置特殊的路由规则。