Introducción

Introducción

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

información relacionada