介紹

介紹

介紹

我有一個微服務在 Docker 容器內運行,並部署在具有 Debian 10 作業系統的虛擬機器上。伺服器的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 請求時,微服務上會出現以下異常:

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,它!

相關內容