Computer >> 컴퓨터 >  >> 시스템 >> Windows Server

Windows 포트 포워딩 완벽 가이드: netsh portproxy로 포트 전달 설정하기

Windows에서는 별도의 서드파티 도구 없이 모든 버전에서 네트워크 포트 포워딩(포트 전달)을 구성할 수 있습니다. 포트 전달 규칙을 사용하면 로컬 TCP 포트로 들어오는 연결(IPv4 또는 IPv6)을 다른 포트 번호로 리디렉션하거나, 심지어 원격 컴퓨터의 포트까지 전달할 수 있습니다. 흥미로운 점은 해당 TCP 포트에서 실제로 대기 중인 서비스가 Windows에 존재하지 않아도 된다는 것입니다. Windows 포트 포워딩은 주로 방화벽 우회나 내부 호스트·서비스를 외부 네트워크로부터 숨기는 용도(NAT/PAT)로 활용됩니다.

Linux 환경에서는 iptablesfirewalld를 사용해 비교적 간단하게 포트 포워딩을 구성합니다. Windows Server에서는 일반적으로 라우팅 및 원격 액세스 서비스(RRAS)로 포트 리디렉션을 설정하지만, 사실 어떤 Windows 버전에서든 잘 작동하는 훨씬 간단한 방법이 있습니다.

netsh Portproxy로 Windows 10 포트 포워딩 구성하기

Windows에서는 Netsh 명령의 Portproxy 모드를 사용해 포트 포워딩을 구성할 수 있습니다. 기본 명령어 구문은 다음과 같습니다.

netsh interface portproxy add v4tov4 listenaddress=localaddress listenport=localport connectaddress=destaddress connectport=destport

각 매개변수의 의미는 다음과 같습니다.

  • listenaddress – 들어오는 연결을 수신할 로컬 IP 주소입니다(여러 개의 NIC가 있거나 하나의 인터페이스에 여러 IP가 할당된 경우 유용).
  • listenport – 연결을 대기할 로컬 TCP 포트 번호입니다.
  • connectaddress – 들어오는 연결을 전달할 로컬 또는 원격 IP 주소(또는 DNS 이름)입니다.
  • connectportlistenport에서 받은 연결이 전달될 TCP 포트 번호입니다.

v4tov6, v6tov4, v6tov6 옵션을 사용하면 IPv4와 IPv6 주소 간의 포트 포워딩 규칙도 만들 수 있습니다.

실전 예제: RDP 포트 변경하기

RDP 서비스가 비표준 포트(예: 3340)로 응답하도록 만들어 보겠습니다. 물론 원격 데스크톱 서비스 설정에서 직접 포트를 변경할 수 있지만, 포트 포워딩을 시연하기에는 RDP가 가장 직관적인 예제입니다. 목표는 TCP 3340 포트로 들어오는 트래픽을 기본 RDP 포트인 3389로 전달하는 것입니다.

먼저 listenport에 지정할 로컬 포트가 다른 서비스나 프로세스에 의해 이미 사용 중이지 않은지 확인해야 합니다. 다음 명령으로 확인할 수 있습니다.

netstat -na|find "3340"

PowerShell의 Test-NetConnection cmdlet으로도 포트가 로컬에서 사용 중인지 확인 가능합니다.

Test-NetConnection -ComputerName localhost -Port 3340

이제 관리자 권한으로 명령 프롬프트를 실행하고 다음 명령을 입력해 포트 포워딩 규칙을 생성합니다.

netsh interface portproxy add v4tov4 listenport=3340 listenaddress=10.1.1.110 connectport=3389 connectaddress=10.1.1.110

여기서 10.10.1.110은 현재 컴퓨터의 IP 주소입니다.

netstat 도구로 Windows가 이제 로컬 3340 포트에서 수신 대기 중인지 확인합니다.

netstat -ano | findstr :3340

참고: 이 명령이 아무 결과도 반환하지 않고 포트 포워딩이 작동하지 않는다면, 컴퓨터에서 iphlpsvc(IP Helper) 서비스가 실행 중인지 확인하세요. 또한 포트 포워딩 규칙이 생성되는 네트워크 인터페이스에서 IPv6 지원이 활성화되어 있어야 합니다. IP Helper 서비스와 IPv6 지원이 없으면 포트 리디렉션이 작동하지 않습니다.

