我正在设置一个基于 Linux 的路由器,它有 4 个 NIC,但尽管按照各个网站上建议的步骤操作,似乎仍无法让它工作。
每个接口位于单独的子网上,如下所示:
eth0 10.1.0.254 (255.255.255.0)
eth1 10.1.1.254 (255.255.255.0)
eth2 10.1.2.254 (255.255.255.0)
eth3 10.1.3.254 (255.255.255.0)
每个网络上的每个设备都配置为使用 10.1。X.254 作为本地网络的网关。
我已启用 IP 转发(并且已将其永久设置为/etc/sysctl.conf
)
$ cat /proc/sys/net/ipv4/ip_forward
1
路由表看起来正确
$ route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
localnet * 255.255.255.0 U 0 0 0 eth0
10.1.1.0 * 255.255.255.0 U 0 0 0 eth1
10.1.2.0 * 255.255.255.0 U 0 0 0 eth2
10.1.3.0 * 255.255.255.0 U 0 0 0 eth3
接口
$ ifconfig
eth0 Link encap:Ethernet HWaddr 00:50:8d:xx:xx:xx
inet addr:10.1.0.254 Bcast:10.1.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:28919 errors:0 dropped:0 overruns:0 frame:0
TX packets:16132 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:35054376 (35.0 MB) TX bytes:1424175 (1.4 MB)
Interrupt:22
eth1 Link encap:Ethernet HWaddr 00:1b:21:xx:xx:xx
inet addr:10.1.1.254 Bcast:10.1.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:8 errors:0 dropped:0 overruns:0 frame:0
TX packets:54 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:480 (480.0 B) TX bytes:3996 (3.9 KB)
eth2 Link encap:Ethernet HWaddr 00:1b:21:xx:xx:xx
inet addr:10.1.2.254 Bcast:10.1.2.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:9 errors:0 dropped:0 overruns:0 frame:0
TX packets:57 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1024 (1.0 KB) TX bytes:4122 (4.1 KB)
eth3 Link encap:Ethernet HWaddr 00:1b:21:xx:xx:xx
inet addr:10.1.3.254 Bcast:10.1.3.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:6419 errors:0 dropped:0 overruns:0 frame:0
TX packets:6702 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:701177 (701.1 KB) TX bytes:612622 (612.6 KB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:1753 errors:0 dropped:0 overruns:0 frame:0
TX packets:1753 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:194373 (194.3 KB) TX bytes:194373 (194.3 KB)
一台连接到 10.1.1.0/24 网络的 PC(IP 地址为 10.1.1.1,网关正确配置为 10.1.1.254),它可以 ping 通 Linux 路由器的本地接口,但无法 ping 通网关上的其他 3 个路由器接口。
我在这个网络设置上没有任何防火墙(硬件或软件)。
我是否遗漏了一些基本的东西?
编辑1
从 PC 10.1.1.1,我现在可以 ping 路由器上除 10.1.0.254 之外的所有接口。(我不确定我做了什么来解决这个问题!)
所有涉及的子网都由多个第 3 层交换机作为 VLAN 托管。Linux 路由器上没有响应的接口是我们核心交换机上唯一具有路由接口的 VLAN。
tcpdump
当我尝试访问该接口时,eth1 上没有显示任何 ICMP 回显迹象,尽管 10.1.1.1 配置为使用 10.1.1.254(Linux 路由器上的 eth1)。
可能是交换机广播的路由协议导致 10.1.1.1 上的 PC 不通过 10.1.1.254 进行路由?
编辑2
在处理其他事情时,我现在又回到了这个问题(没有对 Linux 路由器进行任何更改),它又停止工作了。
编辑3
iptables 配置
# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
答案1
从您的描述来看,它应该可以工作。如果您可以 ping 同一网络上的网关接口,但无法 ping 任何其他接口,那就非常奇怪了。即使通过接口 B 接收,TCP/IP 堆栈也应该正确响应对接口 A 的 ping。
由于您正在 ping 网关的本地地址(尽管在不同的网络上),因此不涉及数据包转发。我认为有三个可能的原因:
1)网关实际上没有接收到数据包(客户端的路由/过滤问题)。
2)网关没有将答复发送到正确的位置。
3)网关选择不回复(某种防火墙。我会再检查一遍,以确保不是这种情况)。
我会使用 tcpdump 或 wireshark 来确认线路上发生了什么。您应该看到 ping 请求离开客户端。然后在网关的接口上,您应该看到它们到达。然后我会监听所有接口,看看是否有任何回复发送到任何地方。如果您看到 ping 请求进来,则表示客户端的路由正常。如果您没有看到 ping 回复从任何接口出去,那么要么是防火墙,要么是网关上的路由表出现了一些异常。最后,如果网关通过正确的接口发送回复,但回复未在客户端上注册,则全是客户端的错。
我会尝试其他网络上的设备(例如 10.1.3.0/24),最好直接连接到服务器的 NIC,以确保没有任何东西干扰通信。这可能只是一个拼写错误,如果你知道你应该看到什么,那就很难发现。配置另一个设备(或重新配置你用于第一次测试的 PC)可以降低你再次犯错的可能性。
最后一个问题——它曾经工作过吗,或者它是一个新设置并插入到网络中的盒子?
编辑:
只要您没有在 Linux 机器上启用任何路由守护程序,它就会忽略来自交换机的路由器流量。
您所观察到的情况强烈表明存在一些外部影响(交换机、防火墙、外星人或被关在 NOC 中的实习生 ;) )。尝试使用两个直接连接到 Linux 机器的客户端来测试设置,如下所示:
+-------------+
client1 ---+ ethX ethY +--- client2
+-------------+
Linux box
在此设置中,测试 Linux 机器上所有接口之间的路由。否则,您将同时在多个战线上作战,这会降低成功排除故障的机会。一旦您知道 Linux 机器可以工作(或不能工作),就该寻找观察到的干扰的原因了。
如果您的 Linux 机器的所有接口都连接了智能交换机,那么您可以在直接连接到 Linux 机器的端口上定义一个 IP 地址,然后尝试在机器和路由器之间进行 ping 操作。我是个多疑的偏执狂,我会带着自己的笔记本电脑和一些已知良好的跳线来到机器旁,看看发生了什么。
答案2
这可能是一个愚蠢的问题,但是......你说这个网络上没有任何防火墙,但你对此绝对确定吗?
Linux 默认启用防火墙,因此即使您启用 IP 转发,如果您没有明确配置 IPTABLES(或完全禁用防火墙),它也不会让任何数据包通过。
当然,对于您的 PC 来说也是如此:无论是 Linux 还是 Windows,它们都会有一个内置防火墙,除非您明确禁用它,否则它将默认处于活动状态。
答案3
Iptables 规则允许转发吗?
iptables -L -n -v