소스 포트는 어떻게 결정되며 특정 포트를 강제로 사용하려면 어떻게해야합니까


26

https://www.google.co.uk에 연결하면 216.58.198.228:443으로 변경됩니다. 그런 다음 [My IP Address] : 63998에서 나와 연결이 열립니다.

내 질문은 63998 포트가 어떻게 선택되고 63999가되도록 강제하는 방법이 있습니다.


9
63999가되도록 강요 할 방법 이 있습니까?이 작업을 시도 할 이유가 있습니까?
AL

1
응용 프로그램을 작성하는 경우 원하는 (사용하지 않은) 소스 포트를 열 수 있습니다. 그러나 좋은 생각이 아니며 왜 이것을 원하는지 명확하지 않습니까?
pjc50

6
@ pjc50 사실,이 질문은 XY 문제 가있는 것 같습니다 .
Dev

1
대상 포트 번호가 대상 컴퓨터에 "로컬"이기 때문에 제목을 "local"이 아닌 "source"로 변경하도록 편집을 제출했지만 초기 TCP SYN 패킷의 소스는 명확하게 연결.
몬티 세게

답변:


39

로컬 포트는 어떻게 결정됩니까?

포트 번호는 TCP 구현 소프트웨어에 의해 Ephemeral Ports 라는 포트 번호 범위에서 선택됩니다 .

사용할 포트 번호와 범위를 선택하는 정확한 메커니즘은 운영 체제에 따라 다릅니다.


그것을 63999로 강제하는 방법이 있습니까?

이것은 TCP 구현 소프트웨어의 구성을 변경하여 수행 할 수 있습니다.

다양한 운영 체제에 대한 임시 포트 범위 구성에 대한 지시 사항은 임시 포트 범위 변경에서 찾을 수 있습니다 .

  • Linux 및 Windows에 대한 지침은이 답변에 참조 용으로 포함되어 있습니다.

그러나 범위를 단일 포트로 제한하는 것은 좋지 않습니다 (예 :) 63999.

  • 실제로 Windows에서는 다음과 같이 불가능합니다.

    설정할 수있는 최소 포트 범위는 255입니다.


임시 포트 범위

TCP / IPv4 연결은 두 개의 엔드 포인트로 구성되며 각 엔드 포인트는 IP 주소와 포트 번호로 구성됩니다. 따라서 클라이언트 사용자가 서버 컴퓨터에 연결할 때 설정된 연결은 4 개의 튜플 (서버 IP, 서버 포트, 클라이언트 IP, 클라이언트 포트)로 생각할 수 있습니다.

일반적으로 4 개 중 3 개는 쉽게 알 수 있습니다. 클라이언트 컴퓨터는 자체 IP 주소를 사용하며 원격 서비스에 연결할 때는 서버 컴퓨터의 IP 주소와 서비스 포트 번호가 필요합니다.

즉시 명백하지 않은 것은 연결이 설정 될 때 연결의 클라이언트 측이 포트 번호를 사용한다는 것입니다. 클라이언트 프로그램이 특정 포트 번호를 명시 적으로 요청하지 않는 한 사용 된 포트 번호는 임시 포트 번호입니다.

임시 포트는 머신의 IP 스택에 의해 할당 된 임시 포트이며,이를 위해 지정된 포트 범위에서 할당됩니다. 연결이 종료되면 임시 포트를 재사용 할 수 있지만 대부분의 IP 스택은 전체 임시 포트 풀이 사용될 때까지 해당 포트 번호를 재사용하지 않습니다.

따라서 클라이언트 프로그램이 다시 연결되면 새 연결 측면에 다른 임시 포트 번호가 할당됩니다.

임시 포트 범위 소스


임시 포트 범위 변경

리눅스 :

Linux에서는 단순히 파일을 사용하여 임시 포트 범위를보고 변경할 수 있습니다 /proc/sys/net/ipv4/ip_local_port_range. 예를 들어, 커널 2.2 시스템의 기본 구성을 보여줍니다.

$ cat /proc/sys/net/ipv4/ip_local_port_range 
1024 4999

이를 원하는 범위로 변경하려면 다음을 수행하십시오 (수퍼 유저).

# echo "49152 65535" > /proc/sys/net/ipv4/ip_local_port_range 

시스템을 부팅 할 때마다이 작업을 수행해야 /etc/rc.local 하므로 범위가 항상 사용되도록 시스템 시작 스크립트에 행을 추가해야합니다 .

또한 적절한 커널 메모리가 사용 가능한 경우 Linux 2.4 커널은 기본적으로 32768에서 61000 사이의 범위를 가지므로 새로운 Linux 시스템에서는 범위를 변경하지 않아도됩니다.

마지막으로, 파일 시스템을 sysctl사용하지 않고 인터페이스를 사용하여 설정을 변경할 수 있습니다 /proc. sysctl매개 변수 의 이름 은 "net.ipv4.ip_local_port_range"입니다. /etc/sysctl.conf파일을 가지고있는 경우 파일을 편집 하거나을 sysctl사용하여이 매개 변수를 변경하려면 시작 스크립트가 명령을 수동으로 실행하도록하십시오 sysctl.

