![Linux는 NFS 서비스에서 사용되며 모든 인터페이스 "::"에 바인딩되는 임시 포트를 제공합니다.](https://linux55.com/image/159272/Linux%EB%8A%94%20NFS%20%EC%84%9C%EB%B9%84%EC%8A%A4%EC%97%90%EC%84%9C%20%EC%82%AC%EC%9A%A9%EB%90%98%EB%A9%B0%20%EB%AA%A8%EB%93%A0%20%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4%20%22%3A%3A%22%EC%97%90%20%EB%B0%94%EC%9D%B8%EB%94%A9%EB%90%98%EB%8A%94%20%EC%9E%84%EC%8B%9C%20%ED%8F%AC%ED%8A%B8%EB%A5%BC%20%EC%A0%9C%EA%B3%B5%ED%95%A9%EB%8B%88%EB%8B%A4..png)
localhost
" "(포트 0에 바인딩됨)의 임시 포트를 사용하여 생성된 Java 소켓 서버가 있습니다 . 그러나 일단 실행되면 netstat는 모든 인터페이스의 동일한 포트를 수신하는 다른 프로세스가 있음을 보여줍니다.
netstat
출력 은 다음 과 같습니다 .
$ sudo netstat -n -a -p | grep 34797
tcp6 0 0 127.0.0.1:34797 :::* LISTEN 4210/java
tcp6 0 0 :::34797 :::* LISTEN -
사용해보니 rpcinfo
NFS인 것을 확인했습니다 nlockmgr
. 소켓 서버를 동일한 포트에 명시적으로 바인딩하여 34797
문제를 재현 할 수 있습니다.
rpc.mountd
NFS 서비스( , ) 에서 사용하는 포트에만 적용됩니다 nlockmgr
. 기존 애플리케이션이 인터페이스에 바인딩된 포트에 대해 동일한 작업을 수행하려고 하면 ::
바인딩 " Address already in use
" 오류가 발생합니다. 이는 예상한 대로입니다.
요청을 받기 위해 실행 중인 서비스를 엉망으로 만들기 때문에 이것이 문제가 됩니다.
내 질문은 NFS 서비스가 왜 그렇게 특별하고 Linux에서 (이미 사용 중인 임시 포트를 할당하여) 이런 일이 발생하도록 허용하는 이유입니다.
답변1
일반적으로 말해서, 당신이 경험하는 것은할 수 있는IPv6의 경우 기존 방식을 유지하세요.
귀하의 경우 "모든 주소" 바인딩은 IPv6 주소이고 "localhost" 주소 바인딩은 IPv4 주소입니다. IPv6 "모든 주소"에 대한 애플리케이션 바인딩이 설정된 경우IPV6_V6ONLY
소켓 옵션.
Linux에서 이 옵션에는 보고 설정할 수 있는 시스템 전체 기본값도 있으므로 IPv4와 IPv6 /proc/sys/net/ipv6/bindv6only
가 0
TCP/UDP 포트 번호 공간을 공유하게 됩니다.
127.0.0.1:34797 LISTEN
또한 소켓에 태그가 지정되었다는 사실은 tcp6
이 목적과 관련이 없습니다. IPv6 네트워크 스택에서 지원하더라도 IPv4 주소로 간주되기 때문입니다. 이것은 또한표준 행동.
귀하의 경우 결과는 TCP 연결이 애플리케이션 127.0.0.1:34797
으로 이동하는 java
반면 동일한 포트에 대한 연결이지만 컴퓨터의 IPv6 주소는 NFS 잠금 서버로 이동한다는 것입니다.
NFS 개발자가 이 작업을 선택한 이유1에 대해서는 잘 모르겠지만 NFS에만 국한된 것은 아닙니다. IPv4 및 IPv6 주소(기본적으로 "모든 주소" 모두), IPv4 0.0.0.0
및 IPv6 주소를 각각 바인딩하는 OpenSSH 데몬을 참조하세요 ::
.
게다가 일부 운영 체제에서는 해당 옵션도 지원하지 않으며 IPV6_V6ONLY
(예: 설정을 허용하지 않음) 해당 시스템에서 얻을 수 있는 유일한 동작은 IPv4와 IPv6 사이의 포트 번호 공간이 완전히 분리되는 것뿐입니다. IPv4와 IPv6를 모두 지원하려면 동일한 포트를 두 번 바인딩하십시오.