Búsqueda de sitios web

Configurar el reenvío de puertos en Windows


Puede configurar el reenvío de puertos de red en todas las versiones de Windows sin usar herramientas de terceros. Con una regla de reenvío de puertos, puede redirigir una conexión TCP entrante (IPv4 o IPv6) desde un puerto TCP local a cualquier otro número de puerto, o incluso a un puerto en una computadora remota. El reenvío de puertos de Windows se usa más comúnmente para eludir los firewalls o para ocultar un host o servicio interno de la red externa (NAT/PAT).

En el mundo de Linux, el reenvío de puertos se configura de manera bastante simple usando reglas de iptables o firewalld. En los hosts de Windows Server, el Servicio de enrutamiento y acceso remoto (RRAS) se usa normalmente para configurar las redirecciones de puertos. Sin embargo, hay una manera más fácil de habilitar el reenvío de puertos usando

netsh portproxy

mode, que funciona en todas las versiones de Windows, desde Win XP hasta las versiones actuales de Windows 11 y Windows Server 2022.

¿Cómo habilitar el reenvío de puertos en Windows con Netsh Portproxy?

Puede configurar el reenvío de puertos en Windows mediante el modo Portproxy del comando Netsh.

La sintaxis del comando es la siguiente:

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

dónde

  • dirección de escucha: es una dirección IP local para escuchar la conexión entrante (útil si tiene varias NIC en diferentes subredes/VLAN o varias direcciones IP en una interfaz);

  • puerto de escucha: un número de puerto TCP local para escuchar (la conexión está esperando);

  • connectaddress: es una dirección IP local o remota (o nombre DNS) a la que desea redirigir la conexión entrante;

  • connectport: es un puerto TCP al que se conecta la conexión

    listenport

    se reenvía a.

Utilizando el

netsh interface portproxy add
v4tov6

/

v6tov4

/

v6tov6

opciones, puede crear reglas de reenvío de puertos entre direcciones IPv4 e IPv6.

Supongamos que su tarea es hacer que el servicio RDP responda en un puerto no estándar, por ejemplo, 3340 (por supuesto, este número de puerto se puede cambiar en la configuración de Windows, pero estamos usando RDP para que sea más fácil demostrar la técnica de reenvío de puertos). Para hacer esto, debemos redirigir el tráfico entrante desde el puerto TCP 3340 a otro puerto local 3389 (este es el número de puerto RDP predeterminado).

Tenga en cuenta que el número de puerto local que especificó en listenport no debe ser escuchado (utilizado) por otro servicio o proceso. Compruebe que el número de puerto no se utiliza:

netstat -na|find "3340"

Como alternativa, puede verificar que el puerto no esté escuchando localmente mediante el cmdlet Test-NetConnection de PowerShell:

Test-NetConnection -ComputerName localhost -Port 3340

Para crear una regla de reenvío de puertos en Windows, abra un símbolo del sistema como administrador y ejecute el siguiente comando:

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

Donde 10.10.1.110: la dirección IP actual de su computadora en la que está configurado el reenvío de puertos.

Ahora, use la herramienta netstat para verificar que Windows ahora está escuchando en el puerto local 3340:

netstat -ano | findstr :3340

Nota. Si este comando no devuelve nada y el reenvío de puertos a través de la interfaz netsh portproxy no funciona, asegúrese de tener el servicio iphlpsvc (IP Helper) ejecutándose en su dispositivo Windows.

Consulta el estado del servicio en el

services.msc

consola o usando el comando de PowerShell:

Get-Service iphlpsvc

La compatibilidad con IPv6 debe estar habilitada en la interfaz de red para la que se crea la regla de reenvío de puertos.

Estos son los requisitos previos para el correcto funcionamiento del reenvío de puertos en Windows. Sin el servicio IP Helper y sin la compatibilidad con IPv6 habilitada, la redirección de puertos no funcionará.

Para que el reenvío de puertos funcione en Windows Server 2003/XP, también debe establecer el parámetro IPEnableRouter en 1 en la clave de registro HKEY_LOCAL_MACHINE\ System\CurrentControlSet\services\Tcpip\Parameter.

Set-ItemProperty -Path HKLM:\system\CurrentControlSet\services\Tcpip\Parameters -Name IpEnableRouter -Value 1

Esta opción también le permite habilitar el enrutamiento entre diferentes subredes en Hyper-V.

Puede identificar el proceso que está escuchando en el puerto especificado por su PID (en nuestro ejemplo, el PID es 636):

tasklist | findstr 636

