ProxyMapper — консольная программа для прозрачного проброса портов через разные типы прокси

Когда-то, много лет назад, возникла у меня необходимость подключиться к удалённому серверу по удалённому рабочему столу (RDP), который находится за прокси. Стандартный RDP-клиент не умеет работать через прокси. Тогда, погуглив, нашёл программу proxifier, которая умеет создавать туннели через прокси и пускать трафик программ, не умеющих работать с прокси, через эти свои туннели.

Но вот недавно всё же сделал и я свою программу, которая умеет пробрасывать порты через прокси для программ, которые сами с прокси не умеют работать. Вот так и появилась эта программа «proxymapper», о которой я сейчас и расскажу. )
Это консольное приложение не требует установки и администраторских прав и выглядит вот так:
Справка по командам программы proxymap

Программа может слушать локальный порт, а все обращения к этому порту передавать к другому серверу и порту (который будет задан ей в параметрах). Если не указать прокси, то соединение будет происходить напрямую, иначе будет попытка подключиться через указанный прокси.
Для чего это нужно?
Ну, например, тот же случай, что был в начале статьи, когда нужно обратиться к какому-то сервису, который находится за прокси-сервером, к которому напрямую нельзя обратиться. А программа, с помощью которой нужно подключиться, не умеет работать через прокси. Вот тут-то и может помочь proxymap, т.к. он будет слушать локальный порт, к которому можно подключаться локальной программе, а сам proxymap будет передавать все данные через HTTP- или Socks-туннель на удалённый сервер, находящийся за прокси.
Таким образом, можно сделать так:
proxymap.exe -l 4444 -c 192.168.5.36:3389 -p proxyuser:[email protected]:3128
В этом случае все обращения к локальному 4444-ому порту будут идти через  HTTP-прокси с адресом proxy.server.net:3128, используя указанные логин и пароль, на сервер 192.168.5.36 к порту 3389. Допустим, это какая-то организация, где доступ в интернет обеспечивается через прокси, всё остальное закрыто, но при этом прокси и в обратную сторону тоже работает, давая возможность получать доступ к внутренним ресурсам предприятия извне, через интернет. Вот так легко и просто можно подключиться к серверу терминалов даже с помощью стандартного клиента удалённых рабочих столов. )

Можно придумать ещё кучу применений данной программе. Например, проброс портов до почтового сервера. Либо, например, есть локальная сеть без доступа в интернет, но какой-то из компьютеров всё же имеет доступ в интернет, но не является при этом шлюзом для других. И можно настроить проброс портов (даже не через прокси) до каких-либо сервисов в интернете, чтобы дать доступ к ним и из локальной сети, но при этом не давая полного доступа к интернету. Примером может служить тот же NTP сервер, чтобы время было у всех синхронизировано, либо почтовый сервер, либо Jabber, ICQ и т.д.

Но! Проброс порта до веб-серверов может не прокатить. Всё потому, что если на веб-сервере настроены виртуальные хосты, то при пробросе портов и при обращении к локальному порту браузер будет посылать заголовок «Host: » тот, к какому локальному адресу идёт обращение. Но настоящий веб-сервер скорее всего не будет иметь у себя данного виртуального хоста, поэтому выдаст либо страницу-заглушку, либо default-сервер (в зависимости от того, как настроен). Но если веб-сервер имеет лишь один хост и любые обращения к нему будут ссылаться именно на этот один единственный виртуальный хост, то тогда всё может даже будет работать хорошо. )
Так что следует учитывать, что проброс портов данной программой — это не полноценный прокси-сервер.

Но с другой стороны, можно напридумывать разные сложные схемы взаимодействия, всё зависит от уровня извращённости. 🙂

Типа очень много вложенных друг в друга туннелей и ёлка )
Мсье знает толк в создании вложенных туннелей )

Например, проброс порта через уже другой проброшенный порт до настоящего прокси-сервера, через который уже можно пустить трафик. А ещё можно задействовать SSH-туннели в этом деле.)
Но речь сейчас не об этом конечно.)

