VPN-сервера нужны для миллиона разных задач. Лично мне нравится простой вариант с web-интерфейсом управления OpenVPN Access Server. Все прекрасно работает при развертывании его внутри периметра своей сети – виртуалка/железка управляется из локалки, наружу торчит только проброшенные наружу порты и доступ контролируется файрволом роутера. А что делать, если OVPN as живет на арендованной VPS где-то там в интернете? Выставлять его голой гхм… веб-админкой наружу? Не вариант, к сожалению. Однако, защититься способ есть.
Первое, что приходит в голову – это использовать дополнительный адрес на существующем интерфейсе. Сложности есть и тут. Для начала, на какой из интерфейсов вешать доп.адрес? На loopback или на внешний? На внешний нельзя – небезопасно. На loopback у меня адрес привязался, конечно, но заработать оно не заработало, потому что это же отдельный интерфейс, а не просто адрес на нем. Похожа ситуация с субинтерфейсами на основе существующего – все создается, привязывается, но не работает. OpenVPN жалуется, что я выбрал несколько интерфейсов и поэтому сохранять настройки отказывается. А выбрать субинтерфейс без основного не получается.
Ладненько (c)… Давайте сделаем виртуальный интерфейс целиком! С преферансом и феями! Быстрый поиск показал 100500 способов, вот только либо интерфейс не поднимается сам после перезагрузки, либо интерфейс не появляется после перезагрузки. Руками следить, когда там сервер перезагрузился и руками же писать команды как-то не хочется ибо хлопотно и ненадежно. И я таки нашел решение! Оговорюсь сразу, у меня взлетело на Ubuntu 18.04.6 LTS. У вас может не заработать, но сама идея достаточно проста.
Для начала включаем поддержку виртуальных интерфесов и в файле /etc/modules добавляем строчку
dummy
Далее, в файле описания интерфесов /etc/network/interfaces добавляем дополнительный блок, который и описывает наш виртуальный интерфейс. Ну и пишем, чтобы до запуска он создался, назначаем ему адрес и, собственно, поднимаем. В соответствии с правилами хорошего тона, не забываем строчку, которая при отключении интерфейса удалит его совсем – он же виртуальный и нам на него плевать.
auto dummy
iface dummy inet manual
pre-up /sbin/ip link add $IFACE type dummy
pre-up ifconfig $IFACE 192.168.1.2 up
post-down /sbin/ip link delete $IFACE
На CentOS 7 у меня сработал следующий метод:
Грузим модуль виртуальных интерфейсов. Для этого создаем файл /etc/modules-load.d/dummy.conf и так же пишем туда одну строчку
dummy
После этого идем в /etc/sysconfig/network-scripts/ifcfg-dummy0 и пишем там конфигурацию интерфейса
TYPE=Ethernet
DEVICE=dummy0
ONBOOT=yes
IPADDR=192.168.1.2
PREFIX=24
Ну а дальше работаем с ним в OpenVPN, как с обычным интерфейсом – отключаем форвард с 443 порта и делаем доступной админку только администраторам с нужного интерфейса.
Если вдруг поломали, то официальная документация подскажет, как вернуть всё взад:
cd /usr/local/openvpn_as/scripts/
./sacli --key "admin_ui.https.ip_address" --value "all" ConfigPut
./sacli --key "admin_ui.https.port" --value "943" ConfigPut
./sacli --key "cs.https.ip_address" --value "all" ConfigPut
./sacli --key "cs.https.port" --value "943" ConfigPut
./sacli --key "ssl_api.local_addr" --value "all" ConfigPut
./sacli --key "ssl_api.local_port" --value "945" ConfigPut
./sacli --key "vpn.server.port_share.enable" --value "true" ConfigPut
./sacli --key "vpn.server.port_share.service" --value "admin+client" ConfigPut
./sacli --key "vpn.daemon.0.server.ip_address" --value "all" ConfigPut
./sacli --key "vpn.daemon.0.listen.ip_address" --value "all" ConfigPut
./sacli --key "vpn.server.daemon.udp.port" --value "1194" ConfigPut
./sacli --key "vpn.server.daemon.tcp.port" --value "443" ConfigPut
./sacli start