Когда-то, много лет назад, возникла у меня необходимость подключиться к удалённому серверу по удалённому рабочему столу (RDP), который находится за прокси. Стандартный RDP-клиент не умеет работать через прокси. Тогда, погуглив, нашёл программу proxifier, которая умеет создавать туннели через прокси и пускать трафик программ, не умеющих работать с прокси, через эти свои туннели.
Но вот недавно всё же сделал и я свою программу, которая умеет пробрасывать порты через прокси для программ, которые сами с прокси не умеют работать. Вот так и появилась эта программа «proxymapper», о которой я сейчас и расскажу. )
Это консольное приложение не требует установки и администраторских прав и выглядит вот так:
Программа может слушать локальный порт, а все обращения к этому порту передавать к другому серверу и порту (который будет задан ей в параметрах). Если не указать прокси, то соединение будет происходить напрямую, иначе будет попытка подключиться через указанный прокси.
Для чего это нужно?
Ну, например, тот же случай, что был в начале статьи, когда нужно обратиться к какому-то сервису, который находится за прокси-сервером, к которому напрямую нельзя обратиться. А программа, с помощью которой нужно подключиться, не умеет работать через прокси. Вот тут-то и может помочь 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-туннели в этом деле.)
Но речь сейчас не об этом конечно.)
Вот некоторые скриншоты программы в действии! )
- Простой проброс порта с локального 88-го до удалённого на сервере k.shpirat.net:80.
Да, да, знаю, я сам говорил о том, что не стоит пробрасывать HTTP-порты. Но в данном случае можно, потому что k.shpirat.net — это default-сервер и он в любом случае ответит этой страничкой с красивой анимированной svg-бабочкой.)
- Теперь проброс порта и проверка подключения с помощью netcat.Поясню. Сначала запустили netcat в первой консольке в режиме ожидания входящих подключений на порту 12345, затем во второй консольке был запущен proxymap, который слушает порт 5555 и перенаправляет подключения на локальный хост, на порт 12345, который слушает netcat в первой консольке. Затем, в третьей консольке через тот же netcat подключаемся к порту 5555 к локальному хосту. Видим, что в логах proxymap-а отобразилось, что клиент подключился! Также сразу отобразится в первой консольке, что клиент подключился и будет написан его адрес, порт и может быть имя хоста (это всё ключ -v виноват!). Затем в первой или третьей консольке пишем текст, нажимаем Enter, и этот же текст отображается в другой консольке с запущенным netcat-ом. Это просто для проверки, а netcat можно ещё для кучи разных вещей использовать. )
- А теперь попробуем слушать порт, который уже используется.
На 9999-ом порту висит Socks5-прокси, организованный через подключенный к серверу PuTTy. При попытке использовать этот порт в программе она пишет об ошибке, поясняет, в чём дело, ну и закрывается, т.к. нет смысла быть ей запущенной, когда она не может выполнить своё первостепенное предназначение… )
- А как дела обстоят со скоростью?
А вот тут, к сожалению, всё не очень хорошо. Потому что используемый способ связывания двух сокетов между собой не очень хорош на самом деле… Но в принципе, если скорость не критична, то это не проблема. Для удалённого рабочего стола её вполне-вполне хватит! Немножко скриншотов в тему:
Для начала измерим скорость с помощью iperf напрямую. Запоминаем результат!Теперь попробуем измерить скорость, пустив трафик через нашу программу proxymap.
Даа.. Видно, что скорость упала в несколько раз. Но! Не смотря на то, что сейчас 21-ый век на дворе, даже о такой скорости некоторые могут только лишь мечтать… ) Так что, если не учитывать результаты изначальных замеров скорости, то этот результат очень даже ничего. 🙂
Ну а теперь попробуем замерить скорость не просто через проброшенный порт, но ещё и через прокси! Смысла в этом большого нет, уже и так понятно, что скорость будет ещё меньше, но это наверное нужно больше для демонстрации работы программы через прокси)
Да, всё работает. Как уже выше было написано, в данном случае в качестве прокси-сервера выступает SSH-сессия, открытая в PuTTy, в которой настроен динамический проброс порта до сервера, что и является, по сути, настоящим Socks5-прокси сервером. )
- А теперь настроим проброс порта до несуществующего адреса! Вот это да.)
В принципе, на этом всё. )
Думаю, достаточно тут и примеров было приведено, и описания. )
Теперь самое главное!
Скачать программу можно тут: proxymap.exe
Так как программа не подписана цифровой подписью, то как минимум хром может предупредить о том, что якобы программе этой не стоит доверять и не нужно её скачивать. Поэтому даю ссылку на 7-zip архив, содержащий данную программу, чтобы хром или другой кто не ругался. Вот ссылка: proxymap.7z
Вот MD5 файла proxymap.exe: D76A61C2D59C6DFF5516DF35A8860143
Если понадобятся исходники, то без проблем отдам, а может и сам чуть позже выложу тут или дам ссылку на BitBucket.
Если есть какие-то пожелания, замечания или ещё что-то по поводу этой небольшой программки, то смело пишите! Ответим в кратчайшие сроки и поможем разобраться, устранить проблему или ответим на вопросы.)
UPD (09.01.017): Посоны! Расходимся! Нас обманули! Есть программа, подобная этой, уже давно, да и по-функциональней будет. Вот: http://netnix.org/bouncer/
🙂
А можно исходничек?
Можно! Загрузил на BitBucket, вот тут: https://bitbucket.org/shpirat/proxymapper/
Для работы необходимо установить набор компонентов Ararat Synapse, т.к. работа с сокетами сделана на их обёртке )
Спасибо большое, жаль, что не на Си.
Пожалуйста!
Ну, перепиши на Си и скидывай, выложу тоже 🙂
Сокеты — они везде сокеты )
Недавно нашёл подобную программу, но как раз на С написанную )
Быть может, ещё акутально )
http://netnix.org/bouncer/
Что-то я в 3 соснах заблудился, помогите ( . Хочу чтобы программа (µTorrent) коннектилась к 127.0.0.1:9055 а трафик шел через proxy socks5 который я укажу. Как это реализовать с помощью proxymap
Если охота пустить трафик uTorrent через Socks5 прокси сервер, то это можно сделать в настройках самого uTorrent, он, вроде, поддерживает работу через прокси.
А программа proxymap немного для других целей предназначена )
Она не для того, чтоб входящие к ней подключения пропускать просто через прокси. Она для того, чтоб к определённому хосту и порту пробрасывать входящие к ней подключения, но можно это делать через прокси какой-то.
Советую ещё глянуть в сторону программы Proxifier, она умеет просто пускать трафик других программ через прокси, даже если в самой программе нет такой поддержки. Она перехватывает и пропускает трафик через прокси )