LinuxForum.Fans
Тема

Маршрутизация в openVPN

Автор: Cruiser78 13 сообщений 4510 просмотров
#197788

Коллеги, помогите настроить маршрутизацию в сети с openVPN.
Дано:
1. openVPN сервер размещен на шлюзовой машине в Инет. Службы, к которым надо обеспечить ремутный доступ - на третьем компьютере, на котором маршрут по умолчанию - шлюзовая машина. Но о каком VPN этот рабочий сервер не знает. И знать не должен.
2. Имеется два независимых провайдера Интернета, пусть А и Б. Подключение к ним обеспечивает шлюз через физические роутеры. Пусть они имеют адреса для шлюза 192.168.1.1 и 192.168.1.2. А далее - там уже роутеры провайдеров, мне они неинтересны.
3. Дефолтный маршрут на шлюзе смотрит на провайдера А, то есть в 192.168.1.1. В случае проблем с А автоматом переключается на Б.
4. Настраиваю openVPN. Сеть там заложена такая: 192.168.128.0/24. Протокол UDP. Причем, настраиваю таким образом, чтобы VPN-трафик мог приходить от ремутных клиентов как с А, так и с Б. Причем, канал Б даже более (по ряду причин) для VPN предпочтительнее. Это важно.
Проблема в следующем - если я, как клиент, коннекчусь через роутер А (который дефолтный на шлюзе), то всё работает без сучка и задоринки, а вот если пытаюсь законнектится через роутер Б, то ответный трафик шлюз шлет на дефолтный роутер А, ну а дальше клиент, получив такой ответ говорит: "вас тут не стояло".
Вопрос: как направить ответный VPN-трафик в тот мой роутер, откуда приходят запросы. Возможно ли разрулить UDP-ответы или надо в моем случае делать openVPN на протоколе TCP?

#197815
Cruiser78 написал:
Коллеги, помогите настроить маршрутизацию в сети с openVPN.
Дано:
1. openVPN сервер размещен на шлюзовой машине в Инет. Службы, к которым надо обеспечить ремутный доступ - на третьем компьютере, на котором маршрут по умолчанию - шлюзовая машина. Но о каком VPN этот рабочий сервер не знает. И знать не должен.
2. Имеется два независимых провайдера Интернета, пусть А и Б. Подключение к ним обеспечивает шлюз через физические роутеры. Пусть они имеют адреса для шлюза 192.168.1.1 и 192.168.1.2. А далее - там уже роутеры провайдеров, мне они неинтересны.
3. Дефолтный маршрут на шлюзе смотрит на провайдера А, то есть в 192.168.1.1. В случае проблем с А автоматом переключается на Б.
4. Настраиваю openVPN. Сеть там заложена такая: 192.168.128.0/24. Протокол UDP. Причем, настраиваю таким образом, чтобы VPN-трафик мог приходить от ремутных клиентов как с А, так и с Б. Причем, канал Б даже более (по ряду причин) для VPN предпочтительнее. Это важно.
Проблема в следующем - если я, как клиент, коннекчусь через роутер А (который дефолтный на шлюзе), то всё работает без сучка и задоринки, а вот если пытаюсь законнектится через роутер Б, то ответный трафик шлюз шлет на дефолтный роутер А, ну а дальше клиент, получив такой ответ говорит: "вас тут не стояло".
Вопрос: как направить ответный VPN-трафик в тот мой роутер, откуда приходят запросы. Возможно ли разрулить UDP-ответы или надо в моем случае делать openVPN на протоколе TCP?

Читать lartc. Там пример есть(глава 4.2), прямо Ваш случай.

#197819
CyberDaemon написал:
Читать lartc. Там пример есть(глава 4.2), прямо Ваш случай.

Вы не совсем внимательно прочитали то, что я написал. Я хотел реализовать "разбрасываение" ответного VPN-трафика между двумя провайдерами. При этом (в целях повышения производительности сети) хотел иметь openVPN на UDP-протоколе. То, что описано в главе 4.2 не прямо мой случай. То, что там описано прекрано работает на TCP (и это у меня давно реализовано). А вот с UDP - такая схема не прокатывает, так как как маршрутизатор определит - это исходящий, инициирующий UDP-пакет или он ответный на внешний раздражитель? Вот и кидает все UDP-пакеты на дефолтный маршрут.

Стоило только настроить openVPN-сервер и клиентов на TCP-протокол, как работать начали оба канала безпроблемно. Так как глава 4.2 давно у меня реализована. У меня не было только подобного UDP-трафика с ремутными клиентами.

