Различных протоколов для организации виртуальных частных сетей (VPN) существует великое множество. Многие из них созданы либо при участии компании CISCO, либо полностью разработаны ей. Среди последних есть весьма удачные: технически прогрессивные и простые в настройке на клиентских устройствах. Среди таких можно выделить CISCO AnyConnect.
AnyConnect работает как поверх TCP, так и поверх UDP, поддерживает шифрование и сжатие трафика, а в самой простой конфигурации клиенту для подключения достаточно адреса сервера, логина и пароля. Кроме того существует открытая реализация сервера, о которой и пойдёт речь ниже.
Начальные условия: VPS от Vultr с Ubuntu 18.04, доменное имя "ocserv.example.com", указывающее на IP-адрес VPS. Необходимо развернуть AnyConnect сервер и разрешить клиентам заворачивать весь трафик через него. Логины и пароли необходимо хранить в отдельном файле.
Установка сервера
Для начала установим необходимые пакеты:
apt-get install ocserv certbot iptables-persistent denyhosts
После установки сервис запускается автоматически и потому на время написания настроек его надо остановить:
service ocserv stop
Теперь нам надо получить сертификат для нашего домена. Сертификат можно купить, но мы используем бесплатный сертификат от letsencrypt:
certbot certonly -d ocserv.example.com --standalone
Создадим файл с логинами и паролями (пока пустой):
touch /etc/ocserv/passwd
Далее открываем в редакторе файл "/etc/ocserv/ocserv.conf" и приводим его к виду:
# Из этой подсети будут получать адреса клиента ipv4-network = 172.16.255.0/24 # Префикс имён сетевых интерфейсов клиентов device = vpns # Максимальное количество одновременных подключений max-clients = 16 # С одним и тем же логином не более двух одновременных подключений max-same-clients = 2 # Этот DNS-сервер будут использовать клиенты dns = 8.8.8.8 # Весь трафик клиентов надо заворачивать на сервер route = default # Если нужно заворачивать только отдельные подсети # То нужно убрать route = default и добавить строки вида: # route = 10.10.11.0/24 # route = 10.254.0.0/15 # Использовать сжатие трафика compression = true # Пользователи описываются в файле /etc/ocserv/passw auth = "plain[passwd=/etc/ocserv/passwd]" # Порты, на которых слушает сервис tcp-port = 443 udp-port = 443 # Сервис будет работать под непривилегированным пользователем run-as-user = nobody run-as-group = daemon # Пути к приватному ключу и сертификату server-cert = /etc/letsencrypt/live/ocserv.example.com/fullchain.pem server-key = /etc/letsencrypt/live/ocserv.example.com/privkey.pem # Остальные параметры # Их описание можно найти в документации:) socket-file = /var/run/ocserv-socket isolate-workers = true keepalive = 32400 dpd = 90 mobile-dpd = 1800 try-mtu-discovery = false 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 = 3 max-ban-score = 50 ban-reset-time = 300 cookie-timeout = 300 deny-roaming = false rekey-time = 172800 rekey-method = ssl use-utmp = true use-occtl = true pid-file = /var/run/ocserv.pid predictable-ips = true ping-leases = false cisco-client-compat = true dtls-legacy = true
Закончив настройку запускаем сервис:
service ocserv start
Включаем пересылку пакетов между интерфейсами:
echo "net.ipv4.ip_forward = 0" > /etc/sysctl.d/99-my.conf sysctl net.ipv4.ip_forward=1
Настраиваем NAT на внешнем интерфейсе и сохраняем правила:
iptables -t nat -A POSTROUTING -s 172.16.255.0/24 -j MASQUERADE -o ens3 netfilter-persistent save
Для автоматического обновления сертификата создадим скрипт "/etc/cron.weekly/certbot-ocserv":
#!/bin/sh exec >> /dev/null 2>> /dev/null service ocserv stop certbot renew service ocserv start
Наконец создадим пользователя командой:
ocpasswd -c /etc/ocserv/passwd username
На этом настройка сервера заканчивается и можно переходить к настройке клиентов.
Клиент на Android
Для подключения устройств на базе Android первым делом необходимо установить приложение AnyConnect. После запуска необходимо зайти в раздел "Подключения" и создать новое подключение в соответствии с настройками сервера. После этого вернуться на главный экран приложения и включить соединение.
Клиент на iOS
Для смартфонов на платформе iOS так же существует приложение AnyConnect, внешне и по функционалу очень похожее на аналогичное приложение для Android. В нём так же надо создать новое подключение указав адрес сервера, логин и пароль и потом включить VPN галочкой на основном экране приложения.
Клиент на Linux или FreeBSD
В портах FreeBSD есть порт security/openconnect, а в репозиторях большинства Linux-дистрибутивов есть пакет openconnect, содержащий открытую реализацию клиента AnyConnect. Исходные тексты openconnect доступны тут. После установки openconnect подключаться к AnyConnect серверам можно командой:
openconnect ocserv.example.com
Кроме того поддержка AnyClient есть в Network Manager и пользователи, предпочитающие GUI, могут воспользоваться им. На Kubuntu 18.04 для этого как минимум необходимо установить пакеты "openconnect" и "network-manager-openconnect".
Если что-то пошло не так
При возникновении проблем начала стоит убедиться что файл конфигурации на сервере не содержит ошибок:
ocserv --test-config --config /etc/ocserv/ocserv.conf
Затем проверить журнал работы сервиса на наличие ошибок командой:
journalctl -xe -u ocserv.service
И наконец необходимо проверить есть ли у клиента доступ к порту tcp/443 сервера.
На этом всё. Приятной работы!
Anonymous 2020-01-29 15:45:10 (#)
Не заморачивались с проблемой при установке ocserv.cong (max-same-clients=1)
Почему то после реконекта пользователь банится на некоторое время