OpenVPN - Nastavení OpenVPN serveru a klienta


OpenVPN nastavení na 2N Interkomech 


Toto FAQ popisuje připojení IP interkomu připojeného do internetu do vnitřní sítě uživatele. Toto připojení vytváří síťový most a umožňuje tak připojení k IP interkomu nebo LTE interkomu jako by byl fyzicky připojen ve vnitřní síti (interkom získá IP adresu z lokální sítě, používá síťové protokoly jako například ARP, funguje broadcast (lokální) sítě a podobně). Nastavení umožňuje také přesměrovat veškerý přenos, který nepatří do lokální sítě interkomu, tímto spojením.


Prerekvizity:

  1. Veřejná IP adresa na straně uživatele dostupná v internetu s možností přesměrování TCP portu do vnitřní sítě
  2. Lokální síť s DHCP serverem.
  3. Zařízení s operačním systémem Linux.

Nastavení sítě:

Na routeru uživatelské sítě upravíme nastavení – nastavíme statickou IP adresu ve vnitřní síti (pro specifickou MAC adresu) síťového interface Linuxového zařízení, které vytváří most a následně na tuto adresu povolíme přesměrování TCP portu 443. MAC adresa, která tvoří síťový most je defaultně nastavena na hodnotu 7c:1e:b3:ff:ff:ff.


Příprava Linuxového systému:

Pro instalaci systému je doporučená Linuxová distribuce Linux Ubuntu 18.04 LTS nebo novější. Nutné je mít správně nastaven systémový čas a hardwarový čas + synchronizaci času. Ten je možný synchronizovat ručně:

      # sudo ntpdate ntp.nic.cz 

   Nicméně je jistota synchronizovat čas automaticky pomocí instalace balíčku ntp:

      # sudo apt-get ntp install

   Kontrolou souboru ntp.conf je možné zjistit, které NTP servery jsou využívány pro kontrolu času:

      # cat /etc/ntp.conf | grep server – vypíše servery, které jsou k dispozici

      # ntpq -q – zobrazí dostupnost, odezvy 

   Důležité je také mít nastavenou správně časovou zónu:

      # timedatectl list-timezones

      # timedatectl set-timezone Europe/Prague

   Kontrola:

      # date

Instalace služeb:

V operačním systému je potřeba nainstalovat balíčky, stunnel4 (verze 5.39 a vyšší), openvpn (verze 2.4 a vyšší) a bridge-utils (verze 1.5 a vyšší). Poté je potřeba připravit certifikační autoritu, sadu certifikátů a privátních klíčů pro obě strany (server a klienti). Můžou být použity RSA i ECC certifikáty (doporučeny jsou ECC, např.: prime256v1).

 

OpenSSL:

Slouží pro generování certifikátů a klíčů se kterými následně pracujeme při konfiguraci OPENVPN SERVERU a VPN klienta. Jako první musí být vytvořena Certifikační autorita, kterou budeme využívat pro podepisování vlastního certifikátu serveru a klienta.


Je potřeba vytvořit certifikační autoritu: 


sudo openssl genrsa -out /etc/ssl/private/rootCA-Support.key 2048


sudo chmod 600 /etc/ssl/private/rootCA-Support.key 2048
 
sudo openssl req -x509 -new -nodes -key /etc/ssl/private/rootCA-Support.key -sha256 -days 3650 -subj "/C=CZ/ST=Prague/L=Prague/O=Support" -out /etc/ssl/certs/rootCA-Support.pem


Vytvoříme skript pro generovaní certifikátů:

 sudo nano /usr/local/bin/generate-certificate

#!/bin/bash

###
# How to generate certificate authority:
#  -> without password:
#    sudo openssl genrsa -out /etc/ssl/private/rootCA-Support.key 2048
#  -> with password:
#    sudo openssl genrsa -des3 -out /etc/ssl/private/rootCA-Support.key 2048
#
#    sudo chmod 600 /etc/ssl/private/rootCA-Support.key 2048
#    sudo openssl req -x509 -new -nodes -key /etc/ssl/private/rootCA-Support.key -sha256 -days 3650 -subj "/C=CZ/ST=Prague/L=Prague/O=Support" -out /etc/ssl/certs/rootCA-Support.pem
###


