介绍
我有一个微服务在 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,这是个问题吗?