Вот некоторые скриншоты программы в действии! )

  1. Простой проброс порта с локального 88-го до удалённого на сервере k.shpirat.net:80.
    Проброс порта с локального 88 на удалённый k.shpirat.net:80
    Проброс порта с локального 88 на удалённый k.shpirat.net:80

    Да, да, знаю, я сам говорил о том, что не стоит пробрасывать HTTP-порты. Но в данном случае можно, потому что k.shpirat.net — это default-сервер и он в любом случае ответит  этой страничкой с красивой анимированной svg-бабочкой.)

  2. Теперь проброс порта и проверка подключения с помощью netcat.netcat_forwardПоясню. Сначала запустили netcat в первой консольке в режиме ожидания входящих подключений на порту 12345, затем во второй консольке был запущен proxymap, который слушает порт 5555 и перенаправляет подключения на локальный хост, на порт 12345, который слушает netcat в первой консольке. Затем, в третьей консольке через тот же netcat подключаемся к порту 5555 к локальному хосту. Видим, что в логах proxymap-а отобразилось, что клиент подключился! Также сразу отобразится в первой консольке, что клиент подключился и будет написан его адрес, порт и может быть имя хоста (это всё ключ -v виноват!). Затем в первой или третьей консольке пишем текст, нажимаем Enter, и этот же текст отображается в другой консольке с запущенным netcat-ом. Это просто для проверки, а netcat можно ещё для кучи разных вещей использовать. )
  3. А теперь попробуем слушать порт, который уже используется.
    Нельзя слушать порт, который уже занят...
    Нельзя слушать порт, который уже занят…

    На 9999-ом порту висит Socks5-прокси, организованный через подключенный к серверу PuTTy. При попытке использовать этот порт в программе она пишет об ошибке, поясняет, в чём дело, ну и закрывается, т.к. нет смысла быть ей запущенной, когда она не может выполнить своё первостепенное предназначение… )

  4. А как дела обстоят со скоростью?
    А вот тут, к сожалению, всё не очень хорошо. Потому что используемый способ связывания двух сокетов между собой не очень хорош на самом деле… Но в принципе, если скорость не критична, то это не проблема. Для удалённого рабочего стола её вполне-вполне хватит! Немножко скриншотов в тему:
    Для начала измерим скорость с помощью iperf напрямую. Запоминаем результат!

    Тест скорости напрямую, без проброса портов и прокси
    Тест скорости напрямую, без проброса портов и прокси

    Теперь попробуем измерить скорость, пустив трафик через нашу программу proxymap.

    Пробрасываем порт до сервера тестирования скорости iperf
    Пробрасываем порт до сервера тестирования скорости iperf
    Замер скорости через проброшенный порт
    Замер скорости через проброшенный порт

    Даа.. Видно, что скорость упала в несколько раз. Но! Не смотря на то, что сейчас 21-ый век на дворе, даже о такой скорости некоторые могут только лишь мечтать… ) Так что, если не учитывать результаты изначальных замеров скорости, то этот результат очень даже ничего. 🙂

    Ну а теперь попробуем замерить скорость не просто через проброшенный порт, но ещё и через прокси! Смысла в этом большого нет, уже и так понятно, что скорость будет ещё меньше, но это наверное нужно больше для демонстрации работы программы через прокси)

    Параметры программы proxymap для замера скорости через прокси
    Параметры программы proxymap для проброса порта через прокси
    Замер скорости через проброшенный через прокси порт.
    Замер скорости через проброшенный через прокси порт.

    Да, всё работает. Как уже выше было написано, в данном случае в качестве прокси-сервера выступает SSH-сессия, открытая в PuTTy, в которой настроен динамический проброс порта до сервера, что и является, по сути, настоящим Socks5-прокси сервером. )Использование socks5 прокси

  5. А теперь настроим проброс порта до несуществующего адреса! Вот это да.)

    Программа сообщает о том, что не может подключиться и причину этого тоже пишет
    Программа сообщает о том, что не может подключиться и причину этого тоже пишет

В принципе, на этом всё. )
Думаю, достаточно тут и примеров было приведено, и описания. )

Теперь самое главное! 

Скачать программу можно тут: proxymap.exe

Так как программа не подписана цифровой подписью, то как минимум хром может предупредить о том, что якобы программе этой не стоит доверять и не нужно её скачивать. Поэтому даю ссылку на 7-zip архив, содержащий данную программу, чтобы хром или другой кто не ругался. Вот ссылка: proxymap.7z

Вот MD5 файла proxymap.exe: D76A61C2D59C6DFF5516DF35A8860143

Если понадобятся исходники, то без проблем отдам, а может и сам чуть позже выложу тут или дам ссылку на BitBucket.

Если есть какие-то пожелания, замечания или ещё что-то по поводу этой небольшой программки, то смело пишите! Ответим в кратчайшие сроки и поможем разобраться, устранить проблему или ответим на вопросы.)

UPD (09.01.017): Посоны! Расходимся! Нас обманули! Есть программа, подобная этой, уже давно, да и по-функциональней будет. Вот: http://netnix.org/bouncer/

🙂

Вам также может понравиться

About the Author: shpirat

7 комментариев

  1. Что-то я в 3 соснах заблудился, помогите ( . Хочу чтобы программа (µTorrent) коннектилась к 127.0.0.1:9055 а трафик шел через proxy socks5 который я укажу. Как это реализовать с помощью proxymap

    1. Если охота пустить трафик uTorrent через Socks5 прокси сервер, то это можно сделать в настройках самого uTorrent, он, вроде, поддерживает работу через прокси.

      А программа proxymap немного для других целей предназначена )
      Она не для того, чтоб входящие к ней подключения пропускать просто через прокси. Она для того, чтоб к определённому хосту и порту пробрасывать входящие к ней подключения, но можно это делать через прокси какой-то.

      Советую ещё глянуть в сторону программы Proxifier, она умеет просто пускать трафик других программ через прокси, даже если в самой программе нет такой поддержки. Она перехватывает и пропускает трафик через прокси )

Добавить комментарий

Войти с помощью: 

Ваш адрес email не будет опубликован. Обязательные поля помечены *