понедельник, 29 апреля 2019 г.

Настройка OpenVPN c stunnel Ubuntu 16.04 хостера DO

Верифицировано 01.05.2019 г. !!!
Бывает необходимо подключить к вебсерверу на котором опубликованы
информационные базы 1С клиентов через интернет.
А так же организован ftp для обмена файлами.

Initial Server Setup with Ubuntu 16.04

Как настроить сервер OpenVPN в Ubuntu 16.04

DO создать пользоватателя user с сертификатом

1. Создать droplet пароль root придет на регистрационный email,  ip увидим при создании

На рабочей машине:
 На рабочей машине:
$ ssh user@ip

$ sudo apt install openvpn easy-rsa -y

Откроем firefox (в ubuntu), откроем эту страничку  и скопируем в буфер скрипт настройки сети:

$ nano start.sh

Скопируем из буфера следующий скрипт, в котором Вам нужно исправить ip и адрес шлюза в соответствии со своей сетью:

#!/bin/bash
#Небольшой тюнинг:
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 /bin/su -c "echo 'vm.swappiness=30' >> /etc/sysctl.conf"
sudo sysctl -p
sudo  systemctl restart networking.service


# Настройка sudo journalctl -b sudo journalctl -b -1 sudo journalctl --list-boots
sudo sed -i 's/#Storage=auto/Storage=persistent/' /etc/systemd/journald.conf

#Добавим swap file to an Ubuntu 16.04:
sudo fallocate -l 1G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
sudo cp /etc/fstab /etc/fstab.bak
sudo echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

#Зададим ip для клиентов внутри vpn
sudo mkdir -p /etc/openvpn/ccd
sudo /bin/su -c "echo 'ifconfig-push 10.8.55.2 255.255.255.0' >> /etc/openvpn/ccd/client1"
sudo /bin/su -c "echo 'ifconfig-push 10.8.55.3 255.255.255.0' >> /etc/openvpn/ccd/client2"
sudo /bin/su -c "echo 'ifconfig-push 10.8.55.4 255.255.255.0' >> /etc/openvpn/ccd/client3"
sudo /bin/su -c "echo 'ifconfig-push 10.8.55.5 255.255.255.0' >> /etc/openvpn/ccd/client4"
sudo /bin/su -c "echo 'ifconfig-push 10.8.55.6 255.255.255.0' >> /etc/openvpn/ccd/client5"
sudo /bin/su -c "echo 'ifconfig-push 10.8.55.7 255.255.255.0' >> /etc/openvpn/ccd/client6"
sudo /bin/su -c "echo 'ifconfig-push 10.8.55.8 255.255.255.0' >> /etc/openvpn/ccd/client7"
sudo /bin/su -c "echo 'ifconfig-push 10.8.55.9 255.255.255.0' >> /etc/openvpn/ccd/client8"
sudo /bin/su -c "echo 'ifconfig-push 10.8.55.10 255.255.255.0' >> /etc/openvpn/ccd/client9"
sudo /bin/su -c "echo 'ifconfig-push 10.8.55.11 255.255.255.0' >> /etc/openvpn/ccd/client10"
sudo /bin/su -c "echo 'ifconfig-push 10.8.55.12 255.255.255.0' >> /etc/openvpn/ccd/client11"
sudo /bin/su -c "echo 'ifconfig-push 10.8.55.13 255.255.255.0' >> /etc/openvpn/ccd/client12"
sudo /bin/su -c "echo 'ifconfig-push 10.8.55.14 255.255.255.0' >> /etc/openvpn/ccd/client13"
sudo /bin/su -c "echo 'ifconfig-push 10.8.55.15 255.255.255.0' >> /etc/openvpn/ccd/client14"
sudo /bin/su -c "echo 'ifconfig-push 10.8.55.16 255.255.255.0' >> /etc/openvpn/ccd/client15"
sudo /bin/su -c "echo 'ifconfig-push 10.8.55.17 255.255.255.0' >> /etc/openvpn/ccd/client16"
sudo /bin/su -c "echo 'ifconfig-push 10.8.55.18 255.255.255.0' >> /etc/openvpn/ccd/client17"
sudo /bin/su -c "echo 'ifconfig-push 10.8.55.19 255.255.255.0' >> /etc/openvpn/ccd/client18"
sudo /bin/su -c "echo 'ifconfig-push 10.8.55.20 255.255.255.0' >> /etc/openvpn/ccd/client19"
sudo /bin/su -c "echo 'ifconfig-push 10.8.55.21 255.255.255.0' >> /etc/openvpn/ccd/client20"


