October 27, 2021

Анонимный VPN роутер на pfSense

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.

Источник:https://habr.com/ru/company/timeweb/blog/581982/