一.问题情况
遇到程序需要转发UDP协议数据包,虽然iptables和firewalld都有转发规则,但是不太会用,最后还是用熟悉的nginx的stream模块进行端口转发.
二.解决办法
nginx从1.9.0版本开始,新增了ngx_stream_core_module模块,新增了ngx_stream_core_module模块,使nginx支持四层负载均衡。默认编译的时候该模块并未编译进去,需要编译的时候添加--with-stream,使其支持stream代理。
stream代理的端口完全走端口转发.无法再被server的listen监听使用.所以不要冲突
直接在nginx.conf的http配置上面增加stream配置即可(不是写入http配置里,在外面)
1 2 3 4 5 6 7 8 9 10 11 |
stream{ upstream {NAME}{ hash $remote_addr consistent; server {IP}:{PORT}; } server { listen {PORT}; listen {PORT} udp; proxy_pass {NAME}; } } |
{NAME}是upstream的名称,自己起一个就好.{IP}是转发到的IP,{PORT}是端口.listen后的{PORT}是监听端口.实际用处就是把listen的监听端口的TCP和UDP转发到upstream的server上去.这里upstream和反向代理时用法一样,可以做权重分配和备用什么的.
然后重新加载nginx配置就可以正常的端口转发了.