if [ "$EUID" -ne 0 ]; then
  echo "Please run as root"
  exit 1
fi
 
if [ $# -eq 0 ]; then
  echo "Please specify domain(s)."
  echo "Usage: $0 <main domain> [another domain] [another domain] ..."
  exit 2
fi
 
ROOTCA="Support"
 
# -> for certificate authority with password uncomment the line below:
#read -p "Enter rootCA-${ROOTCA}.key password: " PASSWORD
 
DOMAIN=$1
CONF="/tmp/$DOMAIN.openssl.cnf"
PRIVATE_KEY="/etc/ssl/private/$DOMAIN.key"
CERTIFICATE_REQUEST="/etc/ssl/certs/$DOMAIN.crt.req"
CERTIFICATE="/etc/ssl/certs/$DOMAIN.crt"
ANOTHER_DOMAINS=""
ANOTHER_DOMAINS_INFO=""
 
ANOTHER_DOMAIN_INDEX=3
for ANOTHER_DOMAIN in ${@:2}
do
  ANOTHER_DOMAINS="${ANOTHER_DOMAINS}DNS.${ANOTHER_DOMAIN_INDEX} = ${ANOTHER_DOMAIN}"$'\n'
  ANOTHER_DOMAIN_INDEX=$((ANOTHER_DOMAIN_INDEX + 1))
  ANOTHER_DOMAINS="${ANOTHER_DOMAINS}DNS.${ANOTHER_DOMAIN_INDEX} = *.${ANOTHER_DOMAIN}"$'\n'
  ANOTHER_DOMAIN_INDEX=$((ANOTHER_DOMAIN_INDEX + 1))
 
  ANOTHER_DOMAINS_INFO="-> ${ANOTHER_DOMAIN}"$'\n'
done
 
cat > $CONF <<-EOF
[req]
default_bits = 2048
prompt = no
x509_extensions = v3_req
distinguished_name = dn
 
[dn]
C = CZ
ST = Prague
L = Prague
O = $ROOTCA
CN = *.$DOMAIN
 
[v3_req]
subjectAltName = @alt_names
 
[alt_names]
DNS.1 = $DOMAIN
DNS.2 = *.$DOMAIN
$ANOTHER_DOMAINS
EOF
 
openssl genrsa -out $PRIVATE_KEY 2048
chmod 600 $PRIVATE_KEY
openssl req -new -config $CONF -key $PRIVATE_KEY -out $CERTIFICATE_REQUEST
 
openssl x509 -req -in $CERTIFICATE_REQUEST -CA /etc/ssl/certs/rootCA-${ROOTCA}.pem -CAkey /etc/ssl/private/rootCA-${ROOTCA}.key \
  -CAcreateserial -out $CERTIFICATE -days 3650 -sha256 -extfile $CONF -extensions 'v3_req'
# -> for certificate authority with password uncomment the line below and remove this line and the one up
#  -CAcreateserial -out $CERTIFICATE -days 3650 -sha256 -extfile $CONF -extensions 'v3_req' -passin pass:$PASSWORD
 
rm $CERTIFICATE_REQUEST
rm $CONF
 
chmod 600 $PRIVATE_KEY
 
echo "Self signed certificate ${CERTIFICATE} and private key ${PRIVATE_KEY} for main domain ${DOMAIN} were generated with 10 years expiration time"
 
if [ -z "$ANOTHER_DOMAINS_INFO" ]; then
  echo "Another domains:"
  echo ${ANOTHER_DOMAINS_INFO}
fi


Nastavíme skript jako spustitelný: 

sudo chmod a+x /usr/local/bin/generate-certificate


 

Nastavení stunnelu:

Konfigurace služby stunnel provedeme vytvořením nebo úpravou souboru stunnel.conf v adresáři /etc/stunnel. Do tohoto adresáře zkopírujeme certifikát certifikační autority ca.crt a certifikát server.pem obsahující také privátní klíč a přejmenujeme v závislosti na skriptu.

/etc/stunnel/stunnel.conf:



[openvpn]

accept = 443

connect = 1194

CAfile = ca.crt

cert = server.pem

verify = 2


Nastavení OpenVPN klienta:

Konfigurace služby OpenVPN provedeme vytvořením nebo úpravou souborů server.conf, up.sh, down.sh a settings.sh v adresáři /etc/openvpn. Skriptům up.sh a down.sh nastavíme práva pro spuštění. Do tohoto adresáře zkopírujeme certifikát certifikační autority ca.crt, certifikát server.crt a privátní klíč server.key. Následně nastavíme hodnoty proměnných v settings.sh, MAC adresa je volitelná a není nutné ji vyplňovat (pak bude nastavena na hodnotu 7c:1e:b3:ff:ff:ff).


   /etc/openvpn/server.conf:


local 127.0.0.1
server-bridge

dev tap
proto tcp-server
port 1194

ca ca.crt
cert server.crt
key server.key
dh none

tun-mtu 1500

script-security 2
auth-user-pass-verify /bin/true via-file
client-to-client

auth none
cipher none

up "up.sh"
down "down.sh"

verb 0

 


/etc/openvpn/up.sh:


#!/bin/bash


TAP="${1}"

MTU="${2}"


if [ -e ./settings.sh ]; then

    . ./settings.sh

fi


if [[ X"${ETH}" == X ]]; then

    ETH=$(route | awk '/default/{print $NF}')

fi


if [[ X"${BR}" == X ]]; then

    BR='br0'

fi


if [[ X"${BR_MAC}" == X ]]; then

    BR_MAC='7c:1e:b3:ff:ff:ff'

fi


brctl addbr ${BR}

ifconfig ${BR} hw ether ${BR_MAC}


brctl addif ${BR} ${ETH}

brctl addif ${BR} ${TAP}


ifconfig ${TAP} 0.0.0.0 promisc up mtu ${MTU}

ifconfig ${ETH} 0.0.0.0 promisc up mtu ${MTU}


 

/etc/openvpn/down.sh:


#!/usr/bin/env bash


MTU="${2}"


if [ -e ./settings.sh ]; then

    . ./settings.sh

fi


if [[ X"${ETH}" == X ]]; then

    ETH=$(route | awk '/default/{print $NF}')

fi


if [[ X"${BR}" == X ]]; then

    BR='br0'

fi


ifconfig ${BR} down


brctl delbr ${BR}


ifconfig ${ETH} -promisc up


/etc/openvpn/settings.sh:


!#/bin/bash


ETH='eth0'

BR='br0'

#BR_MAC='<mac-address>'


Automatická konfigurace služby při startu systému

Pokud se od tohoto řešení očekává persistentní připojení interkomu do vlastní sítě, je potřeba zajistit, aby se služby OpenVPN a stunnel a spouštěly v průběhu startu systému. Služba OpenVPN musí být spuštěna až v době, kdy má síťový interface přidělenou IP adresu, poté by měla být spuštěná služba stunnel.

Ruční spuštění:

  /etc/init.d/

 ./openvpn start

 ./stunnel4 start


2N® IP Interkomy, 2N® LTE Interkomy

  • IMPORT klientskeho certifikátu a klíče

    Certifikát a klíč přeneseme bezpečnou cestou do zařízení. Interkom musí mít správně konfigurováno síťové rozhraní včetně výchozí brány.




  • Vlastní import klientského certifikátu a klíče. Klíč, pokud nebyl zaheslován při generování, zadáváme bez hesla

  • Vlastní připojení OpenVPN klienta. Po připojení je veškerý síťový provoz směřován do tohoto spojení: