為什麼 Google Computer Engine 將我的程序綁定到 IPv6 埠?
我正在編寫一個綁定到多個本地埠(包括
80
和443
)的伺服器。每當我在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
來驗證。