Einleitung

Einleitung

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.comauf 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?

verwandte Informationen