듀얼 스택 OS에서 :: 및 0.0.0.0의 의미 IPv4 전용 시절에는 netstat수신 대기 상태로 표시되는

IPv4 전용 시절에는 netstat수신 대기 상태로 표시되는 LISTEN 연결 0.0.0.0은 시스템의 모든 IPv4 인터페이스의 연결에 응답합니다.

알다시피, 새로운 IPv6 관용구는 ::사용 가능한 모든 IPv6 IPv4 인터페이스를 수신합니다 . 모든 OS (Unix, Windows, Mac)에 대해 이것이 맞습니까? IPv6 인터페이스 만 수신하는 관용구가 있습니까?



답변

불행하게도, 이것은 사용중인 운영 체제에 따라 다릅니다.

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비활성화되어 있습니다 (기본값). 그것이로 설정되면 1SSH가 청취하도록 권장해야합니다 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에 의해 제어됩니다.


답변

네트워크 ID AAAA : BBBB : CCCC : DDDD :: 또는 무엇이든 사용할 수 있습니다. 그러면 IPv6 인터페이스 만이를 선택할 수 있습니다. 내 생각 엔 저는 IPv6 마스터가 아닙니다.