使用nginx的stream模块对内部socket服务进行反向代理,nginx作为接入服务器对外提供SSL安全连接(单向认证),网络拓扑如图1-1所示。其中服务器A与服务器B提供相同服务,可配置成主备或负载均衡模式。
总体配置过程分为:nginx安装、ssl证书生成、nginx配置及最后的服务测试。其中nginx安装过程可参照网络上的介绍,为实现socket反向代理并启用SSL的功能,在安装nginx时需要添加 –with-stream –with-stream_ssl_module 参数。
本实验基于CentOS 6,需要安装OpenSSL、pcre。
1. 证书生成
证书生成过程中会需要输入证书相关信息。
openssl genrsa -des3 -out ssl.key 1024 mv ssl.key server.key openssl rsa -in server.key -out ssl.key rm server.key openssl req -new -key ssl.key -out ssl.csr openssl x509 -req -days 3650 -in ssl.csr -signkey ssl.key -out ssl.crt
2. nginx配置
修改nginx配置文件,添加stream模块配置,并且配置后端服务器信息(对应样例中的backend),配置相应的server,server中指定nginx对外监听的端口、实际代理的服务器、SSL证书及代理相关的配置,具体可参照nginx官方文档ngx_stream_*部分(在最底部)。配置完成后使用 nginx -s reload命令重新加载配置文件。以下配置供参考。
stream { upstream backend { hash $remote_addr consistent; server 127.0.0.1:12345 max_fails=3 fail_timeout=30s; server 127.0.0.1:12346 max_fails=3 fail_timeout=30s; } # 非SSL连接 server { listen 3333; proxy_connect_timeout 5s; proxy_timeout 120s; proxy_pass backend; } # SSL 连接 server { listen 18443 ssl; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5; ssl_certificate /data/server/nginx/cert/ssl.crt; ssl_certificate_key /data/server/nginx/cert/ssl.key; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; proxy_connect_timeout 5s; proxy_timeout 120s; proxy_pass backend; } }
3. 连接测试
测试中,后端服务器使用python做了一个简单的回显服务器,分别监听12345、12346端口,python代码如下:
#!/usr/bin/python #coding=utf-8 import socket import commands HOST = '127.0.0.1' PORT = 12345 s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #定义socket类型,网络通信,TCP s.bind((HOST,PORT)) #套接字绑定的IP与端口 s.listen(1) #开始TCP监听 while 1: conn, addr = s.accept() print ('Connected by', addr) while 1: data = conn.recv(1024) if len(data) == 0 : print ("Connection closed : ", addr) break else: conn.sendall(data) print ("recv: ", data) conn.close()
使用OpenSSL作为SSL客户端连接服务进行测试的命令为格式如下:
openssl s_client -connect localhost:18443