https://www.google.co.uk에 연결하면 216.58.198.228:443으로 변경됩니다. 그런 다음 [My IP Address] : 63998에서 나와 연결이 열립니다.
내 질문은 63998 포트가 어떻게 선택되고 63999가되도록 강제하는 방법이 있습니다.
https://www.google.co.uk에 연결하면 216.58.198.228:443으로 변경됩니다. 그런 다음 [My IP Address] : 63998에서 나와 연결이 열립니다.
내 질문은 63998 포트가 어떻게 선택되고 63999가되도록 강제하는 방법이 있습니다.
답변:
포트 번호는 TCP 구현 소프트웨어에 의해 Ephemeral Ports 라는 포트 번호 범위에서 선택됩니다 .
사용할 포트 번호와 범위를 선택하는 정확한 메커니즘은 운영 체제에 따라 다릅니다.
이것은 TCP 구현 소프트웨어의 구성을 변경하여 수행 할 수 있습니다.
다양한 운영 체제에 대한 임시 포트 범위 구성에 대한 지시 사항은 임시 포트 범위 변경에서 찾을 수 있습니다 .
그러나 범위를 단일 포트로 제한하는 것은 좋지 않습니다 (예 :) 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
시작 포트로 사용한 다음3976
TCP 및 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)설명 :이 매개 변수는 응용 프로그램이 시스템에서 사용 가능한 사용자 포트를 요청할 때 사용되는 최대 포트 번호를 제어합니다. 일반적으로 임시 (즉, 수명이 짧은) 포트는 값
1024
과5000
포함 값 사이에 할당 됩니다.레지스트리 편집기를 종료하십시오.
참고 : 제외 범위를 설정할 수 있다고 주장하는 관련 기술 자료 문서 ( 812873 )가 있습니다. 즉, 포트를 제외
1024-9999
하여 임시 포트 범위가되도록 할 수 있습니다10000-65534
. 그러나이 작업을 수행 할 수 없었습니다 (2004 년 10 월 기준).
임시 포트 범위 변경 소스
bind
호출하기 전에 응용 프로그램에서 시스템 호출을 호출하는 것이 훨씬 좋습니다 connect
. 일부 응용 프로그램에는 옵션이 있지만 다른 응용 프로그램에는 없습니다.
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에 관계없이 무언가 할 수 있다는 사실이 반드시 수행 되어야 한다는 것을 의미하지는 않습니다 . 왜 지구상에서 이것이 필요합니까? 단일 사용 사례를 생각할 수 없습니다.
BIND_PORT
코드를 여전히 원본과 정확히 동일한 방식으로 사용할 수 있도록 옵션을 선택 하는 것이 좋습니다 . 나는 htons(bind_port_env ? atoi(bind_port_env) : 0)
옳은 일을 할 것이라고 생각 합니다.
리눅스 커널도 가지고 있다고 덧붙일 가치가있다
net.ipv4.ip_local_reserved_ports
다소 반대의 역할을하는 노브이지만 그럼에도 불구하고 임시 포트 범위에서 특정 포트를 여는 서비스에 대해 "구멍을 뚫을"수 있기 때문에 매우 유용 할 수 있습니다.
문서 에서 간략하게 발췌 :
알려진 타사 응용 프로그램 용으로 예약 된 포트를 지정하십시오. 이 포트는 자동 포트 할당에 사용되지 않습니다 (예 : 포트 번호가 0 인 connect () 또는 bind ()를 호출 할 때). 명시 적 포트 할당 동작은 변경되지 않습니다.
입력 및 출력 모두에 사용되는 형식은 쉼표로 구분 된 범위 목록입니다 (예 : 포트 1, 2, 3, 4 및 10의 경우 "1,2-4,10-10"). 파일에 쓰면 이전에 예약 된 모든 포트가 지워지고 입력에 제공된 포트로 현재 목록이 업데이트됩니다.