Ahora intente conectarse al nuevo puerto desde una computadora remota usando cualquier cliente RDP. Debe especificar 3340 como el número de puerto RDP. Se especifica después de los dos puntos que siguen a la dirección del host RDP. Por ejemplo,

10.10.1.110:3340

En este ejemplo, primero se debe abrir el puerto TCP/3340 en el Firewall de Windows Defender (consulte la siguiente sección del artículo).

La conexión RDP debe establecerse correctamente.

Las reglas de reenvío de puertos Portproxy son permanentes y no se borran cuando reinicia Windows. Estas reglas se almacenan en el registro. Puede enumerar las reglas de reenvío de netsh en el registro mediante PowerShell:

Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\PortProxy\v4tov4\tcp

Si desea reenviar una conexión TCP entrante a una computadora remota, use el siguiente comando:

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

Esta regla redirigirá todo el tráfico RDP entrante (desde el puerto TCP local 3389) desde esta computadora a un host remoto con una dirección IP 192.168.1.100.

Tenga en cuenta que el modo portproxy en Windows no admite guardar la IP de origen en un paquete de red reenviado. Es decir, si reenvía el puerto 443 desde un dispositivo de Windows a un servidor web interno, entonces todas las conexiones entrantes aparecerán en el servidor de destino como provenientes de la misma dirección IP (desde su host de Windows con netsh portproxy habilitado). Si necesita usar el reenvío de IP de origen, debe usar NAT en un firewall externo o en Hyper-V (descrito a continuación).

Además, puede usar los túneles SSH en Windows para reenviar el puerto local a un servidor remoto.

Configuración de reglas de cortafuegos para el modo de reenvío de puertos en Windows

Asegúrese de que su firewall (Microsoft Windows Defender o un firewall de terceros, que a menudo forma parte del software antivirus) permita conexiones entrantes al nuevo puerto. Puede agregar una nueva regla de permiso al Firewall de Windows Defender con el comando:

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

O usando el cmdlet de PowerShell New-NetFirewallRule:

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

Al crear una regla de firewall entrante para el puerto TCP/3340 a través de la interfaz gráfica de Firewall de Windows Defender, no necesita asociar un programa o proceso con la regla. Este puerto solo es escuchado por el controlador de red.

Si deshabilita la regla portproxy, asegúrese de eliminar la regla de firewall restante de la siguiente manera:

netsh advfirewall firewall del rule name="RDP_3340"

o elimine la regla de firewall con PowerShell:

Remove-NetFirewallRule -Name RDP_3340

Administración de reglas de reenvío de puertos Netsh en Windows

Puede crear cualquier número de reglas de reenvío de puertos en Windows. Todas las reglas de portproxy de la interfaz netsh son persistentes y permanecen después de un reinicio de Windows.

Varias veces encontré casos en los que en Windows Server 2012 R2 las reglas de reenvío de puertos se restablecieron después de reiniciar el servidor. En este caso, debe verificar si hay una desconexión periódica en la interfaz de red y si la dirección IP cambia cuando se inicia el sistema operativo (es mejor usar una IP estática en lugar de DHCP dinámico). Como solución alternativa, tuve que agregar un script por lotes con las reglas de portproxy de la interfaz netsh al Programador de tareas de Windows que se ejecuta en el inicio del sistema.

Para mostrar una lista de todas las reglas de reenvío de puertos TCP habilitadas en Windows, ejecute el comando:

netsh interface portproxy show all

En nuestro caso, solo hay una regla de reenvío desde el puerto local 3340 al 3389:

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

Consejo. También puede enumerar todas las reglas de reenvío de puertos en portproxy de la siguiente manera:

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

Si necesita cambiar la configuración de una regla de portproxy existente, use el siguiente comando:

netsh interface portproxy set v4tov4 listenport=3340 listenaddress=10.10.1.110 connectport=3300 connectaddress=10.10.1.110

En este ejemplo, hemos cambiado el número de puerto de destino de portproxy a 3300.

Para eliminar una regla de reenvío de puertos específica:

netsh interface portproxy delete v4tov4 listenport=3340 listenaddress=10.1.1.110

Para eliminar todas las reglas de mapeo de puertos existentes y borrar completamente la tabla de reglas de reenvío de puertos:

netsh interface portproxy reset

Importante. Este esquema de reenvío de puertos funciona solo para puertos TCP. No podrá reenviar puertos UDP de esta manera. Además, no puede usar la interfaz de bucle invertido 127.0.0.1 (localhost) como el

connectaddress

