不幸的是,我对 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_forward
。route
在网关:
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
- 如果你使用 Linux,停止使用 ifconfig 和路由。使用 ip(
man ip
并阅读 iproute 教程)。 - 在互联网网关上设置路由:
ip route add 192.168.0.0/25 via 10.0.0.99
- 禁用重定向:
sysctl -w sys.net.ipv4.conf.br0.send_redirects
。 - 使用命令检查路由
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
- 可选择添加
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
- 在服务器上启用转发:
sysctl -w sys.net.ipv4.ip_forward=1
- 在大多数情况下,上述步骤已足够。如果目标有其他默认网关(不通过服务器),则可以在目标上添加路由(
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
)。 - 检查连通性:
- 在网关上 ping 服务器和目标。
- 在服务器上 ping 网关和目标。
- 使用 tcpdump 来解决未来的问题。