Низкая пропускная способность канала на Linux шлюзе

Собственно, все началось когда в компанию, где я работаю, позвонил менеджер интернет провайдера "Простор Телеком" (ранее Квантум) и предложила интересные условия на доступ в Интернет. У нас уже было два канала от Билайна и Дом.Ру-Интерзет, но почему бы не попробовать еще, тем более что Простор-Телеком предложил потестировать их канал 20Мб/с бесплатно в течение 2-х недель.

В качестве шлюза у меня используется сервер, на котором стоит Debian; на борту - 4 сетевые карточки, уже сделана балансировка сети, т.е. трафик распределяется примерно поровну между двумя существующими провайдерами. Собственно оба канала (Билайн и Дом.Ру) по документам обеспечивают скорость 20Мб/c, по факту же оказалось, что скорость через канал Билайн составляет 20..30Мб/с, а через канал Дом.Ру - 60..80Мб/с, в зависимости от времени суток, причем входящий поток обычно чуть быстрее исходящего. Замеры скорости по обоим каналам производились как популярными инструментами на клиентах (http://yandex.ru/internet/ , http://www.speedtes.net/, http://2ip.ru/speed/), так и анализом графиков сетевой активности на самом шлюзе (установлен Munin).

Итак, в один из рабочих дней в наш офис протянули канал от Простор-Телекома. Проверили доступ и скорость указанными выше инструментами, все, вроде ОК.

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

Соответственно, определил, какие у меня интерфейсы есть:

# ifconfig -a

Проверил сохраненные описания интерфейсов:

# cat /etc/network/interfaces

и откорректировал их.

На моем шлюзе свободным оказался - eth4, прописал на него необходимые сетевые настройки и поднял его:

# ifconfig eth4 X.X.X.X netmask 255.255.255.0 up

Проверил появление интерфейса среди активных и его настройки:

# ifconfig
# ip a
# ip link ls up

Проверил существующие таблицы роутинга:

# cat /etc/iproute2/rt_tables
#
# reserved values
#
255     local
254     main
253     default
0       unspec
#
# local
#
#1      inr.ruhep
11      T1
12      T2
13      T3

Таблица T1  оказалась пустой:

# ip route show table T1

Прописал необходимые маршруты:

ip route add X.X.X.0/24 dev eth4 src X.X.X.X

Добавил маршрут в таблицу роутинга T1:
# ip route add default via X.X.X.1 dev eth4 table T1
# ip route add X.X.X.0 dev eth4 src X.X.X.X table T1

Добавил правило роутинга:
# ip rule add from X.X.X.X lookup T1

Проверили работу:
#ping -c 3 -I eth4 ya.ru

Заработало, похоже.

Добавил правило, чтобы определенная виртуалка ходила через тестовый канал
# ip rule add from 192.168.0.46 lookup T1

Также добавил правило для брандмауера: изменил конфиг  /etc/arno-iptables-firewall/firewall.conf , добавил в строку внешних интерфейсов eth4

EXT_IF="eth0 eth3 eth4"

Все настройки сделаны, теперь с машины с адресом 192.168.0.46 я выхожу в Интернет через новый тестовый канал. И тут меня ждало разочарование: вместо ожидаемых 20Мб/с я вижу скорость всего на уровне 1-2, максимум - 4Мб/с. Причем измеряя скорость на отдельно стоящей Windows машине через тот же самый провод я вижу заявленные  20Мб/с. Непонятки какие-то и не особо много идей, как решать проблему...

И дальше начинается, увы, шаманство. Погуглил немного, продолжаю искать решение:

# lspci | grep Eth
03:03.0 Ethernet controller: D-Link System Inc DGE-528T Gigabit Ethernet Adapter (rev 10)
04:03.0 Ethernet controller: Intel Corporation 82541GI Gigabit Ethernet Controller (rev 05)
04:04.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8139/8139C/8139C+ (rev 10)
04:05.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8139/8139C/8139C+ (rev 10)

У меня 2 одинаковых интерфейса, но, фактически, работают они по разному.

Этот на канале Билайна, с ним все в порядке:

# ethtool -i eth0
driver: 8139too
version: 0.9.28
firmware-version:
bus-info: 0000:04:05.0
supports-statistics: yes
supports-test: no
supports-eeprom-access: no
supports-register-dump: yes
supports-priv-flags: no

А второй такой же, для канала Простор-Телеком, работает "криво":

# ethtool -i eth4
driver: 8139too
version: 0.9.28
firmware-version:
bus-info: 0000:04:04.0
supports-statistics: yes
supports-test: no
supports-eeprom-access: no
supports-register-dump: yes
supports-priv-flags: no

Сравниваю дальше:

# ethtool eth0
Settings for eth0:
        Supported ports: [ TP MII ]
        Supported link modes:   10baseT/Half 10baseT/Full
                                100baseT/Half 100baseT/Full
        Supported pause frame use: No
        Supports auto-negotiation: Yes
        Advertised link modes:  10baseT/Half 10baseT/Full
                                100baseT/Half 100baseT/Full
        Advertised pause frame use: No
        Advertised auto-negotiation: Yes
        Link partner advertised link modes:  10baseT/Half 10baseT/Full
                                             100baseT/Half 100baseT/Full
        Link partner advertised pause frame use: Symmetric
        Link partner advertised auto-negotiation: Yes
        Speed: 100Mb/s
        Duplex: Full
        Port: MII
        PHYAD: 32
        Transceiver: internal
        Auto-negotiation: on
        Supports Wake-on: pumbg
        Wake-on: d
        Current message level: 0x00000007 (7)
                               drv probe link
        Link detected: yes

 

# ethtool eth4
Settings for eth4:
        Supported ports: [ TP MII ]
        Supported link modes:   10baseT/Half 10baseT/Full
                                100baseT/Half 100baseT/Full
        Supported pause frame use: No
        Supports auto-negotiation: Yes
        Advertised link modes:  Not reported
        Advertised pause frame use: No
        Advertised auto-negotiation: No
        Speed: 10Mb/s
        Duplex: Full
        Port: MII
        PHYAD: 32
        Transceiver: internal
        Auto-negotiation: off
        Supports Wake-on: pumbg
        Wake-on: p
        Current message level: 0x00000007 (7)
                               drv probe link
        Link detected: yes

и обнаружил, что для вновь поднятого интерфейса по какой-то причине стоит скорость 10Mb/s и Auto-negotiation: off

Изменил настройки:

# ethtool --change eth4 autoneg on

# ethtool eth4
Settings for eth4:
        Supported ports: [ TP MII ]
        Supported link modes:   10baseT/Half 10baseT/Full
                                100baseT/Half 100baseT/Full
        Supported pause frame use: No
        Supports auto-negotiation: Yes
        Advertised link modes:  10baseT/Half 10baseT/Full
                                100baseT/Half 100baseT/Full
        Advertised pause frame use: Symmetric
        Advertised auto-negotiation: Yes
        Link partner advertised link modes:  10baseT/Half 10baseT/Full
                                             100baseT/Half 100baseT/Full
        Link partner advertised pause frame use: No
        Link partner advertised auto-negotiation: Yes
        Speed: 100Mb/s
        Duplex: Full
        Port: MII
        PHYAD: 32
        Transceiver: internal
        Auto-negotiation: on
        Supports Wake-on: pumbg
        Wake-on: p
        Current message level: 0x00000007 (7)
                               drv probe link
        Link detected: yes

Скорость на интерфейсе автоматически установилась в 100Mb/s и проверки на клиенте привели к ожидаемому результату: