응용 프로그램을위한 포트를 어떻게 예약합니까?


29

사용자 지정 응용 프로그램을위한 포트 목록을 어떻게 예약합니까?

구체적으로 말하면, 내가 만들고있는 제품에는 많은 프로세스와 많은 상호 통신이 있습니다.

내가 겪고있는 문제는-가끔씩-OS가 내 포트를 훔친다는 것입니다. 드물지만 발생합니다.

다른 애플리케이션이 포트를 지정하지 않고 ":: bind"를 사용했기 때문일 수 있습니다.

또는 언 바운드 소켓으로 ":: connect"를 호출하면 내 응용 프로그램이 포트를 훔칩니다. 매뉴얼 페이지에서 볼 수 있듯이 :

소켓이 로컬 주소에 아직 바인딩되지 않은 경우 connect ()는 소켓의 주소 패밀리가 AF_UNIX가 아닌 한 사용되지 않는 로컬 주소 인 주소에 바인딩해야합니다.

그래서 제 질문은 OS가 사용하지 않도록 필요한 포트를 예약 할 수 있습니까? / etc / services를 사용하여이 작업을 수행 할 수 있습니까? 아니면 다른 방법이 있습니까?


1
대신 AF_UNIX 소켓을 사용할 수 있습니까?
— alex

2
왜 자신의 응용 프로그램이 '스틸 링 포트'인지 걱정하십니까?
— EightBitTony

소프트웨어를 살펴보고 각 연결의 클라이언트 쪽을 특정 포트에 바인딩해야하는지 토론했습니다. 내 응용 프로그램에 많은 연결 경로 가 있기 때문에 이것을 업데이트하는 것은 꽤 일입니다 . 내가 할 시간을 찾을 때까지 OS에서 포트를 예약하는 것이 좋은 스톱 갭 솔루션이었습니다.
— Michael Baker

SELinux시행 모드에서 요구 사항을 충족시킬 수 있는지 확실하지 않지만 여전히 배우고 있습니다. 따라서 추측으로 포트와 같은 포트 SELinux를 예약 하기위한 고유 한 정책을 정의 할 수 있습니다 my_server_port_t tcp 1111, 2222, 3333, 4444-4600. 응용 프로그램이 서버 응용 프로그램이 아닌 모든 곳에서 실행될 경우 SELinuxON 또는 OFF 여부를 제어 할 수 없습니다 .
— LiuYan 刘 研

"훔치기"란 제 3 자 앱이 0에 바인딩하도록 요청했으며 OS가 선택한 포트 번호를 타사 앱. 이 경우, 참조 unix.stackexchange.com/a/38724/27865
— 마크 Lakata

답변:


14

기술적으로 "예약 된 포트"는 없습니다.

TCP / UDP에서 포트를 "예약"하는 유일한 방법은 실제로 bind()소켓을 사용하는 것입니다. 바인딩 된 포트는 다른 응용 프로그램에서 사용되지 않습니다. 사용되지 않는 포트는 사용되지 않으므로 다른 응용 프로그램에서 자유롭게 사용할 수 있습니다.

서버 소프트웨어를 작성하는 경우 애플리케이션 코드에서 원하는대로 소켓을 특정 포트에 바인딩 할 수 있습니다. 시스템 관리자가 충돌을 빠르게 식별하고 충돌하는 응용 프로그램을 별도의 서버로 옮길 수 있도록 포트 번호를 구성 가능하게하거나 문서에서 포트 번호를 명확하게 명시하십시오.


1
또한 가능하면 잘 알려진 / 예약 된 포트를 사용하지 마십시오.
— EightBitTony

때때로 예약 된 포트가 있습니다. 이것은 일반적인 조언이지만 Linux에서는 정답이 아닙니다.
— Jason Newton

18

커널이 Linux의 서버에 사용할 때 49000 및 49001을 클라이언트에 제공하지 않도록하십시오.

sysctl -w net.ipv4.ip_local_reserved_ports = 49000, 49001

에 /etc/sysctl.conf넣은 다음 실행하십시오 sysctl -p.

이것은 테스트되지 않았습니다.

참고 문헌


나는 이것을 시도했지만 내 응용 프로그램이 포트를 사용하지 못하게했습니다! 이름으로 포트 번호를 정의하는 것은 /etc/services어떻습니까?

@ user134197 바인드 요청에 0이 아닌 포트 번호를 명시 적으로 사용하는 경우 응용 프로그램에서 해당 포트를 사용하지 못하게해서는 안됩니다. 그것은 나를 위해 작동합니다.
— Mark Lakata

15

실제로 위의 대답은 완전히 정확하지 않습니다. sysctls net.inet.ip.portrange.first 및 net.inet.ip.portrange.last는 OS가 임의 포트에 할당 할 수있는 포트 범위를 지정합니다. 애플리케이션에 예약 된 포트 범위가이 변수에 포함되지 않도록하려고합니다.

FreeBSD 핸드북 섹션 12.14를 살펴보십시오 . 커널 제한 조정 . 그러나 동일한 기본 전제가 Linux에도 적용되어야합니다.


또한이 링크가 도움이 될 수 있습니다. stackoverflow.com/questions/913501/…
— MattK

3
나는 리눅스라고 불린다net.ipv4.ip_local_port_range
— Brian Gordon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.