Networking

為什麼 Google Computer Engine 將我的程序綁定到 IPv6 埠?

  • July 25, 2019

我正在編寫一個綁定到多個本地埠(包括80443)的伺服器。每當我在Google電腦引擎 (GCE) 上執行它時,使用他們的容器優化作業系統 (COS) 和 Docker 容器,埠綁定到 IPv6,而不是 IPv4。

$ netstat -tuln
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 127.0.0.1:36265         0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN
tcp6       0      0 :::80                   :::*                    LISTEN
tcp6       0      0 :::443                  :::*                    LISTEN
udp        0      0 10.128.0.33:68          0.0.0.0:*

這是一個重要的區別,因為我的程序中有一個邏輯嘗試使用127.0.0.1.

如何指定我的 GCE 實例使用 IPv4 埠?

編輯

需要注意的一件重要事情(正如評論中指出的那樣) - 雖然它可能綁定到使用 IPv4 和 IPv6 的介面,但 IPv6 路由在 Google Cloud 上不起作用(內部尚不支持)。


因此,事實證明,這是 Docker 如何進行網路的一個令人困惑的“功能”,它仍然應該允許 IPv4 連接以及 IPv6。

有關更多詳細資訊,請參閱此 StackOverflow 答案。為了後代,我引用了下面的答案:

github.com/docker/docker/issues/2174是關於僅顯示與 IPv6 的綁定netstat,但這不是問題。正如github問題所述:

> > 設置代理時,Docker 請求環回地址“127.0.0.1”,Linux 意識到這是一個存在於 IPv6 中的地址(如 ::0)並在兩者上打開(但它正式是 IPv6 套接字)。當您執行 netstat 時,它會看到並告訴您它是 IPv6 - 但它仍在偵聽 IPv4。如果您對您的設置進行了一些操作,您可能已經禁用了 Linux 所做的這個技巧 - 通過設置 net.ipv6.bindv6only = 1。 > > >

換句話說,僅僅因為您將其視為僅 IPv6,它仍然能夠在 IPv4 上進行通信,除非您將 IPv6 設置為僅使用 net.ipv6.bindv6only 設置綁定到 IPv6。需要明確的是,net.ipv6.bindv6only 應該是 0 - 你可以執行sysctl net.ipv6.bindv6only來驗證。

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