Назад | Перейти на главную страницу

Как добиться попакетной многопутевой маршрутизации в Linux?

Ядро Linux до версии 3.6 использовало кеширование маршрутов для многопутевой маршрутизации IPv4, что означало, что маршрутизация между двумя отдельными линиями / провайдерами была довольно простой. Начиная с версии 3.6 алгоритм изменился на пакетный, что означает, что для достижения двух линий / ISP потребовались некоторые уловки с маркерной таблицей / правилом / iptables.

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

Начиная с 4.4, ядро снова поменяли для балансировки нагрузки на основе потоков на основе хэша по адресам источника и назначения.

В настоящее время я использую ядро ​​4.4.36 и использую многопутевую маршрутизацию через соединения PPPoE. Мой нисходящий трафик от ISP маршрутизируется по двум отдельным линиям для каждого пакета (один IP-адрес направляется по обеим линиям). Это дает мне скорость загрузки выше, чем скорость отдельной строки. Почти скорость обеих линий сложена. Он работает очень хорошо, видео в Skype, VoIP (UDP), YouTube и т. Д. Отлично работают.

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

Есть ли способ настроить текущее ядро ​​для использования алгоритма посылки? Или какой-либо другой метод достижения многопутевой маршрутизации по пакетам? Придется ли мне вернуться к более старому ядру (чего я не хочу делать по другим причинам)?

Мой интернет-провайдер не поддерживает multi-link ppp.

Если это актуально, я сейчас использую Arch Linux ARMv7 на Raspberry Pi 3.

Итак, у меня было больше времени, чтобы исследовать это, я нашел способ сделать это с помощью Linux TEQL (True Link Equalizer). Вот ссылка, по которой я перешел, но с некоторыми изменениями.

http://lartc.org/howto/lartc.loadshare.html

Вот как я заработал на Arch Linux ARMv7 (Raspberry Pi 3)

При загрузке:

Следующая команда должна быть запущена при загрузке, чтобы загрузить соответствующий модуль ядра.

modprobe sch_teql

Следующие команды также можно запускать при загрузке, если вы хотите использовать NAT из локальной сети на eth0.

sysctl -w net.ipv4.ip_forward=1
iptables -A INPUT -i ppp+ -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i ppp+ -o eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A POSTROUTING -t nat -o teql+ -j MASQUERADE

ПРЯМОЙ обратный трафик находится на ppp +, а МАСКИРОВКА ПОСТАВКИ на teql +, потому что исходящий трафик уходит на teql, а обратный трафик возвращается на ppp.

Когда появляются ссылки ppp:

Предполагая, что для балансировки нагрузки используются ссылки ppp, следующие команды должны выполняться в сценарии в /etc/ppp/ip-up.d/ сценарий.

sysctl -w net.ipv4.conf.ppp1.rp_filter=2
sysctl -w net.ipv4.conf.ppp2.rp_filter=2
tc qdisc add dev ppp1 root teql0
tc qdisc add dev ppp2 root teql0
ip address add 1.1.1.1/32 dev teql0
# you can add additional public IP addresses teql0 if you need to
ip link set teql0 up
ip route replace default scope global dev teql0

куда 1.1.1.1 ваш общедоступный IP-адрес, подключенный к Интернет-провайдеру. Дополнительные общедоступные IP-адреса могут быть назначены устройству teql0, но не должны назначаться устройствам ppp. В моей настройке две ссылки ppp имеют один и тот же IP-адрес (согласованный с помощью pppoe и т. Д.) Ссылка teql назначена вручную, как показано выше. Интернет-провайдеру необходимо отправлять трафик для IP одинаково по обоим каналам.

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

Я так настроил, и он отлично работает. Очень просто! Когда ссылки выходят из строя, происходит плавное переключение при отказе. Когда они подходят, они просто снова начинают работать. Похоже, что при отказе нет ни потери пакетов, ни задержки, ни при восстановлении.

Кроме того, один из комментаторов предложил ссылку ниже, которая использует маршрутизацию политики, с iptables для маркировки каждого другого пакета и т. Д., Но я постараюсь через несколько дней посмотреть, работает ли он лучше, чем указано выше, и соответственно предоставить здесь свой отзыв.

http://support.aa.net.uk/Router_-_Linux_upload_bonding_using_policy_routing