# SNI 代理
# Nginx
国外配置
user nginx;
#机器几个核就写几,更通用的方法是auto,Nginx会自动应用合适的值
worker_processes auto;
error_log /var/log/nginx/error.log error;
pid /var/run/nginx.pid;
#Nginx允许使用的最大文件描述符数量限制,适当调大可避免"too many open files"错误
worker_rlimit_nofile 1048576;
events
{
#设置轮询方法
use epoll;
#单个工作进程可以允许同时建立外部连接的数量,低配机器慎加
worker_connections 262144;
#尽可能多地接收连接
multi_accept on;
}
stream {
#这里定义一个后端的map,防止直接通过https方式访问IP造成的循环反代
map $ssl_preread_server_name $backend {
~*[0-9]$ unix:/dev/shm/null.sock;
default $ssl_preread_server_name:$server_port;
}
#下面这段就是sni代理+ssl加密服务端的实现
server {
listen 4333 ssl;
#与防火墙内Nginx服务器使用ssl加密方式进行连接,效果和stunnel等隧道代理类似,
#这里主要为了加密流量实现防火墙穿透
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5;
#服务端加密方式优先
#ssl_prefer_server_ciphers on;
#证书文件,可以是自签证书,这里的证书配置主要是服务端验证客户端时要用到,
#可以用这两行的命令自签(记得去掉#号):
#openssl req -new -x509 -days 3650 -nodes -subj "/C=CA/ST=CA/L=CA/O=CA/OU=CA/CN=CA" \
#-out /etc/nginx/cert.pem -keyout /etc/nginx/key.pem
ssl_certificate /etc/nginx/cert.pem;
ssl_certificate_key /etc/nginx/key.pem;
#下面三条配置是用来验证客户端的,防止非授权客户端连接,没错,这里博主懒得再签一个了
ssl_client_certificate /etc/nginx/cert.pem;
ssl_trusted_certificate /etc/nginx/cert.pem;
#验证客户端貌有问题
#ssl_verify_client on;
ssl_session_cache shared:SSL:20m;
ssl_session_timeout 10m;
#下面是sni代理转发设置
ssl_preread on;
#DNS服务器设置,用来解析$ssl_preread_server_name(也就是https中的域名)
#注意,下面一定要替换成可用的dns!
#我在此处用来限制被代理域名,不能啥网站都代啊对不,当然你也可以用map去限制域名,一样的效果
#如果允许代理任何https站点,可以设置为resolver 8.8.8.8;
#resolver 127.0.0.1:5353;
resolver 8.8.8.8;
proxy_pass $backend;
}
}