이더넷 어댑터 1개에 IP 2개

이더넷 어댑터 1개에 IP 2개

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를 모두 핑하면 정상적으로 작동합니다. 그러나 케이블을 eth0에만 연결하면 두 IP 모두에 대해 ping을 수행할 수 있습니다. 그리고 10.0.0.195로만 핑을 보낼 수 있을 것으로 예상했습니다. 케이블을 eth1에만 연결했을 때 두 IP를 모두 핑할 수 없었습니다. 이제 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

동일한 IP 서브넷을 공유할 때 특정 IP 인터페이스 할당에 관계없이 컴퓨터가 각 인터페이스에 할당된 모든 IP 주소에 응답하는 Linux 기능이 있습니다. 이것은 당신에게 효과가 있을 수도 있고 그렇지 않을 수도 있습니다.

이것특징기본적으로 활성화되어 있으며 다음을 통해 구성할 수 있습니다.시스템 제어.

나가는 트래픽의 경우 시스템은 다음과 같이 작동합니다. UP으로 구성된 모든 인터페이스에 대해 링크가 있는지 또는 해당 인터페이스를 통해 다른 노드에 도달할 수 있는지 여부에 관계없이 경로 항목이 라우팅 테이블에 삽입됩니다. 동일한 IP 서브넷에 두 개의 인터페이스가 있으므로 라우팅 테이블에는 두 개의 동일한 경로가 있습니다. 운영 체제는 그 중 하나만 사용하며 어느 것이 사용되는지 제어할 수 없습니다! 또한, 어느 것을 사용하든 출력 패킷이 전송될 응답 패킷의 수신 주소와는 아무런 관련이 없습니다. 이는 장애 조치가 예상대로 작동하지 않는 경우가 많다는 것을 의미합니다.

arp_filter - 부울

1 - 동일한 서브넷에 여러 네트워크 인터페이스가 있고 커널이 ARP IP에서 해당 인터페이스로 패킷을 라우팅하는지 여부에 따라 각 인터페이스에 대해 ARP에 응답할 수 있습니다(따라서 소스 기반 소스를 사용해야 함). 작동하도록 라우팅). 즉, arp 요청에 응답할 카드(보통 1개)를 제어할 수 있습니다.

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에서 최대값을 사용하세요. 제한 수준을 높이면 해결된 대상으로부터 답변을 받을 수 있는 기회가 늘어나고, 제한 수준을 낮추면 유효한 발신자 정보를 더 많이 알릴 수 있습니다.

관련 정보