Налаштування port mapping (port forwarding) у windows за допомогою netsh

Про що мова і навіщо це потрібно

У windows, починаючи з версії Windows XP, існує можливість налаштувати прокидання портів (port forwarding або port mapping) без будь-яких зовнішніх програм (і навіть не використовуючи вбудований брандмауер!).

Навіщо це може бути потрібне? Наприклад, для налаштування ще одного (додаткового) порту, на якому "висітиме" служба. Наприклад, до порту 80 (на якому знаходиться apache) можна також "відкрити" порт 1580 або 65123, який фактично виконуватиме ту ж роль, що і 80-й порт, але при цьому він буде "секретним" портом. Або можна таким чином "ховати" фактичні сервери: дозволяти підключення на будь-який локальний порт (на localhost, 127.0.0.1), а потім "прокидати" це підключення на інший сервер (і на інший порт).

Обмеження: дані перенаправлення діють лише на TCP порти, UDP трафік таким чином перенаправити не вдасться.

Як зробити port mapping (port forwarding) через netsh

Для цього в netsh є контекст portproxy, який знаходиться в контексті interface. Для створення port mapping виконайте з командного рядка (у Windows Vista і вище від імені адміністратора):

Перевірка правильності налаштування port mapping

Насамперед перевіряємо, чи з'явилося наше правило у списку правил netsh: netsh interface portproxy show all

Якщо правило з'явилося, переконуємось, що налаштований нами порт прослуховується. Для цього виконаємо команду: netstat -ano findstr : наприклад: netstat -ano findstr :5556

Якщо порт не прослуховується (тобто port mapping не виконується), ця команда нічого не відобразить. Якщо ж наша витівка увінчалася успіхом, то ми побачимо щось на кшталт такого повідомлення: TCP. 5556 0.0.0.0:0 LISTENING.

У разі виникнення проблем із підключенням перевірте, чи у Вас правильно налаштований (або вимкнений) брандмауер (який може блокувати підключення на відкритий Вами порт).

Видалення port mapping

Для того, щоб видалити всі правила перенаправлення (найпростіший випадок), достатньо виконати команду (нагадую, командний рядок повинен бути запущений від імені адміністратора!): netsh interface portproxy reset

Після цього переконайтеся, що всі правила видалені: за командою netsh interface portproxy show all не повинно відображатися нічого.

Якщо ж Ви бажаєте видалити лише одне правило перенаправлення портів, команда буде трохи складнішою: netsh interface portproxy delete v4tov4 listenport= listenaddress=

наприклад: netsh interface portproxy delete v4tov4 listenport=5556 У цьому прикладі ми видаляємо port mapping, який був налаштований на локальному комп'ютері, на порту 5556.

Зміна налаштувань port mapping через netsh

Примітка: Можна змінити будь-які параметри для існуючого запису сервера portproxy. Якщо значення не задано, зміни не відбуваються.