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
Kommentare