воскресенье, 21 июля 2019 г.

Установка OpenConnect с самоподписанным сертификатом

Setup OpenConnect VPN Server for Cisco AnyConnect on Ubuntu 14.04 x64
Install OpenConnect Server on Ubuntu 16.04
Set up OpenConnect VPN Server (ocserv) on Ubuntu 16.04/17.10 with Let’s Encrypt
How to install ocserv (OpenConnect server, aka: free version of Cisco's Anyconnect) on Ubuntu 14.04
OCserv on Ubuntu for Cisco AnyConnect Client
Install OpenConnect VPN Server with Trusted Certificate from Let's Encrypt
OpenConnect Server with Duo Two-Factor Auth in Ubuntu 16.04
OpenConnect VPN Server Installation
在 Ubuntu 16.04.1 Server 上建置 OpenConnect SSL VPN Server
Openconnect 服务端 ocserv 的部署
How to Set up an OpenConnect VPN Server


мануал
Ocserv Firewall - iptables IPv4
Настройка iptables
Скрипт centos
Скрипт ubuntu
Linode CentOS 配置 ocserv 


Клиент Windows 10:
After installing the GUI in Windows 10 ...
Windows 10 - invalid routes
Ссылка на рабочий клиент 1.51 !!! (не старше)
Установка с картинками



В данном описании вариант для 1С без перенаправления интернет трафика: 

# apt update
# apt upgrade
# apt install mc
# adduser user
# usermod -aG sudo user
# su user
$ cd ~
$ mkdir ~/.ssh
$ cd ~/.ssh
$ ip a
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa):user@X.X.X.X
$ ls
Скачать и использовать для входа /home/user/.ssh/user@X.X.X.X
$ cp ~/.ssh/user@X.X.X.X.pub ~/.ssh/authorized_keys
$ rm ~/.ssh/user@X.X.X.X.pub
$ rm ~/.ssh/user@X.X.X.X
$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/authorized_keys
$ exit
# nano /etc/ssh/sshd_config

Проверить:

PasswordAuthentication no
.....

PubkeyAuthentication yes
ChallengeResponseAuthentication no

PermitRootLogin no
 
Сохранить.

$ sudo systemctl reload sshd

Зайти от user


# отключим ipv6
$ sudo /bin/su -c "echo 'net.ipv6.conf.all.disable_ipv6 = 1' >> /etc/sysctl.conf"
$ sudo /bin/su -c "echo 'net.ipv6.conf.default.disable_ipv6 = 1' >> /etc/sysctl.conf"
$ sudo /bin/su -c "echo 'net.ipv6.conf.lo.disable_ipv6 = 1' >> /etc/sysctl.conf"
$ sudo /bin/su -c "echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf"
$ sudo sysctl -p

=========================================================

$ sudo apt install ocserv
$ sudo apt install gnutls-bin
$ sudo mkdir /etc/ocserv/ssl/
$ cd /etc/ocserv/ssl/
$ sudo -i

Все сертификаты формируем в /etc/ocserv/ssl/ !!!

Генерация CA


(Если есть уже подготовленные кладем в root ca-key.pem ca-cert.pem)

# certtool --generate-privkey --outfile ca-key.pem
 
# cat << _EOF_ >ca.tmpl
cn = "VPN CA"
organization = "Big Corp"
serial = 1
expiration_days = -1
ca
signing_key
cert_signing_key
crl_signing_key
_EOF_
  
 
# nano ca.tmpl
 
cn = "VPN CA"
organization = "Big Corp"
serial = 1
expiration_days = -1
ca
signing_key
cert_signing_key
crl_signing_key
 
Сохранить.  
 
# certtool --generate-self-signed --load-privkey ca-key.pem \
           --template ca.tmpl --outfile ca-cert.pem
 

Генерация сертификата локального сервера

В следующем примере создается ключ сервера и пара сертификатов.

Если у нас нет домена ниже прописываем свой ip
ip_address = "1.2.3.4", dns_name заменить на свой, можно убрать или не убирать!


# certtool --generate-privkey --outfile server-key.pem
 
