В настоящее время я живу в стране, которая блокирует множество веб-сайтов и имеет ненадежные сетевые соединения с внешним миром. У меня есть две конечные точки OpenVPN (скажем, vpn1 и vpn2) на серверах Linux, которые я использую для обхода брандмауэра. У меня полный доступ к этим серверам. Это работает довольно хорошо, за исключением большой потери пакетов на моих VPN-соединениях. Эта потеря пакетов варьируется от 1% до 30% в зависимости от времени и, по-видимому, имеет низкую корреляцию, большую часть времени она кажется случайной.
Я думаю о настройке домашнего маршрутизатора (также в Linux), который поддерживает соединения OpenVPN с обеими конечными точками и отправляет все пакеты дважды, обеим конечным точкам. vpn2 будет отправлять все пакеты из дома в vpn1. Обратный трафик будет отправляться как напрямую с vpn1 на дом, так и через vpn2.
+------------+
| home |
+------------+
| |
| OpenVPN |
| links |
| |
~~~~~~~~~~~~~~~~~~ unreliable connection
| |
+----------+ +----------+
| vpn1 |---| vpn2 |
+----------+ +----------+
|
+------------+
| HTTP proxy |
+------------+
|
(internet)
Для ясности: все пакеты между домом и прокси-сервером HTTP будут продублированы и отправлены по разным путям, чтобы увеличить шансы на получение одного из них. Если оба прибывают, первый второй может быть молча отброшен.
Использование полосы пропускания не является проблемой, как на домашней стороне, так и на стороне конечной точки. vpn1 и vpn2 расположены близко друг к другу (пинг 3 мс) и имеют надежное соединение.
Любые указатели о том, как это может быть достигнуто с помощью расширенных политик маршрутизации, доступных в Linux?
источник
Я использовал ответ, предоставленный @ user48116, и он работает как шарм. Настройка на самом деле довольно проста!
ПРИМЕЧАНИЕ : я реализовал это с двумя подключениями только к одному серверу, так как это уже решило проблему для меня. Если вы хотите попробовать установку с двумя серверами, возможно, самый простой способ - это использовать переадресацию портов для пересылки UDP-порта со второго сервера на первый и использовать тот же рецепт, как описано здесь. Я не проверял это сам, хотя.
Во-первых, убедитесь, что у вас есть ядро 2.6 с поддержкой связывания (по умолчанию во всех современных дистрибутивах) и у вас установлен ifenslave.
Затем поместите это в ваш /etc/rc.local или любое другое место, которое вы предпочитаете, но убедитесь, что он запускается до запуска openvpn (потому что он попытается привязаться к bond0):
Клиент:
Вы можете добавить некоторую маршрутизацию, если это необходимо, убедитесь, что вы делаете все правильные маршруты с другой стороны, хотя.
Сервер:
Создайте скрипт /etc/openvpn/tap-up.sh (и не забудьте пометить его исполняемым с помощью chmod a + x tap-up.sh):
Затем добавьте bridge0a.conf и bridge0b.conf в / etc / openvpn / вместе с общим ключом. Файлы одинаковы для a и b, за исключением другого порта (например, используйте 3002 для b). Замените 11.22.33.44 на публичный IP вашего сервера.
Клиент:
Сервер:
Не забудьте отредактировать / etc / defaults / openvpn, чтобы убедиться, что ваши новые конфигурации VPN запущены. Перезагрузите ваши машины или загрузите rc.local и перезапустите openvpn вручную.
Теперь вы готовы проверить свои настройки:
Если все идет хорошо и линия хорошая, вы увидите четыре ответа для каждого пакета ICMP: ваши пакеты дублируются на локальной стороне, а ответы на эти два пакета снова дублируются на удаленной стороне. Это не будет проблемой для TCP-соединений, потому что TCP будет просто игнорировать все дубликаты.
Это проблема для пакетов UDP, так как это зависит от программного обеспечения для обработки дубликатов. Например, DNS-запрос даст четыре ответа вместо ожидаемых двух (и использует ответ в четыре раза больше нормальной полосы пропускания вместо двух раз):
Удачи!
источник