Накопилось куча VPN подключений, попросили сделать ещё 2.
Решил их сделать на собранном ранее кластере pfsence, смотрящим в BGP AS, с 2-я аплинками.
Главная цель - полная горячая отказоустойчивость, реализованная на всех компонентах инфраструктуры, как связи так и виртуализации.
Вторая цель это возможность проверки соединений к самим сервисам внутри ВПН, т.к. при обычном построении IPSEC фазы 2 всегда указываются IP конечных хостов (сетей) к которым у меня нет доступа, чтобы прямо с них проверить.
Третья цель это не мусорить маршрутизацию внутри своей локальной сети, адресами контрагентов, и решить возможные проблемы при их совпадении.
Для решения этих проблем выделил виртуальный IP адрес на pfsence, который разделяется между нодами (CARP) pfsence и указал его в качестве нашего внутреннего для фазы 2 (для контрагентов). На этот же виртуальный IP повесил port-forwarding с произвольными (но систематизированными) TCP портами, начиная с 5000, последовательно примапливая каждый следующий порт к необходимому TCP сервису внутри VPN:
Pfsence-virt-IP:5000->insideVPN-IP:80
Pfsence-virt-IP:5001->insideVPN-IP:443
и т.д.
Таким образом для клиента с нашей стороны полностью подменивается и dst:port , а для сервера на стороне контрагента подменивается src (и port) и все запросы приходят с Pfsence-virt-IP.
Обычно это делается прописыванием 2-х правил в секции NAT: port-forward и outbound ,
сначала (NAT->port-forward) начинаем слушать на нужном порту, подменяем dst:port и посылаем внутрь pfsence, затем на выходном интерфейсе (NAT->outbound) подмениваем src.
всё это прекрасно работает для статических интерфейсов. Но с IPSEC трафиком это не проходит, хотя в настройках NAT->outbound есть интерфейс IPSEC, всё равно всё шлётся согласно существующей статической маршрутизации, т.е. не уходит в интерфейс IPSEC (pfsence не понимает что есть connected "insideVPN-IP" через IPSEC) и NAT-outbound не работает, и действительно, в какой из множества живых IPSEC его посылать?.
Как оказалось это связано с особенностями обработок цепочек фаервола при IPSEC.
Решается это применением NAT/BINAT в самой настройкt фазы 2 IPSEC подключения.
Далее приведу 2 примера полного Порт-IP маппинга для обычных интерфейсов и для IPSEC.
1) Между обычными интерфейсами:
Внутренний хост 10.143.8.26 цель которого попасть на 10.0.1.186:80, у 10.143.8.26 нет возможности быть смаршрутизированным на 10.0.1.186, но есть возможность достигнуть 10.129.170.130 (виртуальный IP pfsence) на интерфейсе ОРТ2.
Pfsence не является шлюзом и пропускает простой транзитный трафик.
10.0.1.128 это IP LAN интерфейса pfsence, хост 10.0.1.186 не имеет маршрутной информации о 10.143.8.26, но достижим с 10.0.1.128. Выберем порт 9191, который будет слушать на 10.129.170.130.
Для этого прописываем в разделе:
принимаем подключение с определенного IP 10.143.8.26 (указываем в advanced option), иначе будет создано (автоматически в разделе Rules/OPT2) правило которое разрешит ВСЕМ доступ к данному форвардингу: 10.129.170.130:9191
Обязательно пишем дескрипшен, чтобы потом найти созданное автоматом правило в Rules, оно будет таким: "NAT <desc...>"
Затем создаем ещё одну трансляцию, но уже outbound:
Здесь указываем, что выходя через LAN (а определяется это статической маршрутизацией), то подменить для совпадающих IP , src на "Interface Address".
2) Маппинг в VPN
Внутренний хост 10.30.0.62 (которому надо через ВПН подключиться (в идеале) к внешнему 192.168.99.1)
Виртуальный IP на pfsence (Pfsence-virt-IP) 10.129.170.130 , он доступен внутренним хостам (и 10.30.0.62) без дополнительной маршрутизации. 10.129.170.130 будет слушать на 5000 порту, 10.129.170.130 также является нашим внутренним IP для VPN (т.е. у него 2 независимых роли, можно использовать и 2 разных IP).
Опускаю процесс поднятия IPSEC Phase 1 - он обычный.
Фазу 2 поднимаем для оговоренных с Той стороной пары IP адресов (сетей) 10.129.170.130 <-> 192.168.99.1
Первое:
прописываем Port-Forward (аналогично пункту 1), в котором описываем подмену DST IP(:port) с 10.129.170.130:5000 на 192.168.99.1:80
Второе:
Для IPSEС обычный NAT - Outbound не работает, поэтому будем использовать опцию NAT/Binat в phase2 IPSEC соединения.
Добавляем еще одну запись phase2 (2-ю, 3-ю если понадобится), где указываем SRC IP из нашей локальной сети, которое надо подменить IP на оговоренный для нас с контрагентом (10.129.170.130).
IP на другой стороне VPN - 192.168.99.1 (оно знает только о 10.129.170.130).
Решил их сделать на собранном ранее кластере pfsence, смотрящим в BGP AS, с 2-я аплинками.
Главная цель - полная горячая отказоустойчивость, реализованная на всех компонентах инфраструктуры, как связи так и виртуализации.
Вторая цель это возможность проверки соединений к самим сервисам внутри ВПН, т.к. при обычном построении IPSEC фазы 2 всегда указываются IP конечных хостов (сетей) к которым у меня нет доступа, чтобы прямо с них проверить.
Третья цель это не мусорить маршрутизацию внутри своей локальной сети, адресами контрагентов, и решить возможные проблемы при их совпадении.
Для решения этих проблем выделил виртуальный IP адрес на pfsence, который разделяется между нодами (CARP) pfsence и указал его в качестве нашего внутреннего для фазы 2 (для контрагентов). На этот же виртуальный IP повесил port-forwarding с произвольными (но систематизированными) TCP портами, начиная с 5000, последовательно примапливая каждый следующий порт к необходимому TCP сервису внутри VPN:
Pfsence-virt-IP:5000->insideVPN-IP:80
Pfsence-virt-IP:5001->insideVPN-IP:443
и т.д.
Таким образом для клиента с нашей стороны полностью подменивается и dst:port , а для сервера на стороне контрагента подменивается src (и port) и все запросы приходят с Pfsence-virt-IP.
Обычно это делается прописыванием 2-х правил в секции NAT: port-forward и outbound ,
сначала (NAT->port-forward) начинаем слушать на нужном порту, подменяем dst:port и посылаем внутрь pfsence, затем на выходном интерфейсе (NAT->outbound) подмениваем src.
всё это прекрасно работает для статических интерфейсов. Но с IPSEC трафиком это не проходит, хотя в настройках NAT->outbound есть интерфейс IPSEC, всё равно всё шлётся согласно существующей статической маршрутизации, т.е. не уходит в интерфейс IPSEC (pfsence не понимает что есть connected "insideVPN-IP" через IPSEC) и NAT-outbound не работает, и действительно, в какой из множества живых IPSEC его посылать?.
Как оказалось это связано с особенностями обработок цепочек фаервола при IPSEC.
Решается это применением NAT/BINAT в самой настройкt фазы 2 IPSEC подключения.
Далее приведу 2 примера полного Порт-IP маппинга для обычных интерфейсов и для IPSEC.
1) Между обычными интерфейсами:
Внутренний хост 10.143.8.26 цель которого попасть на 10.0.1.186:80, у 10.143.8.26 нет возможности быть смаршрутизированным на 10.0.1.186, но есть возможность достигнуть 10.129.170.130 (виртуальный IP pfsence) на интерфейсе ОРТ2.
Pfsence не является шлюзом и пропускает простой транзитный трафик.
10.0.1.128 это IP LAN интерфейса pfsence, хост 10.0.1.186 не имеет маршрутной информации о 10.143.8.26, но достижим с 10.0.1.128. Выберем порт 9191, который будет слушать на 10.129.170.130.
Для этого прописываем в разделе:
принимаем подключение с определенного IP 10.143.8.26 (указываем в advanced option), иначе будет создано (автоматически в разделе Rules/OPT2) правило которое разрешит ВСЕМ доступ к данному форвардингу: 10.129.170.130:9191
Обязательно пишем дескрипшен, чтобы потом найти созданное автоматом правило в Rules, оно будет таким: "NAT <desc...>"
Затем создаем ещё одну трансляцию, но уже outbound:
Здесь указываем, что выходя через LAN (а определяется это статической маршрутизацией), то подменить для совпадающих IP , src на "Interface Address".
2) Маппинг в VPN
Внутренний хост 10.30.0.62 (которому надо через ВПН подключиться (в идеале) к внешнему 192.168.99.1)
Виртуальный IP на pfsence (Pfsence-virt-IP) 10.129.170.130 , он доступен внутренним хостам (и 10.30.0.62) без дополнительной маршрутизации. 10.129.170.130 будет слушать на 5000 порту, 10.129.170.130 также является нашим внутренним IP для VPN (т.е. у него 2 независимых роли, можно использовать и 2 разных IP).
Опускаю процесс поднятия IPSEC Phase 1 - он обычный.
Фазу 2 поднимаем для оговоренных с Той стороной пары IP адресов (сетей) 10.129.170.130 <-> 192.168.99.1
Первое:
прописываем Port-Forward (аналогично пункту 1), в котором описываем подмену DST IP(:port) с 10.129.170.130:5000 на 192.168.99.1:80
Второе:
Для IPSEС обычный NAT - Outbound не работает, поэтому будем использовать опцию NAT/Binat в phase2 IPSEC соединения.
Добавляем еще одну запись phase2 (2-ю, 3-ю если понадобится), где указываем SRC IP из нашей локальной сети, которое надо подменить IP на оговоренный для нас с контрагентом (10.129.170.130).
IP на другой стороне VPN - 192.168.99.1 (оно знает только о 10.129.170.130).