多子网静态路由

多子网静态路由

我在构建跨 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 的实际工作方式。

值得庆幸的是,这些解决方案比以前容易得多!

相关内容