![Introducción](https://rvso.com/image/1642392/Introducci%C3%B3n.png)
Introducción
Tengo un microservicio que se ejecuta dentro de un contenedor acoplable y lo implemento en una máquina virtual con el sistema operativo Debian 10. La dirección IP del servidor es 141.45.146.55.
El microservicio expone la siguiente API:
GET https://<host>:8636/?username=<username>&password=<password>
que realiza una solicitud de autenticación LDAP contra un servidor LDAP en un nodo diferente, digamos: ldaps://example.com:636. La dirección IP de example.com es 141.45.11.192 (esa es la salida de nslookup example.com en el servidor).
Todo funciona bien si el firewall en el servidor en el que se ejecuta el microservicio está apagado, pero si enciendo el firewall obtengo la siguiente excepción en el miroservicio al realizar la solicitud HTTP:
javax.naming.CommunicationException: example.com:636 [Root exception is java.net.UnknownHostException: example.com]
Parece que el firewall está bloqueando una conexión entre el microservicio y el servidor LDAP remoto con el host ldaps://example.com:636.
Pregunta
¿Qué tipo de regla de firewall debo agregar (o eliminar) al script de firewall para que esto funcione? Para completar, agrego el contenido de los scripts del firewall:
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
#
También me gustaría mencionar que el microservicio se ejecuta dentro de un contenedor acoplable.y si apago el firewall y reinicio la VM, todo funciona bien, pero cuando enciendo el firewall, el microservicio arroja una java.net.UnknownHostException.
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
lo que he hecho hasta ahora
Leí el javadoc de java.net.UnknownHostException
, dice:
Se lanza para indicar que no se pudo determinar la dirección IP de un host.
Entonces, la idea era que el firewall tal vez estuviera bloqueando el DNS, así que lo probé nslookup example.com
en el servidor donde se ejecutan el microservicio y el firewall. Desafortunadamente, nslookup funciona cuando el firewall está activado. Resuelve ejemplo.com.
También probé las siguientes reglas:
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
Pero sin éxito. El administrador me dijo que eso no debería ser necesario porque estamos detrás del firewall (dentro de la misma red), pero como soy el desarrollador del microservicio y el administrador no está familiarizado con Docker, depende de mí ejecutar el microservicio con el cortafuegos activado.
¿Alguna otra idea? Me temo que tiene algo que ver con Docker, ¿qué opinas?
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 ...
¿Por qué hay algunas cadenas específicas de Docker y las direcciones de destino son 172.18.0.X? ¡Es! = 141.45.XX. ¿Es un problema?