Итак, у нас есть туннель до VPN-провайдера и мы хотим быть уверены что весь трафик, включая DNS запросы, идёт только через этот туннель, а в случае его недоступности пользователи ни в коем случае не должны выходить напрямую через сеть провайдера. Установлена pfSense CE версии 2.5.2, регистрация на CyberGhost пройдена - поехали.

CyberGhost

У вас может быть и другой VPN-провайдер,- CyberGhost выбран ввиду простоты настройки и для демонстрации настройки получения DNS серверов при подключении. Если в вашей стране не заблокирован ExpressVPN, то настройки будут практически идентичны.

Регистрация пройдена, оплачено нужное количество месяцев. На странице VPN > Управление устройствами выбираем Ручная установка -> Настроить устройство. В появившемся окне в качестве протокола выбираем просто OpenVPN, какую хочется страну и группу серверов. Называем это pfSense.

Далее на странице VPN > Управление устройствами видим pfSense в списке активных VPN-устройств. Нажимаем на "просмотреть" в новом окне и скачиваем архив с конфигураций. Username и Password нам также пригодятся при настройке клиента.

Сертификаты

Распаковываем скачанный архив pfsense_openvpn.zip и видим там несколько файлов. Для начала нам нужны ca.crt, client.crt и client.key.

Переходим в pfSense на страницу System / Certificate Manager / CAs и жмём кнопку Add.

Называем это дело GyberGhost VPN CA, выбираем в качестве метода Import an existing Certificate Authority и вставляем содержимое файла ca.crt данные в поле Certificate data. CA импортирован.

Теперь переходим на вкладку System / Certificate Manager / Certificates, кнопка Add, выбираем в качестве метода Import an existing Certificate, называем CyberGhost Client Certificate и копируем содержимое файла client.crt в поле Certificate data, а файла client.key - в поле Private key data.

Сертификат импортирован.

OpenVPN клиент

Настроим OpenVPN клиент. Жмём Add на странице VPN / OpenVPN / Clients, а также открываем содержимое файла openvpn.ovpn из архива. В моём случае это выглядит так:

client
remote 87-1-at.cg-dialup.net 443
dev tun 
proto udp
auth-user-pass


resolv-retry infinite 
redirect-gateway def1
persist-key
persist-tun
nobind
cipher AES-256-CBC
ncp-disable
auth SHA256
ping 5
ping-exit 60
ping-timer-rem
explicit-exit-notify 2
script-security 2
remote-cert-tls server
route-delay 5
verb 4


ca ca.crt

cert client.crt

key client.key

Начинаем заполнять поля настройки клиента. Если что-то не указано, то оставляем по умолчанию. Поехали:

  • Server host or address: хост из строки remote, в моём случае 87-1-at.cg-dialup.net

  • Server port: порт из строки remote, в моём случае 443

  • Description: CyberGhost VPN

  • Username/Password: копируем со страницы предварительного просмотра роутера (см. выше)

  • TLS Configuration: убираем

  • Peer Certificate Authority: CyberGhost VPN CA

  • Client Certificate: CyberGhost VPN Client Certificate

  • Data Encryption Negotiation: отключаем (строка ncp-disable)

  • Fallback Data Encryption Algorithm: оставляем AES-256-CBC (строка cipher)

  • Auth digest algorithm: оставляем SHA256 (строка auth)

  • Pull DNS: позволяет использовать предоставляемый клиенту DNS, включаем

Сохраняем и на странице Status / OpenVPN проверяем что клиент подключился (Status = up):

Настройка DNS

Нашей задачей является запрет на использование публичных DNS серверов клиентами сети,- мы не хотим показывать куда ходят клиенты через VPN туннель (т.е. исключить DNS Leak).

Для начала назначим OpenVPN интерфейс, это нам пригодится в дальнейшем. На странице Interfaces / Interface Assignments выбираем ovpnc1 и нажимаем Add. Называем CyberGhost_VPN, чекаем Enable и сохраняем.

Переходим на страницу System / General Setup и убираем всё из списка DNS Servers. Ставим галочку DNS Server Override, - это позволит использовать получаемый от OpenVPN сервер DNS в качестве форвардера.

