1 个以太网适配器上的 2 个 IP

1 个以太网适配器上的 2 个 IP

我正在尝试让 2 个以太网适配器正常工作。第一个,eth0,开箱即用。第二个,eth1,行为很奇怪。该端口使用局域网9512。这是我的/etc/network/interfaces文件:

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
        address 10.0.0.195
        netmask 255.255.255.0
        hwaddress ether 40:D8:55:1D:D0:B1

auto eth1
iface eth1 inet static
        address 10.0.0.196
        netmask 255.255.255.0
        hwaddress ether 40:D8:55:1D:D0:B2

这是当我使用插入两个以太网适配器的电缆启动硬件时引导日志的相关部分:

macb f802c000.ethernet (unnamed net_device) (uninitialized): invalid hw address, using random
libphy: MACB_mii_bus: probed
macb f802c000.ethernet eth0: Cadence MACB rev 0x0001010c at 0xf802c000 irq 35 (42:8a:61:6e:a2:bb)
macb f802c000.ethernet eth0: attached PHY driver [Generic PHY] (mii_bus:phy_addr=f802c000.etherne:01, irq=-1)
[...]
usbcore: registered new interface driver smsc95xx
[...]
usb 1-1: New USB device found, idVendor=0424, idProduct=9512
usb 1-1: New USB device strings: Mfr=0, Product=0, SerialNumber=0
hub 1-1:1.0: USB hub found
hub 1-1:1.0: 3 ports detected
usb 1-1.1: new high-speed USB device number 3 using atmel-ehci
usb 1-1.1: New USB device found, idVendor=0424, idProduct=ec00
usb 1-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
usb 1-1.1: Product: LAN9512
usb 1-1.1: Manufacturer: SMSC
usb 1-1.1: SerialNumber: 00951370
smsc95xx v1.0.4
smsc95xx 1-1.1:1.0 eth1: register 'smsc95xx' at usb-700000.ehci-1.1, smsc95xx USB 2.0 Ethernet, 00:80:0f:95:13:70
[...]
IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready
smsc95xx 1-1.1:1.0 eth1: hardware isn't capable of remote wakeup
IPv6: ADDRCONF(NETDEV_UP): eth1: link is not ready
[...]
macb f802c000.ethernet eth0: link up (100/Full)
IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
Starting sshd: IPv6: ADDRCONF(NETDEV_CHANGE): eth1: link becomes ready
smsc95xx 1-1.1:1.0 eth1: link up, 100Mbps, full-duplex, lpa 0x45E1

ifconfig返回预期输出:

eth0      Link encap:Ethernet  HWaddr 40:D8:55:1D:D0:B1  
          inet addr:10.0.0.195  Bcast:0.0.0.0  Mask:255.255.255.0
          inet6 addr: fe80::42d8:55ff:fe1d:d0b1/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1795 errors:0 dropped:2 overruns:0 frame:0
          TX packets:1671 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:108141 (105.6 KiB)  TX bytes:115881 (113.1 KiB)
          Interrupt:35 Base address:0xc000 

eth1      Link encap:Ethernet  HWaddr 40:D8:55:1D:D0:B2  
          inet addr:10.0.0.196  Bcast:0.0.0.0  Mask:255.255.255.0
          inet6 addr: fe80::42d8:55ff:fe1d:d0b2/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1352 errors:0 dropped:2 overruns:0 frame:0
          TX packets:9 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:70740 (69.0 KiB)  TX bytes:762 (762.0 B)

现在我的问题。从不同的主机对两个 IP 执行 ping 操作都可以正常工作。但是当我只将电缆插入 eth0 时,我仍然可以 ping 通两个 IP。而我预计只能 ping 通 10.0.0.195。当我只在 eth1 中插入电缆时,我无法 ping 通两个 IP,现在我希望能够 ping 通 10.0.0.196。

到底是怎么回事?我该如何解决这个问题?

编辑

如所问:

$ netstat -rn
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
10.0.0.0        0.0.0.0         255.255.255.0   U         0 0          0 eth0
10.0.0.0        0.0.0.0         255.255.255.0   U         0 0          0 eth1

答案1

有一个 Linux 功能,当它们共享相同的 IP 子网时,无论特定的 IP 接口分配如何,您的计算机都会对每个接口上分配的每个 IP 地址进行回复。这可能适合也可能不适合您。

特征默认开启,可以通过配置系统控制

对于输出流量,您的机器是这样工作的:对于配置为 UP 的每个接口,都会在路由表中插入一条路由条目,无论是否有链路,也无论是否可以通过该接口到达任何其他节点或不。由于同一 IP 子网有两个接口,因此路由表中将有两条相同的路由。操作系统只会使用其中之一,而您无法控制使用哪一个!此外,使用哪一个与输出数据包将被发送到的回复数据包的传入地址无关。这意味着,故障转移通常不会按您的预期进行。

arp_filter - 布尔值

1 - 允许您在同一子网上拥有多个网络接口,并根据内核是否将来自 ARP 的 IP 的数据包路由到该接口(因此您必须使用基于源的源)来应答每个接口的 ARP。使其工作的路由)。换句话说,它允许控制哪些卡(通常是 1 个)将响应 arp 请求。

0 -(默认)内核可以使用来自其他接口的地址响应 arp 请求。这可能看起来是错误的,但通常是有道理的,因为它增加了成功沟通的机会。 IP 地址由 Linux 上的整个主机拥有,而不是由特定接口拥有。仅对于负载平衡等更复杂的设置,此行为才会导致问题。

如果conf/{all,interface}/arp_filter至少其中之一设置为TRUE,则接口的arp_filter将被启用,否则它将被禁用

arp_announce - 整数

定义不同的限制级别,用于从接口上发送的 ARP 请求中的 IP 数据包中公布本地源 IP 地址:

0 -(默认)使用在任何接口上配置的任何本地地址

1 - 尽量避免使用不在该接口的目标子网中的本地地址。当可通过此接口访问的目标主机要求 ARP 请求中的源 IP 地址成为接收接口上配置的逻辑网络的一部分时,此模式非常有用。当我们生成请求时,我们将检查包含目标 IP 的所有子网,如果源地址来自此类子网,则将保留源地址。如果不存在这样的子网,我们根据级别 2 的规则选择源地址。

2 - 始终使用该目标的最佳本地地址。在此模式下,我们忽略 IP 数据包中的源地址,并尝试选择我们喜欢与目标主机进行对话的本地地址。此类本地地址是通过在包含目标 IP 地址的传出接口上的所有子网上查找主 IP 地址来选择的。如果没有找到合适的本地地址,我们会选择在传出接口或所有其他接口上拥有的第一个本地地址,希望我们能够收到对我们的请求的答复,甚至有时无论我们宣布的源 IP 地址如何。

使用conf/{all,interface}/arp_announce 中的最大值。增加限制级别可以有更多机会从已解决的目标接收答案,而降低级别则可以公布更多有效的发件人信息。

相关内容