Anleitung - IKEv2 mit Let's Encrypt auf OpenWRT

Dieser Artikel beschreibt die Installation und Konfiguration von IKEv2 mit Hilfe von Let's Encrypt auf OpenWRT.

Firewall konfigurieren

Im ersten Schritt müssen wir unsere Firewall konfigurieren. Wenn unserer Gerät als Router fungiert und über den WAN-Port direkt im Internet hängt, können wir nachstehendes Script verwenden. Ist unser OpenWRT-Gerät eine zusätzliche Einheit im LAN wie z.B. ein Access Point oder einfach nur ein kleiner VPN-Server, dann müssen wir den Port 80/TCP für Let's Encrypt auf die IP des Gerätes weiterleiten. IKEv2 benötigt die Ports 500/UDP und 4500/UDP.

#!/bin/sh

uci set firewall.http=rule
uci set firewall.http.target=ACCEPT
uci set firewall.http.src=wan
uci set firewall.http.proto=tcp
uci set firewall.http.dest_port=80
uci set firewall.http.name='https web configuration'

uci set firewall.https=rule
uci set firewall.https.target=ACCEPT
uci set firewall.https.src=wan
uci set firewall.https.proto=tcp
uci set firewall.https.dest_port=443
uci set firewall.https.name='https for 10.1.1.0/24'


uci set firewall.ike=rule
uci set firewall.ike.target=ACCEPT
uci set firewall.ike.src=wan
uci set firewall.ike.proto=udp
uci set firewall.ike.dest_port=500
uci set firewall.ike.name='IPSec ESP IKE'

uci set firewall.nat_t=rule
uci set firewall.nat_t.target=ACCEPT
uci set firewall.nat_t.src=wan
uci set firewall.nat_t.proto=udp
uci set firewall.nat_t.dest_port=4500
uci set firewall.nat_t.name='IPSec NAT-T'

uci commit
/etc/init.d/firewall restart

exit

# Script-Start

#!/bin/sh

# Domain, ersten Username & Passwort konfigurieren

DOMAIN=vpn.example.com ## this domain must actually point to your router
MAIL=my@example.com ## mail for let's encrypt domain registration
VPN_USERNAME=erster-user
VPN_PASSWORD=deinpasswort

# Pakete installieren

opkg update
opkg install curl ca-certificates ca-bundle openssl-util socat
opkg install strongswan-full

# uhttpd stoppen

/etc/init.d/uhttpd stop

# Let's Encrypt installieren

curl https://raw.githubusercontent.com/Neilpang/acme.sh/master/acme.sh > acme.sh
chmod a+x "acme.sh"
./acme.sh --install
./acme.sh --register-account -m $MAIL
./acme.sh --issue --standalone -d $DOMAIN

printf '\n\n Letsencrypt installed \n\n'

# Alte Zertifikate löschen und neu verlinken

rm /etc/ipsec.d/certs/fullchain.pem
rm /etc/ipsec.d/private/privkey.pem
rm /etc/ipsec.d/cacerts/chain.pem

ln -s /root/.acme.sh/$DOMAIN/fullchain.cer /etc/ipsec.d/certs/fullchain.pem
ln -s /root/.acme.sh/$DOMAIN/$DOMAIN.key /etc/ipsec.d/private/privkey.pem
ln -s /root/.acme.sh/$DOMAIN/ca.cer /etc/ipsec.d/cacerts/chain.pem

# ipsec.conf erstellen

echo "config setup
uniqueids=no
# charondebug = ike 3, cfg 3

conn %default
dpdaction=clear
dpddelay=35s
dpdtimeout=2000s

keyexchange=ikev2
ike=aes256-sha1-modp1024,aes256-sha256-modp2048! # For Windows7/10: aes256-sha1-modp1024, For Apple Mac & iOS: aes256-sha256-modp2048
auto=add
rekey=no
reauth=no
fragmentation=yes
compress=yes

