Linux 네트워크 트래픽이 eth0만 통과하는 이유는 무엇입니까?

Linux 네트워크 트래픽이 eth0만 통과하는 이유는 무엇입니까?

서버 측에 두 개의 네트워크 카드가 있습니다(eth0?). 192.168.8.140 및 eth1? 192.168.8.142. 클라이언트가 192.168.8.142로 데이터를 보내고 iftopeth1에 대한 트래픽이 표시될 것으로 예상했지만 표시되지 않습니다. 모든 네트워크는 eth0을 통과하는데, 이 두 네트워크 카드를 어떻게 테스트합니까?

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

섬기는 사람

구성된 경우

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

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

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

이것이 기본적으로 동일한 네트워크 세그먼트에 두 개의 IP 주소가 필요한 경우 두 개의 별도 물리적 인터페이스를 사용하는 것이 일반적으로 권장되지 않는 이유입니다. 대신 인터페이스에는 두 개의 IP 주소(IP 별칭: 예: eth1 = 192.168.8.142 및 eth1:0 = 192.168.8.140)가 할당됩니다. 단일 인터페이스가 제공할 수 있는 것보다 더 많은 대역폭이 필요한 경우 두 개 이상의 인터페이스를 함께 결합(또는 해당하는 경우 결합)하고 결합/팀에서 두 IP를 모두 실행합니다.

일부 sysctl 설정을 조정하고 고급 라우팅 기능을 사용하여 각 NIC에 대해 별도의 라우팅 테이블을 설정함으로써 Linux가 강력한 호스트 모델 시스템처럼 작동하도록 만들 수 있습니다. 그러나 이는 매우 구체적인 구성이므로 구현하기 전에 두 번 생각해 보는 것이 좋습니다.

답변 보기Linux 소스 라우팅, 강력한 엔드 시스템 모델/강력한 호스트 모델?정말로 필요한 경우.

답변2

고려해야 할 또 다른 점은 eth1 인터페이스에 구성된 서브넷 마스크가 255.255.255.255라는 것입니다.

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

답변3

많은 검색 끝에 찾았습니다.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을 반환합니다. 그러면 모든 것이 예상대로 작동할 것입니다.

관련 정보