Опубликован: 20.02.2007 | Доступ: свободный | Студентов: 3483 / 787 | Оценка: 4.42 / 4.03 | Длительность: 40:03:00
Лекция 13:

Перенаправление портов

< Лекция 12 || Лекция 13: 12345 || Лекция 14 >

DATAPIPE

Сервисная программа, используемая для перенаправления портов, направляет TCP/IP-трафик, полученный ею на одном из портов, к другому порту, указанному самой сервисной программой. За исключением обработки IP-адресов и номеров портов, при перенаправлении порта игнорируется тип протокола: утилита не заботится о том, передаете ли вы через нее зашифрованный трафик по протоколу Secure Shell(SSH) или открытый текст электронной почты. Утилита перенаправления порта не является ни клиентом, ни сервером. Она функционирует, как канал для TCP/IP-подключений, а не как конечная точка. Например, вы могли бы поместить утилиту datapipe между Web-броузером и Web-сервером. Web-броузер адресовался бы к утилите перенаправления порта, но все запросы были бы переданы на Web-сервер.

Утилита datapipe представляет собой сервисную программу перенаправления портов для Unix, написанную Тоддом Виерлингом (Todd Vierling). Она использует стандартные системные и сетевые библиотеки, которые дают ей возможность выполняться на любых платформах Unix.

Примечание. Утилита datapipe не является программой взлома ( exploit code ). Она не вызывает переполнения буфера или атак типа CSS ( cross-site scripting ). Для всех сценариев, упомянутых в этих примерах, доступ к командной строке на сервере, выполняющем утилиту перенаправления порта, является необходимым условием.
Реализация

Наиболее простые сервисные программные средства в мире Unix легко распространяются в исходном коде. Это дает возможность пользователям адаптировать программу к разнообразным аппаратным платформам и версиям Unix, используя один и тот же вариант утилиты datapipe.

Компилирование исходного файла

Вы должны скомпилировать утилиту datapipe для своей платформы. Полезно иметь предварительно скомпилированные бинарные файлы для нескольких типов операционных систем Unix: Solaris, AIX, Linux, FreeBSD и др. Используйте команду gcc для компилирования под Linux и семейство BSD.

$ gcc -o datapipe datapipe.c 
datapipe.c: In function 'main':
datapipe.c:86: warning: passing arg 1 of 'gethostbyaddr' 
  from incompatible pointer type 
datapipe.c:98: warning: passing arg 2 of 'bind' 
  from incompatible pointer type 
datapipe.c:113: warning: passing arg 2 of 'accept' 
  from incompatible pointer type 
datapipe.c:136: warning: passing arg 2 of 'connect' 
  from incompatible pointer type

В приведенном выше примере двоичный код скомпилировался успешно. Предупреждений, связанных с функциями bind, accept и connect, можно избежать, преобразуя тип второго аргумента к типу ( struct sockaddr * ), однако программа работает и без этого преобразования.

