В ОС 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
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