zoukankan      html  css  js  c++  java
  • 使用Nginx进行TCP/UDP/IPV6端口转发【原创】

    nginx安装添加stream模块

    先确定nginx安装时,编译的时候添加了--with-stream这个模块支持。nginx 版本 >=1.9才支持。

    # ../sbin/nginx -V
    nginx version: nginx/1.10.3
    built by gcc 4.4.7 20120313 (Red Hat 4.4.7-23) (GCC) 
    built with OpenSSL 1.0.1e-fips 11 Feb 2013
    TLS SNI support enabled
    configure arguments: --prefix=/usr/local/nginx --with-pcre --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --with-http_realip_module --with-stream

    修改nginx配置文件

    比如10.32.7.76有访问10.35.30.121的3306端口权限。10.45.23.47也想访问,利用nginx转发tcp。在10.32.7.76安装nginx转发访问10.35.30.121的3306端口-->10.32.7.76的端口12345

    在nginx.conf最后一行添加

    stream {
        #将12345端口转发到10.35.30.121的3306端口
        server {
            listen 12345;
            proxy_connect_timeout 5s;
            proxy_timeout 20s;
            proxy_pass 10.35.30.121:3306;
        }
    }

    如果报错nginx: [emerg] "stream" directive is not allowed,请注意如果你用的是nginx的1.10版本的stream,那么http段和steam段是平行的

     

     nginx reload操作。

    测试端口转发

    服务器10.45.23.47访问10.35.30.121端口3306是不通的,也访问不了数据库

     现在访问转发服务器10.32.7.76的端口12345,测试一下

    访问成功。

    nginx转发UPD、IPV6

    nginx.conf添加如下配置,并使用nginx -s reload重载nginx使其生效,同时注意防火墙/安全组放行对应的端口。

    stream {
        #将12345端口转发到192.168.1.23的3306端口
        server {
            listen 12345;
            proxy_connect_timeout 5s;
            proxy_timeout 20s;
            proxy_pass 192.168.1.23:3306;
        }
        #将udp 53端口转发到192.168.1.23 53端口
        server {
            listen 53 udp reuseport;
            proxy_timeout 20s;
            proxy_pass 192.168.1.23:53;
        }
        #ipv4转发到ipv6
        server {
            listen 9135;
            proxy_connect_timeout 10s;
            proxy_timeout 30s;
            proxy_pass [2607:fcd0:107:3cc::1]:9135;
        }
    }
    • listen:后面填写源端口(也就是当前服务器端口),默认协议为TCP,可以指定为UDP协议
    • proxy_connect_timeout:连接超时时间
    • proxy_timeout:超时时间
    • proxy_pass:填写转发目标的IP及端口号

    注意:nginx可以将IPV4的数据包转发到IPV6,IPV6的IP需要使用[]括起来。

    总结

    目前能实现端口转发的工具大致有:rinetd、SSH、iptables、nginx、haproxy,其中rinetd配置最为简单,但不支持UDP转发,并且该软件已经好几年未更新,如果您服务器上已经安装了nginx,不妨用nginx做端口转发。

    参考

    使用Nginx进行TCP/UDP端口转发 - 小z博客
    https://www.xiaoz.me/archives/10578

    nginx 转发tcp连接 - imcati - 博客园
    https://www.cnblogs.com/imcati/p/11717802.html

    (3条消息) Nginx 配置TCP代理转发_jeikerxiao-CSDN博客_nginx tcp代理
    https://blog.csdn.net/jeikerxiao/article/details/87863341

    nginx报错”stream”/”upstream” directive is not allowed 错误 – 慢慢赚钱博客
    https://moneyslow.com/nginx%E6%8A%A5%E9%94%99stream-upstream-directive-is-not-allowed-%E9%94%99%E8%AF%AF.html

  • 相关阅读:
    Github
    Vocabulary in Computer
    js中三种定义变量的方式const, var, let的区别
    Node.js-1
    JSON_in_js
    JSON快速入门
    Mysql tinyint长度为1时在java中被转化成boolean型
    maven上解决循环依赖、又不想新加第三模块的方法
    关于springboot和tomcat的服务能力做下简单的测试
    tomcat各个端口的作用
  • 原文地址:https://www.cnblogs.com/paul8339/p/14688059.html
Copyright © 2011-2022 走看看