![Einleitung](https://rvso.com/image/1642392/Einleitung.png)
Einleitung
Ich habe einen Microservice, der in einem Docker-Container ausgeführt und auf einer VM mit dem Betriebssystem Debian 10 bereitgestellt wird. Die IP-Adresse des Servers lautet 141.45.146.55.
Der Mikrodienst stellt die folgende API bereit:
GET https://<host>:8636/?username=<username>&password=<password>
das eine LDAP-Authentifizierungsanforderung an einen LDAP-Server auf einem anderen Knoten ausführt, sagen wir: ldaps://example.com:636. Die IP-Adresse von example.com ist 141.45.11.192 (das ist die Ausgabe von nslookup example.com auf dem Server).
Alles funktioniert einwandfrei, wenn die Firewall auf dem Server, auf dem der Microservice läuft, ausgeschaltet ist. Wenn ich die Firewall jedoch einschalte, erhalte ich beim Senden der HTTP-Anforderung die folgende Ausnahme auf dem Microservice:
javax.naming.CommunicationException: example.com:636 [Root exception is java.net.UnknownHostException: example.com]
Es scheint, dass die Firewall eine Verbindung zwischen dem Microservice und dem Remote-LDAP-Server mit dem Host ldaps://example.com:636 blockiert.
Frage
Welche Firewall-Regel muss ich dem Firewall-Skript hinzufügen (oder daraus entfernen), damit dies funktioniert? Der Vollständigkeit halber füge ich den Inhalt des Firewall-Skripts hinzu:
iptables -F
iptables -t nat -F
iptables -P INPUT DROP
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
#
# Allow only 141.45.x.x
#
iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -s 141.45.0.0/16 -j ACCEPT
#
iptables -A INPUT -p tcp -m tcp --dport 8443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 8636 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables-save > /etc/firewall.conf
#
echo -n "#" > /etc/network/if-up.d/iptables
echo -n ! >> /etc/network/if-up.d/iptables
echo /bin/sh >> /etc/network/if-up.d/iptables
echo "iptables-restore < /etc/firewall.conf" >> /etc/network/if-up.d/iptables
#
chmod +x /etc/network/if-up.d/iptables
#
Ich möchte auch erwähnen, dass der Microservice in einem Docker-Container ausgeführt wirdund wenn ich die Firewall ausschalte und die VM neu starte, funktioniert alles einwandfrei, aber wenn ich die Firewall einschalte, wirft der Microservice eine java.net.UnknownHostException aus.
root:~# iptables -L
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT all -- anywhere anywhere state ESTABLISHED
ACCEPT all -- anywhere anywhere
ACCEPT all -- 141.45.0.0/16 anywhere
ACCEPT tcp -- anywhere anywhere tcp dpt:8443 state NEW,ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp dpt:8636 state NEW,ESTABLISHED
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain DOCKER-USER (0 references)
target prot opt source destination
Chain DOCKER (0 references)
target prot opt source destination
ACCEPT tcp -- anywhere 172.18.0.2 tcp dpt:https
ACCEPT tcp -- anywhere 172.18.0.3 tcp dpt:postgresql
ACCEPT tcp -- anywhere 172.18.0.4 tcp dpt:https
ACCEPT tcp -- anywhere 172.18.0.5 tcp dpt:https
Chain DOCKER-ISOLATION-STAGE-1 (0 references)
target prot opt source destination
Chain DOCKER-ISOLATION-STAGE-2 (0 references)
target prot opt source destination
Was ich bisher getan habe
Ich habe das Javadoc von gelesen java.net.UnknownHostException
, dort steht:
Wird ausgelöst, um anzuzeigen, dass die IP-Adresse eines Hosts nicht bestimmt werden konnte.
Die Idee war, dass die Firewall möglicherweise den DNS blockiert, also habe ich es nslookup example.com
auf dem Server versucht, auf dem der Microservice und die Firewall laufen. Leider funktioniert nslookup, wenn die Firewall eingeschaltet ist. Es löst example.com auf.
Ich habe auch die folgenden Regeln ausprobiert:
iptables -I INPUT -p tcp --sport 636 -j ACCEPT
iptables -I INPUT -p udp --sport 636 -j ACCEPT
iptables -I INPUT -p tcp --dport 636 -j ACCEPT
iptables -I INPUT -p udp --dport 636 -j ACCEPT
Aber ohne Erfolg. Der Admin sagte mir, dass das nicht nötig sein sollte, da wir uns hinter der Firewall befinden (im selben Netzwerk), aber da ich der Entwickler des Microservice bin und der Admin sich nicht mit Docker auskennt, liegt es an mir, den Microservice bei eingeschalteter Firewall zum Laufen zu bringen.
Irgendwelche anderen Ideen? Ich fürchte, es hat etwas mit Docker zu tun. Was meinen Sie?
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
c67630f9118b dawidlokiec/ldap-authentication-service "/opt/docker/bin/lda…" 2 days ago Up 18 hours 0.0.0.0:8636->443/tcp
and three other contains ...
Warum gibt es einige Docker-spezifische Ketten und die Zieladressen sind 172.18.0.X, es ist != 141.45.XX. Ist das ein Problem?