Настроим DNS сервер на Services / DNS Resolver / General Settings. Разрешаем запросы только на LAN и loopback интерфейсах - Network Interfaces = LAN, Localhost. Выбираем в Outgoing Network Interfaces только CyberGhost_VPN и ставим галочку у DNS Query Forwarding.

Исключаем DNS Leak

Вот тут начинаются хитрости. В зависимости от типа подключения к провайдеру нам нужно произвести разные настройки чтобы исключить попадание провайдерских DNS в список форвардеров,- иначе при отвале VPN'а все DNS запросы пойду через следующий по приоритету DNS, т.е. тот что мы автоматически получаем от провайдера.

Для начала добавим на странице Services / DNS Resolver > Host Overrides адреса VPN сервера. Сперва получим их с помощью команды `dig a 87-1-at.cg-dialup.net`:

$ dig a 87-1-at.cg-dialup.net

...пропущено...

;; ANSWER SECTION:
87-1-at.cg-dialup.net.	30	IN	A	37.19.223.231
87-1-at.cg-dialup.net.	30	IN	A	37.19.223.5
87-1-at.cg-dialup.net.	30	IN	A	37.19.223.10
87-1-at.cg-dialup.net.	30	IN	A	37.19.223.203
87-1-at.cg-dialup.net.	30	IN	A	37.19.223.32
87-1-at.cg-dialup.net.	30	IN	A	37.19.223.217
87-1-at.cg-dialup.net.	30	IN	A	89.187.168.165
87-1-at.cg-dialup.net.	30	IN	A	37.19.223.251
87-1-at.cg-dialup.net.	30	IN	A	37.19.223.8
87-1-at.cg-dialup.net.	30	IN	A	37.19.223.250

Создадим Host Entry перечислив полученные адреса через запятую:

Если для подключения к провайдеру используется статический адрес - то по данной части всё готово, никакие другие DNS'ы кроме тех что прилетают при подключении по OpenVPN у нас не появятся.

Если же у нас DHCP подключение то нужно отключить приём настроек DNS через DHCP. В настройках интерфейса нет такой опции, но есть Configuration Override, позволяющая использовать собственный конфигурационный файл. Вот ею и воспользуемся.

Скопируем скрипт запускаемый при подключении по DHCP:

cp /usr/local/sbin/pfSense-dhclient-script /usr/local/sbin/pfSense-dhclient-script.nodns

И закомментируем в нём строки 359, 388-390. Скопируем автоматически сгенерированный конфиг DHCP клиента:

cp /var/etc/dhclient_wan.conf /usr/local/etc/nodns_dhcp.conf

И поменяем там лишь строку `script`:

script "/usr/local/sbin/pfSense-dhclient-script.nodns";

Указываем путь к нашему конфигу в Configuration File Override:

Вот и всё - теперь настройки DNS получаемые по DHCP будут игнорироваться.

А что если PPPoE подключение? Придётся кое-что поправить в скрипте вызываемом при подключении,- /usr/local/sbin/ppp-linkup. Чуть заменим одну строку:

- if [ "${DNSALLOWOVERRIDE}" = "true" ]; then
+ if [ "${DNSALLOWOVERRIDE}" = "X" ]; then

Аналогично, теперь получаемые по PPPoE настройки DNS будут игнорироваться. Но это ещё не всё.

Тут внимательные пользователи pfSense могут спросить - а зачем все эти правки, если получаемый по OpenVPN DNS сервер будет иметь приоритет над теми что прилетают через DHCP/PPPoE? Дело в том, что если по каким-то причинам DNS сервер VPN провайдера не отвечает, то резолвер начнёт пробовать отправлять запрос к следующему по приоритету DNS серверу, и запросы пойдет мимо туннеля.

Настройка Firewall

Нужно исключить возможность использования пользователями/программами нашей локалки каких-либо других DNS серверов кроме того предоставляется VPN провайдером.

Для этого создадим правило блокирующее DNS-over-TLS трафик (853 TCP порт) на вкладке Firewall / Rules / LAN - Add со стрелочкой вверх(!):

  • Action: Reject

  • Address Family: IPv4

  • Protocol: TCP

  • Source/Destination: Any

