Firewall

為什麼我需要一個外部地址來建立 GCE 實例之間的內部連接?

  • November 20, 2018

我有一個帶有 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。

當我使用nmapVM2 時,我可以看到 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,所以我無法進入它(不做複雜的舞蹈……)。

編輯:重現步驟:

  1. 創建 VPC
  2. 為子網的外部 SSH 和 HTTP 訪問創建防火牆規則(我分別使用sshhttp標記)
  3. 為 VPC 上的內部流量創建防火牆規則(源 = 子網,目標 = 子網上的所有實例)
  4. 使用帶有網路標籤和外部 IP 的sourceDebian 創建在 VPC 上呼叫的 VM (以支持 SSH 連接)ssh
  5. target1使用 COS 和帶有網路標籤和外部 IP的nginxdemos/hellodocker 映像(在埠 80 上公開的“hello world”)創建在 VPC 上呼叫的 VMhttp
  6. target2使用 COS 和帶有網路標籤且沒有外部 IP的nginxdemos/hellodocker 映像創建在 VPC 上呼叫的 VMhttp
  7. SSH 到VM和sourceping 兩者- 他們響應target1``target2
  8. curl target1它以 hello world 頁面響應
  9. curl target2它超時了
  10. nmap -Pn target1顯示 ssh + http 打開,所有其他關閉
  11. 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 上偵聽。

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