Windows Vista / Windows Server 2008 이상 :

Windows Vista 및 Windows Server 2008에서 Microsoft 기술 자료 문서 929851 에 따라 Windows는 기본적으로 넓은 범위 (49152-65535)를 사용합니다 . 같은 기사에서 원하는 경우 범위를 변경하는 방법도 보여 주지만 이제 기본 범위는 대부분의 서버에 충분합니다.

임시 포트 범위 변경 소스

다음 netsh명령 을 사용하여 Windows Vista 또는 Windows Server 2008 컴퓨터를 실행하는 컴퓨터에서 동적 포트 범위를 볼 수 있습니다 .

netsh int ipv4 show dynamicport tcp
netsh int ipv4 show dynamicport udp
netsh int ipv6 show dynamicport tcp
netsh int ipv6 show dynamicport udp 

노트:

  • 범위는 각 전송 및 IP 버전마다 별도로 설정됩니다.
  • 포트 범위는 이제 시작점이 있고 끝 점이있는 범위입니다.
  • Windows Server 2008을 실행하는 서버를 배포하는 Microsoft 고객은 내부 네트워크에서 방화벽을 사용하는 경우 서버 간의 RPC 통신에 문제가있을 수 있습니다.
  • 이 경우, 우리는 당신의 동적 포트 범위에서 서버 간의 트래픽을 허용하도록 방화벽을 다시 구성하는 것이 좋습니다 49152 통해 65535.
  • 이 범위는 서비스 및 응용 프로그램에서 사용하는 잘 알려진 포트에 추가됩니다.
  • 또는 서버에서 사용하는 포트 범위를 각 서버에서 수정할 수 있습니다.

netsh다음과 같이 명령 을 사용하여이 범위를 조정하십시오 .

netsh int <ipv4|ipv6> set dynamic <tcp|udp> start=number num=range

이 명령은 TCP의 동적 포트 범위를 설정합니다. 시작 포트는 숫자이고 총 포트 수는 범위입니다. 다음은 샘플 명령입니다.

netsh int ipv4 set dynamicport tcp start=10000 num=1000
netsh int ipv4 set dynamicport udp start=10000 num=1000
netsh int ipv6 set dynamicport tcp start=10000 num=1000
netsh int ipv6 set dynamicport udp start=10000 num=1000

이 샘플 명령은 포트 10000에서 시작하고 포트 10999(1000 포트) 에서 끝나도록 동적 포트 범위를 설정합니다 .

노트:

  • 설정할 수있는 최소 포트 범위는 255입니다.
  • 설정할 수있는 최소 시작 포트는 1025입니다.
  • 구성중인 범위에 따라 최대 끝 포트는을 (를) 초과 할 수 없습니다 65535.
  • Windows Server 2003의 기본 동작을 복제하려면 1025시작 포트로 사용한 다음 3976TCP 및 UDP의 범위 로 사용 하십시오. 결과적으로 시작 포트 1025는 종료 포트가 5000됩니다.

소스 Microsoft 기술 자료 문서 929851 :

Windows XP 및 이전 버전 :

구형 Windows 운영 체제 (Windows XP 및 이전 버전)의 경우 Windows는 기존 포트 범위에 기존 BSD 범위 1024-4999를 사용합니다. 불행히도 임시 포트 범위의 상한 만 설정할 수 있습니다. 다음은 Microsoft 기술 자료 문서 196271 에서 발췌 한 정보입니다 .

  • 레지스트리 편집기 ( Regedt32.exe)를 시작하십시오 .
  • 레지스트리에서 다음 키를 찾으십시오.

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

  • "편집"메뉴에서 "값 추가"를 클릭하고 다음 레지스트리 값을 추가하십시오.

    값 이름 : MaxUserPort데이터 유형 : REG_DWORD값 : 65534(예 :)

    유효 범위 : 5000-65534(소수) 기본값 : 0x1388(소수 5000)

    설명 :이 매개 변수는 응용 프로그램이 시스템에서 사용 가능한 사용자 포트를 요청할 때 사용되는 최대 포트 번호를 제어합니다. 일반적으로 임시 (즉, 수명이 짧은) 포트는 값 10245000포함 값 사이에 할당 됩니다.

  • 레지스트리 편집기를 종료하십시오.

참고 : 제외 범위를 설정할 수 있다고 주장하는 관련 기술 자료 문서 ( 812873 )가 있습니다. 즉, 포트를 제외 1024-9999하여 임시 포트 범위가되도록 할 수 있습니다 10000-65534. 그러나이 작업을 수행 할 수 없었습니다 (2004 년 10 월 기준).

임시 포트 범위 변경 소스


1
최소한 창문은 포트 범위 시스템을 제한하는 것이 가능해 보입니다. 대부분의 경우 이것은 아마도 잘못된 생각 일 수 있습니다. 특히 하나의 포트로 제한하는 것은 다음과 같습니다. KB 929851 참조 , 적어도 나열된 명령은 Windows 7에서 작동합니다.
Seth