Windows Server 2003/XP에서 포트 포워딩을 사용하려면 레지스트리 키 HKLM\SYSTEM\ControlSet001\Services\Tcpip\Parameters에서 IPEnableRouter 값을 1로 추가로 설정해야 합니다.

연결 테스트 및 프로세스 확인

지정된 포트에서 수신 대기 중인 프로세스는 PID로 확인할 수 있습니다(예제에서 PID는 636).

tasklist | findstr 636

이제 원격 컴퓨터에서 RDP 클라이언트로 접속을 시도해 보겠습니다. RDP 포트 번호로 3340을 지정하면 되며, 포트 번호는 RDP 서버 주소 뒤에 콜론(:)으로 붙여 입력합니다. 예: 10.10.1.110:3340

RDP 연결이 성공적으로 설정되는 것을 확인할 수 있습니다.

원격 컴퓨터로 포트 전달하기

들어오는 TCP 연결을 원격 컴퓨터로 전달하려면 다음 명령을 사용합니다.

netsh interface portproxy add v4tov4 listenport=3389 listenaddress=0.0.0.0 connectport=3389 connectaddress=192.168.100.101

이 규칙은 이 컴퓨터의 로컬 TCP 3389 포트로 들어오는 모든 RDP 트래픽을 IP 주소 192.168.100.101인 원격 호스트로 전달합니다. 참고로 Windows SSH 터널을 사용해 로컬 포트를 원격 서버로 전달하는 방법도 있습니다.

Windows에서 포트 포워딩 규칙 관리하기

중요: 새 포트로의 인바운드 연결이 방화벽(Microsoft Windows Defender 방화벽 또는 백신 소프트웨어에 포함된 서드파티 방화벽)에서 허용되는지 반드시 확인하세요. Windows Defender 방화벽에 새 허용 규칙을 추가하는 명령은 다음과 같습니다.

netsh advfirewall firewall add rule name="forwarded_RDPport_3340" protocol=TCP dir=in localip=10.1.1.110 localport=3340 action=allow

PowerShell cmdlet을 사용할 수도 있습니다.

New-NetFirewallRule -DisplayName "forwarder_RDP_3340" -Direction Inbound -Protocol TCP –LocalPort 3340 -Action Allow

Windows Defender 방화벽 GUI를 통해 3340 포트의 인바운드 규칙을 만들 때는 특정 프로그램을 연결할 필요가 없습니다. 이 포트는 네트워크 드라이버만 수신 대기하기 때문입니다.

규칙 조회, 삭제 및 주의사항

Windows 포트 포워딩 규칙은 원하는 만큼 여러 개 만들 수 있으며, 모든 netsh interface portproxy 규칙은 영구적(persistent)이라 Windows 재시작 후에도 유지됩니다. 다만 Windows Server 2012 R2에서 재부팅 후 규칙이 초기화되는 사례가 있었는데, 이 경우 네트워크 인터페이스의 주기적 연결 끊김이나 OS 부팅 시 IP 주소 변경 여부를 확인하세요(DHCP 대신 고정 IP 사용 권장). 임시 해결책으로 시스템 시작 시 실행되도록 netsh interface portproxy 규칙을 담은 배치 스크립트를 Windows 작업 스케줄러에 등록하는 방법도 있습니다.

현재 활성화된 모든 TCP 포트 포워딩 규칙 목록을 보려면 다음 명령을 실행합니다.

netsh interface portproxy show all

Listen on ipv4:             Connect to ipv4:
Address         Port        Address         Port
--------------- ----------  --------------- ----------
10.1.1.110      3340        10.1.1.110      3389

팁: portproxy 설정을 다음과 같이 스크립트 형태로 출력할 수도 있습니다.

netsh interface portproxy dump

#========================
# Port Proxy configuration
#========================
pushd interface portproxy
reset
add v4tov4 listenport=3340 connectaddress=10.1.1.110 connectport=3389
popd
# End of Port Proxy configuration

