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

Ora*_*Tux 6 ethernet

我正在尝试让 2 个以太网适配器工作。第一个,eth0,开箱即用。第二个,eth1,表现得很奇怪。该端口使用LAN9512。这是我的/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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

现在我的问题。从不同的主机 Ping 到两个 IP 工作正常。但是当我只将电缆插入 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
Run Code Online (Sandbox Code Playgroud)

Las*_*lko 10

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

此功能默认开启,您可以通过sysctl进行配置。

对于输出流量,您的机器是这样工作的:对于每个配置为 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 的最大值。增加限制级别提供更多机会从已解决的目标接收答复,而降低级别宣布更多有效的发件人信息。