1. 程式人生 > 其它 >配置nginx tcp ssl負載均衡

配置nginx tcp ssl負載均衡

生成自簽發證書

要做ssl代理必須要有證書,很多人會從第三方認證機構購買,有些人會直接使用lets encrypt的免費證書,但因為我們只是服務端通訊用,所以不必要使用權威認證機構簽發的證書,自己簽發一個就行,參考了下面這篇文章生成自簽發證書

https://zonena.me/2016/02/creating-ssl-certificates-in-3-easy-steps/

生成使用ed25519加密演算法的證書,第一行生成金鑰,第二行生成證書

openssl ecparam -out /etc/ssl/private/ss1-nginx.key -name prime256v1 -genkey
openssl req -new -days 3650 -nodes -x509 \
    -subj "/C=US/ST=Denial/L=Springfield/O=Dis/CN=www.example.com" \
    -key /etc/ssl/private/ss1-nginx.key -out /etc/ssl/certs/ss1-nginx.cert

重新編譯nginx

因為要到nginx 1.9之後才開始支援tcp代理,所以如果要用這個功能必須要使用高版本nginx,如果有docker映象是最好的,沒有的話就得自己重新編譯,具體編譯步驟如下,我用的是archlinux,所以我下了我本地版本的nginx,然後使用瞭如下的編譯選項,--with-stream--with-stream_ssl_module這2個選項必須要有

wget https://nginx.org/download/nginx-1.16.0.tar.gz
tar zxf nginx-1.16.0.tar.gz
cd nginx-1.16.0

./configure \
--sbin-path=/usr/bin/nginx \
--conf-path=/etc/nginx/nginx.conf \
--pid-path=/var/run/nginx.pid \
--with-http_ssl_module \
--with-stream \
--with-stream_ssl_module

make && make install

配置nginx

總的來說就是2臺伺服器,前面的這臺伺服器叫反向代理伺服器,後面的這臺叫作上游伺服器,為了安全起見反代和上游伺服器之間的資料報要加密,所以引入一個ssl來給tcp包一層

以下是反代伺服器的配置

stream {
    upstream backend {
        server 129.181.12.5:92345 weight=1 max_fails=3 fail_timeout=10s;
        server 129.181.12.6:92345 weight=2 max_fails=3 fail_timeout=5s;
    }
    server {
        listen     12345;
        proxy_pass backend;
        proxy_ssl  on;
        proxy_ssl_certificate         /etc/ssl/certs/nginx1.cert;
        proxy_ssl_certificate_key     /etc/ssl/private/nginx1.key;
    }
}

配置很顯然,指定了證書和金鑰的位置,指定了上游服務的ip埠,指定了2個服務的權重,意思就是本機的12345收到請求(非ssl加密),再經過ssl加密後轉到後面的2臺伺服器的92345埠

接下來配置上游伺服器,也需要用到nginx,還要用到相同的證書進行解密

stream {
    upstream backend {
        server 127.0.0.1:8598;
    }
    server {
        listen 92345 ssl;
        proxy_pass backend;
        ssl_certificate         /etc/ssl/certs/nginx1.cert;
        ssl_certificate_key     /etc/ssl/private/nginx1.key;
    }
}

這個配置也很好理解,監聽92345埠,並且只接受ssl加密後了連線,收到請求後拿配置在證書和密就進行解密,解密完後把資料轉發給後的的8598應用,一加密一解密,中間誰也不知道傳了什麼資料,除非攻擊者厲害到能破解ecc演算法,建議走外網的代理都使是ssl加密再傳,提高安全性

需要注意這2個stream配置都要放到nginx.conf,千萬別放到sites-available這種地方,不然就會進入到http部分