# Настройка ftp пользователь: test пароль: test
sudo apt install pure-ftpd -y
sudo groupadd ftpgroup
sudo usermod -aG ftpgroup user
sudo ln -s /etc/pure-ftpd/conf/PureDB /etc/pure-ftpd/auth/50pure
sudo mkdir /home/user/test
sudo chown -R user:ftpgroup /home/user/test
#sudo pure-pw useradd test -u user -d /home/user/test
# Заведем пользователя ftp test с паролем test
sudo echo -e "test\ntest\n" | sudo pure-pw useradd test -u user -d /home/user/test
sudo pure-pw mkdb
sudo service pure-ftpd restart

Сохраним файл start.sh
$ sudo sh start.sh

=========================================================
#Еще добавим nat (если нужна маршрутизация интернет-трафика) :
# Обратить внимание что бы была одна сеть !!!
#$ sudo nano /etc/rc.local

#добавляем строки до exit 0

 iptables -A FORWARD -s 10.8.55.0/24 -j ACCEPT
 iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
 iptables -t nat -A POSTROUTING -s 10.8.55.0/24 -o eth0 -j MASQUERADE

#сохраняем

$ sudo reboot

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


$ sudo reboot
На рабочей машине:
$ ssh user@ip
Если sudo работает запретим входить root по ssh
$ sudo sed -i 's/PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config
Можно посмотреть:
$ sudo nano /etc/ssh/sshd_config
Должно быть: PermitRootLogin no
$ sudo reboot

На рабочей машине:
$ ssh user@ip

