介绍

介绍

介绍

我有一个微服务在 Docker 容器内运行,并部署在装有 Debian 10 OS 的虚拟机上。服务器的 IP 地址是 141.45.146.55。

该微服务公开以下 API:

GET https://<host>:8636/?username=<username>&password=<password>

它针对不同节点上的 LDAP 服务器执行 LDAP 身份验证请求,例如:ldaps://example.com:636。example.com 的 IP 地址是 141.45.11.192(这是服务器上 nslookup example.com 的输出)。

如果运行微服务的服务器上的防火墙已关闭,则一切都可以正常工作,但如果我打开防火墙,则在发出 HTTP 请求时,我会在 miroservice 上收到以下异常:

javax.naming.CommunicationException: example.com:636 [Root exception is java.net.UnknownHostException: example.com]

看起来防火墙阻止了微服务与主机 ldaps://example.com:636 的远程 LDAP 服务器之间的连接。

问题

为了使其正常工作,我必须在防火墙脚本中添加(或删除)哪种防火墙规则?为了完整起见,我添加了防火墙脚本内容:

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
#

我还想提一下,微服务正在 Docker 容器内运行如果我关闭防火墙并重新启动虚拟机,一切都会正常工作,但是当我打开防火墙时,微服务会抛出 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

我目前所做的

我读了 的 javadoc java.net.UnknownHostException,它指出:

抛出表示无法确定主机的 IP 地址。

所以我的想法是防火墙可能阻止了 DNS,所以我nslookup example.com在运行微服务和防火墙的服务器上进行了尝试。不幸的是,当防火墙开启时,nslookup 可以正常工作。它解析了 example.com。

我还尝试了以下规则:

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

但没有成功。管理员告诉我,这没有必要,因为我们在防火墙后面(在同一个网络内),但由于我是微服务的开发人员,而管理员不熟悉 docker,所以我必须在打开防火墙的情况下运行微服务。

还有其他想法吗?我担心这与 Docker 有关,您觉得呢?

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

为什么有一些 docker 特定的链,并且目标地址是 172.18.0.X,它的 != 141.45.XX,这是个问题吗?

相关内容