Почему сетевой трафик Linux проходит только через eth0?

20

Я получил две сетевые карты на стороне сервера, eth0? 192.168.8.140 и eth1? 192.168.8.142. Клиент отправляет данные в 192.168.8.142, и я ожидаю iftopпоказать трафик для eth1, но это не так. Все сети проходят через eth0, так как я могу протестировать две сетевые карты?

Почему весь трафик проходит через eth0 вместо eth1? Я ожидал, что смогу получить 1 Гбит / с на интерфейс. Что не так с моей настройкой или настройкой?

сервер

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
Wener
источник
1
Похоже, что вы действительно ищете, это связывание интерфейса: wiki.linuxfoundation.org/networking/bonding
Flexo
@flexo совершенно прав - в зависимости от вашей конечной цели, объединение двух сетевых интерфейсов может дать вам более широкую полосу пропускания, но варианты соединения могут быть разными. Лучшее, что вы можете получить - это 2 потока по ~ 1 Гбит, а не 1 поток по 2 Гбит. Кроме того, вам требуются услуги управляемого коммутатора Ethernet. Аналогично, соединение 4 может дать потоки 4x 1 Гбит сразу.
Кригги

Ответы:

32

Существуют две возможные модели проектирования сетевого стека TCP / IP: модель сильного хоста и модель слабого хоста. Вы ожидаете поведения, которое будет соответствовать модели сильного хоста. Linux предназначен для использования модели слабого хоста. В целом, модель слабого хоста является более распространенной, поскольку она уменьшает сложность кода маршрутизации и, следовательно, может предложить более высокую производительность. В остальном две хост-модели - это просто разные принципы проектирования: ни одна из них не лучше, чем другая.

По сути, модель слабого хоста означает, что исходящий трафик будет отправляться по первому интерфейсу, указанному в таблице маршрутизации, который соответствует IP-адресу назначения (или выбранному шлюзу, если пункт назначения недоступен напрямую), без учета исходного IP- адреса. адрес .

Именно поэтому, как правило, не рекомендуется использовать два отдельных физических интерфейса, если вам нужны два IP-адреса в одном сегменте сети. Вместо этого назначьте два IP-адреса для одного интерфейса (псевдонимы IP: например, eth1 = 192.168.8.142 и eth1: 0 = 192.168.8.140). Если вам нужна большая полоса пропускания, чем может предоставить один интерфейс, соедините (или объедините, если применимо) два или более интерфейсов вместе, а затем запустите оба IP-адреса в объединении / группе.

Путем настройки ряда параметров sysctl и использования функции «расширенной маршрутизации» для настройки независимых таблиц маршрутизации для каждого сетевого адаптера можно заставить Linux вести себя как система с сильной моделью хоста. Но это очень особенная конфигурация, и я бы рекомендовал дважды подумать, прежде чем ее применять.

См. Ответы в разделе « Маршрутизация исходного кода Linux», «Модель систем с сильным концом / Модель с мощным хостом»? если тебе это действительно нужно

Телком
источник
Режим по умолчанию также вызывает неприятные сюрпризы, если вы пытаетесь
настроить
да, я получал удовольствие от реализации модели сильного хоста в прошлом. Это было необходимо для этого проекта, но я бы не стал переживать эту головную боль за личную машину.
Балдрикк
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.142вернет eth1 вместо eth0. Тогда все работает как положено.

Wener
источник
3
Если вы пропустите настройки ARP sysctl, упомянутые в вопросе, о котором я говорил, и будете иметь дело с коммутаторами и маршрутизаторами корпоративного уровня, ваш сетевой администратор будет немного недоволен тем, что вы вызываете ненужные сообщения «переброса IP-адресов» на маршрутизаторе, так как система может по-прежнему отвечать на запросы ARP для обоих IP-адресов на обоих интерфейсах. Или, если у вас есть защита от перехвата IP-адресов в сети, она может задействовать и отключить весь трафик вашей системы.
ТелекомМ