---
name: win_portproxy_add
kind: function
lang: ps
domain: infra
version: "1.0.0"
purity: impure
signature: "win_portproxy_add -ListenPort <int> [-ConnectPort <int>] [-ListenAddr <string>] [-ConnectAddr <string>]"
description: "Añade una regla de port proxy v4tov4 con netsh para redirigir tráfico desde ListenAddr:ListenPort hacia ConnectAddr:ConnectPort. Si ya existe una regla para el mismo listenaddress:listenport, la elimina y la recrea. Requiere privilegios de Administrador."
tags: [portproxy, netsh, windows, network, infra, wsl2, cdp, redirect, proxy, pendiente-usar]
uses_functions: []
uses_types: []
returns: []
returns_optional: false
error_type: "error_go_core"
imports: []
params:
  - name: ListenPort
    desc: "Puerto en el que escucha el proxy (1-65535)"
  - name: ConnectPort
    desc: "Puerto de destino al que conectar (default: =ListenPort)"
  - name: ListenAddr
    desc: "Dirección IP en la que escucha (default: 0.0.0.0)"
  - name: ConnectAddr
    desc: "Dirección IP de destino (default: 127.0.0.1)"
output: "Void - crea regla de port proxy v4tov4 vía netsh, idempotente por ListenAddr:ListenPort"
tested: false
tests: []
test_file_path: ""
file_path: "powershell/functions/infra/win_portproxy_add.ps1"
---

## Uso

```powershell
# Caso típico WSL2 → Chrome CDP: redirigir 0.0.0.0:9222 → 127.0.0.1:9222
.\win_portproxy_add.ps1 -ListenPort 9222

# Con todos los parámetros explícitos
.\win_portproxy_add.ps1 -ListenPort 9222 -ConnectPort 9222 -ListenAddr 0.0.0.0 -ConnectAddr 127.0.0.1

# Redirigir a un puerto diferente
.\win_portproxy_add.ps1 -ListenPort 8080 -ConnectPort 3000
```

```bash
# Desde WSL2 — habilitar acceso a Chrome CDP en el host Windows
powershell.exe -ExecutionPolicy Bypass -File win_portproxy_add.ps1 -ListenPort 9222
```

## Parametros

| Parametro      | Tipo   | Obligatorio | Default       | Descripcion                                      |
|----------------|--------|-------------|---------------|--------------------------------------------------|
| `-ListenPort`  | int    | si          | —             | Puerto en el que escucha el proxy (1-65535)      |
| `-ConnectPort` | int    | no          | =ListenPort   | Puerto de destino al que conectar (1-65535)      |
| `-ListenAddr`  | string | no          | `0.0.0.0`     | Dirección IP en la que escucha el proxy          |
| `-ConnectAddr` | string | no          | `127.0.0.1`   | Dirección IP de destino                          |

## Notas

- Requiere ejecutarse como **Administrador** en Windows.
- Caso de uso principal: WSL2 no puede alcanzar `127.0.0.1` del host Windows directamente. Esta regla hace que el host escuche en `0.0.0.0:PORT` y reenvíe al loopback donde Chrome (u otro proceso) está escuchando.
- Idempotente respecto a listenaddress:listenport: si ya existe una regla para esa combinación, la elimina y la recrea.
- Combinar con `win_firewall_add_rule` para que el firewall también permita el tráfico entrante.
- Retorna exit code 0 si tuvo éxito, 1 si hubo error.

## Flujo completo WSL2 → Chrome CDP

```bash
# 1. Abrir Puerto en firewall
powershell.exe -ExecutionPolicy Bypass -File win_firewall_add_rule.ps1 -Name "CDP-9222" -Port 9222

# 2. Redirigir tráfico de red al loopback
powershell.exe -ExecutionPolicy Bypass -File win_portproxy_add.ps1 -ListenPort 9222

# 3. Arrancar Chrome con CDP en Windows
# chrome.exe --remote-debugging-port=9222 --headless

# 4. Desde WSL2 conectar al host Windows
# WSL2_HOST=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}')
# curl http://$WSL2_HOST:9222/json
```
