利用Nginx四层协议进行端口转发
假设你有A,B两台服务器,A服务器网络比较友好,B服务器网络比较差。这个时候我们就可以利用Nginx来中转B服务器,以此来达到安全和速度双重目的。
流量大概走向:
客户端 --> A服务器 --> B服务器
配置A机
方法就是利用Nginx的stream模块,来实现四层协议的转发。下面讲讲详细配置和使用方法。以下操作均在A服务器上面:
首先是检查Nginx有没有包含stream模块,nginx -V
看一下有没有 --with-stream
字样,如果没有的话,可参照《编译Nginx及相关配置详解》重新编译一下Nginx,如果已经存在stream模块,那么往下看。
stream是通过tcp层转发,而不是http转发,所以stream和http属同一层级,我们写配置的时候可以把stream写在http上层,下面是利用stream来转发B服务器的配置:
# 外层main模块 user nginx; pid /run/nginx.pid; worker_processes auto; worker_rlimit_nofile 51200; # events模块 events { worker_connections 1024; multi_accept on; use epoll; } # stream模块,也就是今天要讲的重点 stream { # 要转发的目的地,也就是B机的ws地址 upstream tcp_proxy { hash $remote_addr consistent; server xxx.herokuapp.com:443; #B服务器域名 #下面的配置是负载均衡配置,可配置多个服务器,默认是轮询模式 #server yyy.herokuapp.con:443; #c服务器域名 } server { #本机开放的端口,也就是A机端口,记下这个端口,以后用的到。 listen 1024; proxy_connect_timeout 1s; proxy_timeout 60s; proxy_pass tcp_proxy; } } # http模块和stream同层级,两者互不干涉,你可以在http模块开放80和443端口,搭建网站或挂个探针什么的做伪装。 http { server_tokens off; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 120s; keepalive_requests 10000; types_hash_max_size 2048; include /etc/nginx/mime.types; access_log off; error_log /dev/null; server { listen 80; listen [::]:80; server_name xxxx.com; root /var/www; } }
Nginx的配置文件写好后,可以检查一下配置 nginx -t
ok的话,启动就完事了。
systemctl start nginx