Введение

Здесь описывается программа, с помощью которой вы сможете удаленно подключиться к своему домашнему компьютеру из сети Интернет (например через терминальное соединение) не имея внешнего (реального) 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;
  • весь трафик идет через этот промежуточный сервер;
  • соединение устанавливается дольше, в связи с дополнительными манипуляциями которые нужно произвести.
Буду рад, если кому то эта программа поможет.
Если вы нашли в ней ошибку, пожалуйста напишите мне!

 


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

Страницы ссылающиеся сами на себя нежелательны и путают пользователей. Якоб Нильсен пишет про это в своей статье 10 главных ошибок веб-дизайна 2003 года.

Обычный путь решения этой задачи в ASP.NET, это поставить PlaceHolder's и в зависимости от того, является страница текущей или нет - показывать нужный текст или ссылку. Или можно например указать пустое значение ссылки href для тэга <A>, тогда браузер не будет отображать ее как ссылку (правда не уверен насчет кроссплатформенности такого решения). Заниматься всем этим достаточно скучно и нудно.

Собственно для решения этой задачи я создал достаточно простой контрол MutableHyperLink, который наследуется от стандартного контрола ASP.NET HyperLink. Этот контрол автоматически определяет страницу на которой он находится, и если ссылка ведет на эту же страницу - отображается тэг SPAN с таким же содержимым, как если бы это была ссылка. Дополнительно можно задать отдельный класс стилей для SPAN, что позволяет выделить этот элемент.

Пример использования этого контрола можно посмотреть на этом сайте, кликните например на ссылку "Архив" или "Написать мне".

 
Пример выделенной ссылки.

Краткая документация по контролу MutableHyperLink

Помимо стандартных, унаследованных от класса HyperLink, доступны следующие свойства:

SpanCssClass - класс CSS, который будет задан у контрола, если он отображается как SPAN.

ParameterMatch - свойство которое задает, должны ли совпадать параметры URL (Url Parameters) текущей страницы, с теми которые заданы в свойстве NavigationUrl, для того что бы считать страницу текущей.

IgnoreCase - свойство, которое задает, игнорировать регистр букв при сравнении URL текущей страницы с NavigationUrl, или учитывать.

DefaultPage - свойство, которое задает текущую дефолтную страницу (Default Page), если ссылка ведет не на файл, а на директорию с некой страницой по умолчанию, в ASP.NET обычно это 'default.aspx'

ForceSpan - всегда генерировать тэг SPAN, независимо от того, какая страница текущая.

ForceLink - всегда генерировать тэг A, независимо от того, какая страница текущая.

Установка и подключение к проекту

Скачайте и разархивируйте приложенный к заметке файл. Он содержит проект на C#, который компилируется в .dll содержащий нужный контрол.

Подключается контрол стандартным способом - можно включить проект в ваш Solution, добавить reference на проект и указать его в файле Web.Config:

   <add namespace="maqdev.Web.UI.WebControls" tagPrefix="maqdev" assembly="maqdev.MutableHyperLink"/>

После чего вы можете его добавить на свою страницу, например так:

   <maqdev:MutableHyperLink NavigateUrl="~/contact.aspx" Text="Contact" SpanCssClass="SelectedLink" runat="server" />

Скачать проект с контролом: maqdev.MutableHyperLink.zip


Начало

Published 13.01.2008 by maqdev in разное

Все должно быть сделано так просто, как возможно, но не проще этого.
Альберт Эйнштейн.

Хочется начать блог с этой цитаты, в дальнейшем надеюсь здесь будут достаточно полезные, и при этом простые мысли и творения.


maqdev.com

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