내가 듣고 있다면 :::80
모든 ipv6에서 듣고 있습니까, 아니면 모든 ipv6+ipv4에서 듣고 있습니까?
이 내 꺼야 netstat -tln
:
tcp 0 0 :::8080 :::*
답변1
바인딩된 수신 소켓 ::
(즉, 모든 주소(IPv6 주소 INADDR6_ANY
))은 IPv4를 사용하는 연결을 수신할 수도 있고 수신하지 않을 수도 있습니다. 이는 여러 가지 사항에 따라 달라집니다.
- 일부 운영 체제는듀얼 스택, 이러한 운영 체제에서는
IPV6_V6ONLY
(소켓을 생성한 프로그램에 의해) 청취 소켓에 소켓 옵션이 설정되었는지 여부에 따라 달라집니다. Linux 기반 운영 체제와 FreeBSD가 이러한 운영 체제의 예입니다.프로그램이 이 옵션을 명시적으로 설정하지 않은 경우 기본 동작은 운영 체제에 따라 다릅니다. 예를 들어 Linux 기반 운영 체제에서는 0 또는 1 을 작성하여 이 기본값을 변경할 수 있습니다
/proc/sys/net/ipv6/bindv6only
. - 일부 다른 운영 체제에서는 그렇지 않습니다.듀얼 스택, 이러한 운영 체제에서는 단일 소켓을 사용하여 IPv6 및 IPv4를 모두 수신할 수 없습니다. OpenBSD는 그러한 운영 체제 중 하나입니다.
netstat
일부 운영 체제에서는 소켓이 이중 스택인지 여부를 출력으로 알려줍니다. 예를 들어 FreeBSD는 출력의 첫 번째 열에 듀얼 스택 소켓을 보고합니다 netstat
.tcp46
udp46
@Johan Myreen 답변에 감사드립니다. 예제를 통해 이 답변을 개선하고 싶습니다.
이 두 값을 사용하여 ipv6_only 동작을 테스트하고 있습니다.
1.
cat /proc/sys/net/ipv6/bindv6only
0
nc -6 -l 80
#server started
# netstat
tcp6 0 0 :::80 :::* LISTEN
# nc client
nc localhost 80
test
# server response
nc -6 -l 80
test
# from ipv6 now
nc ::1 80
test ipv6
# server response
nc -6 -l 80
test ipv6
2.
cat /proc/sys/net/ipv6/bindv6only
1
# server started
nc -6 -l 80
# connect to ipv4
nc localhost 80
nc: connect to localhost port 80 (tcp) failed: Connection refused
# connect to ipv6
nc ::1 80
test ipv6
# server respose
nc -6 -l 80
test ipv6
위 결과에서 /proc/sys/net/ipv6/bindv6의 값은 ipv6 또는 ipv6+ipv4의 동작만 결정한다는 것을 알 수 있습니다.