Давно я не писал про преодоление защиты сетей. Наверстываю.
Все разы, когда я ездил за границу, в отелях практически всегда был нормальный доступ по 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-специалист навскидку найдёт несколько вариантов, и по крайней мере один из них будет вполне рабочим. Поэтому я всегда скептически отношусь к заявлениям “Специалистов По Корпоративной Безопасности”, что они способны закрыть доступ.