Debuggen von HTTP request eines Docker Containers

Mittlerweile gibt es ja viele Tools nur noch als Docker Container. Das hat ein paar vorteile. Z.b. das man diese einfach so benutzen kann ohne wirklich verstehen zu müssen was die Vorraussetzungen sind oder wie diese Tools funktionieren. Problemmatisch wird es aber dann, wenn man solche Tools verstehen möchte um sie z.B. nachzubauen. Normalerweise würde man hier z.B. Fiddler oder Wireshark benutzen um zu sehen was diese anwendungen tun. Somit bekommt man ein Gefühl dafür was diese Anwendungen tun. Dies ist mit Docker allerdings etwas schwieriger als gedacht. Hier deswegen ein möglicher Lösungsansatz:

Am besten installiert man wie gehabt Fiddler, wenn man weiß das der Traffik HTTP(s) ist. Hat man Fiddler installiert, so sollte man zuerst in die Settings gehen und dort im folgenden Dialog Verbindungen von externen Computern zulassen:

Dies ist notwendig das die Docker Container unter Windows hinter einen eigenen IP laufen und damit für Fiddler nicht zum Host selbst zählen. Als nächstes generieren wir das Zertifikat was wir benutzen damit Fiddler den HTTPs Traffik entschlüsseln kann. Dazu gehen wir in den Settings auf HTTPS und wählen aus das wir HTTPS entschlüsseln wollen. Anschließend exportieren wir den Public Teil des Zertifikates.

Ist das getan findet man das Zertificat auf dem Desktop seines PCs. Dies können wir nun in den Docker Container kopieren den wir debuggen wollen. Das geht am besten über die Docker CLI:

docker cp ~\Desktop\FiddlerRoot.cer unruffled_wilbur:/root/

unruffled_wilbut steht hier für den Docker-Container-Namen. Somit liegt das CERT nun im Docker Container. Nun müssen wir das Certificat noch im Docker Container umwandeln und als Vertrauenswürdig einstufen. Dazu führen wir die Folgenden Befehle aus:

openssl x509 -inform DER -outform PEM -in ./FiddlerRoot.cer -out fiddler.crt
cp fiddler.crt /usr/local/share/ca-certificates/fiddler.crt
chmod 644 /usr/local/share/ca-certificates/fiddler.crt
update-ca-certificates

Nach dem diese abgeschlossen sind vertraut unserer Docker Container nun dem Fiddler Proxy. Jetzt müssen wir dem Docker Container nur noch sagen das er den Proxy verwenden soll. Dabei hilft es zu wissen das der Windows Host immer unter dem Namen `host.docker.internal` erreichbar ist. Somit müssen wir nun nur noch folgenden Befehle absetzen:

export http_proxy=http://host.docker.internal:8888
export https_proxy=http://host.docker.internal:8888
export HTTP_PROXY=http://host.docker.internal:8888
export HTTPS_PROXY=http://host.docker.internal:8888

Ist dies getan kann man mit z.b. wget eine Website abrufen und sollte diese dann auch im Fiddler sehen. Dabei sollte man auch gleich den Filter auf den Process setzen. Alle Verbindung aus Docker kommen für Fiddler im aus dem selben Process.

Und schon kann man zusehen was der Docker Container so macht.