Puede usar Windows Server con el rol RRAS (Servicio de enrutamiento y acceso remoto y NAT) instalado para habilitar el reenvío de puertos para el tráfico UDP. Puede configurar el reenvío de puertos entre las interfaces de red del servidor mediante el complemento gráfico (

rrasmgmt.msc

) o con el comando:

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

La lista de reglas de reenvío de puertos NAT en Windows Server se puede enumerar de la siguiente manera:

netsh routing ip nat show interface

Si tiene WSL (Subsistema de Windows para Linux) instalado en su computadora, puede crear un script de PowerShell simple para crear una regla de reenvío de puertos a la máquina virtual WSL 2 (una VM WSL2 tiene su propio adaptador Ethernet virtual con una dirección IP única):

wsl --shutdown;
netsh interface portproxy reset;
$wsl_ipaddr = wsl -d Ubuntu-20.04 hostname -I;
netsh interface portproxy add v4tov4 listenport=443 listenaddress=0.0.0.0 connectport=443 connectaddress=$wsl_ipaddr ;
netsh interface portproxy show all;
exit;

Otra característica implícita de portproxy es la capacidad de hacer que cualquier servicio de red remota parezca que se ejecuta localmente. Por ejemplo, desea reenviar las conexiones desde el puerto local 9090 a un servidor HTTPS remoto (

google.com:443

)

netsh interface portproxy add v4tov4 listenport=9090 connectport=443 connectaddress=google.com protocol=tcp

Ahora, la página de búsqueda de Google se abrirá si va a http://localhost:9090/ en su navegador (debe ignorar los errores SSL_ERROR_BAD_CERT_DOMAIN). Entonces, a pesar de que el navegador accede a la dirección de la computadora local, abre una página desde un servidor web externo.

Windows no puede reenviar un rango de puertos TCP. Si necesita reenviar varios puertos, tendrá que crear manualmente varias reglas de redireccionamiento de proxy de puerto.

Las reglas de reenvío de puertos también se pueden usar para redirigir un puerto desde la dirección IP externa de una NIC física a un puerto de una máquina virtual que se ejecuta en el mismo host. En Hyper-V, puede configurar el reenvío de puertos en un nivel de conmutador virtual (consulte a continuación).

Reenvío de puertos con reglas NAT en el conmutador virtual de Hyper-V

Al usar la función Hyper-V en su computadora (se puede instalar tanto en Windows 10/11 como en Windows Server, o como un servidor Hyper-V gratuito), puede configurar las reglas de reenvío de puertos DNAT mediante PowerShell. Suponga que desea redirigir todo el tráfico HTTPS que recibe su host Hyper-V a la dirección IP de la máquina virtual que se ejecuta en el host. Para ello, utilice los comandos StaticMapping de Hyper-V.

Cree un conmutador virtual de Hyper-V:

New-VMSwitch -SwitchName NAT_Switch -SwitchType Internal

Establezca la dirección IP para el nuevo conmutador virtual:

New-NetIPAddress -IPAddress 192.168.100.1 -PrefixLength 24  -InterfaceAlias "vEthernet (NAT_Switch)"

Habilite NAT para esta red:

New-NetNat -Name NATNetwork -InternalIPInterfaceAddressPrefix 192.168.100.0/24

Conecte la VM a su NAT_Switch y asígnele una dirección IP estática (por ejemplo, 192.168.10.80). Establezca la dirección IP del conmutador virtual de Hyper-V (192.168.100.1 en este caso) como la puerta de enlace predeterminada para la conexión de red de la máquina virtual.

Ahora puede habilitar el reenvío de puertos desde el host de Hyper-V a la máquina virtual:

Add-NetNatStaticMapping -NatName NATNetwork443 -Protocol TCP  -ExternalIPAddress 0.0.0.0/24  -ExternalPort 443  -InternalIPAddress 192.168.10.80  -InternalPort 443

Después de ejecutar estos comandos de PowerShell, todo el tráfico HTTPS que llegue al puerto TCP/443 del host Hyper-V se reenviará a la dirección IP privada de la máquina virtual.

Si desea crear una regla de reenvío de puertos para un puerto no estándar, no olvide abrirlo en el Firewall de Windows:

New-NetFirewallRule -DisplayName "HyperV_Nat_444" -Direction Inbound -LocalPort 444 -Protocol TCP -Action Allow -Enabled True

Puede mostrar una lista completa de reglas de reenvío de puertos NAT/PAT en un host Hyper-V como este:

Get-NetNat

Artículos relacionados