OpenConnect VPN server на CentOS + radius

ocserv-new2 Краткая инструкция по установке ocserv и подключение его к radius-серверу.
В CentOS 7 ocserv присутствует в репозитории epel, в 6-й версии его там нет, поэтому ставить проще из исходников. В основном все расписано для 6-й версии, немного пояснений есть и для 7-й .

для 6-й версии:

yum install autoconf automake gcc libtasn1-devel zlib zlib-devel trousers trousers-devel gmp-devel gmp xz texinfo libnl-devel libnl tcp_wrappers-libs tcp_wrappers-devel tcp_wrappers dbus dbus-devel ncurses-devel pam-devel readline-devel bison bison-devel flex gcc automake autoconf wget

cd /usr/src/
wget http://www.lysator.liu.se/~nisse/archive/nettle-2.7.tar.gz
tar xvf nettle-2.7.tar.gz
cd nettle-2.7
./configure --prefix=/opt/
make && make install
cd ..

wget ftp://ftp.gnutls.org/gcrypt/gnutls/v3.2/gnutls-3.2.12.tar.xz
tar xvf gnutls-3.2.12.tar.xz
cd gnutls-3.2.12
export LD_LIBRARY_PATH=/opt/lib/:/opt/lib64/
NETTLE_CFLAGS="-I/opt/include/" NETTLE_LIBS="-L/opt/lib64/ -lnettle" HOGWEED_CFLAGS="-I/opt/include" HOGWEED_LIBS="-L/opt/lib64/ -lhogweed" ./configure --prefix=/opt/
make && make install
cd ..

wget http://www.carisma.slowglass.com/~tgr/libnl/files/libnl-3.2.24.tar.gz
tar xvf libnl-3.2.24.tar.gz
cd libnl-3.2.24
./configure --prefix=/opt/
make && make install
cd ..

wget ftp://ftp.infradead.org/pub/ocserv/ocserv-0.8.2.tar.xz
tar xvf ocserv-0.8.2.tar.xz
cd ocserv-0.8.2
LIBGNUTLS_CFLAGS="-I/opt/include/" LIBGNUTLS_LIBS="-L/opt/lib/ -lgnutls" LIBNL3_CFLAGS="-I/opt/include" LIBNL3_LIBS="-L/opt/lib/ -lnl-3 -lnl-route-3" ./configure --prefix=/opt/
make && make install

PATH=$PATH:/opt/bin:/opt/sbin
export PATH

для 6-й версии следует создать папку /etc/ocserv , и в ней расположить файлы:

ca.crt — не обязательно
server.crt
server.pem
ocserv.conf
profile.xml

для 7-й версии, просто

yum install ocserv

profile.xml

<?xml version="1.0" encoding="UTF-8"?>
<AnyConnectProfile xmlns="http://schemas.xmlsoap.org/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://schemas.xmlsoap.org/encoding/ AnyConnectProfile.xsd">

<ClientInitialization>
<AutoUpdate>true</AutoUpdate>
<BypassDownloader>true</BypassDownloader>
<UseStartBeforeLogon>false</UseStartBeforeLogon>
<StrictCertificateTrust>false</StrictCertificateTrust>
<RestrictPreferenceCaching>false</RestrictPreferenceCaching>
<RestrictTunnelProtocols>IPSec</RestrictTunnelProtocols>
<CertEnrollmentPin>pinAllowed</CertEnrollmentPin>
<CertificateMatch>
<KeyUsage>
<MatchKey>Digital_Signature</MatchKey>
</KeyUsage>
<ExtendedKeyUsage>
<ExtendedMatchKey>ClientAuth</ExtendedMatchKey>
</ExtendedKeyUsage>
</CertificateMatch>
</ClientInitialization>

<ServerList>
<HostEntry>
<HostName>server_host_name</HostName>
<HostAddress>IP_address_of_server</HostAddress>
</HostEntry>
</ServerList>
</AnyConnectProfile>

ocserv.conf — пример

