В 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 и выше — от имени администратора):
1 |
netsh interface portproxy add v4tov4 listenport= {целое_число или имя_службы} listenaddress= {IPv4-адрес или имя_узла} connectport= {целое_число или имя_службы} connectaddress= {IPv4-адрес или имя_узла} |
где:
- listenport — обязательный параметр. Задает порт IPv4, который должен прослушиваться, по номеру порта или имени службы;
- listenaddress — задает IPv4-адрес, который должен прослушиваться. Может быть введен IP-адрес, NetBIOS-имя или DNS-имя компьютера. Если адрес не задан, по умолчанию используется локальный компьютер;
- connectaddress — задает IPv4-адрес, к которому следует подключаться. Может быть введен IP-адрес, NetBIOS-имя или DNS-имя компьютера. Если адрес не задан, по умолчанию используется локальный компьютер;
- connectport — задает порт IPv4, к которому следует подключаться, по номеру порта или имени службы. Если параметр connectport не задан, по умолчанию используется значение listenport на локальном компьютере.
например:
1 |
netsh interface portproxy add v4tov4 listenport=5556 listenaddress=192.168.1.1 connectport=3389 connectaddress=192.168.1.10<code></code>В этом примере на компьютере с IP адресом 192.168.1.1 был открыт порт № 5556. При подключении к этому порту все пакеты, приходящие на порт, автоматически будут пересылаться на IP адрес 192.168.1.10, на порт 3389 (RDP). |
Проверка правильности настройки port mapping
В первую очередь проверяем, появилось ли наше правило в списке правил netsh:
1 |
netsh interface portproxy show all |
Если правило появилось, убеждаемся, что настроенный нами порт прослушивается. Для этого выполним команду:
1 |
netstat -ano | findstr :<номер listenport> |
например:
1 |
netstat -ano | findstr :5556 |
Если порт не прослушивается (т.е. port mapping не выполняется), то эта команда не отобразит ничего. Если же наша затея увенчалась успехом, то мы увидим что-то типа такого сообщения:
TCP …:5556 0.0.0.0:0 LISTENING …
В случае возникновения проблем с подключением проверьте, что у Вас правильно настроен (или отключен) брандмауэр (который может блокировать подключения на открытый Вами порт).
Удаление port mapping
Для того, чтобы удалить все правила перенаправления (простейший случай) достаточно выполнить команду (напоминаю, командная строка должна быть запущена от имени администратора!):
1 |
netsh interface portproxy reset |
После этого убедитесь, что все правила удалены: по команде
1 |
netsh interface portproxy show all |
не должно ничего отображаться.
Если же Вы хотите удалить только одно правило перенаправления портов, команда будет немного сложнее:
1 |
netsh interface portproxy delete v4tov4 listenport= {целое_число или имя_службы} listenaddress= {IPv4-адрес или имя_узла} |
где:
- listenport — обязательный параметр. Задает удаляемый порт IPv4;
- listenaddress — задает удаляемый адрес IPv4. Если адрес не задан, по умолчанию используется локальный компьютер.
например:
1 |
netsh interface portproxy delete v4tov4 listenport=5556 |
В этом примере мы удаляем port mapping, который был настроен на локальном компьютере, на порту 5556.
Изменение настроек port mapping через netsh
Если Вы хотите изменить значения параметров существующей на portproxy-сервере (т.е. на компьютере, где Вы запускали команду netsh interface portproxy add …) записи, созданной командой add v4tov4, или добавить новую запись port mapping / port forwarding, выполните следующую команду:
1 |
netsh interface portproxy set v4tov4 listenport= {целое_число или имя_службы} listenaddress= {IPv4-адрес или имя_узла} connectport= {целое_число или имя_службы} connectaddress= {IPv4-адрес или имя_узла} |
где:
- listenport — обязательный параметр. Задает порт IPv4, который должен прослушиваться, по номеру порта или имени службы;
- listenaddress — задает IPv4-адрес, который должен прослушиваться. Может быть введен IP-адрес, NetBIOS-имя или DNS-имя компьютера. Если адрес не задан, по умолчанию используется локальный компьютер;
- connectaddress — задает IPv4-адрес, к которому следует подключаться. Может быть введен IP-адрес, NetBIOS-имя или DNS-имя компьютера. Если адрес не задан, по умолчанию используется локальный компьютер;
- connectport — задает порт IPv4, к которому следует подключаться, по номеру порта или имени службы. Если параметр connectport не задан, по умолчанию используется значение listenport на локальном компьютере.
например:
1 |
netsh interface portproxy set v4tov4 listenport=5556 listenaddress=192.168.1.1 connectport=3300 connectaddress=192.168.1.10 |
В этом примере на компьютере с IP адресом 192.168.1.1 была изменена настройка порта № 5556: теперь при подключении к этому порту все пакеты, приходящие на порт, автоматически будут пересылаться на IP адрес 192.168.1.10, на порт 3300.
Примечание: Можно изменять любые значения параметров для существующей записи сервера portproxy. Если значения не заданы, изменения не производятся.
Внимание! несмотря на то, что port mapping осуществляется с IPv4 на IPv4, для успешной работы перенаправления портов должен быть установлен IPv6.