通过网关路由到另一个子网

通过网关路由到另一个子网

不幸的是,我对 Linux 中的路由经验很少,也无法正确地表述我的问题以便进行搜索。

所以我将在这里解释这个问题。下图中,您可以看到我的网络拓扑。目标是 IP 为 10.0.0.50 的客户端设备可以访问 IP 为 192.168.0.1 的目标设备。

网络拓扑图

在客户端设备上设置正确的路由不是我的目标,因为可能有多个客户端设备需要访问 192.168.0.1。由于我无法访问所有客户端,因此单独配置它们以实现目标并不是我的目标。

到目前为止,我尝试使用 在网关 10.0.0.1 上设置路由route add -net 192.168.0.0/25 gw 10.0.0.99。网关(应该)已正确配置以转发数据包,因为我将其用作整个网络访问互联网的网关。因此,iptables -A POSTROUTING -t nat -o eth0 -j MASQUERADE设置了 IP 转发echo 1 > /proc/sys/net/ipv4/ip_forwardroute网关

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         123.123.123.1   0.0.0.0         UG    202    0        0 eth0
10.0.0.0        *               255.255.255.128 U     0      0        0 br0
123.123.123.2   *               255.255.255.252 U     0      0        0 eth0
192.168.0.0     10.0.0.99       255.255.255.128 UG    0      0        0 br0

服务器 10.0.0.99 上的配置包括用于伪装和 IP 转发的 iptable 规则。route显示以下输出服务器

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         tower           0.0.0.0         UG    204    0        0 br0
default         192.168.0.1     0.0.0.0         UG    303    0        0 wlan0
10.0.0.0        *               255.255.255.128 U     0      0        0 br0
192.168.0.0     *               255.255.255.128 U     0      0        0 wlan0

使用上面说明的设置,我可以从服务器和网关 ping 192.168.0.1,但客户端无法执行此操作。用于测试正在发生什么情况的跟踪路由卡在网关 10.0.0.1 处,无法继续进行。

我也尝试iptables -A POSTROUTING -t nat -o br0 -j MASQUERADE在网关上进行设置以检查是否是该问题,但该规则没有帮助,所以我再次将其删除。

我这里遗漏了什么?请帮帮我。非常感谢!

答案1

  1. 如果你使用 Linux,停止使用 ifconfig 和路由。使用 ip(man ip并阅读 iproute 教程)。
  2. 在互联网网关上设置路由:ip route add 192.168.0.0/25 via 10.0.0.99
  3. 禁用重定向:sysctl -w sys.net.ipv4.conf.br0.send_redirects
  4. 使用命令检查路由ip route get 192.168.0.1 from 10.0.0.50 iif br0。输出应该类似于
192.168.0.1 from 10.0.0.50 via 10.0.0.99 dev br0 
    cache iif br0
  1. 可选择添加SNAT/MASQUERADE规则,使回复通过互联网网关传递,而不是直接从服务器传递到客户端:
iptables -t nat -A POSTROUTING \
         -o br0 \
         --src 10.0.0.0/24 --dst 192.168.0.0/25 \
    -j SNAT --to 10.0.0.1
  1. 在服务器上启用转发:sysctl -w sys.net.ipv4.ip_forward=1
  2. 在大多数情况下,上述步骤已足够。如果目标有其他默认网关(不通过服务器),则可以在目标上添加路由(ip route add 10.0.0.0/24 via 192.168.0.X,其中192.168.0.X是子网中的服务器地址192.168.0.0/25)或在服务器本身上设置 NAT(iptables -t nat -A POSTROUTING -o wlan0 --src 10.0.0.0/24 --dst 192.168.0.1 -j MASQUERADE)。
  3. 检查连通性:
    • 在网关上 ping 服务器和目标。
    • 在服务器上 ping 网关和目标。
    • 使用 tcpdump 来解决未来的问题。

相关内容