#197828

Типо пришол на B ушёл через А это вроде решается с помощью mark + собственные таблицы маршрутизации.
И TCP тут не выход. В вашем случае обязательно собственные таблицы маршрутизации и ещё советовал бы использовать connmark

#197875
Kettler написал:
Типо пришол на B ушёл через А это вроде решается с помощью mark + собственные таблицы маршрутизации.
И TCP тут не выход. В вашем случае обязательно собственные таблицы маршрутизации и ещё советовал бы использовать connmark

Я могу ошибаться, но mark - как будет работать на UDP? Где у него установленное соединение? Упомянутая глава 4.2 прекрасно решает задачу безо всяких mark'ов, но только на TCP-соединениях. Тогда ответные пакеты отправляются обратно по тому пути, по которому запрос пришел. Я это применяю и это прекрасено работает. А вот если обмен построен на UDP, то вот тут и засада. Соединения то нет...

#197921

А при чём тут соединения
Например чисто так на бум набросок
PREROUTING -i ppp0 -p udp --dport 9000 -J MARK 80
PREROUTING -i ppp1 -p udp --dport 9000 -J MARK 90


----------внешка1------- ----------внешка2-------
mark 80 mark 90

table 80 table 90

Ответ будет идти по этим же таблицам и соответственно в свой жлюз откуда и пришло.

#197942
Kettler написал:
А при чём тут соединения
Например чисто так на бум набросок
...
Ответ будет идти по этим же таблицам и соответственно в свой жлюз откуда и пришло.

Спорить не буду. Но у меня выход в инет построен достаточно тривиально, но чуток не так - шлюз имеет не 3 интерфейса (как на картинках), а только два, один обслуживает LAN, а другой - весь WAN. На втором интерфейсе висит небольшая сеточка в которой живут два роутера. И вот как отмаркировать потоки, приходящие с двух этих роутеров на один интерфейс шлюза со всего инету - не знаю. Поставить дополнительную сетевую карту в сервер - нереально.

#197978
text
На втором интерфейсе висит небольшая сеточка в которой живут два роутера. И вот как отмаркировать потоки, приходящие с двух этих роутеров на один интерфейс шлюза со всего инету - не знаю. 

По идее можно по маку

text
/sbin/iptables -A PREROUTING -t mangle -m mac --mac-source 00:0F:EA:91:04:08 -j MARK --set-mark 0x0ff
#198114
Macumazan написал:

По идее можно по маку

А ведь действительно... Совсем про это забыл. Про интерфейс и адреса источника в iptables помню, а вот про маки....
Вечерком протестируем...
----------------
и всё равно - не понимаю я, как это будет работать на "проходном" шлюзе, когда идет обмен с внешним миром (инициатор - клиент во внешнем мире) по протоколу UDP. Ну отмаркируем мы входящий UPD-пакет с запросом. Пробросим его на наш внутренний сервер. Тот поразмыслит и кинет ответный UDP-пакет. Ответный пакет то будет немаркированным??? Или, все таки, маркер на UDP-ответах сохраняется?.. Каким образом?

#198134

По идее не маркируются. Надо смотреть tcpdump`ом для верности.

Хм.. Если есть 2 независимых провайдера и нет своей AS, то значит есть 2 внешних ip на . То тогда как решается вопрос регулирования того, с А или Б должны приходить клиентские запросы? Это важно, так как витают мысли, но пока не хватает каких-то деталей.

#198137

Вообще, про connmark тут правильно подметили. Состояния new, established, related для UDP имеет место быть.
http://hexbot.blogspot.com/2009/03/2-connmark.html - вот примерно похожий случай. Идеи можно взять оттуда.

#198162
Macumazan написал:
По идее не маркируются. Надо смотреть tcpdump`ом для верности.

Хм.. Если есть 2 независимых провайдера и нет своей AS, то значит есть 2 внешних ip на . То тогда как решается вопрос регулирования того, с А или Б должны приходить клиентские запросы? Это важно, так как витают мысли, но пока не хватает каких-то деталей.

Итак, основанные на моей дырявой памяти сомнения меня не обманули. А именно:
общие данные - сделана маркировка на шлюзе по mac-адресу роутера как здесь было указано выше и потом добавлены нужные таблицы маршрутизации через ip... Ну, всё по учебнику.
Конфигурация 1: openVPN построен на протоколе TCP. Пакет от клиента приходит на роутер Б, далее - через маркирующий шлюз на openVPN-сервер. Ответ идет от openVPN-сервера через шлюз и далее тот направляет его на правильный роутер Б. При этом - дефолтный роутер - А. Ниже - информативная часть лога на клиенте:

