Denna howto har författats av Anders/sm0vwm och Björn/sa0bxi. Anders har stått för val av hjälpmedel, skriptutveckling och implementering. Björn har stått för användarkrav, testning och återkoppling. Båda har samarbetat om att sätta upp VPN-servrarna vid SK0BU och SK0TM och därmed förenad trubbelskjutning. Servrarna sattes upp runt midsommar 2019 och har fungerat stabilt sedan dess.
A. Installation av OpenVPN-server
I texten nedan förutsätts konfiguration av en openvpn-server för nätet 44.140.x.y/t med matchande managementnät 10.x.y.0/24
A.1 Installera senaste openvpn-version
Förberedelser:
Installera nödvändig programvara:
sudo apt-get update
sudo apt-get install openssl libssl-dev liblzo2-dev
Skapa användare och grupp openvpn och verifiera att openvpn användaren finns och är medlem igruppen openvpn:
sudo useradd openvpn
id openvpn
Skapa lämplig katalog och ladda ner, packa upp och kompilera openvpn (i den konfiguration vi kommer att använda behövs inte pam modulen, så vi bygger openvpn utan den):
mkdir build
cd build
wget https://swupdate.openvpn.org/community/releases/openvpn-2.4.7.tar.gz
tar -zxvf openvpn-2.4.7.tar.gz
cd openvpn-2.4.7
./configure --disable-plugin-auth-pam
make
sudo make install
A.2 Installera PKI (publik nyckel - infrastruktur)
När openvpn är installerad är det dags att bygga en PKI. För detta används easyrsa. Lättast är att sätta upp hela PKI'n som din egen användare och därefter flytta den till rätt ställe.:
cd /home/
wget https://github.com/OpenVPN/easy-rsa/archive/master.zip
mkdir CERT
cd CERT
unzip -o ../master.zip easy-rsa-master/easyrsa3/*
mv easy-rsa-master/easyrsa3/* .
rm -r easy-rsa-master/
Om allt har gått bra skall du nu ha en katalogstruktur under CERT som ser ut som följer:
./easyrsa
./vars.example
./openssl-easyrsa.cnf
./x509-types
./x509-types/ca
./x509-types/email
./x509-types/code-signing
./x509-types/serverClient
./x509-types/server
./x509-types/COMMON
./x509-types/client
Första steget är att skapa en fil som innehåller lite parametrar för CA genereringen:
Skapa filen "vars" med följande information (anpassad till egen context):
if [ -z "$EASYRSA_CALLER" ]; then
echo "You appear to be sourcing an Easy-RSA 'vars' file." >&2
echo "This is no longer necessary and is disallowed. See the section called" >&2
echo "'How to use this file' near the top comments for more details." >&2
return 1
fi
set_var EASYRSA_REQ_COUNTRY "SE"
set_var EASYRSA_REQ_PROVINCE "Stockholm"
set_var EASYRSA_REQ_CITY "Stockholm"
set_var EASYRSA_REQ_ORG "Amprnet"
set_var EASYRSA_REQ_OU "sk0bu"
set_var EASYRSA_KEY_SIZE 2048
set_var EASYRSA_CRL_DAYS 730
Därefter är det dags för att generera nycklar, detta kommer att ta lång tid:
./easyrsa init-pki # Skapar upp pki katalogstrukturen
./easyrsa build-ca # Här ska en Passphrase sättas. Man kan även sätta ett x509 "Common Name", t.ex sk0bu
./easyrsa gen-dh # Tar beroende på CPU kraft lång, jättelång eller superlång tid.
./easyrsa build-server-full sk0bu nopass # Byt ut sk0bu mot eget x509 Common Name.
Den pass phrase som angetts ovan under CA-skapandet ska anges också i detta steg.
./easyrsa gen-crl # Skapar en "certificate revocation list" som skall användas för att kunna spärra "revoke" klienter.
Nu är själva PKI'n klar för användning. Kopiera hela CERT katalogen till rätt ställe:
sudo mkdir /etc/openvpn
sudo cp -r CERT /etc/openvpn
crl filen har fel rättigheter, den måste vara läsbar av gruppen openvpn:
sudo chgrp openvpn /etc/openvpn/CERT/pki
sudo chmod g+rx /etc/openvpn/CERT/pki
sudo chgrp openvpn /etc/openvpn/CERT/pki/crl.pem
sudo chmod g+r /etc/openvpn/CERT/pki/crl.pem
A.3 Konfigurera VPN-servern
Nu är det dags att konfigurera servern, skapa en serverkonfigurationsfil /etc/openvpn/server.conf med nedanstående innehåll (Om du i steget ./easyrsa build-server-full ovan inte angav sk0bu så ändra crt och key parametrarna nedan):
port 1194
proto udp
dev tun
ca /etc/openvpn/CERT/pki/ca.crt
cert /etc/openvpn/CERT/pki/issued/sk0bu.crt
key /etc/openvpn/CERT/pki/private/sk0bu.key # This file should be kept secret
dh /etc/openvpn/CERT/pki/dh.pem
crl-verify /etc/openvpn/CERT/pki/crl.pem
cipher AES-256-CBC
topology subnet
server 10.x.y.0 255.255.255.0
client-config-dir /etc/openvpn/ccd
mute-replay-warnings
keepalive 10 120
;comp-lzo
persist-key
persist-tun
verb 3
user openvpn
group openvpn
Skapa också katalogen /etc/openvpn/ccd för klient-specifik konfiguration:
sudo mkdir /etc/openvpn/ccd
A.4 Skapa Start/stop-skript
Nu återstår att skapa ett start/stop-skript och se till att servern startar vid boot:
Skapa filen /etc/init.d/openvpn
sudo touch /etc/init.d/openvpn
med nedanstående innehåll
#! /bin/sh
#
### BEGIN INIT INFO
# Provides: noip
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Simple script to start a program at boot
### END INIT INFO
case "$1" in
start)
/usr/local/sbin/openvpn --config /etc/openvpn/server.conf --daemon --user
openvpn --writepid /var/run/openvpn.pid --status /var/run/openvpn.status
;;
stop)
kill `cat /var/run/openvpn.pid`
;;
restart)
$0 stop
sleep 2
$0 start
;;
status)
ps -fp `cat /var/run/openvpn.pid` && exit 0 || exit $?
;;
*)
log_action_msg "Usage: /etc/init.d/cron {start|stop|status|restart|reload|forcereload}"
exit 2
;;
esac
exit 0
Se till att openvpn startar automatiskt:
sudo chmod +x /etc/init.d/openvpn
sudo update-rc.d openvpn defaults
Slå på IP_Forwarding
sudo su
echo 1 >/proc/sys/net/ipv4/ip_forward
exit
Säkerställ att IP_FORWARDING slås på vid boot genom att, som root, editera filen /etc/sysctl.conf:
ta bort "#" tecknet före raden:
#net.ipv4.ip_forward=1
så att det står:
net.ipv4.ip_forward=1
Starta openvpn servern:
sudo /etc/init.d/openvpn start
I detta läge är openvpn servern startad.
A.5 Förnyelse av servercertifikat
För att kontrollera när ett certifikat går ut:
openssl x509 -noout -text -in /etc/openvpn/CERT/pki/issued/sk0bu.crt
Certifikat kan förnyas när det är <30 dagar till expiration.
Gör backup av nuvarande certifikat:
cp -p /etc/openvpn/CERT/pki/private/sk0bu.key /etc/openvpn/CERT/pki/private/sk0bu.key.backup
cp -p /etc/openvpn/CERT/pki/reqs/sk0bu.req /etc/openvpn/CERT/pki/reqs/sk0bu.reqs.backup
cp -p /etc/openvpn/CERT/pki/issued/sk0bu.crt /etc/openvpn/CERT/pki/issued/sk0bu.crt.back
cd /home/pi
tar cvfz CERT-backup-202ÅMMDD.tgz CERT
Förnya certifikat:
cd /home/pi/CERT
./easyrsa renew sk0bu nopass
I detta steg kommer man behöva ange lösenordet till CA-certifikatet.
OBS! Om man slår fel lösenord till CA-certifikatet eller på annat sätt avbryter easyrsa så behöver man kopiera tillbaka crt, key och req-filerna från backup innan man kan göra nytt försök med easyrsa.
Kopiera de nya certifikaten till openvpn:
cp -p pki/issued/sk0bu.crt /etc/openvpn/CERT/pki/issued
cp -p pki/private/sk0bu.key /etc/openvpn/CERT/pki/private
cp -p pki/reqs/sk0bu.req /etc/openvpn/CERT/pki/reqs
Starta om openvpn:
systemctl restart openvpn
Kontrollera att tunnlarna går upp (statusfilen uppdateras en gång i minuten och det kan ta några minuter innan de går upp):
cat /var/run/openvpn.status
B. Generering av programvara för Klienter
B1. Skript för generering av klienter
Ett skript som underlättar skapandet av klienter finns i clients.tgz
Kopiera clients.tgz till katalogen /etc/openvpn:
cd /etc/openvpn
tar -zxvf clients.tgz
Detta skall skapa en clients katalog med följande innehåll:
clients/
clients/new-client.sh
clients/base.conf
clients/generate-client-full.sh
clients/templates/
clients/templates/openvpn-klient.sh
clients/templates/openvpn-down.sh
clients/templates/openvpn-up.sh
clients/revoke-client.sh
clients/renew-client.sh
För att dessa skript skall fungera korrekt behövs en base.conf fil i samma katalog (/etc/openvpn/clients)), denna innehåller bland annat IP-adressen till servern som måste editeras ienlighet med uppsättningen:
### base.conf ###
client
dev tun
proto udp
remote 44.140.7.2 1194 #<---- Denna rad ska peka på aktuell server
resolv-retry infinite
nobind
persist-key
persist-tun
;comp-lzo
verb 3
cipher AES-256-CBC
remote-cert-tls server
verify-x509-name sk0bu name #<--- Denna rad ska visa x509-namnet på servern som angavs i punkt A.2
B.2. Generering av klientkonfigurationsfil
Förberedelser:
Eftersom denna installation är byggd för att tunnla trafik från servern till klienten krävs följande ändringar.
Nätet som skall delegeras måste läggas in så att routingen fungerar från servern till klienten. Detta görs på två ställen:
- I katalogen /etc/openvpn/ccd/ skapas en fil med namnet klientnamn (t.ex signal på klubb eller person som ansvarar för klienten och det delegerade subnätet). I denna fil läggs en klientspecifik konfiguration i form av två rader:
ifconfig-push 10.x.y.2 255.255.255.0 # Sätter IP adressen på klienten hårt till 10.x.y.2 (detta används för routing nedan)
iroute 44.140.x.0 255.255.255.248 # Nätet som skall routas från servern till klienten
- I filen /etc/openvpn/server.conf adderas två rader: (subnätet och IP adressen är taget från exemplet ovan):
; klientnamn
route 44.140.x.0 255.255.255.248 10.x.1.2
För mer information kring varför man måste lägga in både en route och en iroute se: https://backreference.org/2009/11/15/openvpn-and-iroute/
För att generera en klientkonfiguration kan man nu som root köra (med IP adresser tagna från exemplet ovan):
cd /etc/openvpn/clients
sudo ./generate-client-full.sh 10.x.1.y 44.140.x.0/29 klientnamn
När skriptet körs ska man ange serverns pass phrase som sattes vid PKI-installationen i steg A.2 ovan.
Detta skript genererar dels ett klientpaket med namnet klientnamn.tgz som skickas till berörd klientägare, dels klient-specfik information som installeras på servern.
Starta om openvpn servern med: sudo /etc/init.d/openvpn restart
Verifiera att det subnät som ska routas genom vpn-tunneln läggs till i operativsystemets routingtabell:
ip route # skall visa:
44.140.x.0/29 via 10.x.1.2 dev tun0
När klienten ansluter, kommer den i detta exempel att få 10.x.1.2 som adress på tunnel-interfacet.
B.3 Förnyelse av klientcertifikat
För att kontrollera när ett certifikat går ut:
openssl x509 -noout -text -in /etc/openvpn/CERT/pki/issued/klient.crt
Certifikat kan förnyas när det är <30 dagar till expiration.
Gör backup av nuvarande certifikat:
cp -p /etc/openvpn/CERT/pki/private/klient.key /etc/openvpn/CERT/pki/private/klient.key.backup
cp -p /etc/openvpn/CERT/pki/reqs/klient.req /etc/openvpn/CERT/pki/reqs/klient.reqs.backup
cp -p /etc/openvpn/CERT/pki/issued/klient.crt /etc/openvpn/CERT/pki/issued/klient.crt.back
cp -p /etc/openvpn/clients/klient.conf /etc/openvpn/clients/klient.conf.backup
cp -p /etc/openvpn/clients/klient.tgz /etc/openvpn/clients/klient.tgz.backup
cd /etc
tar cvfz /home/pi/etc-openvpn-backup-202ÅMMDD.tgz openvpn
OBS OBS OBS! Om klienten enbart kan nås via VPN-tunneln måste man ta stegen i viss ordning eftersom man annars tappar kontakten med klienten innan man hunnit göra nödvändiga ändringar. Följ denna ordning:
- Skapa backup av certfikat och konfigurationsfiler enligt instruktion ovan.
- Förnya certifikatet med kommandot nedan men starta INTE om openvpn på servern ännu
- Distribuera uppdaterad conf-fil till klienten och starta om klientens openvpn (se kommando nedan). OBS! I detta steg tappar man kontakten med klienten!
- Starta om openvpn-klienten på servern (se kommandon nedan)
Om man råkat starta om serverns openvpn innan man hann distribuera conf-filen och starta om klienten kan man komma runt detta genom att kopiera undan de nya certifkaten till t ex /tmp och sedan tillfälligt kopiera tillbaka crt, key och req från backup och starta om openvpn så bör tunneln gå upp efter ett par minuter. När klienten är uppdaterad, kopiera sedan tillbaka de nya certifikatfilerna och starta om openvpn på nytt.
Förnya certifikatet:
cd /etc/openvpn/clients
./renew-client.sh klient
Den resulterande /etc/openvpn/clients/klient.conf kopieras till klientens /etc/openvpn/klient.conf och openvpn på klienten startas om. OBS! Om man ansluter till klienten via tunneln tappar man i detta läge kontakten med klienten. OBS nr 2: Endast conf-filen uppdateras vid renew, d v s distribuera inte .tgz-filen till klienten eftersom den innehåller det ursprungliga certifikatet.
Starta om openvpn i klient respektive server:
systemctl restart openvpn
Kontrollera att tunnlarna går upp (statusfilen uppdateras en gång i minuten och det kan ta några minuter innan de går upp):
cat /var/run/openvpn.status
C. Installation av OpenVPN-klient
C.1 Installation av klienten hos klientägaren
Klient-installation utförs med följande steg
1. Packa upp .tgz
tar zxvf .tgz
2. Gå in i katalogen och kör skriptet openvpn-klient.sh som root
cd
sudo ./openvpn-klient.sh
3. Säkerställ att klienten har IP_FORWARDING påslaget genom att köra följande som root :
sudo su
echo 1 >/proc/sys/net/ipv4/ip_forward
exit
4. Ändra så att IP_FORWARDING även slås på vid uppstart, som root editera /etc/sysctl.conf och ta bort "#" tecknet före raden:
#net.ipv4.ip_forward=1
så att det står:
net.ipv4.ip_forward=1
C.2 Kontrollera routing
Se till att klienten har ett interface med ip-adressen inom det delegerade subnätet, tex 44.140.x.y
ip addr
Testa att adressen kan nås från Internet och att Internet kan nås från klienten.
ping ping.sunet.se # från klienten
ssh
C.3 Förnyelse av klientcertifikat
Detta initieras på servern, se punkt B.3. Den resulterande nya config-filen kopieras till klientens /etc/openvpn och openvpn startas om (OBS! Om klienten konfigureras via tunneln så tappar man i detta läge kontakt med klienten, se B.3 ovan för mer info):
Skapa en backup av den nuvarande conf-filen (klient.conf ersätts med namnet på just din conf-fil):
sudo cp -p /etc/openvpn/klient.conf /etc/openvpn/klient.conf.old
I vissa installationer har config-filen på klientsidan modifierats lokalt. Kontrollera om den gamla configfilen innehåller dessa rader och om så är fallet, kopiera in dem sist i den nya conf-filen:
Kopiera in den nya conf-filen till /etc/openvpn.
Starta om openvpn (OBS! Om du är ansluten via tunneln så tappar du nu kontakten.)
sudo systemctl restart openvpn
Meddela nu administratören av serversidan (som du fick conf-filen av) att du har startat om så att denne kan starta om serversidans openvpn.