Налаштування порт форвардинга в Windows

В ОС Windows, починаючи з Windows XP, існує вбудована можливість установки перенаправлення / проброса мережевих портів (порт форвардинга). Завдяки цій можливості входить TCP з'єднання (IPv4 або IPv6) на будь-який локальний порт) можна перенаправити на інший порт або навіть на порт віддаленого комп'ютера. Причому не обов'язково, щоб у системі був сервіс, слухає даний порт.

У Linux перенаправлення портів налаштовується досить просто за допомогою iptables. На серверних системах Windows Server для організації перенаправлення портів, як правило використовується служба маршрутизації та віддаленого доступу (RRAS). Однак є більш простий спосіб налаштування порт форвардинга, який однаково добре працює в будь-якій версії Windows.

Налаштування перенаправлення портів в Windows здійснюється з командного рядка через режим Portproxy команди Netsh. Синтаксис команди наступний:
netsh interface portproxy add v4tov4 listenaddress = localaddress listenport = localport connectaddress = destaddress connectport = destport
де,

  • listenaddress - локальний IP адреса, на якому буде очікуватися з'єднання
  • listenport - локальний TCP порт, який повинен слухатися (на ньому буде очікується вхідні повідомлення)
  • connectaddress - локальний або віддалений IP-адреса або DNS-ім'я, на який потрібно перенаправляти вхідне підключення
  • connectport - TCP порт, на який буде перенаправляти з'єднання з порту listenport

Припустимо наша задача, змусити службу RDP відповідати на нестандартному порту, наприклад 3340 (цей порт, звичайно, можна змінити в настройках самої служби, але ми використовуємо саме RDP для спрощення демонстрації техніки перенаправлення). Для цього нам потрібно перенаправити вхідний трафік на TCP порт 3340 на інший локальний порт - 3389 (стандартний rdp порт).

Примітка. Даний порт не повинен слухатися в системі іншою службою.

Запускаємо командний рядок з правами адміністратора і виконуємо.

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

Де 10.10.1.110 - поточний IP адреса вашого комп'ютера

За допомогою netstat перевіримо, що на комп'ютері став прослуховуватися порт 3340:

netstat -ano | findstr: 3340

Примітка. Якщо ця команда нічого не повертає і перенаправлення портів через netsh interface portproxy не працює, переконайтеся що у вас в системі включена служба iphlpsvc (IP Helper / Допоміжна служба IP).

А на мережевому інтерфейсі, для якого створюється правило перенаправлення портів повинна бути включена підтримка IPv6.

Це обов'язкові умови для коректної роботи порт-форвардинга. Без служби IP Helper і без включеної підтримки IPv6 механізм перенаправлення не працює.

Визначити процес, який слухає цей порт можна за допомогою його PID (в нашому прикладі PID - 636):

tasklist | findstr 636

Спробуємо підключитися до цього комп'ютера з віддаленої системи за допомогою будь-якого rdp клієнта. Як rdp-порту потрібно вказати 3340 (порт вказується після двокрапки після адреси rdp-сервера), наприклад, 10.10.1.110:3340:

Підключення повинно успішно встановитися.

важливо. Перевірте, що в налаштуваннях вашого брандмауера (брандмауера Windows або стороннього мережевого екрану, такі часто включаються до складу антивірусного ПО) дозволені вхідні підключення на новий порт. У разі необхідності в брандмауера Windows можна додати нове правило командою:

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

При створенні входить правила брандмауера через графічний інтерфейс для порту 3340 не потрібно асоціювати ніяку програму, тому що даний порт слухається виключно мережевим драйвером.

Можна створити будь-яку кількість правил перенаправлення портів Windows. Всі правила netsh interface portproxy є постійними і зберігаються в системі після перезавантаження Windows.

Виведемо на екран список всіх правил перенаправлення TCP портів в системі:

netsh interface portproxy show all

У нашому випадку присутній тільки одне правило форвардинга з порту 3340 на 3389:

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

Порада. Також настройки режиму portproxy можна отримати так:
netsh interface portproxy dump
# ========================
# Port Proxy configuration
# ========================
pushd interface portproxy
reset
add v4tov4 listenport = 3340 connectaddress = 10.10.1.110 connectport = 3389
popd
# End of Port Proxy configuration

Щоб видалити певний правило перенаправлення:

netsh interface portproxy delete v4tov4 listenport = 3340 listenaddress = 10.10.1.110

Щоб очистити всі наявні правила перенаправлення:

netsh interface portproxy reset 
важливо. Така схема перенаправлення працює тільки для TCP портів ... Трафік на UDP порти перенаправити не вдасться. Також не можна використовувати в якості connectaddress адреса 127.0.0.1.

Якщо потрібно перенаправити входить TCP з'єднання на інший комп'ютер, команда може виглядати так:

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

Це правило перенаправить всі вхідні RDP запити (на порт 3389) з цього комп'ютера на віддалений комп'ютер з IP-адресою 192.168.1.100

Ще однією неявній можливістю portproxy є можливість створити видимість локальної роботи будь-якого віддаленого мережевого сервісу.

Наприклад, створимо таке перенаправлення з локального порту 8888 на віддалений адресу 213.180.204.3:

netsh interface portproxy add v4tov4 listenport = 8888 connectport = 80 connectaddress = 213.180.204.3 protocol = tcp

Тепер, якщо в браузері перейди за адресою http: // localhost: 8888 /, відкриється стартова сторінка Yandex. Тобто незважаючи на те, що браузер звертається до локального комп'ютера, в ньому відкривається віддалена сторінка.

Перенаправлення портів також можна використовувати, щоб прокинути порт з зовнішнього адреси мережевої карти на порт віртуальної машини, запущеної на цьому ж комп'ютері.

Також були випадки, коли в Windows Server 2012 R2 правила перенаправлення портів працювали тільки до перезавантаження системи, а після перезавантаження скидалися. В цьому випадку потрібно перевірити чи немає періодичних відключень на мережевому інтерфейсі, і не змінюється чи IP адреса при завантаженні ОС (краще використовуватися статичний IP). Як обхідного рішення довелося додати в планувальник Windows скрипт з правилами netsh interface portproxy, відробляє при завантаженні системи.

У Windows Server 2003 / XP для роботи перенаправлення додатково потрібно включити параметр реєстру IPEnableRouter = 1 в гілці HKEY_LOCAL_MACHINE \ SYSTEM \ ControlSet001 \ Services \ Tcpip \ Parameters