if (bind(lsock, (struct sockaddr *) &laddr, sizeof(laddr))) {

В зависимости от библиотек совместимости вашей системы, вам, возможно, придется также удалить строку 48.

#include <linux/time.h>

Спокойно удалите эту строку, не ожидая никаких неприятных последствий.

Утилита datapipe компилируется также под Cygwin, но вы должны изменить еще одну строку (строка 96 в оригинальном исходном файле).

laddr.sin_family = htons (AF_INET);

Удалите вызов функции htons.

laddr.sin_family = AF_INET;

Помните, что файл cygwin1.dll необходим, чтобы утилита datapipe выполнялась в системе Windows, однако вам не нужно регистрировать файл DLL. Обратите внимание, что Windows не требует, чтобы вы являлись привилегированным пользователем (т. е. имели права администратора) для открытия портов, имеющих номера ниже, чем 1024.

Другие опции компилирования. При компилировании утилиты datapipe для некоторых вариантов системы Unix компонуйте такие версии бинарного кода, которые имеют свойства static и shared (общего доступа). Версия бинарного кода, использующая библиотеки общего доступа, компонуется по умолчанию с опциями компилятора gcc, упомянутыми выше. Эти опции дают самый маленький двоичный файл, но он, возможно, будет выполняться только на том физическом хосте, на котором он компилировался. Альтернатива состоит в компоновке статической версии, которая содержит все функции поддержки, необходимые, чтобы программа выполнялась.

$ gcc -o datapipe_static -static datapipe.c

С такими опциями создается двоичный файл намного большего размера, но он должен выполняться на любой равнозначной операционной системе. Статическая версия утилиты datapipe облегчит перенос этой программы на систему, которая, возможно, не имеет компилятора. Вы можете также добавить к gcc опцию -s, чтобы удалить часть неиспользуемой символьной информации.

$ gcc -o datapipe_static_stripped -static -s datapipe.c

Ниже приводятся примеры различных размеров файлов, которые получаются на системе OpenBSD. Звездочка указывает на то, что файл является исполняемым:

-rwxr-xr-x  1   root    wheel   29420   Mar     9 20:05     datapipe*
-rw-r-r-    1   root    wheel   4556    Mar     9 20:05     datapipe.c
-rwxr-xr-x 1    root    wheel   175139  Mar     10 01:45    datapipe_static*
-rwxr-xr-x 1    root    wheel   143360  Mar     10 01:45    datapipe_static_stripped*
13.1.
Совет. Попытайтесь скомпоновать коллекцию сервисных программ datapipe, используя опции -static и -s для операционных систем Solaris (sparс и x86), AIX, IRIX, Linux (x86) и FreeBSD.
Перенаправление трафика

Использовать утилиту datapipe несложно, несмотря на сложные пути перенаправления портов, которые вы можете создавать с ее помощью.

$ ./datapipe 
Usage: ./datapipe localport remoteport remotehost

Значение localport представляет номер порта, прослушиваемого на локальной системе; подключения будут сделаны к этому номеру порта. В Unix вы должны быть привилегированным пользователем ( root ), чтобы открыть для прослушивания порты, имеющие номера ниже 1024. Если вы получите ошибку, подобную такой: "bind: Permission denied" ("Нет разрешения на доступ"), это будет означать, что ваша учетная запись, возможно, не дает вам право открывать зарезервированный порт.

Значение remoteport представляет номер порта, на который будут переправлены данные. Например, если адресатом является Web-сервер, значение remoteport равно 80.

Значение remotehost представляет имя хоста или IP-адрес получателя.

Самый легкий концептуальный пример перенаправления порта: переадресация трафика HTTP. В этом случае мы устанавливаем утилиту datapipe так, чтобы прослушивать порт с большим номером, в данном примере 9080, и переадресовывать трафик на любой сайт по вашему выбору.

$./datapipe 9080 80 www.google.com

Теперь вводим следующий URL в Web-броузер:

http://localhost:9080/

Должна открыться домашняя страница сайта Google. Утилита datapipe выполняется в фоновом режиме, поэтому надо использовать команды ps и kill, чтобы найти ID процесса и остановить его.

$ ps auxww | grep datapipe
root 21570 0.0 0.1 44 132 ?? Is 8:45 PM 0:00.00 ./datapipe 9080 80 
  www.google.com
$ kill -9 21570

Утилита datapipe выполняет элементарную функцию, но, с небольшими творческими усилиями, вы можете превратить ее в мощный инструмент. В разделе "Пример из жизни: перенаправление портов" есть интересные предложения о том, когда можно использовать перенаправление порта.

Примечание. При перенаправлении портов трафик переадресуется между TCP-портами, и только. При этом не выполняются преобразования протокола или какие-либо другие манипуляции с данными. Перенаправление Web-трафика от порта 80 к порту 443 не изменит http-подключение на зашифрованное HTTPS-подключение. Вместо этого используйте SSL-прокси.
< Лекция 12 || Лекция 13: 12345 || Лекция 14 >