애플리케이션이 포트에 바인딩될 때 /etc/services가 적극적으로 사용됩니까?

애플리케이션이 포트에 바인딩될 때 /etc/services가 적극적으로 사용됩니까?

애플리케이션이 바인딩할 포트를 찾을 때 /etc/services충돌이 발생하지 않는지 확인하기 위해 적극적으로 검색합니까? 즉, 에 포트가 등록되어 있으면 /etc/services실제 사용 여부와 상관없이 예약되어 있는 것인가요?

답변1

각 TCP 연결에는 하나가 포함되지 않지만포트 번호: 로컬 포트 ​​및 원격 포트. 나가는 연결에서 로컬 포트 ​​번호는 중요하지 않으며 대부분의 프로그램에서는 운영 체제가 이를 선택하도록 합니다. binsta가 지적했듯이 운영 체제는 임시 포트 범위에서 첫 번째 사용 가능한 포트를 자동으로 선택합니다.

그러나 애플리케이션(또는 애플리케이션을 실행하는 사용자)은 연결할 원격 포트 번호를 지정해야 합니다. 그렇지 않으면 원격 호스트에서 올바른 서비스에 연결할 수 없습니다.

들어오는 연결의 경우 상황이 미러링됩니다. 서버 응용 프로그램은 일반적으로 운영 체제가 들어오는 연결을 수신할 로컬 포트 ​​번호를 선택하도록 할 수 없습니다. 그렇지 않으면 클라이언트는 연결할 포트를 알 수 없습니다. 그러나 들어오는 연결을 수신하는 응용 프로그램은 종종 원격 포트 번호를 무시하고 원격 호스트가 이를 결정하도록 합니다.

