Странный рутинг



  • Ситуация следующая:
    pfSense стоит как рутер в среде VMware ESXi 5.0, за ней - куча виртуальных машин. Всё работает, хвала богам и создателям сего продукта, но проявилась странность следующего вида - необходимо обеспечить доступ к внутренним машинам клиентам, попадающим в сеть через VPN. Сервер, на котором работает OpenVPN находится в одной сети (VLAN) с сервером ESXi и, соответственно, внешним (WAN) интерфейсом pfSense но не совпадает с дефолтным рутером. Вроде ничего особенного, но!
    Прописываю дополнительное правило рутинга, всё равно как - через веб интерфейс или в командной строке

    10.8.0.0/24	 GWvpn - 192.168.21.214	 WAN
    

    получаю для IP4

    netstat -r
    Routing tables
    
    Internet:
    Destination        Gateway            Flags    Refs      Use  Netif Expire
    default            corerouter-21      UGS         0  7476867    le0
    10.8.0.0           basebsd            UGS         0      246    le0
    localhost          link#6             UH          0      229    lo0
    192.168.0.0        link#2             U           0 99388697    le1
    virtbuff           link#2             UHS         0        0    lo0
    192.168.1.0        link#3             U           0        0    em0
    192.168.1.1        link#3             UHS         0        0    lo0
    192.168.21.0       link#1             U           0 49814580    le0
    virtbuff           link#1             UHS         0        0    lo0
    

    сеть 10.8.0.0/24 - это адреса внутри VPN, basebsd (192.168.21.214) - адрес интерфейса сервера с OpenVPN.
    Результат: пакеты по этому правилу не идут, точнее какие-то туда попадают, но случайным образом. При попытке трассировки изнутри получаем трассу в дефолтный рутер -

    traceroute 10.8.0.2
    traceroute to 10.8.0.2 (10.8.0.2), 64 hops max, 40 byte packets
     1  corerouter-21 (192.168.21.100)  0.366 ms  0.225 ms  0.207 ms
     2  gwb (172.16.7.181)  0.227 ms  0.202 ms  0.203 ms
    ...............
    

    соответвенно, там таких адресов нет.
    Вопрос: что за …? На BSD, линуксе и даже винде (!) такие правила работают без проблем.



  • Скорее всего вместо маршрутизации у вас срабатывает правило NAT



  • Нужна схема сети, ничего не понятно из ваших слов. С какой машины трассируете и кто для нее шлюз по умолчанию?



  • Мне в свою очередь не понятно что непонятно.
    Трассирую изнутри pfSense к одному из хостов подключенных через VPN, чисто для демонстрации, т.к. сразу было очевидно что пакеты в VPN от pfSense не возвращаются. Шлюз по умолчанию == default, сабинтерфейс Cisco, 192.168.21.100

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



  • Тут телепатов нету, многие вещи, которые очевидны вам, могут быть не очевидны другим.
    Если правильно понимаю, Cisco, pfSense и сервер OpenVPN смотрят своими интерфейсами в один свитч, причем pfSense смотрит в него интерфейсом WAN, а Cisco - LAN. Все находятся в одной подсети 192.168.21.0/?? и все влезают в маску.
    Теперь озвучте версию pfSense и как вы добавляли маршрут через WEBGUI. Через коммандную строку лучше не делать т.к. это не чистая FreeBSD (pf например тут пропатчен по-своему) и могут быть подводные камни.
    Если версия 2.0.1, то в System -> Routing нужно добывить Gateway с адресом сервера OpenVPN (192.168.21.214) и там же в Routes маршут через этот Gateway в сеть 10.8.0.0/24.



  • Никакой телепатии не потребовалось, рассматриваем именно такую линейную схему. Все интерфейсы в сети 192.168.21.0/24. Маршрут к серверу OpenVPN в конечном итоге был прописан именно через System -> Routing (версия как раз 2.0.1), т.е. описан второй гейт (не дефолтный) и прописан маршрут: отправлять пакеты в сеть 10.8.0.0/24 через него. pfSense не перегружал, правило не работает. Пришлось поднять прокси в той же сети и пустить юзеров из VPN через него, но это паллиатив.



  • Я бы попросил вас неприличными словами тут не выражаться) По сути вопроса, маршруты, в том виде как вы их заводите, работают у тысяч и сотен тысяч пользователей pfSense. Единственное, что следует учитывать - это policy routing. Правилами Firewall -> Rules можно переназначить gateway и это переназначение будет иметь приоритет над таблицей маршрутизации.
    Если у вас policy routing'а нет, то все должно работать. Все вы сделали правильно.



  • Именно это я имел в виду. Такие правила работают на линуксе, FreeBSD и даже винде (извините за повтор), а здесь ядро просто игнорирует частное правило и сразу шлёт пакеты по дефолтному.
    Ещё раз повторюсь: правилами Firewall -> Rules невозможно назначить маршрут куда-то налево, не введя понятие ещё одного гейта. Правильно? Именно так в конечном счёте и было проделано, был опрелён доп. гейт, в него прописан маршрут, отправлять туда пакеты назначенные в "левую" сеть. В результате в таблице рутинга появляется тоно такая же запись, как при определении маршрута командой route add (специально смотрел), и результат совершенно аналогичный. Т.е. либо всё же бага в ядре в 2.0.1, либо где-то сидит здоровенный побочный эффект.
    То, что я "всё сделал правильно" - не утешает ;)



  • Все это странно конечно, при том, что у меня например такие маршруты не первый год нормально работают. Одно скажу, ядро тут не при чем.
    Пара мыслей. Маршруты нужно определять не через Firewall -> Rules, а через System -> Routing вкладка Routes. Тогда они будут действительны не только для машин за pfSense, но и для самого pfSense. Иначе трассировка с pfSense даст то, что вы и наблюдаете.
    Отзывается ли сервер OpenVPN на пинг с pfSense? Если нет, то определенный вами gateway может расценен как недоступный. Проверьте это в Status -> Gateways.



  • @rubic:

    Пара мыслей. Маршруты нужно определять не через Firewall -> Rules, а через System -> Routing вкладка Routes.

    Такие маршруты будут действительны только для самого pfSense. А станции в сети - по правилам FW Rules отдельно работают.

    Я уже нарывался на такое, отписывался здесь в какой-то теме.



  • Вот это уже интересно, нужно попробовать.
    Гейт/сервер vpn естественно пингуется и с базовой машины и из pfSense.



  • @sweep4:

    @rubic:

    Пара мыслей. Маршруты нужно определять не через Firewall -> Rules, а через System -> Routing вкладка Routes.

    Такие маршруты будут действительны только для самого pfSense. А станции в сети - по правилам FW Rules отдельно работают.

    Я уже нарывался на такое, отписывался здесь в какой-то теме.

    Эти маршруты будут действительны для всех, если иное не определено в Firewall -> Rules. Иными словами, если в правиле Firewall -> Rules gateway выставлен как default, то будет действовать таблица маршрутизации pfSense, включая то, что пользователь прописал в System -> Routing [Routes].
    Если вы хотите чтобы для определенного трафика действовала дефолтная таблица маршрутов, то правило для этого трафика в Firewall -> Rules нужно поставить выше правил, для которых определен альтернативный gateway и под которые подпадает этот трафикю



  • Прекрасный пример ответа "вообще", не читая вопроса. :)

    В общем, только после того как прописал особое правило рутинга во "Floating rules", появился контакт к хостам подключенным через OpenVPN сервер (выделенный).



  • Мда, чудны дела твои…
    Поторопился малость. Из машин за гейтом контакт с машинами в OpenVPN есть, а вот если попытаться из VPN подключиться к машине за pfSense, облом. Т.е. пакеты от источника до получателя доходят, тот отвечает, естественно на адреса отправителя, но на сервер VPN эти пакеты не попадают... Загадка. Подключение от машин, находящихся просто в одной сети с выходным интерфейсом pfSense, проходит без сучка и задоринки. Будем смотреть теперь физический интерфейс :)



  • У вас cisco - это то, куда все сходится, и для всех она default gateway. Вот на ней я бы на вашем месте и прописал маршрут в 10.8.0.0/24 через 192.168.21.214, а если NAT на pfSense отключен, то и в сети 192.168.0.0/24, 192.168.1.0/24 через WAN IP pfSense. Да, трафик между машинами за pfSense и клиентской сетью OpenVPN ходил бы через cisco, но если он небольшой, то и нормально. Зато весь ручной роутинг в одном месте.
    Еще у pfSense есть такой момент, что пакеты от локальных процессов всегда уходят через default gateway. Я к тому, что трассировка с самого pfSense - не показатель, нужно трассировать 10.8.0.0/24 с машины за pfSense. То, что вы прописали floating rule исправило только этот момент. По сути это правило для общения машин за pfSense с клиентской сетью OpenVPN не нужно, достаточно маршрута в System -> Routing -> Routes



  • теоретически оно может и так, а практически правило в System -> Routing -> Routes эффекта не даёт, что без "плавающего правила", что с ним. NAT естественно включен, с одной стороны у pfSense сеть .21.0/24, с другой - .0.0/24.

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



  • это вообще-то рутер по призванию.

    Нее. По призванию он как раз кусок роутера. А полноценный роутер из него как раз хотят все сделать. Ожидаемо безуспешно.



  • @chawoosh:

    NAT естественно включен, с одной стороны у pfSense сеть .21.0/24, с другой - .0.0/24.

    Да? И в чем взаимосвязь?

    Странновато реализован рутинг в pfSense, при том что это вообще-то рутер по призванию.

    Не надо делать глобальных выводов из вашей частной неудачи. Не то превратитесь в "обиженного", такого как постом выше. Вы очевидно недавно на pfSense, решили сделать все по наитию, не прочитав документацию. Где-то накосячили в конфигурации и не видите этого. Схему сети выкладывать не хотите, скриншоты очевидно тоже. Ну, вал_и_те теперь все на pfSense, это действительно проще чем признать, что чего-то не понимаете.
    Ваша ситуация (асимметричный роутинг) яйца выеденного не стоит и элементарно решается. Будет схема, будут скрины, будем говорить.



  • 2 rubic

    Не то превратитесь в "обиженного", такого как постом выше.

    Это не обида, это констатация очевидного факта. Концепцию нужно менять. Она себя исчерпала уже в m0n0. Из куска маршрутизатора полноценный роутер не получиться, очевидно-же.



  • Специально для великого Рубика приведу невообразимо сложную схему

    Из подписей и предидущих постов вроде должно быть ясно что и куда должно бегать. Единственное пояснение - pfSense и Hosts array - внутри ESXi 5.

    NAT естественно включен, с одной стороны у pfSense сеть .21.0/24, с другой - .0.0/24.

    Да? И в чем взаимосвязь?

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



  • @chawoosh:

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

    У меня так две локальные сети и "общаются" (10.7.0.х и 10.7.1.х), хотя на внешних интерфейсах обеих  - адреса 192.168.0.х. И в обеих сетях в логах на pf-ах я "вижу" статистику от узлов 10.7.0.х\10.7.1.х, а не от 192.168.х.х. Само собой в правилах NAT-а стоит "галка" на No NAT. Так уж у нас повелось и такие корпоративные требования и требования пров-ра, к-ый предоставляет канал для связи эти двух сетей.

    Вопрос - ЧЯДНТ ?



  • Где вы нашли провайдера, который вам даёт левонетовские адреса?
    Если у вас десятые сети прописаны как /8 или хотя бы как /16, то ничего удивительного.



  • @chawoosh:

    Где вы нашли провайдера, который вам даёт левонетовские адреса?
    Если у вас десятые сети прописаны как /8 или хотя бы как /16, то ничего удивительного.

    Нам корпоративный канал пров предоставляет внутри своей сети (vlan-ом). И да , когда на WAN - Инет, то без NAT-а никуда.
    Просто не стоит однозначно утверждать , что без трансляции адресов невозможно функционирование сетей.
    Мой пример - как частный случай такой возможности.



  • @werter:

    @chawoosh:

    Где вы нашли провайдера, который вам даёт левонетовские адреса?
    Если у вас десятые сети прописаны как /8 или хотя бы как /16, то ничего удивительного.

    Нам корпоративный канал пров предоставляет внутри своей сети (vlan-ом). И да , когда на WAN - Инет, то без NAT-а никуда.
    Просто не стоит однозначно утверждать , что без трансляции адресов невозможно функционирование сетей.
    Мой пример - как частный случай такой возможности.

    У нас провайдер с белым адресом канал выделяет, а маршрутизация с помощью BGP сделана без NATа. VLAN-ов нет, по крайней мере на нашей стороне.
    Одно время на этом канале с успехом работал PFSense с пакетом BGP.



  • Да, снимаю своё утверждение про NAT, как сказанное в запале. В данном случае NAT'ом изолирован зоопарк внутри вмварного сервера от корпоративной сети.

    У нас провайдер с белым адресом канал выделяет, а маршрутизация с помощью BGP сделана без NATа. VLAN-ов нет, по крайней мере на нашей стороне.
    Одно время на этом канале с успехом работал PFSense с пакетом BGP.

    Если у вас внутри сети - белые адреса (трансляция 1:1), то NAT естественно не нужен. Если левонет - обязан наличествовать, т.к. в И-нете левонет не живёт. BGP занимается маршрутизацией между автономными системами (в основном) и к преобразованию адресов никакого отношения не имеет.



  • Давайте для начала скриншоты

    1. System -> Routing -> Gateways, Routes и Groups (если не пусто)
    2. Firewall -> Rules по всем вкладкам


  • Ну что ж, обнажимся…

    Остальные вкладки пустые


    одна строка дублируется в скриншоте

    Остальное пусто.



  • В System -> Routing -> Routes заведите маршрут:

    10.8.0.0/24 	GWvpn 	WAN
    

    В Firewall -> Rules -> Floating зайдите в редактор правила, поставьте галку "Disable this rule" и сохраните

    В Firewall -> Rules -> WAN добавьте правило:

    
            Proto 	Source 	Port 	Destination 	Port 	Gateway
    Pass    ICMP 	* 	 * 	* 	 	* 	*
    
    

    Пробуйте пинговать WAN IP pfSense с из сети 10.8.0.0/24
    Пробуйте пинговать хост в сети 10.8.0.0/24 из сети 192.168.0.0/24



  • С этого всё начиналось, правда без ICMP, за ненадобностью. Коннект по TCP к внутреннему сайту не проходил, по причине не прохождения обратных пакетов, точнее, направление их на дефолтный гейт. Пакеты генерируемые внутренними хостами так же уходили туда. Сейчас ситуация следующая (для тех кому лень читать ранние посты):
    пакеты от внутреннего хоста идут к хостам в VPN (по правилу в "плавающих") и получают ответы, пакеты от хостов из VPN доходят до внутренних хостов, ответные пакеты отправляются на дефолтный гейт.
    На дефолтном гейте (киске 3825) заведено правило которое отправляет пакеты, адресованные в сеть VPN на сервер VPN, благодаря чему всё стало доступно (плюс некоторые побочные эффекты).



  • Кажется у меня больше желания разобраться почему простой маршрут не работает, чем у вас. Понимаю, все кое-как наладилось и не хочется начинать с начала.
    Если не трудно, прикрепите config.xml (Diagnostics -> Backup/Restore -> Download Configuration), я подниму его в виртуалке. pfSense у вас на "серых" адресах, пароль в конфиге в открытом виде не хранится. Думаю, бояться тут нечего.



  • Да в общем без проблем… Меня немного напрягает наличие одинаковых МАС на WAN и LAN интерфейсах, но мне эта машина так и досталась, а тот кто её ставил сюда явно не лазил, чистый юзверь.

    Расширение .txt убрать, будет маленький архив bz2.

    config-virt.bz2.txt



  • Ну, кажется и мне пришло время признать ошибку. В то время как http://doc.pfsense.org/index.php/2.0_New_Features_and_Changes сообщает нам, что "You can have multiple gateways per interface", на деле это не работает: http://redmine.pfsense.org/issues/651.
    Думаю, что настройка gateway в свойствах интерфейса перекрывает все, что введено руками в System -> Routing -> Routes.
    Это не баг, а фича - пишет разработчик. Можно поставить gateway: none, но тогда хосты за pfSense не попадут в интернет. Кое-кто рапортует, что ему помогло отключение NAT. Сам разработчик склоняется к floating rule.
    Вложение у меня не открылось (ошибка CRC), можно скриншот вашего floating rule?
    Простейшим выходом из ситуации вижу поднятие tagged vlan между pfSense и Cisco. В pfSense при этом останется интерфейс 192.168.21.xxx на котором и можно будет прописать маршрут в 10.8.0.0/24



  • @chawoosh:

    Вопрос: что за …? На BSD, линуксе и даже винде (!) такие правила работают без проблем.

    Вы просто плохо представляете насколько винда няшна и ковайна)) Винда, к примеру, может вытянуть из PPP-линка статические маршруты и адреса DNS-серверов, а pfSense - не может.
    Предполагая, что в топик набежит наш общий друг aleksvolgin, спешу сообщить, что и Mikrotik не может. Не удивительно - это не предусмотрено RFC. Но кому какое дело?
    Вот и в pfSense разработчик видимо счел ситуацию 2-х gateways на одном интерфейсе статистически незначимой))



  • Юмор ситуации в том, что у нас вся сеть побита на VLAN'ы, соответственно сабинтерфейс киски, VPN сервер и pfSense находятся внутри 21й виланы. Но поскольку VLAN - понятие 2-го уровня, она благополучно терминируется на интерфейсе вмварного сервера, который естественно находится на L3. Причём из-за некоторой некомпетентности гл. инженера, который решил сам написать конфиг интерфейса к которому подключен сервер - туда приходит именно тегированный VLAN.

    Скриншот "плавающего руля" - на предидущей странице, самый первый.
    Архивчик однако побился при загрузке - скорее потому что его грузили как текст.

    @rubic:

    @chawoosh:

    Вопрос: что за …? На BSD, линуксе и даже винде (!) такие правила работают без проблем.

    Вы просто плохо представляете насколько винда няшна и ковайна)) Винда, к примеру, может вытянуть из PPP-линка статические маршруты и адреса DNS-серверов, а pfSense - не может.
    Предполагая, что в топик набежит наш общий друг aleksvolgin, спешу сообщить, что и Mikrotik не может. Не удивительно - это не предусмотрено RFC. Но кому какое дело?
    Вот и в pfSense разработчик видимо счел ситуацию 2-х gateways на одном интерфейсе статистически незначимой))

    На самом деле юниксы спокойно получают всё, что им посылает сервер PPP, неоднократно проверено на практике. Насчёт pfSense - не знаю, не пробовал.



  • Нужно сделать 22-ой (на деле конечно любой) vlan на le0 и тогда в pfSense можно будет добавить новый интерфейс и назначить его WAN с gateway-ем на Cisco, которую конечно тоже придется настроить. 21-й станет как LAN без gateway и все разрулится.
    З.Ы. Под скриншотом я имею ввиду свойства правила, не то как оно выглядит в Firewall -> Rules -> Floating
    З.З.Ы. В том то и дело, что не получают. После установления соединения PPP винда хитро шлет в канал запрос DHCP Inform и получает все, что ей нужно. UNIX-like системы, кроме адаптированных к суровым российским условиям аппаратных роутеров некоторых производителей, этого не умеют.
    Это прекрасно видно на подключении к домашнему интернет Билайн. После установления сессии L2TP винда получает пару дополнительных адресов DNS-серверов и multicast-маршруты билайновского IPTV. Тот же хваленый Mikrotik не получает ничего, ибо протоколом IPCP это не предусмотрено, а грязных трюков он не умеет и не хочет))



  • У меня в сети и так куча VLAN с одним - двумя хостами (для изоляции от любопытных, т.с.), а поскольку от получившейся схемы мне уже отходить не хочется, пусть будет всё как есть.
    PPtP сервер я поднимал, и сам на него коннектился со своей линуксовой машины, Что творит у себя Би - не знаю, там иногда такие "знатоки" попадаются, что хоть стой хоть падай. Если правильно сконфигурять сервер, он будет спокойно передавать сам всё, что нужно подключившемуся клиенту, причем и PPP и OpenVPN сервера это делают одинаково. И "стандарта" на это нет :)
    Я например своим юзверям отдаю маршрут только в 21й VLAN, где живут сервера. Моя машина существует во всех VLAN'ах предприятия, для простоты. А сейчас на домашнем компе я могу прописать маршрут в любую VLAN вручную и попасть туда куда нужно без лишних маршрутов в таблицах хостов. Это и есть побочные эффекты решения.


Log in to reply