Linux 네트워크 트래픽이 왜 eth0을 통과합니까?


20

서버 측에 두 개의 NIC (eth0)가 있습니다. 192.168.8.140 및 eth1? 192.168.8.142. 클라이언트는 192.168.8.142로 데이터를 전송 iftop하지만 eth1의 트래픽을 표시 할 것으로 예상 되지만 그렇지 않습니다. 모든 네트워크는 eth0을 통과하므로 두 NIC를 어떻게 테스트 할 수 있습니까?

모든 트래픽이 eth1 대신 eth0을 통과하는 이유는 무엇입니까? 인터페이스 당 1Gbit / s를 얻을 수있을 것으로 예상했습니다. 설정 또는 구성에 어떤 문제가 있습니까?

섬기는 사람

ifconfig

eth0    Link encap:Ethernet  HWaddr 00:00:00:19:26:B0
        inet addr:192.168.8.140  Bcast:0.0.0.0  Mask:255.255.252.0
        inet6 addr: 0000::0000:0000:fe19:26b0/64 Scope:Link
        UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
        RX packets:45287446 errors:0 dropped:123343 overruns:2989 frame:0
        TX packets:3907747 errors:0 dropped:0 overruns:0 carrier:0
        collisions:0 txqueuelen:1000
        RX bytes:66881007720 (62.2 GiB)  TX bytes:261053436 (248.9 MiB)
        Memory:f7e00000-f7efffff

eth1    Link encap:Ethernet  HWaddr 00:00:00:19:26:B1
        inet addr:192.168.8.142  Bcast:0.0.0.0  Mask:255.255.255.255
        inet6 addr: 0000::0000:0000:fe19:26b1/64 Scope:Link
        UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
        RX packets:19358 errors:0 dropped:511 overruns:0 frame:0
        TX packets:14 errors:0 dropped:0 overruns:0 carrier:0
        collisions:0 txqueuelen:1000
        RX bytes:1772275 (1.6 MiB)  TX bytes:1068 (1.0 KiB)
        Memory:f7c00000-f7cfffff

서버 측

# Listen for incomming from 192.168.8.142
nc -v -v -n -k -l 192.168.8.142 8000 | pv > /dev/null
Listening on [192.168.8.142] (family 0, port 8000)
Connection from 192.168.8.135 58785 received!

고객

