Anleitung
Ich habe mal eine kleine Anleitung erstellt, wie Ihr einen völlig automatisierten Prozess zur Let's Encrypt Erneuerung einstellen könnt, ohne dauerhaft Port 80 freigegeben zu lassen, oder diesen immer manuell zu öffnen.
Ich habe das Python Skript nochmal auf Bash umgeschrieben, dann spart man sich die Installation der Python Module über das Paketzentrum.
Folgendes funktioniert fortan automatisch:
- Aktivierung Portfreigabe von Port 80 auf der Fritz!Box per Bash-Skript (über TR-064 Schnittstelle)
- Deaktivierung Syno Firewall
- Erneuerung Zertifikat
- Aktivierung Syno Firewall
- Deaktivierung Portfreigabe von Port 80 auf der Fritz!Box per Bash-Skript (über TR-064 Schnittstelle)
- Einspielung des Zertifikats in die Fritz!Box per Bash-Skript
Vorab prüft ihr mal, ob die Fritz!Box die TR-064 Schnittstelle offen hat:
Bitte in der Fritz!Box (Ansicht: Erweitert) unter "Heimnetz > Netzwerk > Netzwerkeinstellungen" im Bereich "Heimnetzfreigaben" die Option "Zugriff für Anwendungen zulassen" aktivieren (standardmäßig aktiviert)!
Danach sucht Ihr Euch einen Pfad auf der DiskStation aus, wo die Skripte abgelegt werden.
Beispiel:
/volume1/data/scripts/
Dort erstellt ihr mit dem Text-Editor der DiskStation zwei Dateien:
> fb_port.sh
Rich (BBCode):
#!/bin/bash
################################################################################
# Bitte in der Fritz!Box (Ansicht: Erweitert) unter "Heimnetz > Netzwerk > Netzwerkeinstellungen"
# im Bereich "Heimnetzfreigaben" die Option "Zugriff für Anwendungen zulassen" aktivieren (standardmäßig aktiviert)!
# Seit dem neuesten Fritz!OS ist es nur noch möglich, dass lokale Netzwerkgeräte sich selber eine
# Portfreigabe erstellen. Da die DiskStation dies für sich selber tut ist das also kein Problem!
# Getestet mit Fritz!OS 07.12
################################################################################
# Please configure your Fritz!Box (View: Advanced) > Home Network > Home Network Overview"
# in "Network Settings" and activate the option "Allow access for applications" (activated by default)!
# Port mapping entries are only allowed for hosts inside of LAN.
# Furthermore hosts can only add port mapping entries for themselves and not for other hosts in the LAN.
# It is not intended to allow port mapping entries for the guest network or hosts with IP addresses routed into WAN.
# Tested with Fritz!OS 07.12
################################################################################
# http://fritz.box:49000/tr64desc.xml
# https://avm.de/service/schnittstellen/
################################################################################
# variables
# please configure your Fritz!Box IP and login
FBIP="fritz.box"
FBUSER="user"
FBPASS="password"
# please configure your Synology DiskStation IP
SYNOIP="192.168.178.100"
################################################################################
# script, don't change anything here
if [ "$1" == "0" ]
then
STATUS="DEACTIVATED!"
elif [ "$1" == "1" ]
then
STATUS="ACTIVATED!"
fi
location="/upnp/control/wanpppconn1"
uri="urn:dslforum-org:service:WANPPPConnection:1"
action='AddPortMapping'
SoapParamString="<NewRemoteHost>0.0.0.0</NewRemoteHost>
<NewExternalPort>80</NewExternalPort>
<NewProtocol>TCP</NewProtocol>
<NewInternalPort>80</NewInternalPort>
<NewInternalClient>$SYNOIP</NewInternalClient>
<NewEnabled>$1</NewEnabled>
<NewPortMappingDescription>Lets Encrypt</NewPortMappingDescription>
<NewLeaseDuration>0</NewLeaseDuration>"
if [ "$1" == "0" ] || [ "$1" == "1" ]
then
curl -k -m 5 --anyauth -u "$FBUSER:$FBPASS" https://$FBIP:49443$location -H 'Content-Type: text/xml; charset="utf-8"' -H "SoapAction:$uri#$action" -d "<?xml version='1.0' encoding='utf-8'?><s:Envelope s:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/' xmlns:s='http://schemas.xmlsoap.org/soap/envelope/'><s:Body><u:$action xmlns:u='$uri'>$SoapParamString</u:$action></s:Body></s:Envelope>" -s
printf "Port sharing: $STATUS"
else
printf "No expected parameter (0|1) given. Port sharing not activated."
fi
> fb_update_cert.sh
Rich (BBCode):
#!/bin/bash
set -euo pipefail
IFS=$'\n\t'
################################################################################
# parameters
USERNAME="user"
PASSWORD="password"
################################################################################
CERTPATH="/usr/syno/etc/certificate/_archive/$(cat /usr/syno/etc/certificate/_archive/DEFAULT)"
CERTPASSWORD=""
HOST="http://fritz.box"
unset RESPONSE
# make and secure a temporary file. Arrange for automatic cleanup
TMP=""
trap 'rm -f "$TMP"' exit
TMP="$(mktemp -t XXXXXX)"
chmod 600 "$TMP"
# login to the box and get a valid SID
CHALLENGE=$(wget -q -O - "$HOST/login_sid.lua" | sed -e 's/^.*<Challenge>//' -e 's/<\/Challenge>.*$//')
if [ -z "$CHALLENGE" ]
then
RESPONSE="Is HOST-name pointing to a Fritz!BOX?"
else
# continue with the script on success
HASH="$(echo -n "$CHALLENGE-$PASSWORD" | uconv -f ASCII -t UTF16LE |md5sum|awk '{print $1}')"
SID=$(wget -q -O - "$HOST/login_sid.lua?sid=0000000000000000&username=$USERNAME&response=$CHALLENGE-$HASH"| sed -e 's/^.*<SID>//' -e 's/<\/SID>.*$//')
if [[ $SID == "0000000000000000" ]]
then
RESPONSE="Failed to authenticate."
else
# generate our upload request
BOUNDARY="---------------------------"$(date +%Y%m%d%H%M%S)
(
printf -- "--%s\r\n" "$BOUNDARY"
printf "Content-Disposition: form-data; name=\"sid\"\r\n\r\n%s\r\n" "$SID"
printf -- "--%s\r\n" "$BOUNDARY"
printf "Content-Disposition: form-data; name=\"BoxCertPassword\"\r\n\r\n%s\r\n" "$CERTPASSWORD"
printf -- "--%s\r\n" "$BOUNDARY"
printf "Content-Disposition: form-data; name=\"BoxCertImportFile\"; filename=\"BoxCert.pem\"\r\n"
printf "Content-Type: application/octet-stream\r\n\r\n"
cat "$CERTPATH"/privkey.pem
cat "$CERTPATH"/fullchain.pem
printf "\r\n"
printf -- "--%s--" "$BOUNDARY"
) >> "$TMP"
# upload the certificate to the box
RESPONSE=$(wget -q -O - "$HOST/cgi-bin/firmwarecfg" --header="Content-type: multipart/form-data boundary=$BOUNDARY" --post-file "$TMP" | grep SSL)
fi
fi
if [ -z "$RESPONSE" ]
then
echo $HOST ": Certificate import failed."
else
echo $HOST ": " "$RESPONSE"
fi
(Hinweis: die "fb_update_cert.sh" basiert inhaltlich auf diesem Post: https://www.synology-forum.de/showthread.html?103708-Automatischer-Zertifikats-Export-in-Fritzbox&p=837864&viewfull=1#post837864)
Beide Dateien mit dem Text-Editor auf der DiskStation öffnen und bearbeiten:
> fb_port.sh ---
bitte Zeile 32-38 anpassen
> fb_update_cert.sh ---
bitte Zeile 9-10 anpassen
Danach in Systemsteuerung > Aufgabenplaner ein "Benutzerdefiniertes Skript" als "Geplante Aufgabe" anlegen.
Den Zeitplan nach eigenen Wünschen definieren.
Unter Aufgabeneinstellungen kann der Haken bei "Ausführungsdetails per E-Mail senden" gesetzt werden.
Unter Befehl ausführen > Benutzerdefiniertes Skript einfügen (Pfad zum Script anpassen):
Rich (BBCode):
bash /volume1/data/scripts/fb_port.sh 1
synofirewall --disable
/usr/syno/sbin/syno-letsencrypt renew-all -v
synofirewall --enable
bash /volume1/data/scripts/fb_port.sh 0
bash /volume1/data/scripts/fb_update_cert.sh
Fertig!