# cat << _EOF_ >server.tmpl
cn = "VPN server"
dns_name = "www.example.com"
dns_name = "vpn1.example.com"
ip_address = "1.2.3.4"
organization = "MyCompany"
expiration_days = -1
signing_key
encryption_key #only if the generated key is an RSA one
tls_www_server
_EOF_
 
# nano server.tmpl 
 
cn = "VPN server"
dns_name = "www.example.com"
dns_name = "vpn1.example.com"
ip_address = "1.2.3.4"
organization = "MyCompany"
expiration_days = -1
signing_key
encryption_key #only if the generated key is an RSA one
tls_www_server 
 
# certtool --generate-certificate --load-privkey server-key.pem \
           --load-ca-certificate ca-cert.pem --load-ca-privkey ca-key.pem \
           --template server.tmpl --outfile server-cert.pem 
 


Генерация клиентских сертификатов

==========================

ниже сделаем скриптом!

# certtool --generate-privkey --outfile user-key.pem
 
Ниже не делаем, сделаем скриптом gen-client-cert.sh:  
 
# cat << _EOF_ >user.tmpl
cn = "user"
unit = "admins"
expiration_days = 365
signing_key
tls_www_client
_EOF_
 
 
# certtool --generate-certificate --load-privkey user-key.pem \
           --load-ca-certificate ca-cert.pem --load-ca-privkey ca-key.pem \
           --template user.tmpl --outfile user-cert.pem

# certtool --to-p12 --load-privkey user-key.pem \
           --pkcs-cipher 3des-pkcs12 \
           --load-certificate user-cert.pem \
           --outfile user.p12 --outder


==========================

Сделаем скриптом gen-client-cert.sh: 

$ sudo nano gen-client-cert.sh

Вставить

#!/bin/bash
USER=$1
CA_DIR=$2
SERIAL=`date +%s`
certtool --generate-privkey --outfile $USER-key.pem
cat << _EOF_ >user.tmpl
cn = "$USER"
unit = "users"
serial = "$SERIAL"
expiration_days = 3650
signing_key
tls_www_client
_EOF_
certtool --generate-certificate --load-privkey $USER-key.pem --load-ca-certificate $CA_DIR/ca-cert.pem --load-ca-privkey $CA_DIR/ca-key.pem --template user.tmpl --outfile $USER-cert.pem
openssl pkcs12 -export -inkey $USER-key.pem -in $USER-cert.pem -name "$USER VPN Client Cert" -certfile $CA_DIR/ca-cert.pem -out $USER.p12

Сохранить.

$ ip a
ниже в конце строки точка:
$ sudo sh gen-client-cert.sh user01@X.X.X.X .
.....
$ sudo sh gen-client-cert.sh user10@X.X.X.X .

