Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Fritzbox: Setzen eines PortMappings per Bash-Skript schlaegt fehl

88 views
Skip to first unread message

Marcus Roeckrath

unread,
Sep 11, 2016, 12:40:02 PM9/11/16
to
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

Marcus Roeckrath

unread,
Sep 16, 2016, 3:20:02 PM9/16/16
to
Hallo,

Marcus Roeckrath wrote:

> 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:

Inzwischen gelöst.

--
Gruss Marcus

Dieter Sporer

unread,
Sep 16, 2016, 3:35:48 PM9/16/16
to
Und wie?

Dieter

Marcus Roeckrath

unread,
Sep 16, 2016, 5:10:03 PM9/16/16
to
Hallo Dieter,

Dieter Sporer wrote:

>> > 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:
>>
>> Inzwischen gelöst.
>
> Und wie?

Wen es interessieren sollte, liegt das fertige Linux-Bash-Skript (entwickelt
für eisfair) derzeit unter

http://home.foni.net/~marcusroeckrath/eisfair/fb_port_forwarding_for_letsencrypt

bereit.

Wichtigster Punkt der Problemlösung: Nicht die idgdesc.xml sondern die
tr64desc.xml Funktionsbeschreibungen der Fritzbox nutzen.

--
Gruss Marcus

Dieter Sporer

unread,
Sep 16, 2016, 6:00:27 PM9/16/16
to
Danke! Interessant

Dieter

Marcus Roeckrath

unread,
Sep 17, 2016, 6:30:04 PM9/17/16
to
Bitte, bedien dich.

Die aktuelle Version wird ohne Änderungen aber nur noch unter der
Distribution eisfair laufen, da eine Datei inkludiert wird, die es so nur
auf eisfair gibt.

--
Gruss Marcus
0 new messages