Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision | |||
linux_faq:совсем-разные-сервисы-https-ssl-и-ssh-на-одном-порту [2018/10/13 22:16] – admin | linux_faq:совсем-разные-сервисы-https-ssl-и-ssh-на-одном-порту [2019/02/11 09:13] (current) – external edit 127.0.0.1 | ||
---|---|---|---|
Line 1: | Line 1: | ||
+ | ====== Задача ====== | ||
+ | Нужно запустить на одном порту 443 сервер **SSH** и **HTTPS SSL**. На первый взгляд - невозможно. Но на самом деле есть же прекрасный балансировщик **haproxy**.\\ | ||
+ | |||
+ | ====== Первый вариант ====== | ||
+ | **Haproxy** позволяет проверить, | ||
+ | |||
+ | < | ||
+ | timeout connect 5s | ||
+ | timeout client 50s | ||
+ | timeout server 20s | ||
+ | |||
+ | listen ssl :443 | ||
+ | tcp-request inspect-delay 2s | ||
+ | acl is_ssl req_ssl_ver 2:3.1 | ||
+ | tcp-request content accept if is_ssl | ||
+ | use_backend ssh if !is_ssl | ||
+ | server www-ssl :444 | ||
+ | timeout client 2h | ||
+ | |||
+ | backend ssh | ||
+ | mode tcp | ||
+ | server ssh :22 | ||
+ | timeout server 2h</ | ||
+ | |||
+ | Тут строка **acl is_ssl req_ssl_ver 2:3.1** проверяет запрос **SSL** или нет. \\ | ||
+ | а если не **SSL**, то строка **use_backend ssh if !is_ssl** отправляет на бекенд с **SSH**. | ||
+ | |||
+ | ====== Второй вариант ====== | ||
+ | Описан тут: https:// | ||
+ | В данном случае - на фронтэнде проверяется содержимое запроса клиента, | ||
+ | < | ||
+ | backend secure_http | ||
+ | reqadd X-Forwarded-Proto: | ||
+ | rspadd Strict-Transport-Security: | ||
+ | mode http | ||
+ | option httplog | ||
+ | option forwardfor | ||
+ | server local_http_server 127.0.0.1: | ||
+ | |||
+ | backend ssh | ||
+ | mode tcp | ||
+ | option tcplog | ||
+ | server ssh 127.0.0.1: | ||
+ | timeout server 2h | ||
+ | |||
+ | frontend ssl | ||
+ | bind X.X.X.X:443 ssl crt / | ||
+ | mode tcp | ||
+ | option tcplog | ||
+ | tcp-request inspect-delay 5s | ||
+ | tcp-request content accept if HTTP | ||
+ | |||
+ | acl client_attempts_ssh payload(0, | ||
+ | |||
+ | use_backend ssh if !HTTP | ||
+ | use_backend ssh if client_attempts_ssh | ||
+ | use_backend secure_http if HTTP | ||
+ | </ | ||
+ | |||