Вопрос или проблема
У меня есть машина EC2 с публичным IP 123.123.123.123. На этой машине у меня установлен OpenVPN, и OpenVPN подключен к этой машине.
ifconfig utun6
utun6: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1500 inet 10.8.0.6 –> 10.8.0.5 netmask 0xfffffffc nd6 options=201<PERFORMNUD,DAD>
Также в файле клиента OpenVPN
route-nopull route 123.123.123.123 255.255.255.255
nginx имеет
allow 10.8.0.0/24; deny all;
Таким образом, когда я в браузере захожу на 123.123.123.123, я получаю таймаут соединения.
Моя задача – запретить доступ к хосту без VPN.
Ответ или решение
Для решения задачи маршрутизации OpenVPN с использованием nginx в вашей конфигурации необходимо рассмотреть несколько ключевых аспектов и применить их для достижения требуемого результата, а именно блокировки доступа к вашему серверу без использования VPN.
Теория:
Начнем с базовой теории. Вы используете OpenVPN в связке с nginx для ограничения доступа к вашему серверу EC2, имеющему публичный IP-адрес 123.123.123.123. Основная идея в том, чтобы позволить доступ только через VPN, в то время как все остальные попытки подключения должны быть заблокированы. Для этого конфигурация nginx настроена таким образом, чтобы разрешать доступ только с IP-адресов в диапазоне 10.8.0.0/24, который является диапазоном, типично используемым для клиентов OpenVPN.
OpenVPN устанавливает виртуальный сетевой интерфейс (utun6 в вашем случае), через который маршрутизируется трафик. Это позволяет клиентам подключаться к вашему серверу по внутренней IP-адресации, предоставляемой VPN. Параметр allow 10.8.0.0/24; deny all;
в конфигурации nginx гарантирует, что только устройства, подключенные через VPN, смогут взаимодействовать с вашим сервером.
Пример:
На вашем сервере EC2 установлен OpenVPN, и, как видно из вывода команды ifconfig utun6
, VPN-клиент получает внутренний IP (10.8.0.6 в вашем случае). Ваш клиентский файл OpenVPN содержит параметр route-nopull route 123.123.123.123 255.255.255.255
, который предотвращает автоматическое применение маршрутов от VPN-сервера, за исключением маршрута к вашему публичному IP-адресу.
Проблема заключается в том, что при попытке доступа к серверу через браузер по публичному IP вы получаете timeout. Это связано с тем, что трафик не проходит корректно через VPN либо из-за неправильной настройки маршрутизации (возможно, маршрут по умолчанию не настроен), либо из-за того, что ваш nginx не обрабатывает соединения от VPN-клиентов должным образом.
Применение:
-
Проверка OpenVPN:
- Убедитесь, что ваш OpenVPN-сервер правильно настроен и функционирует. Важно, чтобы все клиенты получали IP-адреса из заданного вами диапазона (10.8.0.0/24) и могут передавать трафик через VPN.
- Перепроверьте конфигурационный файл сервера OpenVPN чтобы убедиться, что диапазоны IP-адресов и другие параметры (например,
push "route 123.123.123.123 255.255.255.255"
) настроены правильно.
-
Конфигурация ngnix:
- В вашем конфиге nginx проверьте строку
allow 10.8.0.0/24; deny all;
. Убедитесь, что она находится в правильном контексте (например, в блоке server{}), что обеспечивает фильтрацию на уровне сервера. - Проверьте, чтобы не было конфликтующих правил в других файлах конфигурации nginx и, что все изменения сохранены корректно.
- В вашем конфиге nginx проверьте строку
-
Маршрутизация и сеть:
- На клиенте VPN убедитесь, что маршрут 123.123.123.123 действительно прописан. Используйте на клиенте команду
route
(на Windows) илиip route
(на Linux) для проверки текущих маршрутов. - Проверьте настройки файрволла как на сервере, так и на клиенте. Убедитесь, что правила iptables или другие аналогичные не блокируют соединения с вашего клиента VPN на сервер.
- На клиенте VPN убедитесь, что маршрут 123.123.123.123 действительно прописан. Используйте на клиенте команду
-
Тестирование:
- Запустите tcpdump или wireshark на сервере для наблюдения за входящими соединениями на VPN-интерфейс и убедитесь, что пакеты действительно достигают сервера.
- Проверьте, нет ли потерь пакетов или других проблем с сетевой связью между клиентом и сервером.
Настроив все необходимые конфигурации и проверив их выполнение, вы сможете добиться того, чтобы доступ к вашему серверу возможен был исключительно через VPN. Таким образом, все несанкционированные внешние попытки соединения будут блокироваться nginx.