@Seth 예. OP가 자신의 OS를 언급하지 않았기 때문에 이것을 언급하는 것을 꺼려했으며 N 운영 체제를 다루는 대답을 확장하고 싶지 않았습니다 ...
DavidPostill

당신 말이 맞아요 결국 많은 운영 체제가 있습니다. 원래이 질문에 대답하려고 시도했을 때 우연히 발견되었습니다. 귀하의 답변이 더 빨라 졌을 때 나는 그것을 추가 할 것이라고 생각했습니다. 정말 잘 작성된 답변입니다! :) 방금 프로그램을 변경하는 대신 구성을 변경하는 것으로 충분하다는 힌트로 방금 추가했습니다 (재 컴파일과 비슷한 소리로 이해가 다를 수 있습니다).
세스

1
실제로 Linux에서도 매우 간단합니다. echo "49152 65535"> / proc / sys / net / ipv4 / ip_local_port_range 만 수행하십시오 . 명령 별로 수행 할 수있을 정도로 간단합니다 .
MariusMatutiae

2
임시 포트 범위를 변경하는 대신 bind호출하기 전에 응용 프로그램에서 시스템 호출을 호출하는 것이 훨씬 좋습니다 connect. 일부 응용 프로그램에는 옵션이 있지만 다른 응용 프로그램에는 없습니다.
kasperd

9

David Postill의 답변은 완벽합니다. 나는 리눅스 에서 임시 포트 범위를 변경하는 것이 너무 간단하여 OP가 긍정적 인 대답을하도록 강조함으로써 그것에 덧붙이고 싶습니다 .

다음과 같이 EPR을 변경하십시오.

echo "40000 60000" > /proc/sys/net/ipv4/ip_local_port_range 

다음 스크립트를 사용하여 포트 50000 (예 :)을 선택할 수 있습니다.

OLD_RANGE=$(cat /proc/sys/net/ipv4/ip_local_port_range)
MY_PORT=50000
echo "$MY_PORT $MY_PORT" > /proc/sys/net/ipv4/ip_local_port_range
sudo -u SomeUser SomeApplication  & 
echo $OLD_RANGE" > /proc/sys/net/ipv4/ip_local_port_range 

한 가지주의 사항 : 범위 내에 단일 포트가 있기 때문에 다른 응용 프로그램이 위의 세 번째 줄과 네 번째 줄을 실행하는 사이에 포트를 빼앗을 수 있습니다. 또한 경쟁 조건이 없어도 큰 EPR을 복원 할 때까지 다른 모든 응용 프로그램을 마비 시키므로 가능한 빨리 원래 범위를 복원해야합니다.

따라서, 경우 작전 '운영체제가 리눅스 있었다, 대답은 쉽게 할 수 있었을 것이다.

놀랍게도, 이것은 BSD에서 간단하지 않으며, 일부는 EPR에 대한 런타임 커널 설정조차 없습니다. MacOS X, FreeBSD 및 OpenBSD는 /etc/sysctl.conf 파일을 수정해야 하지만 EPR에 대해 다른 선택이 있습니다.

위와 OS에 관계없이 무언가 할 수 있다는 사실이 반드시 수행 되어야 한다는 것을 의미하지는 않습니다 . 왜 지구상에서 이것이 필요합니까? 단일 사용 사례를 생각할 수 없습니다.


Linux 예 +1의 경우
DavidPostill

헤헤 BSD / OS는 커널을 재 컴파일해야합니다 :)
DavidPostill

1
@DavidPostill 그것은 충격 입니다.
MariusMatutiae

코드 예제에 결함이 있습니다. 타입 캐스트가 잘못 배치되었습니다. 또한 BIND_PORT코드를 여전히 원본과 정확히 동일한 방식으로 사용할 수 있도록 옵션을 선택 하는 것이 좋습니다 . 나는 htons(bind_port_env ? atoi(bind_port_env) : 0)옳은 일을 할 것이라고 생각 합니다.
kasperd

1

리눅스 커널도 가지고 있다고 덧붙일 가치가있다

net.ipv4.ip_local_reserved_ports

다소 반대의 역할을하는 노브이지만 그럼에도 불구하고 임시 포트 범위에서 특정 포트를 여는 서비스에 대해 "구멍을 뚫을"수 있기 때문에 매우 유용 할 수 있습니다.

문서 에서 간략하게 발췌 :

알려진 타사 응용 프로그램 용으로 예약 된 포트를 지정하십시오. 이 포트는 자동 포트 할당에 사용되지 않습니다 (예 : 포트 번호가 0 인 connect () 또는 bind ()를 호출 할 때). 명시 적 포트 할당 동작은 변경되지 않습니다.

입력 및 출력 모두에 사용되는 형식은 쉼표로 구분 된 범위 목록입니다 (예 : 포트 1, 2, 3, 4 및 10의 경우 "1,2-4,10-10"). 파일에 쓰면 이전에 예약 된 모든 포트가 지워지고 입력에 제공된 포트로 현재 목록이 업데이트됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.