Показать
Thu Oct 06 21:57:54 2011 Attempting to establish TCP connection with Б:1194
Thu Oct 06 21:57:54 2011 TCP connection established with Б:1194
Thu Oct 06 21:57:54 2011 TCPv4_CLIENT link local: [undef]
Thu Oct 06 21:57:54 2011 TCPv4_CLIENT link remote: Б:1194
Thu Oct 06 21:57:54 2011 TLS: Initial packet from Б:1194, sid=b550f580 ade24bb6

Конфигурация 2: openVPN построен на протоколе UDP. Собственно - ожидаемый обломайтис. ответные пакеты со шлюза идут не в роутер Б, а в дефольный роутер А. Что очень хорошо видно из прилагаемого лога:

Показать
Thu Oct 06 22:14:10 2011 UDPv4 link local: [undef]
Thu Oct 06 22:14:10 2011 UDPv4 link remote: Б:1194
Thu Oct 06 22:14:10 2011 TCP/UDP: Incoming packet rejected from А:1194[2], expected peer address: Б:1194 (allow this incoming source address/port by removing --remote or adding --float)
Thu Oct 06 22:14:13 2011 TCP/UDP: Incoming packet rejected from А:1194[2], expected peer address: Б:1194 (allow this incoming source address/port by removing --remote or adding --float)
.....
Thu Oct 06 22:15:13 2011 UDPv4 link local: [undef]
Thu Oct 06 22:15:13 2011 UDPv4 link remote: А:1194
Thu Oct 06 22:15:13 2011 TLS: Initial packet from А:1194, sid=9f700f04 865f014b

А видно, что UDP-"соединение" через выбранный клиентом роутер не идет, ответы сервера направляются шлюзом в дефолтный роутер А, и клиентом отвергаются. Но, как только клиент коннектится через роутер А - здесь маршрут совпадает с дефолтным и "соединение" устанавливается.

Ну и ответ на поставленный запрос - клиентские запросы могут приходить через любой из двух роутеров. Это дело клиента выбрать по каким-то критериям желаемый роутер. Хоть рандомно выбирай. Считаем, что это непредсказуемо. Хотя критерии там простые - у меня два типа подключения к Инету, первый - ADSL с медленным исходящим каналом и быстрым входящим. Поставлен на шлюзе по дефолту для обеспечения работы юзеров фирмы в инете. Второй - кабельный, с достаточно быстрым исходящим каналом, но не шустрым каналом входящим. Через этот канал ходьба на отдельные сайты, требующие эффективной отдачи нашего трафика, плюс разные служебные трафики. В принципе несложно сделать маршрутизацию по источнику в этот кабельный канал. Но как тогда система будет переключаться на иной, когда провайдер его выключит (а такое случается)? Вот и рисую openVPN с двумя удаленными хостами. Пусть он сам разбирается какой маршрут более живой.

#198174
Macumazan написал:
Вообще, про connmark тут правильно подметили. Состояния new, established, related для UDP имеет место быть.
http://hexbot.blogspot.com/2009/03/2-connmark.html - вот примерно похожий случай. Идеи можно взять оттуда.

Это читал. Всё, что там написано - слишком "сложно". У меня конфигурация схожая, но я обошелся базовыми возможностями только ip2. А именно, провайдерские сети (в которых сидят роутеры) различны (сидят на интерфейсе, имеющем 2 IP-адреса). Пусть опять, А.0/24 и Б.0/24. При этом роутеры к провайдерам имеют традиционные адреса А.1 и Б.1, а интерфейсы шлюза А.2 и Б.2. Тогда, чтобы раскидать трафик на эти роутеры, применяю команды:

text
ip rule add from А.2 table 101
ip rule add from Б.2 table 102
ip route add А.0/24 dev eth1  proto kernel  scope link  src А.2  metric 1 table 101
ip route add default via А.1 table 101
ip route add Б.0/24 dev eth1:1  proto kernel  scope link  src Б.2 table 102
ip route add default via Б.1 table 102
ip route flush cache

С TCP эта конструкция работает эффективно. А вот с UDP... Увы-с...

Войдите или зарегистрируйтесь, чтобы ответить.