Настройка nginx в качестве HTTP-прокси для использования с proxytunnel при подключениях типа ssh over http-proxy
https://serverfault.com/questions/355271/ssh-over-https-with-proxytunnel-and-nginx
https://github.com/chobits/ngx_http_proxy_connect_module
Настройка nginx
Для того, чтобы чистый nginx мог проксировать ssh ему не хватает поддержки метода CONNECT. Добрый человек написал модуль для nginx, который реализует этот функционал, однако для того чтобы это работало нужно собрать nginx из исходников.
sudo apt-get update && sudo apt-get upgrade && sudo apt-get install wget nano sudo apt-get install build-essential -y wget https://nginx.ru/download/nginx-1.12.2.tar.gz && tar -zxvf ./nginx-1.12.2.tar.gz wget https://ftp.pcre.org/pub/pcre/pcre-8.40.tar.gz && tar xzvf pcre-8.40.tar.gz wget http://www.zlib.net/zlib-1.2.11.tar.gz && tar xzvf zlib-1.2.11.tar.gz wget https://www.openssl.org/source/openssl-1.1.0f.tar.gz && tar xzvf openssl-1.1.0f.tar.gz rm -rf *.tar.gz wget -O ngx_http_proxy_connect_module.zip https://github.com/chobits/ngx_http_proxy_connect_module/archive/master.zip unzip ./ngx_http_proxy_connect_module.zip cd nginx-1.12.2/ patch -p1 < ../ngx_http_proxy_connect_module-master/proxy_connect.patch ./configure --prefix=/usr/share/nginx \ --sbin-path=/usr/sbin/nginx \ --modules-path=/usr/lib/nginx/modules \ --conf-path=/etc/nginx/nginx.conf \ --error-log-path=/var/log/nginx/error.log \ --http-log-path=/var/log/nginx/access.log \ --pid-path=/run/nginx.pid \ --lock-path=/var/lock/nginx.lock \ --user=www-data \ --group=www-data \ --build=Ubuntu \ --http-client-body-temp-path=/var/lib/nginx/body \ --http-fastcgi-temp-path=/var/lib/nginx/fastcgi \ --http-proxy-temp-path=/var/lib/nginx/proxy \ --http-scgi-temp-path=/var/lib/nginx/scgi \ --http-uwsgi-temp-path=/var/lib/nginx/uwsgi \ --with-openssl=../openssl-1.1.0f \ --with-openssl-opt=enable-ec_nistp_64_gcc_128 \ --with-openssl-opt=no-nextprotoneg \ --with-openssl-opt=no-weak-ssl-ciphers \ --with-openssl-opt=no-ssl3 \ --with-pcre=../pcre-8.40 \ --with-pcre-jit \ --with-zlib=../zlib-1.2.11 \ --with-compat \ --with-file-aio \ --with-threads \ --with-http_addition_module \ --with-http_auth_request_module \ --with-http_dav_module \ --with-http_flv_module \ --with-http_gunzip_module \ --with-http_gzip_static_module \ --with-http_mp4_module \ --with-http_random_index_module \ --with-http_realip_module \ --with-http_slice_module \ --with-http_ssl_module \ --with-http_sub_module \ --with-http_stub_status_module \ --with-http_v2_module \ --with-http_secure_link_module \ --with-mail \ --with-mail_ssl_module \ --with-stream \ --with-stream_realip_module \ --with-stream_ssl_module \ --with-stream_ssl_preread_module \ --with-debug \ --add-module=../ngx_http_proxy_connect_module-master/ make sudo make install sudo mkdir --parents /var/lib/nginx/body
/etc/nginx/nginx.conf
user www-data; worker_processes 1; pid /run/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; server { listen 53; # dns resolver used by forward proxying resolver 192.168.77.1; # forward proxy for CONNECT request proxy_connect; proxy_connect_allow 22; proxy_connect_connect_timeout 10s; proxy_connect_read_timeout 99999s; proxy_connect_send_timeout 99999s; # forward proxy for non-CONNECT request # location / { # proxy_pass http://$host; # proxy_set_header Host $host; # } } }
На клиенте ssh устанавливаем proxytunnel и в ~/.ssh/config пишем такое:
Host domain.com #адрес хоста который будет указан в команде подключения: ssh user@domain.com. Может быть ненастоящим. Реальный хост указывается в ProxyCommand DynamicForward 1080 ProxyCommand proxytunnel -v -p autosys.tk:53 -d 127.0.0.1:22 # тут -p - указывает на адрес HTTP-прокси, а -d указывает на хост к которому подключемся (ресолвинг хоста происходит на HTTP-прокси) ServerAliveInterval 30
Discussion