$ cd /etc/ocserv/ssl/ 
$ mkdir  /home/user/cert
$ sudo cp /etc/ocserv/ssl/ca-cert.pem /home/user/cert
$ sudo cp /etc/ocserv/ssl/ca-key.pem /home/user/cert
$ sudo cp /etc/ocserv/ssl/*.p12 /home/user/cert
$ cd /home/user/cert
$ sudo tar -czpf cert.tar.gz *
$ sudo chmod 700 /etc/ocserv/ssl/

Скачать на клиента  /home/user/cert/cert.tar.gz

$ cd ~
$  sudo rm -R /home/user/cert


Задать клиентам ip

$ sudo mkdir /etc/ocserv/config-per-user/
sudo /bin/su -c "echo 'explicit-ipv4=10.10.10.2' > /etc/ocserv/config-per-user/server@X.X.X.X"
sudo /bin/su -c "echo 'explicit-ipv4=10.10.10.3' > /etc/ocserv/config-per-user/user@X.X.X.X"
sudo /bin/su -c "echo 'explicit-ipv4=10.10.10.101' > /etc/ocserv/config-per-user/user01@X.X.X.X"
sudo /bin/su -c "echo 'explicit-ipv4=10.10.10.102' > /etc/ocserv/config-per-user/user02@X.X.X.X"
sudo /bin/su -c "echo 'explicit-ipv4=10.10.10.103' > /etc/ocserv/config-per-user/user03@X.X.X.X"
sudo /bin/su -c "echo 'explicit-ipv4=10.10.10.104' > /etc/ocserv/config-per-user/user04@X.X.X.X"
sudo /bin/su -c "echo 'explicit-ipv4=10.10.10.105' > /etc/ocserv/config-per-user/user05@X.X.X.X"
sudo /bin/su -c "echo 'explicit-ipv4=10.10.10.106' > /etc/ocserv/config-per-user/user06@X.X.X.X"
sudo /bin/su -c "echo 'explicit-ipv4=10.10.10.107' > /etc/ocserv/config-per-user/user07@X.X.X.X"
sudo /bin/su -c "echo 'explicit-ipv4=10.10.10.108' > /etc/ocserv/config-per-user/user08@X.X.X.X"
sudo /bin/su -c "echo 'explicit-ipv4=10.10.10.109' > /etc/ocserv/config-per-user/user09@X.X.X.X"
sudo /bin/su -c "echo 'explicit-ipv4=10.10.10.110' > /etc/ocserv/config-per-user/user10@X.X.X.X"


$ sudo cp /etc/ocserv/ocserv.conf /etc/ocserv/ocserv.conf.$(date +%F)
$ sudo sed -i 's|^auth = "pam|#auth = "pam|' /etc/ocserv/ocserv.conf
$ sudo sed -i 's/#auth = "certificate"/auth = "certificate"/' /etc/ocserv/ocserv.conf
$ sudo sed -i 's/max-same-clients = 2/max-same-clients = 1/' /etc/ocserv/ocserv.conf
$ sudo sed -i 's|server-cert = /etc/ssl/certs/ssl-cert-snakeoil.pem|server-cert = /etc/ocserv/ssl/server-cert.pem|' /etc/ocserv/ocserv.conf
$ sudo sed -i 's|server-key = /etc/ssl/private/ssl-cert-snakeoil.key|server-key = /etc/ocserv/ssl/server-key.pem|' /etc/ocserv/ocserv.conf
$ sudo sed -i 's|ca-cert = /etc/ssl/certs/ssl-cert-snakeoil.pem|ca-cert = /etc/ocserv/ssl/ca-cert.pem|' /etc/ocserv/ocserv.conf
$ sudo sed -i 's/cert-user-oid = 0.9.2342.19200300.100.1.1/cert-user-oid = 2.5.4.3/' /etc/ocserv/ocserv.conf
$ sudo sed -i 's/ipv4-network = 192.168.1.0/ipv4-network = 10.10.10.0/' /etc/ocserv/ocserv.conf
$ sudo sed -i 's/dns = 192.168.1.2/dns = 8.8.8.8/' /etc/ocserv/ocserv.conf
$ sudo sed -i 's/^route = 10.10.10.0/# route = 10.10.10.0/' /etc/ocserv/ocserv.conf
$ sudo sed -i 's/^route = 192.168.0.0/# route = 192.168.0.0/' /etc/ocserv/ocserv.conf
$ sudo sed -i 's/^\(try-mtu-discovery = \).*$/\1''true/' /etc/ocserv/ocserv.conf
$ sudo sed -i 's|#config-per-user = /etc/ocserv/config-per-user/|config-per-user = /etc/ocserv/config-per-user/|' /etc/ocserv/ocserv.conf


Или так:


$ cd ~
$ sudo nano ocserv_conf.sh

Вставить:

cp /etc/ocserv/ocserv.conf /etc/ocserv/ocserv.conf.$(date +%F)
sed -i 's|^auth = "pam|#auth = "pam|' /etc/ocserv/ocserv.conf
sed -i 's/#auth = "certificate"/auth = "certificate"/' /etc/ocserv/ocserv.conf
sed -i 's/max-same-clients = 2/max-same-clients = 1/' /etc/ocserv/ocserv.conf
sed -i 's|server-cert = /etc/ssl/certs/ssl-cert-snakeoil.pem|server-cert = /etc/ocserv/ssl/server-cert.pem|' /etc/ocserv/ocserv.conf
sed -i 's|server-key = /etc/ssl/private/ssl-cert-snakeoil.key|server-key = /etc/ocserv/ssl/server-key.pem|' /etc/ocserv/ocserv.conf
sed -i 's|ca-cert = /etc/ssl/certs/ssl-cert-snakeoil.pem|ca-cert = /etc/ocserv/ssl/ca-cert.pem|' /etc/ocserv/ocserv.conf
sed -i 's/cert-user-oid = 0.9.2342.19200300.100.1.1/cert-user-oid = 2.5.4.3/' /etc/ocserv/ocserv.conf
sed -i 's/ipv4-network = 192.168.1.0/ipv4-network = 10.10.10.0/' /etc/ocserv/ocserv.conf
sed -i 's/dns = 192.168.1.2/dns = 8.8.8.8/' /etc/ocserv/ocserv.conf
sed -i 's/^route = 10.10.10.0/# route = 10.10.10.0/' /etc/ocserv/ocserv.conf
sed -i 's/^route = 192.168.0.0/# route = 192.168.0.0/' /etc/ocserv/ocserv.conf
sed -i 's/^\(try-mtu-discovery = \).*$/\1''true/' /etc/ocserv/ocserv.conf
sed -i 's|#config-per-user = /etc/ocserv/config-per-user/|config-per-user = /etc/ocserv/config-per-user/|' /etc/ocserv/ocserv.conf

Сохранить.

$ sudo sh ocserv_conf.sh

$ sudo cp /lib/systemd/system/ocserv.service /etc/systemd/system/ocserv.service
$ sudo nano /etc/systemd/system/ocserv.service

[Unit]
Description=OpenConnect SSL VPN server
Documentation=man:ocserv(8)
After=network-online.target
#Requires=ocserv.socket #Заккоменитировать!

[Service]
PrivateTmp=true
PIDFile=/var/run/ocserv.pid
ExecStart=/usr/sbin/ocserv --foreground --pid-file /var/run/ocserv.pid --config /etc/ocserv/ocserv.conf
ExecReload=/bin/kill -HUP $MAINPID

[Install]
WantedBy=multi-user.target
#Also=ocserv.socket #Заккоменитировать!

Сохранить.

$ sudo systemctl daemon-reload
$ sudo systemctl enable ocserv.service
$ sudo systemctl restart ocserv.service
$ sudo systemctl status ocserv.service
#$ sudo systemctl stop ocserv.socket
#$ sudo systemctl disable ocserv.socket

Не делаем:
#$ sudo ocpasswd -c /etc/ocserv/ocpasswd username


Для адекватной проверки скорости соединения, нужно создать nat до перезагрузки
Узнаем имя сетевого адаптера :
$ ip a
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group
==================================================
Не делаем:
В данном случае  ens3:

$ sudo iptables -t nat -A POSTROUTING -o ens3 -j MASQUERADE

$ sudo iptables -t nat -L POSTROUTING

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  --  anywhere             anywhere
==================================================


Если нужна маршрутизация интернета постоянно, можно настроить ufw :

$ sudo ufw enable
$ sudo ufw allow 22
$ sudo ufw allow 443


#$ sudo nano /etc/default/ufw
$ sudo sed -i 's|IPV6=yes|IPV6=no|' /etc/default/ufw
$ sudo sed -i 's|DEFAULT_FORWARD_POLICY="DROP"|DEFAULT_FORWARD_POLICY="ACCEPT"|' /etc/default/ufw

$ ip a
..... ens18

Указать соответствующий ens3 или ens18:

#$ sudo nano /etc/ufw/before.rules

$ sudo -i
# echo "*nat" >> /etc/ufw/before.rules
# echo ":POSTROUTING ACCEPT [0:0]" >> /etc/ufw/before.rules
# echo "-A POSTROUTING -o ens3 -j MASQUERADE" >> /etc/ufw/before.rules
# echo "COMMIT" >> /etc/ufw/before.rules
# ufw disable && ufw enable

# ufw status
Status: active

To                         Action      From
--                         ------      ----
22                         ALLOW       Anywhere
443                        ALLOW       Anywhere
 

$ sudo ufw allow from x.x.x.x proto tcp to any port 22

#$ sudo ufw status numbered
#$ sudo ufw delete 3
#$ sudo ufw disable && sudo ufw enable


Можно проверерять вход с клиента

windows 10 gui client OpenConnect

Для windows переименовать ca-sert.pem в ca-sert.crt

ca-sert.crt установить в Доверенные корневые центры сертификации









Проверить скорость интернета



Отключение маршрутизации интернет трафика:

$ sudo nano /etc/ocserv/ocserv.conf

Изменить:
#dns=8.8.8.8
route = 10.10.10.0/255.255.255.0
#route = default
 
Сохранить.

$ sudo systemctl restart ocserv





Подключение клиента на Ubuntu

Проверка

$ sudo apt install openconnect

Положить сертификат
 /root/server.p12 - клиентский
/root/ca-cert.pem - сервера


Запустить локально:
$ sudo openconnect -b xxx.xxx.xxx.xxx -c /root/server.p12 --cafile /root/ca-cert.pem





Если в логах появится постоянно:

Jul 16 13:44:47 u1804 openconnect[1796]: DTLS handshake failed: The operation timed out
Jul 16 13:46:17 u1804 openconnect[1796]: DTLS handshake failed: Resource temporarily unavailable, try again.
Jul 16 13:50:48 u1804 openconnect[1796]: message repeated 3 times: [ DTLS handshake failed: Resource temporarily unavailable, try again.]

Добавить:
--no-dtls

$ sudo openconnect -b XXX.XXX.XXX.XXX -c /root/server@XXX.XXX.XXX.XXX.p12 --key-password=password --cafile /root/ca-cert.pem --no-dtls --syslog

Сделать службу:

$ sudo nano /etc/systemd/system/openconnect.service

Вставить:

[Unit]
  Description=OpenConnect VPN Client
  After=network-online.target
  Wants=network-online.target

[Service]
  Type=simple
  ExecStart=/usr/sbin/openconnect XXX.XXX.XXX.XXX -c /root/server@XXX.XXX.XXX.XXX.p12 --key-password=password --cafile /root/ca-cert.pem --no-dtls --syslog
  #--no-dtls # Добавить в предыдущую строку для отключения dtls
  ExecStop=/usr/bin/pkill openconnect
  Restart=always
  RestartSec=2

[Install]
  WantedBy=multi-user.target

Сохранить.

$ sudo systemctl enable openconnect.service

$ sudo systemctl start openconnect.service

Если что то менялось:
$ sudo systemctl daemon-reload
$ sudo systemctl restart openconnect.service

Проверить ip
$ wget -O - -q icanhazip.com

Маршрутизация интернет трафика:

$ sudo nano /etc/ocserv/ocserv.conf

Если маршрут закомментирован
dns=8.8.8.8
#route = 10.10.10.0/255.255.255.0
или прямо указан (по умолчанию default даже если закомментировано)
route = default

Интернет трафик идет через tun0

На клиенте:

$ route



Отключение маршрутизации интернет трафика:

$ sudo nano /etc/ocserv/ocserv.conf

Изменить:
dns=8.8.8.8
route = 10.10.10.0/255.255.255.0
#route = default
 

Сохранить.

$ sudo systemctl restart ocserv


Интернет трафик идет через enp0s3


Если dns указан, обращение идет по tun0

$ sudo nano /etc/ocserv/ocserv.conf

Изменить:

#dns=8.8.8.8
route = 10.10.10.0/255.255.255.0
#route = default
 
Сохранить.

$ sudo systemctl restart ocserv


Если dns закомментирован, обращение идет по enp0s3


Горячая замена vpn при подключении по vpn

1. Положить в /root необходимые сертификаты.
2. $ sudo nano /etc/systemd/system/openconnect.service

Старую стрчку с подключением закомментировать, новую добавить.

#ExecStart=....
ExecStart=....

Сохранить.

3.
$ sudo systemctl daemon-reload && sudo systemctl restart openconnect.service

4. Подключиться по другой vpn.

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

Отправить комментарий