И создадим Port Forwarding правило перенаправляющее все DNS запросы наружу на наш pfSense. Вкладка Firewall / NAT / Port Forward -> Add:

  • Interface: LAN

  • Address Family: IPv4

  • Protocol: TCP/UDP

  • Destination: Invert match - включить, Type: LAN Address

  • Destination port range: DNS

  • Redirect target IP: LAN address

  • Redirect target port: DNS

  • Filter rule association: Add associated filter rule

Теперь нам нужно настроить фаервол так, чтобы при падении VPN туннеля наши пользователи не побежали неожиданно через сеть провайдера.

На странице System / Advanced / Miscellaneous включаем Skip rules when gateway is down, - это нужно для того, чтобы при отвале VPN'а не создавались правила использующие шлюз этого VPN. В этом случае правила как бы "не будет", а следом нет и других правил,- соответственно deny, трафик будет дропаться.

Создадим же само правило (Add со стрелочкой вниз):

  • Action: Pass

  • Interface: LAN

  • Address Family: IPv4

  • Protocol: Any

  • Source: LAN net

  • Destination: Any

  • Advanced Options / Gateway: CYBERGHOST_VPN_VPNV4

Итого у нас должен получиться следующий порядок правил:

Настроим Outbound NAT для клиентов локальной сети. На Firewall / NAT / Outbound переключаем Mode в "Hybrid Outbound NAT rule generation" и нажимаем Save. Теперь можно добавить следующее правило:

  • Interface: CYBERGHOST_VPN

  • Address Family: IPv4

  • Protocol: any

  • Source: адрес нашей LAN сети, в моём случае - 192.168.3.0/24

  • Destination: Any

  • Address: Interface Address

Теперь IP адреса хостов LAN сети попадая в туннель будут автоматически транслироваться в адрес OpenVPN-интерфейса (маскарадинг).

Настройка pfBlockerNG

Подробнее про настройку этого чудо-блокировщика я уже писал ранее, поэтому пробежимся только по тому что нам от него нужно. Для начала установим пакет pfBlockerNG-devel через System / Package Manager / Available Packages, сделаем дефолтную настройку с помощь визарда на Firewall / pfBlockerNG и перейдём к специфичным для нас вещам.

А именно блокировке DoH серверов. На странице Firewall / pfBlockerNG / DNSBL / DNSBL SafeSearch переводим DoH/DoT Blocking в Enable и выбираем через Ctrl+A все сервера в DoH/DoT Blocking List.

В принципе, это основное что нам нужно от pfBlockerNG - исключить DNS leak через DoH сервера. При желании можно настроить фиды для блокировки IP или DNS адресов, например использовать фиды из категории Firebog_Trackers для блока трек-адресов или блокировать рекламу с помощью Firebog_Advertisement, ADs и Easylist фидов.

Не забываем запустить Force / DNSBL на Firewall / pfBlockerNG / Update для применения изменений.

Готово

Проверяем: https://www.cyberghostvpn.com/ru_RU/dns-leak-test

Можно дополнительно проверить что трафик не пойдёт мимо VPN'а если тот отвалится,- просто остановите OpenVPN клиент на Status / OpenVPN (иконка с "кирпичиком") и убедитесь что клиенты даже не смогут ничего пинговать по IP адресу.

Как уже говорилось в начале, данная конфигурация применима и к другим VPN провайдерам работающим по OpenVPN, незначительные отличия могут быть лишь в правильной "интерпретации" .ovpn конфига и для настройки OpenVPN клиента в pfSense.