### left - local (server) side
# filename of certificate chain located in /etc/strongswan/ipsec.d/certs/
leftcert=fullchain.pem
leftsendcert=always
leftsubnet=0.0.0.0/0,::/0
leftfirewall=yes

### right - remote (client) side
eap_identity=%identity
rightsourceip=10.1.1.0/24,2a00:1450:400c:c05::/112
rightdns=8.8.8.8,2001:4860:4860::8888

conn ikev2-mschapv2
rightauth=eap-mschapv2

conn ikev2-mschapv2-apple
rightauth=eap-mschapv2
leftid=$DOMAIN
" > /etc/ipsec.conf

# ipsec.secrets erstellen

echo "# filename of private key located in /etc/strongswan/ipsec.d/private/
: RSA privkey.pem

# syntax is \`username : EAP \"plaintextpassword\"\`
$VPN_USERNAME : EAP \"$VPN_PASSWORD\"
" > /etc/ipsec.secrets

# uhttpd wieder starten

/etc/init.d/uhttpd start

# Port 80 auf der WAN-Seite schließen

uci set firewall.http.enabled=0
uci commit firewall
/etc/init.d/firewall reload

# Einstellungen übernehmen

ipsec restart
exit

Client konfiguration

Unter /etc/ipsec.secrets können weitere Clients hinzugefügt werden. Danach müssen wir IPsec neu starten um die Änderungen zu übernehmen.

ipsec restart

Auf Apple-Geräte werden wir zusätzlich nach der Entfernen-ID gefragt. Dort geben wir nochmals die Domain ein, welch wir zu beginn des Scripts konfiguriert haben.

Let's Encrypt Zertifikate aktualisieren

Die Zertifikate von Let's Encrypt sind nur für 3 Monate gültig. Aus diesem Grund müssen sie regelmäßig aktualisiert, und das IPsec-Service neu gestartet werden. Wir kopieren nachstehend Code in eine ausführbare Datei und aktualisieren wieder unsere Domain.

#!/bin/sh

mkdir -p /usr/local/sbin

echo "#!/bin/sh
DOMAIN=vpn.example.com ## this domain must actually point to your router

## Die Firewall-Regeln müssen auskommentiert werden, wenn OpenWRT als Router direkt am Internet angeschlossen ist.

uci set firewall.http.enabled=1
uci commit firewall
/etc/init.d/firewall reload
/etc/init.d/uhttpd stop
/root/.acme.sh/acme.sh --renew -d $DOMAIN
uci set firewall.http.enabled=0
uci commit firewall
/etc/init.d/firewall reload
/etc/init.d/uhttpd start


ipsec reload
" > /usr/local/sbin/cert-update-script.sh

chmod a+x /usr/local/sbin/cert-update-script.sh


printf '\n\n cert-update-script.sh installed in /usr/local/sbin/ \n\n'

exit

Crontab erstellen

Wir starten:

crontab -e

und löschen die Zeile

25 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null

und fügen folgende Zeilen ein:

###################################################################
#minute (0-59), #
#| hour (0-23), #
#| | day of the month (1-31), #
#| | | month of the year (1-12), #
#| | | | day of the week (0-6 with 0=Sunday)#
#| | | | | commands #
###################################################################

0 2 * * 1 sh /usr/local/sbin/cert-update-script.sh >> /var/log/cert-update-script.log

Quellen

How to run on OpenWRT

https://github.com/Neilpang/acme.sh/wiki/How-to-run-on-OpenWRT

Firewalling IPSEC Traffic

https://forum.archive.openwrt.org/viewtopic.php?id=52661

Strongswan with Let’s Encrypt on CentOS and RHEL

https://adamroe.me/blog/strongswan-letsencrypt-rhel-centos

Firewall configuration

https://oldwiki.archive.openwrt.org/doc/uci/firewall

Kommentare

Bitte addieren Sie 5 und 6.