因此,我有以下简单的网络设置:
让A成为 24 前缀网络上 192.168.0.1 处的主路由器。
让乙是连接到 192.168.0.185 网络的 Linux 设备。
让C是连接到 192.168.0.146 网络的第二个设备,但其网关不是指向路由器(192.168.0.1),而是指向设备 B。也就是说,设备 C 生成的所有流量都从设备 C 流向设备 B,最后到达路由器(设备 A)。
问题是,尽管已经在设备 B 上允许 IP 转发,并添加了一些 iptables 以确保流量得到转发,但似乎什么都没有发生。设备 C 可以毫无问题地 ping 设备 B,但是,当设备 C 尝试将数据包发送到公共 IP 或同一子网中的任何其他 IP 地址时,我收到“目标主机不可访问”错误。
这是设备B上的配置,它连接到wlan0上的主路由器:
iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A FORWARD -i wlan0 -j ACCEPT
网络状态监测
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
10.134.203.168 0.0.0.0 255.255.255.252 U 0 0 0 rmnet_data0
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 wlan0
IP 路由列表
10.134.203.168/30 dev rmnet_data0 proto kernel scope link src 10.134.203.170
192.168.0.0/24 dev wlan0 proto kernel scope link src 192.168.0.185
当我禁用设备 B 上的 IP 转发时,设备 C 只是挂在那里等待答案,但当我激活 IP 转发时,设备 C 立即收到“目标主机无法访问”错误。所以我认为这可以排除 IP 转发作为主要问题。问题可能与 iptables 和 IP 路由有关。
在其他 Linux 机器上,只需允许 IP 转发就可以了,显然这台机器需要一些额外的配置。
有人知道我应该运行哪个命令才能使其工作吗?我应该如何编辑路由表?
谢谢
更新
所以我已经按照你的要求做了,现在我的路由表如下所示:
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
10.134.203.168 0.0.0.0 255.255.255.252 U 0 0 0 rmnet_data0
192.168.0.0 192.168.0.1 255.255.255.0 UG 0 0 0 wlan0
不幸的是问题仍然存在...
我应该改变什么吗?
谢谢
更新2
我已经将路由表与其他 Linux 发行版进行了比较,并复制了它们。尝试了其他一些方法,但仍然没有效果。
这是当前的表格:
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 192.168.0.1 0.0.0.0 UG 0 0 0 wlan0
10.135.186.32 0.0.0.0 255.255.255.248 U 0 0 0 rmnet_data0
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 wlan0
这是预期的,可以正常工作。我想,因为我是在 Android 9 上执行此操作,所以一切都完全不同,所以除非我修改整个文件系统(我不会这样做),否则这是不可能的。
在 Android 8 之前这不是一个问题,我不知道他们在新版本上做了什么。
答案1
正如@yoonix 指出的那样,计算机 B 没有默认路由。因此它不知道将数据包转发到未知网络的位置。
答案2
我找到解决办法了!
我们必须首先清理 iptables,允许 ip 转发,添加 ip 路由,最后添加主路由。
这可以通过 4 个命令完成:
iptables -F -t filter
sysctl -w net.ipv4.ip_forward=1
ip route add default via {gateway}
ip rule add from all lookup main pref 1
感谢大家的时间