有哪位对 Linux 和网络有深厚背景的人能帮我吗?我在网上搜索了这个问题的明确答案,甚至还比较了我能访问的具有相同设置的盒子,但我的盒子就是无法工作。
基本情况是这样的:
===========================
RHEL 6 Linux 机有两个以太网接口:
eth0 = 10.10.5.10/24
eth1 = 10.10.6.10/24
[root@box ~]# netstat -nr
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
10.10.5.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
10.10.6.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
0.0.0.0 10.10.5.254 0.0.0.0 UG 0 0 0 eth0
ip 转发已启用并且处于活动状态。
问题:
与 eth1 或 10.10.6.x 网络位于同一子网的客户端可以 ping 和 telnet 到此框中 eth1 上运行的资源。
但是,其他子网上的客户端则不能。因此,从我的工作站,我可以整天 ping 和 telnet 到盒子的 eth0 上的资源,但 eth1 上什么都做不了... 怎么回事?
将此设置与我的环境中另一个类似性质的盒子进行比较,没有发现明显差异。
以下是一些文件:
# cat ifcfg-eth0
DEVICE="eth0"
BOOTPROTO="none"
HWADDR="Omitted"
IPADDR="10.10.5.10"
NETMASK="255.255.255.0"
NETWORK="10.10.5.0"
ONBOOT="yes"
TYPE="Ethernet"
USERCTL="no"
# cat ifcfg-eth1
DEVICE="eth1"
BOOTPROTO="none"
HWADDR="omitted"
IPADDR="10.10.6.10"
NETMASK="255.255.255.0"
NETWORK="10.10.6.0"
ONBOOT="yes"
TYPE="Ethernet"
USERCTL="no"
# cat route-eth0
default via 10.10.5.254 dev eth0
# cat /etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=box
GATEWAY=10.10.5.254
NOZEROCONF=yes
如您提供任何帮助我们将不胜感激!
谢谢。
添加更多信息,但简洁明了:
# ip addr
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
inet 10.10.5.10/24 brd 10.10.5.255 scope global eth0
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
inet 10.10.6.10/24 brd 10.10.6.255 scope global eth1
答案1
使用您当前显示的设置:
你有两面:
- eth1 端(10.10.6.10 接口,在 10.10.6.0/24 局域网上)
- eth0 端(10.10.5.10 接口,在 10.10.5.0/24 局域网上)
- 您在 eth0 端定义了该机器的默认网关(默认网关 ip:10.10.5.254)
所以
- 在 eth1 端:
- [要求] 10.10.6.0/24 中的任何机器都应该能够与 10.10.6.10 通信(并且彼此之间也可以通信)(我认为没有防火墙问题)
- [必要条件] 此外:10.10.6.0/24 中已将其默认网关定义为“10.10.6.10”的任何机器都能够通过您的机器(10.10.6.10/24->eth1[machine]eth0-> 其他局域网)向其他机器发送数据包。实际上,您不需要将其作为默认网关,但对于 eth0 端的任何局域网,它们都需要将该局域网与 10.10.6.10 网关关联。
- 在 eth0 端:
- [要求] 10.10.5.0/24 上的任何机器都应该看到 10.10.5.10 (eth0) 并可以与它通信(以及相互通信)。
- [要求] 另一个 LAN 上的任何机器都应该能够通过(可能有额外的跳数)具有 10.10.5.254 ip 的机器与 eth0 进行通信(例如:如果该机器有 2 个子网,10.10.5.254/24 在与 eth0 同一侧,10.xyz/24 在另一个接口上,则 10.xy0/24 中的机器可以通过路由将数据包发送到 10.10.5.10:10.10.5.0/24 和网关 10.xyz)。
- 如果是这样,那么他们只需要有一条额外的路由到达 10.10.6.0/24:通过网关 10.xyz 到达 10.10.6.0/24
- 在 eth1 端:
用语言表达可能会很复杂...
什么会有所帮助:告诉我们网络列表()以及每个网络的网关。
现在我猜你尝试过:
[everything other machines (even internet, via the exterior internet gateway)]
|
|(links via switch(s) for 10.x.y.0/24 network, for example.
| If you have such an additionnal LAN.
| Maybe it's even "the Internet", and therefore not in 10.x anything,
| but this is just an example.)
|
|
(10.x.y.z?) | [---------------]
(or Internet?)ethZ[some router/box]ethW(10.10.5.254)
[---------------] |
|
|(links via switch(s) for 10.10.5.0/24 network)
|
[-------] |
(10.10.6.10)eth1[yourbox]eth0(10.10.5.10)
| [-------]
|
|(links via switch(s) for 10.10.5.0/24 network)
|
| [---------------------------]
ethx[any machine in 10.10.6.0/24]
[---------------------------]
调试设置的一般方法:
- 想象一下你就是 IP 数据包:你有一个源 IP 和一个目标 IP。
- 现在,在源所在的接口上,查看该机器的路由告诉您下一跳是哪个。然后前往那里(但首先确保机器的设置允许您这样做,例如在 eth0/eth1 机器上,它需要 ipforward 才能从一个接口转到另一个接口)。然后继续前进,一次一跳,朝着您的目标前进(并返回您的源:有时目标机器的路由/defaultgw 已损坏,因此回复数据包未通过正确的路径发送)
- ex1(非常简单):10.10.6.10 尝试发送到 10.10.5.10:步骤 1 您位于 eth1(10.10.6.10)上。该机器有一条路由,表示“10.10.5.0/24 直接位于此处,位于 eth0 上”。Ipforwarding 允许您从 eth1 跳转到 eth0。继续到 eth0。步骤 2:您现在位于 eth0 上(相同的 IP 数据包)。事实证明这是您的目的地:很好。步骤 2b:回复数据包:反向源/目的地:您现在是一个数据包(10.10.5.10 -> 10.10.6.10=):感谢上帝,本地路由告诉您下一跳位于 eth1 上。步骤 4:没有 eth1:您已到达目的地。很好。
- ex2(稍长的例子:)您是来自“any_machine”的数据包,10.10.6.12(在 eth1 端)。您尝试到达目的地 google(例如 8.8.8.8)。因此,您是“10.10.6.12 -> 8.8.8.8”,并且首先位于 10.10.6.12 接口(例如,eth3)。“any_machine”上的本地路由告诉您(因为它是上面的先决条件):“default gw=10.10.6.10”,因此您跳转到“yourbox”,并到达 eth1 端。步骤 2:您现在位于“yourbox/eth1”:现在本地路由告诉您“您需要通过 eth0 转到默认 gw:10.10.5.254”(并且“yourbox”上的 ipforward 允许您从 eth1 跳转到 eth0)。现在您到达了 eth0,按照默认的 gw 路由,稍后您将到达 ethW(10.10.5.254)上的“somerouter”。等等……(并且不要忘记检查回程路线)
答案2
您的默认网关为 10.10.5.254,但 eth1 接口配置为 10.10.6.10/24。这实际上意味着 10.10.6.x 接口无法到达默认网关,因为它们位于不同的子网中。
需要更多常规网络信息才能正确评估您的选择,但是从目前发布的信息来看,您的两个选择是:
- 确认这两个网络实际上是 /24 子网,如果是这样,请在该接口的配置文件中为 eth1 设置正确的网关
- 如果接口是较大超网的一部分,则将两个接口配置为位于 /16 子网上以使用相同的网关。
答案3
您启用了 IP 转发吗?
sysctl net.ipv4.ip_forward
如果显示 0,则表示您没有,并且您的盒子没有路由数据包。
启用它
sysctl -w net.ipv4.ip_forward=1
并通过添加以下内容使其永久生效/etc/sysctl.conf
:
net.ipv4.ip_forward = 1