Установка VPN на роутер
Carder's ClubУ вас может быть и другой VPN-провайдер,- CyberGhost выбран ввиду простоты настройки и для демонстрации настройки получения DNS серверов при подключении. Если в вашей стране не заблокирован ExpressVPN, то настройки будут практически идентичны.
![](https://sun9-65.userapi.com/impg/zJmql1hOSFOlGaSJv59WoIIOjaA-eWIhXXaO0g/iKVdxMbzygU.jpg?size=707x600&quality=96&sign=9dacbbe5d83e6a756e0513c12de17e68&type=album)
Регистрация пройдена, оплачено нужное количество месяцев. На странице VPN > Управление устройствами выбираем Ручная установка -> Настроить устройство. В появившемся окне в качестве протокола выбираем просто OpenVPN, какую хочется страну и группу серверов. Называем это pfSense.
![](https://sun9-55.userapi.com/impg/imOgYR9v5aSv2Lc4vr7t5vdm0jwzSThS7bVuKg/FmS3fR4es8o.jpg?size=686x383&quality=96&sign=40ffc16603149873aaf51024020c62f0&type=album)
Далее на странице VPN > Управление устройствами видим pfSense в списке активных VPN-устройств. Нажимаем на "просмотреть" в новом окне и скачиваем архив с конфигураций. Username и Password нам также пригодятся при настройке клиента.
Сертификаты
Распаковываем скачанный архив pfsense_openvpn.zip и видим там несколько файлов. Для начала нам нужны ca.crt, client.crt и client.key.
Переходим в pfSense на страницу System / Certificate Manager / CAs и жмём кнопку Add.
![](https://sun9-4.userapi.com/impg/rXO8hAUlUXJLELHeNiFsGZkPyLpsJ7xKM8_gYQ/5Wm_sxvlsKg.jpg?size=807x456&quality=96&sign=2af8a8d53f0555350b8474247933a9c1&type=album)
Теперь переходим на вкладку System / Certificate Manager / Certificates, кнопка Add, выбираем в качестве метода Import an existing Certificate, называем CyberGhost Client Certificate и копируем содержимое файла client.crt в поле Certificate data, а файла client.key - в поле Private key data.
![](https://sun9-67.userapi.com/impg/NR3BF1OBYsex0O1nnOFZXlOXoQRcaPs5lRJzow/qk0hgM0Juzg.jpg?size=807x433&quality=96&sign=28eec1f2c48f1f0d15ccc52979d1d271&type=album)
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, включаем
![](https://sun9-28.userapi.com/impg/k0x5rDvcTSVPPaFsi3zeQBUcIFr5WaI-FqrEdA/mTEThzif-fY.jpg?size=807x337&quality=96&sign=490e9387fa5330cf488a226c059b66ac&type=album)
Сохраняем и на странице Status / OpenVPN проверяем что клиент подключился (Status = up):
![](https://sun9-20.userapi.com/impg/dmY7zKdc7H-IhjQyXdIR-kNr6ZO63YnuWu25aw/b4FE5jTng3g.jpg?size=807x222&quality=96&sign=c2e3eed9a41206967897495dd5f78986&type=album)
Настройка DNS
Нашей задачей является запрет на использование публичных DNS серверов клиентами сети,- мы не хотим показывать куда ходят клиенты через VPN туннель (т.е. исключить DNS Leak).
![](https://sun9-11.userapi.com/impg/cTJH73ME28s_H8PWXf6VlxU_smIHnAGoccfMCg/uB1BZ2LBwaQ.jpg?size=807x72&quality=96&sign=4385f6c24dfe43615bcda20dcfcdd18f&type=album)
Для начала назначим OpenVPN интерфейс, это нам пригодится в дальнейшем. На странице Interfaces / Interface Assignments выбираем ovpnc1 и нажимаем Add. Называем CyberGhost_VPN, чекаем Enable и сохраняем.
![](https://sun9-74.userapi.com/impg/SS7bDtnrXPcK5LYItoWwOiaDygRD9tS3dGN2fQ/Bzie5V63oTw.jpg?size=807x282&quality=96&sign=893d3a00a89e51909895e0f1f2dc93ac&type=album)
Переходим на страницу System / General Setup и убираем всё из списка DNS Servers. Ставим галочку DNS Server Override, - это позволит использовать получаемый от OpenVPN сервер DNS в качестве форвардера.
![](https://sun9-9.userapi.com/impg/zVHDQyd8_Trd-V8nt2GfvLXTa57ZmLKA3MBtEw/3s6L08hmePI.jpg?size=807x409&quality=96&sign=d75feb2ba1d1a9d32139699409d109e1&type=album)
Настроим 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 перечислив полученные адреса через запятую:
![](https://sun9-11.userapi.com/impg/_LPLuH_1lci4P8iZfearSc9ibg3z_9BHMnM7gw/SasDQ2Sy1R0.jpg?size=807x316&quality=96&sign=2d456bc6d760c48f1c134ca741a9b910&type=album)
Если для подключения к провайдеру используется статический адрес - то по данной части всё готово, никакие другие 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:
![](https://sun9-88.userapi.com/impg/zShZ_BtlbGYmGr8PvK9SEpqeYF4jLCTSDEF1EA/zOi82NCJGyU.jpg?size=807x161&quality=96&sign=5c895db3ed5ad8fbbc9e6e4ed0f154ea&type=album)
Вот и всё - теперь настройки 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:
![](https://sun9-55.userapi.com/impg/yl7myfTh4FJDV_lFSg41y65jbND8i80XMA8c3A/W2HGenmujG0.jpg?size=807x303&quality=96&sign=3797035e0c2fc0bec536223b92186cc3&type=album)
- 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 туннеля наши пользователи не побежали неожиданно через сеть провайдера.
![](https://sun9-5.userapi.com/impg/JpFfaROv_O6WiJXF9VNyakIOO3d4KiH4WA2s9Q/5iVdfyIuxC4.jpg?size=807x138&quality=96&sign=2923319b45a52a35aae03325e4ff593b&type=album)
На странице 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
Итого у нас должен получиться следующий порядок правил:
![](https://sun9-88.userapi.com/impg/E1VjvGbC9csp4iS-PFLytpGuGN49wgcjPDM0mQ/kmwWofxcNMk.jpg?size=807x391&quality=96&sign=2cd0ee9f9002c6606d4e8f64e6fc64a5&type=album)
Настроим Outbound NAT для клиентов локальной сети. На Firewall / NAT / Outbound переключаем Mode в "Hybrid Outbound NAT rule generation" и нажимаем Save. Теперь можно добавить следующее правило:
![](https://sun9-47.userapi.com/impg/cyy6Tinr6FyEhELV9GN-7QmqykFFmE1ZFbwDUA/jlVEqO3xkrs.jpg?size=807x397&quality=96&sign=004eb6a9784c8174b218f5e1c26a54da&type=album)
- 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 и перейдём к специфичным для нас вещам.
![](https://sun9-86.userapi.com/impg/hIwVCHWzXh_ArJHS1Z49jb7s2cCWBhqIeT0lQg/aNfykHiuUhE.jpg?size=807x281&quality=96&sign=bdd057273bab8943b46809fce31d0389&type=album)
А именно блокировке 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
![](https://sun9-43.userapi.com/impg/51F5v5FxWLve8_IQoXDQ97G60HcCwZ3tOZxMug/E2VKJroUGIQ.jpg?size=779x604&quality=96&sign=d3d327932b747ff713875fa5d49a91af&type=album)
Можно дополнительно проверить что трафик не пойдёт мимо VPN'а если тот отвалится,- просто остановите OpenVPN клиент на Status / OpenVPN (иконка с "кирпичиком") и убедитесь что клиенты даже не смогут ничего пинговать по IP адресу.
Как уже говорилось в начале, данная конфигурация применима и к другим VPN провайдерам работающим по OpenVPN, незначительные отличия могут быть лишь в правильной "интерпретации" .ovpn конфига и для настройки OpenVPN клиента в pfSense.