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


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.