CentOS7下使用nginx实现TCP和UDP代理
nginx从1.9.0版本开始,新增了ngx_stream_core_module模块,使nginx支持四层负载均衡,实现TCP和UDP代理。默认编译的时候该模块并未编译进去,需要编译的时候添加--with-stream,使其支持stream代理
具体可以参考nginx官方文档
http://nginx.org/en/docs/stream/ngx_stream_core_module.html
下面介绍如何编译安装nginx,并实现tcp/udp代理
1、编译环境准备
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo yum install -y make zlib zlib-devel gcc-c++ libtool openssl openssl-devel pcre pcre-devel
2、下载nginx源码包并进行编译安装
cd /opt #下载nginx 1.18.0版本源码包 wget http://nginx.org/download/nginx-1.18.0.tar.gz #解压到/usr/src目录下 tar -zxvf nginx-1.18.0.tar.gz -C /usr/src #进行环境配置configure ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-http_ssl_module --with-stream --with-stream_realip_module #make编译安装 make && make install
3、创建nginx执行程序软链并创建nginx用户与nginx日志目录
#创建nginx执行程序软链 ln -snf /usr/local/nginx/sbin/nginx /usr/local/sbin #创建nginx用户 useradd -s /sbin/nologin -M nginx #创建nginx日志目录 mkdir /var/log/nginx
4、修改nginx实现TCP代理的配置文件
cd /usr/local/nginx/conf mv nginx.conf nginx.conf_bak vi nginx.conf
配置文件修改成如下内容
worker_processes auto; error_log /var/log/nginx/error.log info; events { worker_connections 1024; } stream { upstream backend { server 127.0.0.1:12345 max_fails=3 fail_timeout=30s; } server { listen 12345; proxy_connect_timeout 1s; proxy_timeout 3s; proxy_pass backend; } }
检查nginx.conf语法是否有错误
nginx -t
启动nginx
nginx
验证nginx TCP代理功能是否OK
netstat -anp | grep 12345 tail -f /var/log/nginx/error.log
SecureCRT直接连接nginx TCP代理服务器192.168.31.10的TCP 12345端口,最终转发到192.168.31.1的TCP 22端口上,从/var/log/nginx/error.log中可以看到 TCP代理OK
5、修改nginx.conf并实现UDP代理
修改上一步中的nginx.conf,修改并增加UDP代理的部分配置
worker_processes auto; error_log /var/log/nginx/error.log info; events { worker_connections 1024; } stream { upstream tcp_backend { server 192.168.31.1:22 max_fails=5 fail_timeout=30s; } server { listen 12345; proxy_connect_timeout 10s; proxy_timeout 30s; proxy_pass tcp_backend; } upstream udp_backend { server 192.168.31.51:514; } server { listen 1514 udp; proxy_pass udp_backend; } }
修改后nginx -s reload重载nginx服务
在一台测试Linux服务器上配置rsyslog 测试Linux服务器的Syslog日志转发到nginx UDP代理服务器192.168.31.10的UDP 1514端口,最终转发到192.168.31.51的UDP 514端口上(用kiwi syslog搭建的一台Windows Syslog日志接收服务器)
echo "*.* @192.168.31.10:1514" >> /etc/rsyslog.conf systemctl restart rsyslog.service service sshd restart
触发日志,可以看到udp代理转发OK