Введение

Здесь описывается программа, с помощью которой вы сможете удаленно подключиться к своему домашнему компьютеру из сети Интернет (например через терминальное соединение) не имея внешнего (реального) IP адреса на домашнем компьютере, создавать tcp прокси соединения, перекидывающие коннекты с одной машины на другую. Если вам, когда либо приходилось с этим сталкиваться, возможно эта заметка вам поможет.

Описание

Будучи активным участником построения разного рода сетей, мне довольно часто приходилось решать такую задачу:
Имеется некий сетевой сервис, работающий на компьютере Server, с заданным номером порта TCP. Есть некоторый клиент этого сервиса, работающий на компьютере Client, но который по разным причинам не может подключиться к этому сервису (например Server ограничивает клиентов по IP адресам, или сервис работает в локальной сети, а клиент находится в сети Интернет, причины могут быть разные). При этом у нас есть некий третий компьютер Proxy, который имеет доступ к компьютеру Server, и к которому в свою очередь имеет доступ наш клиент Client.

Вариант №1

Требуется организовать прокси сервер на компьютере Proxy, который бы прокидывал (мэппил) соединение по цепочке: Client -> Proxy -> Server. Это, в общем то, достаточно просто, многие общеизвестные прокси реализуют эту функцию - обычно она называется Mapped Link.

 

Рисунок к варианту 1.

Вариант №2

Задача становится более сложной и интересной в случае, если компьютер Proxy также не имеет возможности исходящего подключения к Server, но при этом сам Server может инициировать и установить соединение с Proxy . Т.е. Соединение возможно установить по следующей цепочке Client -> Proxy <- Server.

Каким же образом Server узнает о том, что есть запрос на входящее для него соединение от клиента? Ответ: он может установить контрольное постоянное подключение к компьютеру Proxy, через которое он и получит сообщение о входящем соединении от клиента. Получив такое сообщение он сам инициирует исходящее соединение к Proxy  которое затем связывается с клиентским соединением.

Рисунок к варианту 2.

Программа TcpProxy

Собственно приведенные выше  задачи и решаются в программе, которую вы можете скачать здесь совершенно бесплатно (и использовать на свой страх и риск).
TcpProxy позволяет шифровать контрольное соединение, чтобы никто кроме вас не мог воспользоваться сервисом. Также можно ограничивать клиентов по IP адресам.

Системные требования и загрузка

Приложение использует Microsoft .Net Framework 2.0, если его у вас нет, то можете загрузить ее с сайта Microsoft.
Скачать программу TcpProxy: SetupTcpProxy.msi (427,00 kb).

Настройка и запуск

Скачайте TcpProxy, затем установите ее, для варианта 1 на компьютере Proxy, для варианта 2 еще и на компьютере Server.
Отредактируйте конфигурационный файл LinkConfig.xml, в котором указываются все настройки для программы.
Я постарался откомментировать этот файл, правда на английском языке, если что то не понятно - пишите.
После чего можно запускать службу, через оснастку Services, или командой "net start TcpProxy".
Мониторинг работы можно выполнять по сообщениям в Eventlog: Application. По умолчанию пишутся ошибки и предупреждения, уровень логирования
можно менять в конфигурационном файле, параметр LogLevel.

Заключение

Конечно есть и альтернативные способы решения этой задачи. Например - организация VPN соединения. Или же в каких то случаях вы (или администратор вашей сети) может открыть входящее соединение на роутере. К слову, многие домашние роутеры с NAT позволяют это.

Использование TcpProxy имеет следующие плюсы:

  • не нужен внешний IP адрес;
  • можно удаленно подключаться к вашему мобильному устройству или ноутбуку, даже если вы все время меняете сеть (wi fi, gprs) - главное чтобы устройство было в сети;
  • ваше компьютер не "светится" напрямую в сети Интернет с открытыми  портами (но светится шлюз - Proxy), это дает некоего рода анонимность.
Минусы  - во многом вытекают из плюсов:
  • нужен отдельный сервер в сети, который может принимать входящие соединения, на котором установлен Microsoft Windows и .NET Framework 2.0;
  • весь трафик идет через этот промежуточный сервер;
  • соединение устанавливается дольше, в связи с дополнительными манипуляциями которые нужно произвести.