Комментарии (12)


  1. NikaLapka
    26.10.2021 16:36

    Извините, а почему бы не воспользоваться более популярным protonvpn(если он не заблокирован, к сожалению не обладаю информацией)? И просто мысли: ovpn и pfSense это довольно требовательная связка, в отличие от l2tp\ipsec + любой домашний роутер. Утечку DNS можно удобно исключить в табличке маршрутизации.


    1. silinio Автор
      26.10.2021 17:56

      Можно использовать и ProtonVPN, какой угодно VPN провайдер на базе OpenVPN. Об этом сказано в самом начале.
      Полностью согласен со вторым доводом
      Как можно исключить утечку DNS с помощью таблички маршрутизации если адрес DNS получается динамически?


  1. Mantukai
    27.10.2021 12:13

    Добрый день

    Очень интересно было бы увидеть похожую статью о подключении pFsense к публичному VPN сервису и настройке туннеля через Wireguard - можно ожидать?


    1. silinio Автор
      27.10.2021 12:14

      Да, статья про настройку WireGuard на pfSense уже в планах


  1. werter_l
    30.10.2021 17:43

    Спасибо.
    Но мне кажется, что схема немного переусложнена )

    Переходим на страницу System / General Setup и СНИМАЕМ галку с DNS Server Override.
    Тем самым мы «лишаемся» (что хорошо) в корне возможности использовать провайдерские dns.
    Там же прописываем DNS (напр., 1.1.1.1) и ЯВНО указываем gateway к этому DNS — наш ovpn_gw. Правильнее указать неск-ко ip-адресов dns по аналогии. Тогда клиенты в локалке за пф получив по dhcp в кач-ве 1-го днс ip пфсенса будут пользовать те днс (форвардингом), что указаны в настройках пфсенса на странице System / General Setup и ТОЛЬКО через впн-туннель.

    Также непонятно, зачем блокировать doh пфблокером клиентам? У нас же ВЕСЬ трафик уходит в впн-туннель — так пусть пользуют doh через впн на здоровье.

    Далее, правило fw на скрине с reject-ом всего dnssec (853\TCP). ВЕСЬ трафик и так уходит в туннель (и dnnsec тоже, ес-но) согласно последнему правилу на этом же скрине и смысл в его блокировке стремится к нулю.
    image
    После правки правил fw рекомендую сделать Reset states ради чистоты эксперимента.

    Касаемо конфига впн от киберхоста. Эти строки:

    cipher AES-256-CBC
    ncp-disable

    Оч. плохо, что этот хостер НЕ ПОДДЕРЖИВАЕТ алгоритмы шифрования с аппаратным ускорением AES (
    Даже странно как-то — это же и им лишняя нагрузка на железо.
    В таком случае вы более 10-20 Мбит\с через этот впн не «прокачаете».
    Но получите приличную нагрузку на cpu железки, где установлен пфсенс. Причем даже, если ваш cpu умеет ускорять aes.


    1. silinio Автор
      30.10.2021 22:41

      Схема переусложнена по причине динамического получения IP адреса DNS сервера VPN-провайдера при подключении по OpenVPN. По той же причине блокируется DoH и DNS-over-TLS.

      Если вы хотите использовать публичный DNS вместо сервера VPN провайдера — то да, ваша конфигурация вполне подойдёт.


      1. werter_l
        31.10.2021 14:09

        А причем здесь блокировка DoH и dnssec (dnssec - это не DoT) ?

        Наоборот, использование DoH, dnssec etc на клиентской стороне НЕ позволяет перехватывать днс-трафик и впн-провайдеру тоже. Зачем киберхосту знать, куда я хожу через их впн?

        Еще раз повторюсь, что этот киберхост - школоло-поделка. Мне хватило того, что они в конфиге впн касаемо AES нарисовали. Сами себе в ногу стреляют не используя аппаратное ускорение.


        1. silinio Автор
          01.11.2021 16:17

          > Еще раз повторюсь, что этот киберхост — школоло-поделка. Мне хватило того, что они в конфиге впн касаемо AES нарисовали. Сами себе в ногу стреляют не используя аппаратное ускорение.

          Как было не раз сказано, CyberGhost выбран лишь в качестве примера
          Вы можете использовать описанную конфигурацию с любом другим VPN провайдером


    1. silinio Автор
      30.10.2021 22:56

      если проц поддерживает AES-NI то OpenVPN автоматом использует его для ускорение всех AES-*-* алгоритмов


      1. werter_l
        31.10.2021 14:00

        Я вас разочарую. Openvpn будет "поддерживать" только то, что указано в конфигурационном файле. Сами проверьте.

        При этом надо еще и руками на самом пфсенсе вкл. ускорение AES в настройках. Оно выкл. по умолчанию.


  1. werter_l
    04.11.2021 13:08

  1. logon61
    07.11.2021 20:14

    Интересно было бы почитать про настройку wireguard или openvpn, чтобы через туннель клиенты ходили только на определенные сайты из алиаса. Я пробовал настраивать такой конфиг, вроде все работало, но потом увидел, что pfsense сам ходит в инет только через vpn туннель, получается, что увеличивается задержка от серверов dns. В общем работал некорректно, как мне показалось. Хотелось бы почитать, как это грамотно организовать.