(일부 서비스는 완전 동적 포트 번호를 사용하며 종종 지원 검색 프로토콜을 사용하여 서버가 수신 대기 중인 포트를 알아냅니다. NFSv3은 rpc.statd아마도 rpc.mountd현대 Linux 사용자에게 가장 친숙한 예일 것입니다. 원격 호스트에 연결하려면 다음을 수행해야 합니다. 먼저 111의 RPC portmapper 포트에서 해당 호스트에 접속하고 서비스가 어떤 포트에 있는지 물어보세요.

일부 서버 응용 프로그램(예: 주로 클래식 Unix 서버 응용 프로그램 inetd)은 사용할 로컬 포트를 이름으로 찾을 수 있으며 getportbyname()일반적으로 에서 가져옵니다 /etc/services.

그러나 애플리케이션은 이 단계를 건너뛰고 원하는 포트를 숫자로 직접 지정할 수 있습니다. 대부분의 최신 응용 프로그램은 이 작업을 수행하는 경향이 있습니다. 번호별로 수신 포트를 구성해야 하는 모든 서버 프로그램이 이 작업을 수행할 것입니다.

요즘 더 일반적으로 사용되는 응용 프로그램 은 출력의 포트 번호를 보다 인간 친화적인 이름으로 대체할 수 있는 , 또는 와 같은 응용 프로그램 /etc/services일 것입니다 . 하지만 이름 조회를 위한 이 포트 번호는 설명에만 의존할 수 있다는 점을 기억해야 합니다.lsofnetstattcpdump/etc/services일반적인 용도: 포트에 대한 정확한 설명일 수도 있고 아닐 수도 있습니다.실제 사용특정 시스템에서.

/etc/services따라서 "포트가 에 등록되어 있으면 예약되어 있습니까?" 라는 질문에 대한 대답은 다음과 같습니다.아니요, 그렇지 않습니다..

일부/etc/services포트 번호가 애플리케이션 구성에서 직접 지정되거나 사용자가 지정하지 않는 한, 애플리케이션은 이를 사용하여 사용할 포트 번호를 결정할 수 있습니다 .

"충돌"에 대한 보호는 운영 체제 수준에서 발생하며 다음 상황과 전혀 관련이 없습니다 /etc/services. 응용 프로그램이 bind(2)특정 포트 번호를 사용하려고 함을 지정하기 위해 시스템 호출을 하고 해당 포트가 이미 다른 프로그램에서 사용 중인 경우, 시스템 호출이 실패합니다. EADDRINUSE이는 다른 것이 이미 그것을 사용하고 있음을 나타냅니다.

답변2

아니요, 애플리케이션은 포트 바인딩을 요청하지만 실제로 애플리케이션에 포트를 할당할지 여부를 결정하는 것은 운영 체제입니다.

root따라서 예를 들어 1024보다 작은 포트는 유능한 사용자 만 사용할 수 있습니다 CAP_NET_BIND_SERVICE.

proc/sys/net/ipv4/ip_local_port_range임시 포트 범위라고 하는 로컬 포트를 선택하기 위해 TCP 및 UDP 트래픽이 사용하는 로컬 포트 ​​범위를 정의합니다(변경 가능).

cat /proc/sys/net/ipv4/ip_local_port_range

32768   60999

또는

sysctl net.ipv4.ip_local_port_range

net.ipv4.ip_local_port_range = 32768    60999

/proc/sys/net/ipv4/ip_local_reserved_ports또한 일부 포트는 관리자가 구성 또는 커널 매개변수를 통해 예약할 수 있으므로 net.ipv4.ip_local_reserved_ports이러한 포트는 자동 포트 할당에 사용되지 않습니다.

목적 은 프로그램이 사용해야 하는 포트를 얻기 위해 코드에서 소켓 호출을 수행할 /etc/services수 있도록 하는 것입니다 .getportbyname()

답변3

많은 응용 프로그램에는잘 알려진 포트 번호. 그들은 대개 그것에 묶여 있을 것입니다.

다른 응용 프로그램은 포트 0에 바인딩되어 시스템이 사용 가능한 포트를 선택하게 됩니다. 그런 다음 잘 알려진 포트 번호 외에 다른 방법을 사용하여 포트 번호를 최종 클라이언트에 전달합니다. 예를 들어 네트워크에 가용성을 브로드캐스트합니다.

답변4

소화할 게 너무 많아요. 나는 필요한 답을 얻었다고 생각합니다. /etc/services는 잘 알려진 서비스와 공식 이름의 등록일 뿐입니다. getportbyname()을 사용하여 직접 참조할 수 있지만 필수는 아닙니다. 동적 포트가 요청되면 나가는 포트가 요청될 수 있습니다. ip_local_port_range는 허용되는 포트 범위에 대한 참조입니다. 관리자는 특정 포트를 /proc/sys/net/ipv4/ip_local_reserved_ports 또는 커널 매개변수 rnet.ipv4.ip_local_reserved_ports에 추가하여 예약할 수 있습니다. 자동 포트 할당에서는 이러한 포트를 사용하지 않습니다. 제가 맞다면 제가 이 질문을 하는 이유는 제가 AIX의 안전한 온프레미스 세계에서 Azure Cloud 및 SUSE로 전환했기 때문입니다. 클라우드 클러스터의 경우 로드 밸런서 기능을 사용하여 클러스터 노드 간에 이동할 서비스 IP 주소 등을 정의합니다. 사용할 특정 포트(예: 62500)를 할당해야 합니다. 최근 Commvault라는 백업 소프트웨어를 테스트하고 있는데 클러스터가 시작되기 전에 동일한 포트를 점유하는 경우가 가끔 있어서 이를 방지할 수 있는 방법을 찾아보았습니다. 기본 로컬 포트 ​​범위를 변경하여 높은 표시가 62499가 되도록 하거나 포트를 ip_local_reserved_ports에 특별히 추가해야 할 것 같습니다. 모든 내용이 정확하다면 빠른 도움을 주신 모든 분들께 감사드립니다.

관련 정보