Por que o tráfego de rede Linux passa apenas pelo 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 iftopmostrar o tráfego para eth1, mas isso não acontece. Todas as redes passam por eth0, então como posso testar as duas placas de rede?

Por que todo o tráfego passa por eth0 em vez de eth1? Eu esperava conseguir 1 Gbit / s por interface. O que há de errado com minha instalaçã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

11
Parece que o que você realmente está procurando é a ligação de interface: wiki.linuxfoundation.org/networking/bonding
Flexo

O @flexo está totalmente certo - dependendo do seu objetivo final, unir as duas interfaces de rede pode oferecer mais largura de banda geral, mas as opções de ligação variam. O melhor que você pode obter é 2 fluxos de ~ 1 Gbit e não 1 fluxo de 2 Gbit. Além disso, você precisa dos serviços de um switch Ethernet gerenciado. Da mesma forma, a ligação 4 pode gerar fluxos de 4x 1 Gbit de uma só vez.
Criggie

Respostas:


32

Existem dois modelos de design possíveis para uma pilha de rede TCP / IP: um modelo de host forte e um modelo de host fraco. Você está esperando um comportamento que corresponda ao modelo de host forte. O Linux foi projetado para usar o modelo de 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 para a primeira interface listada na tabela de roteamento que corresponda ao endereço IP do destino (ou gateway selecionado, se o destino não for alcançável diretamente), sem considerar o IP de origem endereço .

É basicamente por isso que geralmente não é aconselhá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, vincule (ou equipe, se aplicável) duas ou mais interfaces e, em seguida, execute os dois IPs no vínculo / equipe.

Ajustando várias configurações do sysctl e usando a funcionalidade "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 forte. Mas essa é uma configuração muito especial, e eu recomendaria pensar duas vezes antes de implementá-la.

Veja as respostas em Linux Source Routing, Modelo de sistema final forte / Modelo de host forte? se você realmente precisar.


O modo padrão é também uma má surpresa esperando se tentar o tráfego forma com iptables :)
rackandboneman

Sim, eu me diverti implementando o modelo de host forte no passado. Era necessário para esse projeto, mas eu não me incomodaria em passar por essa dor de cabeça por uma máquina pessoal.
precisa saber é o seguinte

11

Um ponto adicional a considerar é que a interface eth1 está configurada com uma máscara de sub-rede 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 ele não poderá se comunicar com seu cliente 192.168.8.142.


2

Após muita pesquisa, descobri Por que o netcat não usa a interface correta 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

Essa rota fará o ip route get 192.168.8.135 from 192.168.8.142retorno eth1 em vez de eth0. Então tudo funciona como esperado.


3
Se você omitir as configurações de sysctl do ARP mencionadas na pergunta a que me referi e estiver lidando com roteadores e switches de nível corporativo, o administrador da rede ficará um pouco insatisfeito com você, causando mensagens desnecessárias de "alteração de endereço IP" no roteador, como o O sistema ainda pode responder às solicitações de ARP para os dois IPs nas duas interfaces. Ou, se você possui proteção contra seqüestro de IP na rede, ela pode ativar e desativar todo o tráfego do seu sistema.
TelcoM
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.