OCServ: Совместимый с CISCO AnyConnect VPN сервер на Linux

()

Различных протоколов для организации виртуальных частных сетей (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. После запуска необходимо зайти в раздел "Подключения" и создать новое подключение в соответствии с настройками сервера. После этого вернуться на главный экран приложения и включить соединение.

CISCO AnyClient VPN клиент на Android

Клиент на iOS

Для смартфонов на платформе iOS так же существует приложение AnyConnect, внешне и по функционалу очень похожее на аналогичное приложение для Android. В нём так же надо создать новое подключение указав адрес сервера, логин и пароль и потом включить VPN галочкой на основном экране приложения.

CISCO AnyClient VPN клиент на iOS

Клиент на 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".

Настройка подключения к серверу AnyClient в KDE

Если что-то пошло не так

При возникновении проблем начала стоит убедиться что файл конфигурации на сервере не содержит ошибок:

ocserv --test-config --config /etc/ocserv/ocserv.conf

Затем проверить журнал работы сервиса на наличие ошибок командой:

journalctl -xe -u ocserv.service

И наконец необходимо проверить есть ли у клиента доступ к порту tcp/443 сервера.

На этом всё. Приятной работы!

Ключевые слова: cisco, anyconnect, ios, android, ocserv, openconnect, letsencrypt.

Подписаться на обновления: RSS-лента Канал в TamTam Telegram канал Канал в ICQ

Комментарии:

Anonymous 2020-01-29 15:45:10 (#)

Добрый вечер,
Не заморачивались с проблемой при установке ocserv.cong (max-same-clients=1)
Почему то после реконекта пользователь банится на некоторое время

Anonymous 2020-01-29 15:49:43 (#)

Немного неправильно. Если в конфигурационном файле ocserv.conf указать значение max - same clients = 1
то пользователь постоянно банится, к примеру между переходом с 3g на wi fi сеть.
Поможете найти решение?

Anonymous 2020-04-22 14:23:59 (#)

Спасибо!
Новый комментарий

Жирный текстКурсивный текстПодчёркнутый текстЗачёркнутый текстПрограммный кодСсылкаИзображение




© 2006-2024 Вадим Калинников aka MooSE
Политика конфиденциальности