Настройка 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