![介紹](https://rvso.com/image/1642392/%E4%BB%8B%E7%B4%B9.png)
介紹
我有一個微服務在 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,它!