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:
- 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ě
- Lokální síť s DHCP serverem.
- 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í: