為什麼我需要一個外部地址來建立 GCE 實例之間的內部連接?
我有一個帶有 3 個虛擬機的 VPC (10.11.0.0/20)。VM2 和 VM3相同,只是 VM2 具有外部 IP 地址(臨時)而 VM3 沒有。他們都在執行一個 Docker 映像,其中的 Web 伺服器公開了 80 埠。
我有一個“允許所有內部”防火牆規則:
NAME NETWORK DIRECTION PRIORITY SRC_RANGES ALLOW dev-internal dev INGRESS 1000 10.11.0.0/20 icmp,tcp:0-65535,udp:0-65535
我可以進入 VM1,然後我可以 ping VM2 和 VM3。
當我使用
nmap
VM2 時,我可以看到 998 個埠已關閉並且兩者都ssh
打開http
- 正如預期的那樣。當我使用VM3 時,我過濾
nmap
了999 個埠——這意味著防火牆正在屏蔽它們?- 只有埠暴露。ssh
我可以
curl
從 VM2,但 VM3 超時。我希望能夠在不分配外部 IP 的情況下通過內部網路進行通信。我究竟做錯了什麼?
(唯一稍微複雜的是,VPC 定義在 1 個項目中,VPC-Shared 定義在第二個項目中。防火牆規則和路由定義在 VPC 宿主項目中。VM 存在於第二個項目中,但位於共享 VPC 上。)
編輯:
netstat -antp
來自 VM2 的結果:Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1207/nginx: master tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 311/sshd tcp 0 0 0.0.0.0:5355 0.0.0.0:* LISTEN 299/systemd-resolve tcp 0 0 10.11.0.6:46458 169.254.169.254:80 ESTABLISHED 381/python2.7 tcp 0 272 10.11.0.6:22 173.194.90.33:64360 ESTABLISHED 43364/sshd: jamie_h tcp 0 0 10.11.0.6:53880 169.254.169.254:80 ESTABLISHED 401/device_policy_m tcp 0 0 10.11.0.6:46454 169.254.169.254:80 CLOSE_WAIT 385/python2.7 tcp 0 0 10.11.0.6:46460 169.254.169.254:80 ESTABLISHED 385/python2.7 tcp 0 0 10.11.0.6:46456 169.254.169.254:80 ESTABLISHED 384/python2.7 tcp6 0 0 :::5355 :::* LISTEN 299/systemd-resolve
VM3 是相同的- 兩個容器作業系統,都執行相同的 Docker 映像 - 因為我沒有外部 IP,所以我無法進入它(不做複雜的舞蹈……)。
編輯:重現步驟:
- 創建 VPC
- 為子網的外部 SSH 和 HTTP 訪問創建防火牆規則(我分別使用
ssh
和http
標記)- 為 VPC 上的內部流量創建防火牆規則(源 = 子網,目標 = 子網上的所有實例)
- 使用帶有網路標籤和外部 IP 的
source
Debian 創建在 VPC 上呼叫的 VM (以支持 SSH 連接)ssh
target1
使用 COS 和帶有網路標籤和外部 IP的nginxdemos/hello
docker 映像(在埠 80 上公開的“hello world”)創建在 VPC 上呼叫的 VMhttp
target2
使用 COS 和帶有網路標籤且沒有外部 IP的nginxdemos/hello
docker 映像創建在 VPC 上呼叫的 VMhttp
- SSH 到VM和
source
ping 兩者- 他們響應target1``target2
curl target1
它以 hello world 頁面響應curl target2
它超時了nmap -Pn target1
顯示 ssh + http 打開,所有其他關閉nmap -Pn target2
顯示 ssh 打開和所有其他已過濾
這比我想像的要簡單得多……
如果沒有外部 IP 地址,ContainerOS 實例將無法訪問 Internet來拉取 Docker 映像。如果您添加一個 Cloud NAT 實例 ( https://cloud.google.com/nat/docs/using-nat ),該實例會提取圖像並啟動它,然後一切正常。
原因
nmap
是沒有顯示 http 並且所有其他“已過濾”必須是因為在實例啟動並執行之前不會應用防火牆規則。(要找到這個,我必須在子網上切換“Private Google access”標誌。這允許內部虛擬機將日誌推送到 Stackdriver,這清楚地顯示了 Docker 拉出超時。)
您不需要外部 IP 即可在 GCE 實例之間進行連接。您可以使用 VM 的內部 IP 在 GCE 實例之間進行通信。確保您的防火牆配置正確,為您的目的打開了必要的埠,並且您有一個服務在埠 80 上偵聽。