Генерация ключей
$ cd ~
$ make-cadir ~/openvpn-ca
$ cd ~/openvpn-ca
$ source vars
$ ./clean-all
$ ./build-ca
$ ./build-key-server server
....
Certificate is to be certified until Sep  4 14:15:23 2028 GMT (3650 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

$ ./build-dh
$ openvpn --genkey --secret keys/ta.key

Генерация ключей для клиента
$ cd ~/openvpn-ca
$ source vars
$ ./build-key client1
.....
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
$ ./build-key client2
...............................
$ ./build-key client20

Скопируем ключи:
$ cd ~/openvpn-ca/keys
$ sudo cp ca.crt ca.key server.crt server.key ta.key dh2048.pem /etc/openvpn
$ sudo gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz | sudo tee /etc/openvpn/server.conf
$ sudo cp /etc/openvpn/server.conf /etc/openvpn/server.conf.bak

Настройка сервера:
$ sudo nano /etc/openvpn/server.conf

Скопируем настройки server.conf и вставим (заменим) в /etc/openvpn/server.conf:

port 1194
#port 443 port-share 127.0.0.1 4443
proto tcp
dev tun
ca ca.crt
cert server.crt
key server.key  # This file should be kept secret
dh dh2048.pem
topology subnet
server 10.8.55.0 255.255.255.0
;ifconfig-pool-persist ipp.txt
client-config-dir ccd
# раскоментировать push "redirect-gateway def1"  и строки красным для маршрутизации интернета
;push "redirect-gateway def1"
;push "redirect-gateway def1 bypass-dhcp"
;push "dhcp-option DNS 208.67.222.222"
;push "dhcp-option DNS 208.67.220.220"
client-to-client
;duplicate-cn
keepalive 10 120
tls-auth ta.key 0 # This file is secret
key-direction 0
;cipher BF-CBC        # Blowfish (default)
cipher AES-128-CBC   # AES
;cipher DES-EDE3-CBC  # Triple-DES
;cipher none # шифрование stunnel
auth SHA256
comp-lzo
;max-clients 100
user nobody
group nogroup
persist-key
persist-tun
status openvpn-status.log
log openvpn.log
;log-append  openvpn.log
verb 3
;mute 20

Сохранить.

Запуск:
$ sudo systemctl start openvpn@server
$ sudo systemctl enable openvpn@server
$ sudo systemctl status openvpn@server
$ sudo systemctl restart openvpn@server
 -------------------------------------------------------------------------------------------------------------------------
Упакуем сертификаты
$ mkdir -p ~/client-configs/files
$ chmod 700 ~/client-configs/files
$ cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/client-configs/base.conf
$ cp ~/client-configs/base.conf ~/client-configs/base.conf.bak

Настроим базовые настройки клиента, XXX.XXX.XXX.XXX ip адрес сервера:
# Для работы через stunnel 127.0.0.1 !!!
$ nano ~/client-configs/base.conf
Заменить на: 
client
dev tun
proto tcp
;proto udp
remote 127.0.0.1 1194
;remote XXX.XXX.XXX.XXX 1194
;remote my-server-1 1194
;remote my-server-2 1194
resolv-retry infinite
nobind
;user nobody
;group nogroup
persist-key
persist-tun
;http-proxy-retry # retry on connection failures
;http-proxy [proxy server] [proxy port #]
;mute-replay-warnings
ca ca.crt
cert client.crt
key client.key
remote-cert-tls server
tls-auth ta.key 1
cipher AES-128-CBC
;cipher none # шифрование stunnel 
auth SHA256
key-direction 1
comp-lzo
verb 3
;mute 20

Сохранить.

$ nano ~/client-configs/make_config.sh
Добавить:
#!/bin/bash
# First argument: Client identifier
KEY_DIR=~/openvpn-ca/keys
OUTPUT_DIR=~/client-configs/files
BASE_CONFIG=~/client-configs/base.conf
cat ${BASE_CONFIG} \
    <(echo -e '<ca>') \
    ${KEY_DIR}/ca.crt \
    <(echo -e '</ca>\n<cert>') \
    ${KEY_DIR}/${1}.crt \
    <(echo -e '</cert>\n<key>') \
    ${KEY_DIR}/${1}.key \
    <(echo -e '</key>\n<tls-auth>') \
    ${KEY_DIR}/ta.key \
    <(echo -e '</tls-auth>') \
    > ${OUTPUT_DIR}/${1}.ovpn
Сохранить.
Убедиться что нет пустых строчек!!!
$ chmod 700 ~/client-configs/make_config.sh
$ cd ~/client-configs
$ ./make_config.sh client1
.........................................
$ ./make_config.sh client20

Подключиться по csp и скачать конфигурационные файлы для openvpn из  /home/user/client-configs/files
$ mkdir -p  /home/user/test/vu
Первый раз:
$ scp user@XXX.XXX.XXX.XXX:/home/user/client-configs/files/* /home/user/test
Настроить  vpn клиента
S sudo reboot

Затем подключиться по vpn
-------------------------------------------------------------------------------------------
$ scp user@10.8.55.1:/home/user/client-configs/files/* /home/user/test

$ sudo openvpn --config /etc/openvpn/client1.ovpn
-------------------------------------------------------------------------------------------

Перед настройкой stunnel4, OpenVPN должен быть настроен и проверен!!!

После проверки необходимо сделать изменеия на сервере:
OpenVPN and Obfsproxy network problems

$ sudo nano /etc/openvpn/server.conf

Добавить:
local 127.0.0.1

Закоментировать:
;push "redirect-gateway def1"

Добавить где XXX.XXX.XXX.XXX , ip адрес сервера:
push "redirect-gateway local"
push "route XXX.XXX.XXX.XXX 255.255.255.255 net_gateway"

Полный файл:

local 127.0.0.1
port 1194
#port 443 port-share 127.0.0.1 4443
proto tcp
dev tun
ca ca.crt
cert server.crt
key server.key  # This file should be kept secret
dh dh2048.pem
topology subnet
server 10.8.55.0 255.255.255.0
;ifconfig-pool-persist ipp.txt
client-config-dir ccd
# раскоментировать push "redirect-gateway def1" для маршрутизации интернета
;push "redirect-gateway def1"
#push "redirect-gateway def1 bypass-dhcp"
push "redirect-gateway local"
push "route XXX.XXX.XXX.XXX 255.255.255.255 net_gateway"
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"
client-to-client
;duplicate-cn
keepalive 10 120
tls-auth ta.key 0 # This file is secret
key-direction 0
;cipher BF-CBC        # Blowfish (default)
cipher AES-128-CBC   # AES
;cipher DES-EDE3-CBC  # Triple-DES
auth SHA256
comp-lzo
;max-clients 100
user nobody
group nogroup
persist-key
persist-tun
status openvpn-status.log
log openvpn.log
;log-append  openvpn.log
verb 3
;mute 20
 
Установка  stunnel4 на сервере:
Для проверки можно использовать:
How To Set Up an SSL Tunnel Using Stunnel on Ubuntu

$ sudo apt update
$ sudo apt upgrade
$ sudo apt install stunnel4 -y

$ sudo nano /etc/stunnel/stunnel.conf

; Указываем PID файл работающего сервиса.
pid = /var/run/stunnel.pid

; Отключим отладочные режимы - 0
debug = 7
output = /var/log/stunnel.log
cert = /etc/stunnel/stunnel.pem

; Полностью отключим уязвимые протоколы SSL версии 2 и 3.
options = NO_SSLv2
options = NO_SSLv3
options = NO_TLSv1
options = NO_TLSv1.1
ciphers = ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256

[ovpn]
accept = 53
connect = 127.0.0.1:1194



Сохранить.

$ sudo nano /etc/default/stunnel4

# Change to one to enable stunnel automatic startup
#ENABLED=0
ENABLED=1

Сохранить.

$ sudo openssl genrsa -out /etc/stunnel/key.pem 2048
$ sudo openssl req -new -x509 -key /etc/stunnel/key.pem -out /etc/stunnel/cert.pem -days 3650
$ sudo su -c "cat /etc/stunnel/key.pem /etc/stunnel/cert.pem >> /etc/stunnel/stunnel.pem"

sudo /etc/init.d/stunnel4 restart

Установка  stunnel4 на клиенте:

$ sudo apt update
$ sudo apt upgrade
$ sudo apt install stunnel4 -y

#<IP_server> = XXX.XXX.XXX.XXX

$ sudo nano /etc/stunnel/stunnel.conf
; Указываем PID файл работающего сервиса.
pid = /var/run/stunnel.pid

; Отключим отладочные режимы - 0
debug = 7
output = /var/log/stunnel.log
cert = /etc/stunnel/stunnel.pem

[ovpn]
client = yes
accept = 127.0.0.1:1194
connect = XXX.XXX.XXX.XXX:53


Сохранить.

Переносим с сервера файл с сертификатами в /etc/stunnel/stunnel.pem

$ sudo nano /etc/default/stunnel4

# Change to one to enable stunnel automatic startup
#ENABLED=0
ENABLED=1

Сохранить.
 
sudo /etc/init.d/stunnel4 restart

 -------------------------------------------------------------------------------------------------------------------------
Перед настройкой ufw, OpenVPN должен быть настроен и проверен!!!
Доступ к серверу по ssh будет только через OpenVPN через stunnel !!!
Можно будет зайти только через Access console панели управления!

$ sudo ufw  reset
---------------------------------------------------------------------------------------------------------------------------
Настройка ufw
$ sudo nano /etc/ufw/before.rules

 Добавляем после:
# ok icmp codes for INPUT
-A ufw-before-input -p icmp --icmp-type echo-request -j DROP

комментируем:
#-A ufw-before-input -p icmp --icmp-type echo-request -j ACCEPT

Сохранить.

#$ sudo ufw disable && sudo ufw enable
$ sudo ufw default deny incoming
$ sudo ufw default deny outgoing
$ sudo ufw default deny forward
$ sudo ufw allow out on tun0
$ sudo ufw allow in on tun0
$ sudo  ufw allow 53/tcp
#$ sudo  ufw allow 443/tcp
#$ sudo ufw allow from x.x.x.x proto tcp to any port 22
$ sudo ufw disable && sudo ufw enable
$ sudo ufw status verbose

$ sudo reboot

Если предполагается  одновременная работа с прокси:

$ sudo ufw  reset
$ sudo ufw default deny incoming
$ sudo ufw default allow outgoing
$ sudo ufw default allow forward
$ sudo ufw allow out on tun0
$ sudo ufw allow in on tun0
$ sudo  ufw allow 53/tcp
#$ sudo  ufw allow 443/tcp
$ sudo  ufw allow 35732/tcp
$ sudo ufw allow from x.x.x.x proto tcp to any port 22
$ sudo ufw disable && sudo ufw enable
$ sudo ufw status verbose
#$ sudo ufw status numbered
#$ sudo ufw delete 30


Можно подключать 1С-ки.

----------------------------------------------------------------------------------------------------
Под linux точно работает!
Под windows похоже нужно допиливать маршрутизацию!

$ apt list --all-versions openvpn
Listing... Done
openvpn/xenial-updates,xenial-security,now 2.3.10-1ubuntu2.1 amd64 [installed]
Для windows
Клиента качаем отсюда, версия 2.3.18
OpenVPN 2.3.18 (old stable)


Установка клиента OpenVPN ubuntu 16.04 desktop
Для контролируемого доступа службу не запускаем! 
Настройка на ручной запуск
$ sudo apt-get install openvpn -y
$ sudo reboot
$ sudo systemctl disable openvpn.service
$ sudo systemctl status openvpn.service
● openvpn.service - OpenVPN service
   Loaded: loaded (/lib/systemd/system/openvpn.service; enabled; vendor preset: enabled)
   Active: inactive (dead)

How can I run OpenVPN as root in the background, in a script?

Ручной запуск:
# Настройки не здесь /etc/openvpn/client.conf  тут будет автоматически запускаться!!!
Запустить до перезагрузки:
$ sudo openvpn --config /home/user/client.conf --daemon

Прервать соединение:
$ sudo killall openvpn

$ sudo systemctl status openvpn.service
[sudo] пароль для user:
● openvpn.service - OpenVPN service
   Loaded: loaded (/lib/systemd/system/openvpn.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
$ ping 10.8.55.1
PING 10.8.55.1 (10.8.55.1) 56(84) bytes of data.
--- 10.8.55.1 ping statistics ---
6 packets transmitted, 0 received, 100% packet loss, time 5101ms
$ sudo openvpn --config /home/user/client.conf --daemon
$ ping 10.8.55.1
PING 10.8.55.1 (10.8.55.1) 56(84) bytes of data.
64 bytes from 10.8.55.1: icmp_seq=1 ttl=64 time=53.8 ms
^C
$ sudo systemctl status openvpn.service
● openvpn.service - OpenVPN service
   Loaded: loaded (/lib/systemd/system/openvpn.service; disabled; vendor preset: enabled)
   Active: inactive (dead) 
----------------------------------------------------------------------------------------------------
Автозапуск:
Автоматический запуск:
Кладем /home/user/clien1.ovpn по csp
Переименуем:
$ sudo mv /home/user/client1.ovpn /etc/openvpn/client.conf
Запускаться будет в любом  случае после однократного запуска
без настройки /etc/default/openvpn
$ sudo nano /etc/default/openvpn
Раскоментировать:
# AUTOSTART="all"
AUTOSTART="all"
Сохранить.

$ sudo reboot

Проверяем:
$ sudo openvpn --config /etc/openvpn/client.conf

---------------------------------------------------------------------------------------------------- 
Делаем сервис для запуска:

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

[Unit]
Description=Daemon to start OpenVPN Client
Wants=network-online.target
After=network.target

[Service]
Type=simple
ExecStart=openvpn --config /etc/openvpn/client.conf

[Install]
WantedBy=multi-user.target

Сохранить.

$ sudo systemctl daemon-reload && sudo systemctl enable ovpn.service && sudo systemctl restart ovpn.service
$ sudo  systemctl status ovpn.service
$ sudo journalctl --unit=ovpn.service
---------------------------------------------------------------------------------------------------- 

Серврер будет по ssh 10.8.55.2

Узнать внешний ip (без настройки маршрутизации ip не изменяется!)
$ wget -O - -q icanhazip.com

---------------------------------------------------------------------------------------------------------------------------------------------
На плохих каналах нужно обеспечить перезапуск после падения канала:

$ ping -c 1 8.8.8.8 || sudo service openvpn stop && sudo service openvpn start
$ ping -c 1 10.8.55.1 || sudo service openvpn stop && sudo service openvpn start
 
$ sudo su - root
# mkdir /etc/scripts/
# nano /etc/scripts/openvpn.sh 
Вставитьв файл: 
#!/bin/bash
# Проверка OpenVPN соединения
ping -c 1 10.8.55.1 || service openvpn stop && service openvpn start
Сохранить:
# chmod +x /etc/scripts/openvpn.sh 
# nano /etc/crontab 
Добавить в конец
*/5 *  *  *  *   root    /etc/scripts/openvpn.sh
 
И теперь каждые 5 мин будет проверяться наличие канала, по пингу
и если пинга нет, то происходит попытка его поднятия.

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

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