Буду рад, если кому то эта программа поможет.
Если вы нашли в ней ошибку, пожалуйста напишите мне!

 


Комментарии

Nickolay Ukraine

27 апреля 2009 г. 16:45

Nickolay

Магомед, подскажите, а сколько (хотя бы приблизительно) может потреблять в сутки контрольное постоянное подключение к компьютеру Proxy?

И еще - у меня есть задача: постоянный конект к Proxy от пары десятков Server-ов. Как это можно решить с помощью Вашей программы.
Это надо для поддержки клиентов, у которых на ноутбуке установлен Радмин и они в любой момент могут попросить помощь (А в Интернет выходят черех NAT, GPRS ...).
Сейчас в таких случаях пользуюсь программой "TeamViewer" (http://www.teamviewer.com/), но она держит соедиение через свой центральный сервер, а это не удобно.

maqdev

3 мая 2009 г. 1:17

maqdev

Контрольное подключение может потреблять:

1. если включено шифрование контрольного соединения, то (размер минимального блока 128 байт)
2. если выключено, то размер блока 4 байта

По умолчанию обмен 2 раза за 15 секунд (этот параметр можно настраивать, опция keepAliveTimeout в LinkConfig.xml надо добавить вот так, если нету в конец файла: <KeepAliveTimeout  >60000</BindTimeout>).
Итого получается для включенного шифрования: 1,4мб в день, для выключенного: 46кб в день при keepAliveTimeout=15. Трафик - туда и обратно одинаковый. Возможно что то не учел...

По поводу решения - думаю можно использовать, сам примерно для этого и использую, но соединение у меня постоянное.
Правда нет никакой документации, и его довольно сложно сконфигурировать.  В основном надо разобраться с файлом
LinkConfig.xml

brat India

15 мая 2009 г. 1:57

brat

Интересная задача, не планируете открыть исходиники?

maqdev

27 мая 2009 г. 16:18

maqdev

Хм.. а зачем исходники? Если есть какая то полезная фича - напишите, может я ее туда добавлю Smile
Подумываю сделать GUI интерфейс, ибо редактирование XML не очень приятное занятие...

Andrew Russia

2 июня 2009 г. 9:09

Andrew

Очень интересная программка. У меня подобная задача, только есть два НО:
- прокси и клиент - это одна и та же машина (что неособенно важно);
- прокси не всегда ONLINE, а только на необходимое время (удаленное администрирование).
Все чудно работает, но после нескольких часов, как погас прокси, служба серверной части падает наглухо (пока не перезагрузишь систему - не запускается). Ежеменутные логи сообщений справедливо кричат об этом:

Can't connect to remote gate control '<unknown>'. Details: System.Net.Sockets.SocketException: Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение
   в System.Net.Sockets.Socket.EndConnect(IAsyncResult asyncResult)
   в TcpProxy.RemoteGateLink.ConnectCallback(IAsyncResult ar)

Пока продолжаю для "бэкдора" Wink юзать Zebedee, там проблема сообщить серверу, что клиент ждет соединения (приходится по аське команду посылать на запуск). А здесь все четко, но на некоторое время. Может можно напильником чуток подработать, чтоб не сразу подключаться, а для начала пинг послать какой-нибудь?

brat India

2 июня 2009 г. 10:21

brat

Написал нечто похожее на Java, вот, интересно было бы посмотреть на архитектуру.
Из фич могу посоветовать добавить разве что возможность фильтрации по регекспам.

А вот с гуи я бы как раз заморачиваться не стал у меня тоже все в .xml и .properties файлах - не серверное это дело Smile

Andrew Russia

2 июня 2009 г. 10:33

Andrew

2 Brat

Да простит меня Магомед (Америку я не открываю), Reflector тебе в помощь...

mihail

4 июля 2009 г. 18:01

mihail

Магомед, спасибо конечно за программу, но действительно есть проблемы при пропадании связи. И этот новомодный XML - простите голову сломал пока понял как и что настроить, может просто ini-файл?

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




  Country flag

biuquote
  • Комментарий
  • Предпросмотр
Loading



maqdev.com

сообщения с ограниченным временем жизни