Por que o tráfego de rede do Linux passa apenas pela eth0?

20

Eu tenho duas placas de rede no lado do servidor, eth0? 192.168.8.140 e eth1? 192.168.8.142. O cliente envia dados para 192.168.8.142 e espero que iftop mostre o tráfego para eth1, mas isso não acontece. Todas as redes passam pela eth0, então como posso testar as duas placas de rede?

Por que todo o tráfego passa pela eth0 em vez da eth1? Eu esperava conseguir 1 Gbit / s por interface. O que há de errado com minha configuração ou configuração?

Servidor

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

Lado do servidor

# 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!

Cliente

# 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!

Lado do servidor

$ 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
    
por wener 22.01.2018 / 07:39

3 respostas

32

Existem dois modelos de design possíveis para uma pilha de rede TCP / IP: um modelo de host strong e um modelo de host fraco. Você está esperando um comportamento que corresponda ao modelo de host strong. O Linux foi projetado para usar o modelo host fraco. Em geral, o modelo de host fraco é mais comum, pois reduz a complexidade do código de roteamento e, portanto, pode oferecer melhor desempenho. Caso contrário, os dois modelos de host são apenas princípios de design diferentes: nenhum é inerentemente melhor que o outro.

Basicamente, o modelo de host fraco significa que o tráfego de saída será enviado pela primeira interface listada na tabela de roteamento que corresponda ao endereço IP do destino (ou gateway selecionado, se o destino não puder ser acessado diretamente) sem levar em conta o endereço IP de origem .

É basicamente por isso que é geralmente desaconselhável usar duas interfaces físicas separadas se você precisar de dois endereços IP no mesmo segmento de rede. Em vez disso, atribua dois endereços IP para uma interface (aliases de IP: por exemplo, eth1 = 192.168.8.142 e eth1: 0 = 192.168.8.140). Se você precisar de mais largura de banda do que uma única interface pode fornecer, vincular (ou equipe, se aplicável) duas ou mais interfaces juntas e, em seguida, executar os dois IPs no vínculo / equipe.

Ajustando várias configurações de sysctl e usando a funcionalidade de "roteamento avançado" para configurar tabelas de roteamento independentes para cada NIC, é possível fazer o Linux se comportar como um sistema de modelo de host strong. Mas essa é uma configuração muito especial, e eu recomendaria pensar duas vezes antes de implementá-la.

Veja as respostas em Roteamento de origem do Linux , Strong End System Model / modelo host strong? se você realmente precisar dele.

    
por 22.01.2018 / 08:13
11

Um ponto adicional a ser considerado é que a interface eth1 é configurada com uma máscara de sub-rede de 255.255.255.255.

Isso significa que a interface eth1 está configurada para não esperar outros dispositivos (hosts) em sua interface de rede. Isso significa que não será capaz de se comunicar com seu cliente 192.168.8.142.

    
por 22.01.2018 / 13:32
2

Depois de muita pesquisa, eu encontrei Por que o netcat não usa a interface certa associada ao IP? , e este é o mesmo problema. Como a @telcoM disse, o tráfego de saída será enviado para a primeira interface, e esse é o problema, portanto, a maneira mais fácil de resolver isso é:

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

Esta rota fará com que ip route get 192.168.8.135 from 192.168.8.142 retorne eth1 em vez de eth0. Então tudo funciona como esperado.

    
por 22.01.2018 / 08:45