# Send to 192.168.8.142
time yes | pv |nc -s 192.168.8.135 -4 -v -v -n 192.168.8.142 8000 >/dev/null
Connection to 192.168.8.142 8000 port [tcp/*] succeeded!

서버 측

$ iftop -i eth0
interface: eth0
IP address is: 192.168.8.140

TX:             cumm:  6.34MB   peak: 2.31Mb   rates: 2.15Mb  2.18Mb  2.11Mb
RX:                    2.55GB          955Mb           874Mb   892Mb   872Mb
TOTAL:                 2.56GB          958Mb           877Mb   895Mb   874Mb

$ iftop -i eth1
interface: eth1
IP address is: 192.168.8.142

TX:             cumm:      0B   peak:     0b   rates:     0b      0b      0b
RX:                    4.51KB         3.49Kb          3.49Kb  2.93Kb  2.25Kb
TOTAL:                 4.51KB         3.49Kb          3.49Kb  2.93Kb  2.25Kb

$ ip link show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
    link/ether 00:00:00:19:26:b0 brd ff:ff:ff:ff:ff:ff
$ ip link show eth1
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
    link/ether 00:00:00:19:26:b1 brd ff:ff:ff:ff:ff:ff

1
실제로 찾고있는 것은 인터페이스 본딩입니다 : wiki.linuxfoundation.org/networking/bonding
Flexo

@flexo는 완벽하게 맞습니다. 궁극적 인 목표에 따라 두 개의 네트워크 인터페이스를 결합하면 전체 대역폭이 더 커질 수 있지만 결합 옵션은 다양합니다. 당신이 얻을 수있는 가장 좋은 것은 2 스트림 ~ 2 기가 비트의 1 스트림이 아닙니다. 또한 관리되는 이더넷 스위치 서비스가 필요합니다. 마찬가지로, 본딩 4는 한 번에 4x 1 Gbit 흐름을 제공 할 수 있습니다.
Criggie

답변:


32

TCP / IP 네트워크 스택에 대한 두 가지 가능한 디자인 모델이 있습니다 : 강력한 호스트 모델과 취약한 호스트 모델. 강력한 호스트 모델과 일치하는 동작을 기대하고 있습니다. Linux는 취약한 호스트 모델을 사용하도록 설계되었습니다. 일반적으로 라우팅 코드의 복잡성을 줄이고 더 나은 성능을 제공 할 수 있으므로 취약한 호스트 모델이 더 일반적입니다. 그렇지 않으면 두 호스트 모델은 서로 다른 디자인 원칙입니다. 본질적으로 다른 것보다 낫습니다.

기본적으로 취약한 호스트 모델은 발신 IP 가 원본 IP와 상관없이 대상의 IP 주소 (또는 대상에 직접 연결할 수없는 경우 선택한 게이트웨이)와 일치하는 라우팅 테이블에 나열된 첫 번째 인터페이스로 전송됨을 의미합니다. 주소 .

기본적으로 동일한 네트워크 세그먼트에 두 개의 IP 주소가 필요한 경우 두 개의 개별 물리적 인터페이스를 사용하지 않는 것이 좋습니다. 대신 하나의 인터페이스에 두 개의 IP 주소를 할당하십시오 (예 : eth1 = 192.168.8.142 및 eth1 : 0 = 192.168.8.140). 단일 인터페이스가 제공 할 수있는 것보다 더 많은 대역폭이 필요한 경우 두 개 이상의 인터페이스를 함께 본드 (또는 해당하는 경우 팀)로 본딩 한 다음 본드 / 팀에서 두 IP를 모두 실행하십시오.

많은 sysctl 설정을 조정하고 "고급 라우팅"기능을 사용하여 각 NIC에 대한 독립적 인 라우팅 테이블을 설정함으로써 Linux를 강력한 호스트 모델 시스템처럼 작동시킬 수 있습니다. 그러나 이것은 매우 특별한 구성이므로 구현하기 전에 두 번 생각하는 것이 좋습니다.

Linux 소스 라우팅, 강력한 최종 시스템 모델 / 강력한 호스트 모델 의 답변을 참조하십시오 . 정말로 필요하다면.


기본 모드는 iptables로 트래픽을 구성하려고 시도하는 경우 대기하는 나쁜 놀라움입니다. :)
rackandboneman

예, 과거에는 강력한 호스트 모델을 구현하는 것이 즐거웠습니다. 그 프로젝트에는 필요했지만 개인용 컴퓨터로 두통을 겪지 않을 것입니다.
Baldrickk

11

고려해야 할 추가 사항은 eth1 인터페이스가 255.255.255.255의 서브넷 마스크로 구성되어 있다는 것입니다.

이는 eth1 인터페이스가 네트워크 인터페이스에 다른 장치 (호스트)가 없도록 구성되어 있음을 의미합니다. 이는 192.168.8.142 클라이언트와 통신 할 수 없음을 의미합니다.


2

많은 검색을 한 후 왜 netcat이 IP와 관련된 올바른 인터페이스를 사용하지 않습니까? , 이것은 같은 문제입니다. @telcoM이 말했듯이 발신 트래픽은 첫 번째 인터페이스로 전송되며 이것이 문제이므로이를 해결하는 가장 쉬운 방법은 다음과 같습니다.

ip route add default via 192.168.8.142 dev eth1 table 142
ip rule add from 192.168.8.142 table 142

이 경로는 ip route get 192.168.8.135 from 192.168.8.142eth0 대신 eth1 을 반환 합니다 . 그런 다음 모든 것이 예상대로 작동합니다.


3
내가 언급 한 질문에서 언급 한 ARP sysctl 설정을 생략하고 엔터프라이즈 급 스위치 및 라우터를 처리하는 경우 네트워크 관리자는 라우터에서 불필요한 "IP 주소 플 래핑"메시지를 발생시키는 것에 약간 불만이 생길 것입니다. 시스템은 여전히 ​​두 인터페이스의 두 IP에 대한 ARP 요청에 응답 할 수 있습니다. 또는 네트워크에 IP 하이재킹 보호 기능이있는 경우 시스템에 대한 모든 트래픽을 활성화 및 비활성화 할 수 있습니다.
telcoM
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.