Когда-то в Риме: пересекая непокорную сеть

We use cookies. Read the Privacy and Cookie Policy

Когда-то в Риме: пересекая непокорную сеть

Допустим, что есть сервер с запущенной на нем программой sshd и клиент с программой ssh. Сервер и клиент хотят установить связь, но сеть не настолько хороша и покорна, чтобы позволить им сделать это. При попытке установить соединение пакеты теряются, связь не устанавливается. Что делать? В рассматриваемом случае возможность прохождения пакетов обычно определяется тем, кто посылает и что посылает. Повышение проходимости пакетов через сеть будет означать изменение маршрута трафика SSH или маршрута непосредственной пересылки данных через сеть.

Прохождение моста: доступ к модулям доступа прокси с помощью опции ProxyCommand

В действительности довольно редко можно встретить сеть, которая непосредственно запрещает выходящие соединения по протоколу SSH. Когда такое случается, то это означает запрет в сети всех выходящих соединений. Обойти этот запрет можно при помощи маршрутизации выходящих соединений через прикладной уровень модулей доступа прокси. Не являясь средством полной дезинформации, модули доступа прокси предоставляют гораздо более простой метод скрытного доступа, чем современные решения трансляции сетевых адресов NAT. По сравнению со многими протоколами модули доступа прокси обладают дополнительными преимуществами, которые позволяют им лучше осуществлять кэширование. Поэтому прокси небесполезны. Существует много различных подходов построения и использования модулей доступа прокси, но поскольку обычно они почти ничего не добавляют к обеспечению безопасности выходящих соединений, то у разработчиков пакета OpenSSH не было желания реализовать их непосредственно внутри клиента. Реализация каждого из этих подходов непосредственно в модуле доступа прокси может превратиться в один из подвигов Геракла.

Поэтому вместо непосредственной интеграции в пакет OpenSSH была добавлена опция общего назначения ProxyCommand. Как правило, используя некоторый порт, протокол SSH непосредственно устанавливает TCP-соединение c заданным хостом и обменивается данными с каким-нибудь найденным там демоном, который может работать по протоколу SSH. Кроме того, опция ProxyCommand отключает это TCP-соединение, маршрутизируя все данные соединения через стандартный поток ввода-вывода I/O, который передается произвольному приложению и принимается от него. Это приложение может выполнять какие-то преобразования, которые потребуются при получении данных от модуля доступа прокси. Задача приложения будет полностью выполнена, если будет установлена полностью работоспособная связь с демоном протокола SSH. Разработчики добавили минимально возможное количество переменных, завершающихся спецификациями преобразования %h и %p, которые соответствуют адресу хоста и номеру его порта. Если клиент SSH инициализировал TCP-соединение, то он ждет эти данные. (Вне всякого сомнения, аутентификация хоста соответствует этим ожиданиям.)

Быстрая демонстрационная версия работы опции ProxyCommand выглядит следующим образом:

# Negotiate an SSH connection with whatever we find by

directly

# establishing a TCP link with 10.0.1.11:22

bash-2.05a$ ssh effugas@10.0.1.11

effugas@10.0.1.11”s password:

FreeBSD 4.3-RELEASE (CURRENT-12-2-01) #1: Mon Dec 3

13:44:59 GMT 2001

$

# Establish a TCP connection to 10.0.1.11:22

$ nc 127.0.0.1 22

SSH-1.99-OpenSSH_3.0.1p1

# Negotiate an SSH connection with whatever we find by using

netcat to

# indirectly establish a TCP link with 10.0.1.11:22

bash-2.05a$ ssh -o ProxyCommand=“nc 10.0.1.11 22”

effugas@10.0.1.11

effugas@10.0.1.11’s password:

FreeBSD 4.3-RELEASE (CURRENT-12-2-01) #1: Mon Dec 3

13:44:59 GMT 2001

$

# Add basic variable substitutions to above command

bash-2.05a$ ssh -o ProxyCommand=“nc %h %p” effugas@10.0.1.11

effugas@10.0.1.11’s password:

FreeBSD 4.3-RELEASE (CURRENT-12-2-01) #1: Mon Dec 3

13:44:59 GMT 2001

$

Программа connect.c отличается наибольшей гибкостью реализации возможностей опции ProxyCommand. Ее разработчик Shun-Ichi Goto. Это изящное небольшое приложение можно найти по адресам www.imasy.or.jp/~gotoh/connect.c или www.doxpara.com/tradecraft/connect.c. Оно поддерживает протоколы SOCKS4 и SOCKS5 с аутентификацией, но без протокола HTTP: • SSH с использованием протокола SOCKS4;

effugas@OTHERSHOE ~

$ ssh -o ProxyCommand=“connect.exe -4 -S foo@10.0.1.11:20080

%h %p”

effugas@10.0.1.10

effugas@10.0.1.10’s password:

Last login: Mon Jan 14 03:24:06 2002 from 10.0.1.11

[effugas@localhost effugas]$

• SSH с использованием протокола SOCKS5;

effugas@OTHERSHOE ~

$ ssh -o ProxyCommand=“connect.exe -5 -S foo@10.0.1.11:20080

%h %p”

effugas@10.0.1.10

effugas@10.0.1.10’s password:

Last login: Mon Jan 14 03:24:06 2002 from 10.0.1.11

[effugas@localhost effugas]$

• SSH с использованием протокола HTTP (запрос HTTP CONNECT выдается программой connect.c).

effugas@OTHERSHOE ~

$ ssh -o ProxyCommand=“connect.exe -H 10.0.1.11:20080 %h %p”

effugas@10.0.1.10

effugas@10.0.1.10’s password:

Last login: Mon Jan 14 03:24:06 2002 from 10.0.1.11

[effugas@localhost effugas]$

Данный текст является ознакомительным фрагментом.