Чому мережевий трафік Linux проходить лише через eth0?


20

У мене є два NIC на стороні сервера, eth0? 192.168.8.140 і eth1? 192.168.8.142. Клієнт надсилає дані на 192.168.8.142, і я очікую iftopпоказати трафік для eth1, але це не так. Всі мережі проходять через eth0, тож як я можу протестувати два NIC?

Чому весь трафік проходить через 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

1
Здається, те, що ви насправді шукаєте, це зв’язування інтерфейсу: wiki.linuxfoundation.org/networking/bonding
Flexo

@flexo абсолютно правий - залежно від вашої кінцевої мети, з'єднання двох мережевих інтерфейсів разом може дати вам більше загальної пропускної здатності, але варіанти зв’язку варіюються. Найкраще ви можете отримати 2 потоки ~ 1 Гбіт, а не 1 потік 2 Гбіт. Крім того, вам потрібні послуги керованого Ethernet комутатора. Так само зв'язування 4 може давати одночасно 4х Гбіт потоків.
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

так, мені було цікаво впроваджувати сильну модель хоста в минулому. Це було потрібно для цього проекту, але я б не переймався, переживаючи головний біль для особистої машини.
Балдрік

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. Тоді все працює як очікувалося.


3
Якщо ви опустите параметри sysctl ARP, згадані в питанні, про яке я посилався, і маєте справу з комутаторами та маршрутизаторами корпоративного рівня, ваш мережевий адміністратор буде трохи незадоволений вами, викликаючи непотрібні повідомлення "плескання IP-адреси" на маршрутизаторі, як система все ще може відповідати на запити ARP для обох IP-адрес на обох інтерфейсах. Або якщо у вас є захист IP-крадіжок у мережі, він може залучати та вимикати весь трафік у вашій системі.
telcoM
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.