У одного заказчика столкнулся с проблемой, когда локальный DPI (Deep Packet Inspection — технология накопления статистических данных, проверки и фильтрации сетевых пакетов по их содержимому) не пропускал SSH протокол. В результате не было возможности подключиться к необходимой мне инфраструктуре используя ssh туннели.
Достаточно часто по работе я использую другую технологию туннелирования — Cisco AnyConnect, но ставить физическую железку Cisco ASA для туннелирования в своей инфраструктуре дорого и нерентабельно, а виртуальная ASA в моем виртуальном окружении не поднимается по архитектурным особенностям.
Оказывается есть opensource аналог AnyConnect VPN Server — OpenConnect VPN Server или ocserv.
Установка проходит в 5 простых шагов:
1. Установка пакета ocserv.
Данный пакет находится в репозитарии epel
yum install ocserv |
2. Подготовка сертификатов.
Сертификат можно выпустить и самоподписанный, но я воспользовался бесплатными сертификатами от Let’s Encrypt, для того чтобы при подключении клиент на него не ругался.
3. Настройка конфигурационного файла.
# grep -Ev '^\s*(;|#|$)' ocserv.conf auth = "plain[/etc/ocserv/ocpasswd]" tcp-port = 444 udp-port = 444 run-as-user = ocserv run-as-group = ocserv socket-file = ocserv.sock chroot-dir = /var/lib/ocserv isolate-workers = false max-clients = 16 max-same-clients = 2 keepalive = 32400 dpd = 90 mobile-dpd = 1800 switch-to-tcp-timeout = 25 try-mtu-discovery = false server-cert = /etc/letsencrypt/live/shurshun.ru/fullchain.pem server-key = /etc/letsencrypt/live/shurshun.ru/privkey.pem ca-cert = /etc/letsencrypt/live/shurshun.ru/chain.pem cert-user-oid = 0.9.2342.19200300.100.1.1 tls-priorities = "NORMAL:%SERVER_PRECEDENCE:%COMPAT:-VERS-SSL3.0" auth-timeout = 240 min-reauth-time = 300 max-ban-score = 50 ban-reset-time = 300 cookie-timeout = 300 deny-roaming = false rekey-time = 172800 rekey-method = ssl use-occtl = true pid-file = /var/run/ocserv.pid device = vpns predictable-ips = true default-domain = my.domain.ru ipv4-network = 192.168.2.192 ipv4-netmask = 255.255.255.240 tunnel-all-dns = true dns = 192.168.1.1 ping-leases = false route = 192.168.1.0/255.255.255.0 cisco-client-compat = true dtls-legacy = true user-profile = profile.xml |
Вам следует обратить внимание и заполнить своими данными следующие параметры:
Тип аторизации: auth
Порты: tcp-port, udp-port (обычно пор 443, но у меня один ip и данный порт уже занят)
Сертификаты: server-cert, server-key, ca-cert
Домен по умолчанию: default-domain
Настройка сети: ipv4-network,ipv4-netmask, dns, route
4. Включение Forwarding IP и настройка маршрутизации.
sudo nano /etc/sysctl.conf net.ipv4.ip_forward = 1 sudo sysctl -p |
В моем случае роутер (192.168.1.1) и VPN сервер (192.168.1.7) разные машины. VPN отдает сеть 192.168.2.* и для того чтобы подключенный клиент мог видеть локальную сеть 192.168.1.* на роутере (192.168.1.1) необходимо прописать статически маршрут для сети 192.168.2.* на VPN сервер(192.168.1.7).
Данный момент многие забывают, что приводит к различным проблемам при первичной настройке.
5. Задание пользователя и пароля для подключения.
sudo ocpasswd -c /etc/ocserv/ocpasswd username |
Проверить работу сервера можно при помощи любого клиента Cisco AnyConnect или установив консольный клиент:
yum install openconnect sudo openconnect -b vpn.example.com:port-number |
Итоги:
В целом решение себя оправдало.
Хочется отметить, что я рассмотрел простейшую конфигурацию, но также как и железное решение, ocserv поддерживает множество различных настроек, например двухфакторную аутентификацию — достаточно популярный и важный в наше время функционал.
По материалам:
https://pupli.net/2017/12/22/set-up-openconnect-vpn-server-ocserv-on-ubuntu-16-04-17-10-with-lets-encrypt/