手頭沒證書,如何給https做代理?Nginx TCP轉發


線上的一個海外充值接口(https)經常因我朝網絡問題中斷,想借助hk的機器做個https反向代理又沒證書。

一開始

一開始想到的辦法是借助Nginx的tcp轉發進行代理:

編譯NGINX時加入 --with-stream選項,

upstream backend {
   server xxxxxx.com:443 ;
}
server {
    listen 443;
    proxy_pass backend;
    proxy_connect_timeout 5s;
    proxy_timeout 15s;
   error_log /data/logs/tcp_xxxxxx.com.log info;
}

服務器通過綁定host,將https://xxxxxx.com的訪問請求到中轉機再反向到實際的海外服務器確實也ok

不過這里也將面臨一個問題:443端口只能被https://xxxxxx.com占用,無法給其他域名的代理提供作用

后來

如果我想https://xxxxxx.com和https://yyyyyy.com都借助這台機器代理呢?
Nginx的stream_ssl_preread_module可以解決這個問題
ngx_stream_ssl_preread_module模塊(1.11.5)允許從ClientHello消息中提取信息而不終止SSL / TLS,例如,通過SNI請求的服務器名稱或在ALPN中通告的協議。 默認情況下不構建此模塊,應使用--with-stream_ssl_preread_module配置參數啟用它。

Nginx(1.11+),編譯時加入:--with-stream--with-stream_ssl_preread_module 兩個選項,

然后配置:

#$ssl_preread_server_name #通過SNI請求的服務器名稱
map $ssl_preread_server_name $real_server {
    xxxxxx.com    xxx;
    yyyyyy.com    yyy;
}
upstream xxx{
    server xxxxxx.com:443;
}
upstream yyy{
    server yyyyyy.com:443;
}
server {
    listen 443;
    ssl_preread on;  #允許在預讀階段從ClientHello消息中提取信息
    resolver 8.8.8.8;
    proxy_pass $real_server;
    proxy_connect_timeout 5s;
    proxy_timeout 15s;
    error_log /data/logs/stream_ssl_preread.log info;
}

這樣就可以給https://xxxxxx.com 和https://yyyyyy.com兩個域名做tcp層的代理了,其他域名如果也綁host過來就會被403掉。

參考:http://nginx.org/en/docs/stream/ngx_stream_ssl_preread_module.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM