Ядро Linux до 3.6 использовало кэширование маршрутов для многопутевой маршрутизации IPv4, что означало, что маршрутизация между двумя отдельными линиями / провайдерами была довольно простой. С 3.6 алгоритм изменился на пакетный, что означало, что для достижения двух линий / интернет-провайдеров требовались некоторые приемы маркера таблицы маршрутов / правила / iptables.
Однако если бы у вас было две линии с одним и тем же провайдером, которые могли бы маршрутизировать один IP по обеим линиям для каждого пакета в режиме сбалансированного / аварийного переключения, то из 3.6 вы могли бы легко добиться соединения линий (на уровне IP) из-за маршрутизация за пакет в обоих направлениях.
Начиная с 4.4, ядро снова переключилось на балансировку нагрузки на основе потоков на основе хэша по адресам источника и назначения.
В настоящее время я использую ядро 4.4.36 и использую многолучевую маршрутизацию по соединениям PPPoE. Мой нисходящий трафик от интернет-провайдера направляется через две отдельные линии для каждого пакета (один IP направляется по обеим линиям). Это дает мне скорость загрузки быстрее, чем скорость одной отдельной строки. Почти скорость обеих линий суммируется. Это работает очень хорошо, видео Skype, VoIP (UDP), YouTube и т. Д. Все отлично работает.
Из-за такого хорошего нисходящего потока я хочу попробовать его в восходящем направлении, но мой восходящий трафик направляется в соответствии с более новым алгоритмом на основе потоков на обоих устройствах ppp (которые имеют один и тот же IP-адрес). Это означает, что я не могу достичь скорости загрузки, превышающей скорость отдельной строки.
Есть ли способ настроить текущее ядро для использования алгоритма для каждого пакета? Или какой-то другой метод для достижения многопутевой маршрутизации на пакет? Нужно ли мне возвращаться к более старому Ядру (что я не хочу делать по другим причинам)?
Мой провайдер не поддерживает многоканальный 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)
При загрузке:
Следующая команда должна быть запущена при загрузке, чтобы загрузить соответствующий модуль ядра.
Следующие команды также запускаются при загрузке, если вы хотите использовать NAT из локальной сети на eth0.
Обратный трафик FORWARD находится на ppp +, а MASQUERADE POSTROUTING на teql +, потому что исходящий трафик выходит на teql, а обратный трафик возвращается на ppp.
Когда появляются ppp ссылки:
Предполагая, что ссылки для балансировки нагрузки являются ppp, следующие команды должны быть выполнены в скрипте в
/etc/ppp/ip-up.d/
скрипте.Где
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
источник
sysctl -w net.ipv4.ip_forward
но должен сказать,sysctl -w net.ipv4.ip_forward=1
так что я исправил выше. Это, безусловно, предотвратит передачу трафика из локальной сети по соединенному каналу.