특정 포트 포워딩 규칙을 삭제하려면 다음 명령을 사용합니다.

netsh interface portproxy delete v4tov4 listenport=3340 listenaddress=10.1.1.110

모든 기존 매핑 규칙을 제거하고 포트 포워딩 테이블을 완전히 초기화하려면 다음을 실행합니다.

netsh interface portproxy reset

중요: 이 포워딩 방식은 TCP 포트에만 적용되며 UDP 포트는 전달할 수 없습니다. 또한 루프백 인터페이스 127.0.0.1을 connectaddress로 사용할 수 없습니다.

UDP 트래픽의 포트 포워딩이 필요하다면 RRAS와 NAT 역할이 설치된 Windows Server를 사용해야 합니다. 그래픽 스냅인(rrasmgmt.msc)이나 다음 명령으로 서버 인터페이스 간 포트 포워딩을 구성할 수 있습니다.

netsh routing ip nat add portmapping Ethernet1 udp 0.0.0.0 53 192.168.100.100 53

활용 예: 원격 웹 서비스를 로컬처럼 보이게 하기

portproxy의 또 다른 기능은 원격 네트워크 서비스가 마치 로컬에서 실행되는 것처럼 보이게 만드는 것입니다. 예를 들어 로컬 포트 5555로 들어오는 연결을 원격 HTTP 서버(IP: 157.166.226.25)로 리디렉션해 보겠습니다.

netsh interface portproxy add v4tov4 listenport=5555 connectport=80 connectaddress=157.166.226.25 protocol=tcp

이제 브라우저에서 https://localhost:5555/에 접속하면 CNN 시작 페이지가 열립니다. 브라우저는 로컬 컴퓨터에 접속했지만 실제로는 외부 웹 서버의 페이지를 불러오는 것입니다.

포트 포워딩 규칙은 물리적 NIC의 외부 IP 주소 포트를 동일 호스트에서 실행 중인 가상 머신의 포트로 전달하는 데에도 활용할 수 있습니다. Hyper-V에서는 가상 스위치 수준에서 포트 포워딩을 구성할 수 있습니다(아래 참조).

Windows는 TCP 포트 범위(range) 단위의 포워딩은 지원하지 않습니다. 여러 포트를 전달해야 한다면 portproxy 규칙을 개별적으로 여러 개 만들어야 합니다. 가장 쉬운 방법은 메모장에서 포트 번호만 다르게 한 netsh interface portproxy add 명령 목록을 생성한 후, 명령 프롬프트에 붙여넣어 일괄 실행하는 것입니다.

Hyper-V Server에서의 포트 포워딩

컴퓨터에서 Hyper-V 역할을 사용 중이라면(Windows 10, Windows Server 또는 무료 Hyper-V Server 모두 해당) PowerShell로 DNAT 포트 포워딩 규칙을 구성할 수 있습니다. 예를 들어 Hyper-V 호스트가 수신하는 모든 HTTPS 트래픽을 호스트에서 실행 중인 가상 머신의 IP 주소로 리디렉션한다고 가정해 보겠습니다. 이 경우 Hyper-V StaticMapping 명령을 사용합니다.

먼저 NAT가 설정된 가상 스위치를 생성합니다.

New-VMSwitch -Name "HTTPS-NAT" -SwitchType NAT -NATSubnetAddress 192.168.100.0/24

그런 다음 해당 vSwitch에 필요한 VM을 연결하고, 이 Hyper-V 가상 스위치를 통해 연결된 모든 가상 머신에 대한 주소 변환 규칙을 활성화합니다.

New-NetNat -Name HTTPS-NAT -InternalIPInterfaceAddressPrefix 192.168.100.0/24
Add-NetNatStaticMapping -ExternalIPAddress "0.0.0.0/24" -ExternalPort 443 -Protocol TCP -InternalIPAddress "192.168.100.77" -InternalPort 443 -NatName HTTPS-NAT

이 PowerShell 명령들을 실행하면 Hyper-V 호스트의 443 포트로 들어오는 모든 HTTPS 트래픽이 가상 머신의 사설 IP 주소로 전달됩니다.