Hallo,
angelehnt an die Beispiele zur Authentifizierung in der AVM-Doku
(
https://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/AVM_TR-064_first_steps.pdf;
Abschnitt 10.7) habe ich versucht, ein Skript zum Setzen eines PortMappings
zu setzen, was aber leider nicht funktioniert:
#!/bin/sh
new_remote_host=""
new_external_port="80"
new_protocol="TCP"
new_internal_port="80"
new_internal_client="192.168.1.3"
new_enabled="1"
new_port_mapping_description="http forward for letsencrypt"
new_lease_duration=""
FBIP='192.168.178.1'
FBPORT='49000'
user=dslf-config
password=<password> # muss passend eingesetzt werden
# die sed Zeilen sind hier umbrochen, gehören in eine Zeile
control_url="`curl -m 5 -s "http://${FBIP}:${FBPORT}/igddesc.xml" | \
sed -e '/WANIPConn1<\/controlURL\>/!d' -e 's/^<controlURL>//' -e
's/<\/controlURL>.*$//'`"
urn="`curl -m 5 -s "http://${FBIP}:${FBPORT}/igddesc.xml" | \
sed -e '/WANIPConnection:1<\/serviceType\>/!d' -e 's/^<serviceType>//' -e
's/<\/serviceType>.*
# Achtung: auch hier Umbrüche enthalten
curl -m 5 -k --digest -u ${user}:$password} "http://${FBIP}
${FBPORT}${control_url}" \
-H "Content-Type: text/xml; charset='utf-8'" \
-H "SoapAction:${urn}#AddPortMapping" \
-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:Header>
<h:InitChallenge
xmlns:h='
http://soap-authentication.org/digest/2001/10/'
s:mustUnderstand='1'>
<UserID>${user}</UserID>
</h:InitChallenge>
</s:Header>
<s:Body>
<u:AddPortMapping xmlns:u='${urn}'>
<NewPortMappingDescription>${new_port_mapping_description}</NewPortMappingDescription>
<NewLeaseDuration>${new_lease_duration}</NewLeaseDuration>
<NewInternalClient>${new_internal_client}</NewInternalClient>
<NewEnabled>${new_enabled}</NewEnabled>
<NewExternalPort>${new_external_port}</NewExternalPort>
<NewRemoteHost>${new_remote_host}</NewRemoteHost>
<NewProtocol>${new_protocol}</NewProtocol>
<NewInternalPort>${new_internal_port}</NewInternalPort>
</u:AddPortMapping>
</s:Body>
</s:Envelope>" \
-s
Antwort:
<?xml version="1.0"?>
<s:Envelope xmlns:s="
http://schemas.xmlsoap.org/soap/envelope/"
s:encodingStyle="
http://schemas.xmlsoap.org/soap/encoding/">
<s:Body>
<s:Fault>
<faultcode>s:Client</faultcode>
<faultstring>UPnPError</faultstring>
<detail>
<UPnPError xmlns="urn:schemas-upnp-org:control-1-0">
<errorCode>502</errorCode>
<errorDescription>XML error</errorDescription>
</UPnPError>
</detail>
</s:Fault>
</s:Body>
</s:Envelope>0
Laut AVM-Doku erwarte ich zwar einen Fehler, aber dabei auch die Übergabe
einer Nonce, um die Anfrage authentifiziert wiederholen zu können, z. B.
sowas:
Request:
<?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:Header>
<h:InitChallenge
xmlns:h="
http://soap-authentication.org/digest/2001/10/"
s:mustUnderstand="1">
<UserID>admin</UserID>
</h:InitChallenge >
</s:Header>
<s:Body>
<u:GetHostNumberOfEntries xmlns:u="urn:dslforum-org:service:Hosts:1">
</u:GetHostNumberOfEntries>
</s:Body>
</s:Envelope>
Response:
<?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:Header>
<h:Challenge
xmlns:h="
http://soap-authentication.org/digest/2001/10/"
s:mustUnderstand="1">
<Status>Unauthenticated</Status>
<Nonce>F758BE72FB999CEA</Nonce>
<Realm>F!Box SOAP-Auth</Realm>
</h:Challenge>
</s:Header>
<s:Body>
<sFault>
<errorCode>503</errorCode>
<errorDescription>Auth. failed</errorDescription>
</s:Fault>
</s:Body>
</s:Envelope>
Mit der Nonce kann man dann fortsetzen.
Setze ich in der Fritzbox-Oberfläche unter Internet|Freigaben|Portfreigaben
die Option "Alle Geräte im Heimnetz dürfen Portfreigaben selbstständig
verändern", können unter weglassen des InitChallenge-Headers Portfreigaben
ohne Authentifizierung gesetzt werden, was aber nicht gewünscht ist.
Wo liegt der (Denk-)Fehler?
--
Gruss Marcus