auth = "pam" # PAM нужен для radius-а
max-clients = 16
max-same-clients = 1
tcp-port = 443
udp-port = 443
keepalive = 32400
dpd = 90
try-mtu-discovery = false
server-cert = /etc/ocserv/server.crt
server-key = /etc/ocserv/server.pem
ca-cert = /etc/ocserv/ca.crt # необязательный параметр
tls-priorities = "NORMAL:%SERVER_PRECEDENCE:%COMPAT"
auth-timeout = 40
cookie-timeout = 360
rekey-time = 172800
rekey-method = ssl
use-utmp = true
use-occtl = true
pid-file = /var/run/ocserv.pid
socket-file = /var/run/ocserv-socket
run-as-user = nobody # для 7-й: ocserv
run-as-group = daemon # для 7-й: ocserv
device = vpns
predictable-ips = true
default-domain = domain.tld
ipv4-network = 192.168.91.0 # сеть из которой назначаются адреса
ipv4-netmask = 255.255.255.0
dns = 8.8.8.8 # dns для клиентов
dns = 8.8.4.4 # dns для клиентов
ping-leases = false
auto-select-group = false
route-add-cmd = "ip route add %R dev %D"
route-del-cmd = "ip route delete %R dev %D"
user-profile = /etc/ocserv/profile.xml
cisco-client-compat = true

Если мы хотим передавать маршруты клиентам, то нужно в конфиг добавить:

route = 192.168.1.0/255.255.255.0
route = 192.168.5.0/255.255.255.0

по количеству необходимых маршрутов, если таких строчек нет, то будет дефолтный маршрут.

Как создать сертификаты, думаю объяснять не нужно.

если мы не хотим привязки к radius-у, то меняем:
auth = "pam"
на
auth = "plain[/etc/ocserv/ocpasswd]"
и создаем клиентов:

ocpasswd user1 -c /etc/ocserv/ocpasswd

Запускать сервер нужно командой:

LD_LIBRARY_PATH=/opt/lib/:/opt/lib64/ /opt/sbin/ocserv -c /etc/ocserv/ocserv.conf

а для рестарта можно создать небольшой файлик:

#!/bin/bash
kill `cat /var/run/ocserv.pid`
sleep 4
LD_LIBRARY_PATH=/opt/lib/:/opt/lib64/ /opt/sbin/ocserv -c /etc/ocserv/ocserv.conf

Если не устраивает, то можете написать свой init.d для сервиса, это не сложно.

для 7-й версии стартовать и рестартить нужно штатными средствами
service ocserv restart

Теперь по radius-у:

yum install pam_radius

для 7-й надо скачать и установить из исходников:

wget ftp://ftp.freeradius.org/pub/radius/pam_radius-1.3.17.tar.gz
tar -xzvf pam_radius-1.3.17.tar.gz
make
cp pam_radius_auth.so /lib64/security/
cp pam_radius_auth.conf /etc/
ln -s /etc/pam_radius_auth.conf /etc/pam_radius.conf

правим файл /etc/pam_radius.conf оставляя только:
ip_of_radius secret_key timeout
пример:
172.24.17.5 BvHbgVfg5TgffgFt 5

mkdir /etc/raddb
правим /etc/raddb/server — без этого постоянно сыпались ошибки
172.24.17.5 BvHbgVfg5TgffgFt

правим /etc/pam.d/ocserv , приводим к виду:

#%PAM-1.0
auth sufficient /lib64/security/pam_radius_auth.so
auth include password-auth
account required pam_nologin.so
account include password-auth
session include password-auth

Теперь достаточно в firewall добавить маскарадинг:

iptables -t nat -I POSTROUTING -s 192.168.91.0/24 -o eth0 -j MASQUERADE

и разрешить соединение на 443 порт:

iptables -I INPUT -p tcp --dport 443 -j ACCEPT

Для 7-й версии:

firewall-cmd --permanent --zone=external --change-interface=eth0
firewall-cmd --permanent --zone=external --add-service=https

Всё готово, осталось только подключиться.
Android клиент
для iOS — AnyConnect
для Linux и OS X — openconnect

Удачи в настройках.
© shadow_alone