Блог Олега Сердюкова

Туннелирование SSH через HTTP-прокси (corkscrew)

Давно я не писал про преодоление защиты сетей. Наверстываю.

Все разы, когда я ездил за границу, в отелях практически всегда был нормальный доступ по WiFi на базе NAT (в основном через transparent proxy для авторизации, но никаких телодвижений по настройке прокси со стороны клиента не требовалось). Только два раза я натыкался на “тупые” конфигурации - один раз в московском отеле, другой - в Амстердаме. Для работы приходилось прописывать прокси, руководствуясь информацией, полученной на receiption.

Конечно же, ssh через web-прокси не работает. Как назло во втором случае мне было очень нужно попасть на мой сервер. Я собирался выкручиваться путём записи на свой сайт скрипта, обеспечивающего доступ к shell, например, PHP and AJAX shell console, но @andy_shev мне порекомендовал corkscrew, утилиту для туннелирования SSH поверх HTTP-прокси. Ею я и воспользовался, за что Andy огромное спасибо.

Одно “но”. Corkscrew использует метод CONNECT, а squid, использующийся в качестве web-прокси в большинстве случаев, в конфигурации по умолчанию разрешает CONNECT только на порт 443:

acl SSL_ports port 443
acl CONNECT method CONNECT
http_access deny CONNECT !SSL_ports

Поэтому corkscrew выдаст “Proxy could not open connnection to host.com: Forbidden” при попытке соединения на любой порт, на котором обычно вешается ssh. Мне повезло, так как я на своём сервере держал ssh на порту 443. Если и вы собираетесь воспользоваться corkscrew, то предварительно перекиньте ssh на 443/tcp.

Приступим. Я использую менеджер пакетов HomeBrew.

Обновляемся:

$ brew update

Ставим corkscrew:

$ brew install corkscrew

Предположим, прокси-сервер находится на адресе 192.168.99.101 и порту 3128. Добавляем в начало конфиг-файла ssh строки:

$ vim ~/.ssh/config
Host *
    ProxyCommand /usr/local/bin/corkscrew 192.168.99.101 3128 %h %p

Если ssh находится не на порту 443, и squid разрешает только порт 443, то получим сообщение (при указании флага “-v”):

$ ssh -v host.com
...
debug1: Reading configuration data /etc/ssh_config
debug1: Executing proxy command: exec /usr/local/bin/corkscrew 192.168.99.101 3128 host.com 22
...
Proxy could not open connnection to host.com:  Forbidden
ssh_exchange_identification: Connection closed by remote host

Для решения проблемы нужно предварительно в конфиг-файле sshd на сервере поменять порт на 443 и перезапустить sshd (конечно же, на этом хосте не должен стоять web-сервер с https):

$ vim /etc/ssh/sshd_config
Port 443

Перезапуск sshd для разных систем делается по-своему, я делаю это через “ps ax | grep sshd”, а потом перезапускаю нужный sshd.

Всё, можно пользоваться:

$ ssh -v -p 443 host.com
Linux host.com 2.6.32-linode23 #1 SMP Sat Dec 5 16:04:55 UTC 2009 i686

12:02 [ctrld@host][~] 

Решений для выход за пределы сети существует много. Описанный мною метод - только один из многих. Любой грамотный IT-специалист навскидку найдёт несколько вариантов, и по крайней мере один из них будет вполне рабочим. Поэтому я всегда скептически отношусь к заявлениям “Специалистов По Корпоративной Безопасности”, что они способны закрыть доступ.

Comments