我在构建跨 2 个不同子网和一个 VPN 连接的静态路由时遇到问题。我的拓扑如下所示:
- 主机 A:
inet 10.0.28.45
网络掩码255.255.224.0
广播10.0.31.255
主机 B:
inet 10.0.47.160
网络掩码255.255.240.0
广播10.0.47.255
主机-C:
inet 172.16.254.133
网络掩码255.255.255.0
广播172.16.254.255
我有一个从 Host-C 发起到 Host-B 的 OpenVPN 连接。OpenVPN 连接位于 tun0 上,子网为 192.168.100.0/24,因此 Host-B 的 tun0 地址为 192.168.100.2,Host-C 的地址为 192.168.100.5
主机 B 已启用 IP 转发,并在防火墙上进行 IP 伪装。
我启动了我的 vpn 连接,并且可以毫无问题地从 Host-C 访问 Host-A。我希望 Host-A 也能访问 Host-C。据我所知,要添加静态路由,您需要在与网关相同的子网上拥有一个主机。由于 Host-A 和 Host-B 位于不同的子网上,因此我在 Host-A 上的路由表中添加了 10.0.32.0 子网。
Host-A 上的路由表如下:
# ip route list
default via 10.0.0.1 dev eth0
10.0.0.0/19 dev eth0 proto kernel scope link src 10.0.28.45
10.0.32.0/20 via 10.0.0.1 dev eth0
169.254.0.0/16 dev eth0 scope link metric 1002
然后我尝试添加一条到位于 10.0.32.0/20 子网的 Host-B 的路由,如下所示:
ip route add 192.168.100.0/24 via 10.0.47.160
但我收到错误:RTNETLINK 答案:网络无法访问
我知道我在这里尝试使用的网关超出了 Host-A 所在子网的范围。我通过上面的 10.0.0.1 添加了 10.0.32.0/20 子网,以提供该子网应该采用的路由,其中 10.0.47.160 位于其中,但我不确定这是否是处理这种情况的正确方法。
Host-B 上的路由表如下:
$ ip route list
default via 10.0.32.1 dev eth0
10.0.32.0/20 dev eth0 proto kernel scope link src 10.0.47.160
169.254.0.0/16 dev eth0 scope link metric 1002
192.168.100.0/24 via 192.168.199.2 dev tun0
192.168.100.2 dev tun0 proto kernel scope link src 192.168.199.1
我希望除发往 192.168.100.0 的流量之外的所有流量继续通过 10.0.0.1 退出 eth0。
我觉得这里的问题部分是由于我的 Host-A 上的路由表中缺少了某些内容,这就是为什么当我尝试添加至 192.168.100.0/24 的路由时出现网络不可达错误。
我在这里遗漏了什么?
答案1
10.0.47.160 超出 10.0.0.0/19 范围
从IP计算器:
Address: 10.0.0.0 00001010.00000000.000 00000.00000000
Netmask: 255.255.224.0 = 19 11111111.11111111.111 00000.00000000
Wildcard: 0.0.31.255 00000000.00000000.000 11111.11111111
=>
Network: 10.0.0.0/19 00001010.00000000.000 00000.00000000 (Class A)
Broadcast: 10.0.31.255 00001010.00000000.000 11111.11111111
HostMin: 10.0.0.1 00001010.00000000.000 00000.00000001
HostMax: 10.0.31.254 00001010.00000000.000 11111.11111110
Hosts/Net: 8190 (Private Internet)
因此 10.0.47.160 > 10.0.31.254 并且网络不可达。
如果您建立 10.0.0.0/19 网络,这将与您的 10.0.32.0(/32) 路由冲突。
我认为您的意思是通过 10.0.0.1 的 10.0.32.0 实际上应该是通过 10.0.0.1 的 10.0.32.0/19。
更新后
因此您的新路线列表是:
# ip route list
default via 10.0.0.1 dev eth0
10.0.0.0/19 dev eth0 proto kernel scope link src 10.0.28.45
10.0.32.0/20 via 10.0.0.1 dev eth0
169.254.0.0/16 dev eth0 scope link metric 1002
并且您想要添加:
ip route add 192.168.100.0/24 via 10.0.47.160
您现在会得到的错误将会有所不同:
Error: Nexthop has invalid gateway.
换句话说,你不能这样做是因为网关不在你本地,它是别人的网关。您需要一个界面源 IP 与您尝试连接的网关位于同一范围内。
您的唯一源 IP 地址(10.0.28.45)不会在网关范围 10.0.32.0/20 内,如果我们允许来自任何地方的数据包,那么我们的网络中可能会出现各种漏洞和循环。
相反,它将如何返回?外部网关将收到一个数据包并通过其默认路由将其发送回去,因为主机-A也不会是本地的。
基本上,您要求路由器重新映射源 IP,但这在到达第一个网关 10.0.0.1 之前是不适用的,到那时,它不知道返回的路径,因为数据包没有面包屑踪迹。
有很多方法可以解决这个问题,但这取决于你想要的网络。我会研究隧道(tap 和 tun)或 GRE 或虚拟交换机,它们可以重新映射 IP 并跟踪外部连接,就像它们是本地连接一样。它们在与目的地相同的范围内创建虚拟接口,这就是 VPN 的实际工作方式。
值得庆幸的是,这些解决方案比以前容易得多!