
나는 여러 로컬 포트( 80
및 포함 443
)에 바인딩되는 서버를 작성 중입니다. COS(Container-Optimized OS)와 Docker 컨테이너를 사용하여 GCE(Google Computer Engine)에서 실행할 때마다 포트는 IPv4가 아닌 IPv6에 바인딩됩니다.
$ 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:*
내 프로그램에는 IPv4 주소를 사용하여 로컬 인터페이스에 직접 연결을 시도하는 논리가 있기 때문에 이는 중요한 차이점입니다 127.0.0.1
.
GCE 인스턴스가 IPv4 포트를 사용하도록 지정하려면 어떻게 해야 하나요?
답변1
편집하다
주목해야 할 중요한 사항 중 하나(댓글에서 지적했듯이)- IPv4와 IPv6를 모두 사용하여 인터페이스에 바인딩될 수 있지만 IPv6 라우팅은 Google Cloud에서 작동하지 않습니다(아직 내부적으로 지원되지 않음).
따라서 이는 Docker가 네트워킹을 수행하는 방식과 혼동되는 "기능"이며 IPv6뿐만 아니라 IPv4 연결도 허용해야 합니다.
보다이 StackOverflow 답변상세 사항은. 후손을 위해 아래 답변을 인용했습니다.
...github.com/docker/docker/issues/2174에서는 IPv6에만 바인딩을 표시하는 것에 관한 것이지만
netstat
이는 문제가 되지 않습니다. 해당 github 문제에서는 다음과 같이 말합니다.프록시를 설정할 때 Docker는 루프백 주소 '127.0.0.1'을 요청하고 Linux는 이 주소가 IPv6에 존재하는 주소(::0)임을 인식하고 두 주소 모두에서 열립니다(그러나 공식적으로는 IPv6 소켓임). netstat를 실행하면 이를 보고 IPv6임을 알려 주지만 여전히 IPv4를 수신하고 있습니다. 설정을 약간 변경했다면 net.ipv6.bindv6only = 1을 설정하여 Linux에서 수행하는 이 트릭을 비활성화했을 수 있습니다.
즉, IPv6 전용으로 표시되기 때문에 net.ipv6.bindv6only 설정을 사용하여 IPv6에서만 바인딩하도록 IPv6을 설정하지 않는 한 여전히 IPv4에서 통신할 수 있습니다. 명확하게 하려면 net.ipv6.bindv6only가 0이어야 합니다. 실행
sysctl net.ipv6.bindv6only
하여 확인할 수 있습니다.