OpenConnect VPN server на CentOS + radius
Краткая инструкция по установке 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 installPATH=$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