Linux는 NFS 서비스에서 사용되며 모든 인터페이스 "::"에 바인딩되는 임시 포트를 제공합니다.

Linux는 NFS 서비스에서 사용되며 모든 인터페이스 "::"에 바인딩되는 임시 포트를 제공합니다.

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      -         

사용해보니 rpcinfoNFS인 것을 확인했습니다 nlockmgr. 소켓 서버를 동일한 포트에 명시적으로 바인딩하여 34797문제를 재현 할 수 있습니다.

rpc.mountdNFS 서비스( , ) 에서 사용하는 포트에만 적용됩니다 nlockmgr. 기존 애플리케이션이 인터페이스에 바인딩된 포트에 대해 동일한 작업을 수행하려고 하면 ::바인딩 " Address already in use" 오류가 발생합니다. 이는 예상한 대로입니다.

요청을 받기 위해 실행 중인 서비스를 엉망으로 만들기 때문에 이것이 문제가 됩니다.

내 질문은 NFS 서비스가 왜 그렇게 특별하고 Linux에서 (이미 사용 중인 임시 포트를 할당하여) 이런 일이 발생하도록 허용하는 이유입니다.

답변1

일반적으로 말해서, 당신이 경험하는 것은할 수 있는IPv6의 경우 기존 방식을 유지하세요.

귀하의 경우 "모든 주소" 바인딩은 IPv6 주소이고 "localhost" 주소 바인딩은 IPv4 주소입니다. IPv6 "모든 주소"에 대한 애플리케이션 바인딩이 설정된 경우IPV6_V6ONLY소켓 옵션.

Linux에서 이 옵션에는 보고 설정할 수 있는 시스템 전체 기본값도 있으므로 IPv4와 IPv6 /proc/sys/net/ipv6/bindv6only0TCP/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를 모두 지원하려면 동일한 포트를 두 번 바인딩하십시오.

1. 자세히 조사해본 적은 없지만여기 관련 코드 조각일 수 있음

관련 정보