Записки IT специалиста
Технический блог специалистов ООО»Интерфейс»
- Главная
- Настраиваем проброс портов в Windows при помощи командной строки и Portproxy
Настраиваем проброс портов в Windows при помощи командной строки и Portproxy
Необходимость проброса портов весьма часто встающая перед системным администратором задача. Обычно для этой цели используют службы маршрутизации и удаленного доступа (RRAS), но в ряде случаев использование данного инструмента избыточно. В тоже время немногие знают о такой службе как Portproxy, которая управляется из командной строки при помощи команд Netsh. Тем не менее данная служба позволяет справиться с поставленной задачей проще, быстрее и удобнее, чем инструменты графического интерфейса.
Часто можно услышать совершенно неверное утверждение, что в части сетевых настроек операционные системы Windows значительно уступают своим конкурентам (Linux и BSD). Отчасти такие суждения опираются на опыт администрирования стандартных ролей полностью игнорируя возможности командной строки.
Начиная с Windows Server 2003 в состав системы был в введена команда Netsh, которая позволяет гибко управлять сетевыми настройками компьютера. Обзор всех возможностей этой утилиты займет не одну статью, поэтому мы остановимся на командах Netsh для интерфейса Portproxy, позволяющих непосредственно решить нашу задачу.
Данный набор команд позволяет перенаправлять приходящие пакеты с IPv4 и IPv6 портов на любые IPv4 и IPv6 порты компьютера назначения в любых комбинациях. Единственное ограничение — portproxy может работать только с протоколом TCP, но в большинстве случаев этого достаточно.
Для добавления перенаправления используется команда add v4tov4 (если требуется перенаправление с IPv4 в IPv6 используйте v4tov6 и т.д.), полный синтаксис будет такой:
- listenaddress — локальный адрес на котором принимаются соединения
- listenport — локальный порт на котором принимаются соединения
- connectaddress — удаленный или локальный адрес на который перенаправляются соединения
- connectport — удаленный или локальный порт на который перенаправляются соединения
Для изменения уже существующего правила используется команда set v4tov4, которая имеет идентичный синтаксис, listenaddress и listenport — являются обязательными параметрами. Из необязательных параметров можно указывать только тот, который нужно изменить.
Для удаления правил используйте delete v4tov6 с указанием входящих адреса и порта:
Для просмотра существующих правил введите:
Вместо all допустимо указывать v4tov4 или v6tov4 и т.п. для просмотра только соответствующих правил.
Для сброса всех существующих правил используйте:
Чтобы не быть голословными рассмотрим практический случай использования portproxy в одной довольно непростой ситуации.
У одного нашего клиента имеется две аффилированных (т.е. принадлежащих одному владельцу) организации, имеющие разный вид деятельности и между собой не взаимодействующие. Одна из них находится в городе и не испытывает проблем с внешними коммуникациями. Вторая в сельской местности где доступен только среднего качества интернет, а о выделенном IP-адресе не может быть и речи.
Поэтому, когда встал вопрос организации удаленного доступа к сети второй организации с административными и контрольными целями, то было принято решение использовать для этого ресурсы первой организации, при этом внутренние сети обоих компаний не должны видеть друг друга и вообще иметь какой-либо доступ к ресурсам другой организации.
Кроме того, выяснилось, что обе сети имеют одинаковый диапазон IP-адресов, что делало маршрутизацию между ними в принципе крайне затруднительной. По условиям задачи требовалось обеспечить доступ к RDP (порт 3389) сервера SRV-2-1 и SSH (порт 22) сервера SRV-2-2 второй организации, для этого выделялся сервер SRV-1-1 первой компании, при этом, как можно увидеть из схемы ниже, сервера обоих компаний также имеют одинаковые внутренние адреса.
Между серверами был поднят VPN-туннель, и они видят друг друга по адресам VPN-сети (10.8.0.0), а дальше на выручку приходит portproxy. Так как порты 3389 и 22 соответствующие нужным службам уже использовались для целей администрирования первой компании, то мы выбрали для служб второй компании внешние порты 3390 и 22222, которые были проброшены с внешнего интерфейса роутера первой компании на сервер SRV-1-1 штатным образом.
Теперь нам надо перенаправить все соединения на эти порты в сеть второй компании, но там нам доступен только SRV-2-1 по VPN-адресу, поэтому направим пакеты туда, для чего создадим два правила:
Первое правило отправит все пакеты пришедшие на порт 3390 с адресом 192.168.0.200 (внутренний адрес SRV-1-1) в VPN-туннель серверу SRV-2-1, а так как он уже является целевым для службы RDP, то сразу меняем порт назначения на 3389. Первая часть задачи выполнена.
Второе правило отправит к SRV-2-1 все пакеты с порта 22222 (SSH), теперь нам надо научить этот сервер как правильно доставить их адресату. Для этого добавим уже этому серверу следующее правило:
Согласно которому сервер SRV-2-1 в сети второй компании будет слушать порт 22222 на интерфейсе VPN-сети и передавать все полученные пакеты на порт 22 (SSH) сервера SRV-2-2.
Как видим мы весьма просто реализовали довольно сложную схему, так пакет к серверу SRV-2-2 проходит три промежуточных узла, но при этом мы не настраивали никакой маршрутизации и не устанавливали никакого дополнительного ПО и вообще обошлись минимальным вмешательством в инфраструктуру.
Записки IT специалиста
Технический блог специалистов ООО»Интерфейс»
Windows Server. Настравиваем форвардинг портов через RRAS.
Будем считать, что роутер настроен и функционирует. Подробнее о его настройке вы можете прочитать здесь. В нашей тестовой лаборатории мы собрали следующую схему:
В тестовой сети имеется роутер с внутренним адресом 10.0.0.2 и терминальный сервер с адресом 10.0.0.5, к которому мы будем организовывать доступ. Внешний адрес условно принят нами как 192.168.64.203. Оба сервера работают под управлением Windows Server 2008 R2.
Настроить форвардинг портов в Windows Server не просто, а очень просто. Откроем Пуск — Администрирование — Маршрутизация и удаленный доступ.
Последовательно разворачивая пункты, находим Преобразование сетевых адресов (NAT), в окне справа выбираем внешний интерфейс и, щелкнув на него правой кнопкой мыши, заходим в его Свойства.
За форвардинг портов отвечает отдельная закладка Службы и порты, на которой уже созданы шаблоны для наиболее часто встречающихся задач.
Достаточно выбрать нужную службу и указать ее адрес во внутренней сети, все остальные параметры имеют стандартные значения и изменению не подлежат.
Подтверждаем изменения и пробуем подключиться с удаленного ПК. Все должно работать без перезапуска сервера и службы RRAS.
Поставим более сложную задачу. Нам необходимо подключаться из внешней сети к удаленному рабочему столу роутера для административных целей и в тоже время обеспечить удаленным клиентам доступ к терминальному серверу. Оба сервера используют для удаленных подключений порт 3389 и пробросив его для сервера 10.0.0.5 как указано выше, мы лишимся возможности удаленно подключаться к серверу 10.0.0.2. Как быть? Ответ прост: использовать другой порт. Для сервера 10.0.0.5 мы будем использовать порт 3390, в то время как подключение на 3389 даст нам возможность управлять роутером.
На закладке Службы и порты нажимаем Добавить и в открывшемся окне указываем имя службы, входящий порт (порт на который будут подключаться из внешней сети), адрес службы во внутренней сети и исходящий порт (на котором служба работает во внутренней сети). В нашем примере исходящим портом будет 3389, а входящим 3390. Данное правило перенаправит все запросы на порт 3390 внешнего интерфейса роутера на порт 3389 терминального сервера во внутренней сети.
Для подключения в строке адреса необходимо указать также порт подключения через двоеточие:
Как видим служба RRAS предоставляет в руки администратора мощный и в то же время простой инструментарий для управления перенаправлением портов, позволяя легко публиковать внутренние службы во внешней сети.
Проброс диапазона (пула) портов — потратил два часа времени, я в шоке!
И так начну по порядку, а дело было так.
Один из давних клиентов, которому мы делали и обслуживаем видеонаблюдение, позвонил и сказал «Срочно сделайте нам VoIP телефонию в офис, т.к. мы теряем клиентов и пропускаем звонки». Ну думаю созрели, всего то прошло два года:)
Приступили к проекту, дошла очередь до настройки и поверки телефонии. Все прекрасно работает, но некоторые сотрудники компании работали удаленно и у них должны были работать телефоны на местах. Телефоны в свою очередь регистрируются на АТС, которая стоит в офисе. И вот тут появилась проблема, сигнализация полноценно работала только в одну сторону, а голоса вообще не было. Ну при таких симптомах все стандартно и понятно, нужно открыть и пробросить соответствующие порты на пограничном маршрутизаторе. Обычно всем своим клиентам мы рекомендуем и ставим cisco, это надежно, удобно и как не удивительно звучит, но не дорого. А главное работает вечно и как часы. Но этот клиент заупрямился и сказал, что денег лишних нет и что вот сейчас мы прекрасно живем на windows server и так и будем жить, т.е. учредители денег на cisco не дадут.
Нет так нет, будем делать как есть. Так как на этом сервере два года назад пробрасывали порты для видеорегистратора, то дорожка уже была протоптана. Для сигнализации нужно было пробросить всего один порт udp 5060, а вот для голоса нужно было пробросить диапазон udp 9000 – 20000 и тут все началось, начинаю создавать правило, а этот изумительный windows server 2012 не умеет пробрасывать диапазон портов, любой простой домашний роутер делает это, а виндоус сервер 2012 нет. Ну нас так просто не возьмешь и полез во всемирный разум за ответом.
Ответ не утешительный – виндоус пробрасывать диапазон портов не умеет и все с этим очень мучаются, кто софт ставит дополнительный для решения этой проблемы, кто железку меняет/устанавливает. Но эти два варианта не подходили и вот нашел!
Можно запустить из командной строки команду которая создаст последовательно порты.
1. открываем CMD от имени администратора
2. сохраняем существующую конфигурацию nat в файл введя вот такую команду netsh routing ip nat dump > c:\conf\nat.txt как видно конфигурация будет сохранена в файл nat.txt
3. вводим команду for /L %k in (9000,1,20000) do netsh routing ip nat add portmapping Ethernet udp 0.0.0.0 %k 192.168.1.112 %k где:
- — Ethernet — это внешний интерфейс;
- — (9000,1,20000) — пул портов с 9000 по 20000 и шагом 1;
- 192.168.1.112 — ip АТС до которой нужно пробросить порты;
- Все остальные параметры нам не интересны.
Сервер достаточно долго создает эти настройки и потом долго их загружает в маршрутизацию. Примерно 20 – 40 минут.
4. далее можно повторить пункт два, чтобы убедится, что все порты прописались.
Если нужно удалить сразу диапазон портов, то команда выглядит вот так for /L %k in (9000,1,20000) do netsh routing ip nat delete portmapping Ethernet udp 0.0.0.0 %k
После проверяем работоспособность удаленных телефонов и о чудо, все работает!
В этом месте обычно все улыбаются, шутят, радуются и хлопают!:)