Ssl

為什麼我的 docker 系統資料庫拒絕來自本地網路中的虛擬機而不是主機的連接?

  • March 2, 2021

對於上下文 - 我正在嘗試在氣隙環境中部署 OKD,這需要鏡像鏡像系統資料庫。然後,在安裝過程中,網路中的其他機器會從這個私有、安全的系統資料庫中提取。

描述環境 - 執行系統資料庫容器的主機正在執行 Centos 7.6。其他機器都是使用 libvirt 執行 Fedora coreOS 的虛擬機。虛擬機和主機使用使用 libvirt 創建的虛擬網路連接,其中包括虛擬機的 DHCP 設置(通過 virsh net-edit 配置),為它們提供靜態 IP。主機還託管 DNS 伺服器(綁定),據我所知,它配置正確,因為我可以使用其完全限定的域名從其他機器 ping 每台機器並訪問特定埠(例如埠主機上的 apache 伺服器監聽)。使用 Podman 代替 Docker 進行 OKD 的容器管理,但據我所知,命令完全相同。

我使用以下命令在氣隙環境中執行系統資料庫:

sudo podman run --name mirror-registry -p 5000:5000 -v /opt/registry/data:/var/lib/registry:z \
-v /opt/registry/auth:/auth:z -v /opt/registry/certs:/certs:z -e REGISTRY_AUTH=htpasswd \
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/registry.pem -e REGISTRY_HTTP_TLS_KEY=/certs/registry-key.pem \
-d docker.io/library/registry:latest

可以使用curl -u username:password https://host-machine.example.local:5000/v2/_catalogwhich returns訪問它{"repositories":[]}。我相信這證實了我的 TLS 和授權配置是正確的。但是,如果我將 ca.pem 文件(用於簽署系統資料庫使用的 SSL 證書)傳輸到虛擬網路上的 VM 之一,並嘗試使用相同的curl命令,則會收到錯誤消息:

connect to 192.168.x.x port 5000 failed: Connection refused
Failed to connect to host-machine.example.local port 5000: Connection refused
Closing connection 0

這對我來說很奇怪,因為過去我已經能夠使用這種方法從虛擬機與系統資料庫進行通信,但我不確定發生了什麼變化。

經過進一步探勘,似乎埠本身存在某種問題,但我無法確定問題出在哪裡。例如,如果我sudo netstat -tulpn | grep LISTEN在主機上執行,我會收到一條指示 podman (conmon) 正在偵聽正確埠的行:

tcp 0 0 0.0.0.0:5000 0.0.0.0:* LISTEN 48337/conmon

但是,如果我測試該埠是否可以從 VM 訪問,( nc -zvw5 192.168.x.x 5000) 我會收到類似的錯誤:Ncat: Connection refused.如果我在主機上的任何其他偵聽埠上使用相同的測試,則表明與這些埠的連接成功。

請注意,我已經完全禁用了 firewalld,據我所知,所有埠都是開放的。

我不確定問題出在我的 DNS 設置、虛擬網路還是系統資料庫本身,我不太確定如何進一步診斷問題。任何見解將不勝感激。

網路定義:

<network connections='6'>
 <name>okd</name>
 <uuid>2ce10cce-9bb6-4d5d-950f-15427172b196</uuid>
 <bridge name='virbr1' stp='on' delay='0'/>
 <mac address='52:54:00:d9:d6:95'/>
 <domain name='okd'/>
 <ip address='192.168.2.1' netmask='255.255.255.0'>
   <dhcp>
     <range start='192.168.2.200' end='192.168.2.254'/>
     <host mac='52:54:00:45:93:07' name='okd-bootstrap' ip='192.168.2.200'/>
     <host mac='52:54:00:f0:0a:1c' name='okd-master1' ip='192.168.2.201'/>
     <host mac='52:54:00:d1:29:9e' name='okd-master2' ip='192.168.2.202'/>
     <host mac='52:54:00:c9:a4:bb' name='okd-master3' ip='192.168.2.203'/>
     <host mac='52:54:00:25:5d:48' name='okd-worker1' ip='192.168.2.204'/>
     <host mac='52:54:00:1e:90:3c' name='okd-worker2' ip='192.168.2.205'/>
   </dhcp>
 </ip>
</network>

“連接被拒絕”是一個方便的提示。iptables 拒絕連接,或者軟體配置為將某些 IP 範圍列入白名單/黑名單。路徑中的某些東西正在積極拒絕連接。如果您收到“請求超時”……這可能是一個更大的問題列表。(路由,數據包被丟棄……等等……)

引用自:https://serverfault.com/questions/1055573