답변:
불행하게도, 이것은 사용중인 운영 체제에 따라 다릅니다.
Microsoft Windows에서 소켓을 ::
바인딩하면 IPv6 포트에만 바인딩됩니다. 따라서 IPv4 및 IPv6 모두에있는 모든 주소에서 수신하려면에 바인드 할 필요가 0.0.0.0
아니라으로 ::
. 다음은 Vista 상자에서 추출한 것입니다.
C:\>netstat -an | find "445"
TCP 0.0.0.0:445 0.0.0.0:0 LISTENING
TCP [::]:445 [::]:0 LISTENING
내가 제공하는 예는 NetBIOS를 사용하지 않을 때 SMB 트래픽에 사용되는 포트 445입니다. 당신이 볼 수 있듯이, 그것은 모두에 구속력 0.0.0.0
과 ::
메이크업, 각각 모두 IPv4 및 IPv6 클라이언트 작업에.
Linux에서는 ::
올바르게 짐작했듯이 IPv4 호환 주소를 포함하므로 바인딩 0.0.0.0
도 불필요합니다. 에 AF_INET6
소켓 에만 바인딩하는 간단한 Python 프로그램을 작성했습니다 ::
. AF_INET
(IPv4) 소켓 에도 바인딩하지 않았지만 여전히 IPv4 클라이언트의 연결을 허용합니다. 예를 들어 10.1.1.3
연결하면 에서 연결로 표시됩니다 ::ffff:10.1.1.3
.
털이다는 것을 제외하고 . /proc/sys/net/ipv6/bindv6only
로 설정된 경우 Linux에는 위의 사항이 적용되지 않습니다 1
.이 경우 동작은 Windows와 정확히 동일 ::
합니다. 바인딩 은 IPv6 요청 만 수신합니다. IPv4 요청을 수신하려면 AF_INET
소켓 을 작성 하고 청취 해야합니다 0.0.0.0
. 다행히 기본에 대한 bindv6only
것입니다 0
, 그래서 당신이 이제까지이 처리해야합니다 매우 슬림 기회가 (제외 데비안, 실제로 기본값을 사용하는 경우 bindv6only = 1
).
이 모든 것이 서비스가 IPv6를 지원하는지 여부와 IPv4를 지원하는지 여부를 확인하는 데 유용합니다. 내 SSH 서버는 다음과 같습니다.
$ netstat -64ln | grep 22
tcp6 0 0 :::22 :::* LISTEN
보시다시피 SSH는 ::
포트 22 에서만 수신 대기합니다. 그러나 IPv6 클라이언트 만 수신하는 것이 아니라 IPv4 호환 바인딩으로 인해 IPv4 클라이언트에서 제대로 작동합니다. 이걸 보면 이것을 증명하기 위해 :
$ cat /proc/sys/net/ipv6/bindv6only
0
bindv6only
비활성화되어 있습니다 (기본값). 그것이로 설정되면 1
SSH가 청취하도록 권장해야합니다 0.0.0.0
(또는 대신).
Mac OS X에 관한 정보가없는 것에 대해 사과드립니다. 나는 과거에 그것을 사용했지만 그놈의 미학을 선호하기 때문에 오랫동안 사용하지 않았습니다. 그러나 나는 그 행동이 Linux와 동일하다고 생각합니다.
도움이 되었기를 바랍니다.
IPv6 주소 공간의 세그먼트가 IPv4 공간과 동일하므로 IPv4 소켓을 비활성화 할 수 있어도 IPv4 패킷을 IPv6 소켓으로 보낼 수 있습니다. IPv4 위키 백과 페이지 에서 IPv4 전환 섹션을 확인 하십시오 .
편집 : 아, 조금 더 아래로 말합니다 :
IPv6 및 IPv4 스택은 별도의 구현 (Vista / Longhorn 이전의 Microsoft Windows : XP / 2003) 또는 보안 문제 (OpenBSD) 때문에 일부 일반적인 IPv6 스택은 IPv4 매핑 주소 기능을 지원하지 않습니다. 이러한 운영 체제에서는 지원할 각 IP 프로토콜에 대해 별도의 소켓을 열어야합니다. 일부 시스템 (예 : Linux, NetBSD, FreeBSD)에서이 기능은 RFC 3493에 지정된 소켓 옵션 IPV6_V6ONLY에 의해 제어됩니다.