nginx tcp/udp 数据转发

前言

nginx 从 1.9.0 开始支持 tcp 转发,1.9.13 支持 udp 转发。利用 nginx 数据转发模块我们可以方便的进行链路优化。

本次演示在 linux 下进行,包括 debian 和 centos。debian 使用的是 debian9,centos 使用的是 centos7。

如果你使用了云服务商提供的外部防火墙的话,你还需要参考云服务商的文档进行配置。或者你使用了云服务商提供的修改过的系统比如 aliyun ,请参考 yun 服务商的文档配置防火墙。

fedora 官方源打包的 nginx 不包含 tcp/upd 数据转发模块,这是我之前踩过的坑,这里只是顺便说一下,本文不演示 fedora 的 nginx tcp/upd 数据转发。

安装 nginx

在使用 nginx tcp/udp 数据转发模块之前当然是需要先安装 nginx 啦。

debian9 默认源的 nginx 版本为 1.10.+ 是包含 tcp/udp 数据转发模块的,所以直接安装就好。centos 需要先添加 nginx 官方源,然后再安装 nginx。

debian9 安装 nginx

更新软件源:

sudo apt update

安装 nginx:

sudo apt install nginx

到这里 nginx 就安装完成了,没错就是这么简单。

centos7 安装 nginx

由于 centos7 官方源并不包含 nginx ,所以我们需要先添加 nginx 官网源,然后再安装 nginx。

添加 nginx 的官方源

rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

安装 nginx

sudo yum install nginx

配置 nginx tcp / udp 数据转发

配置一定要添加在 /etc/nginx/nginx.conf,不要自己玩骚操作在 /etc/ngonx/conf.d/ 添加配置文件,这是 tcp 数据转发不是 http。

在 /etc/nginx/nginx.conf 最下面添加以下内容

stream {
    server {
        listen  8443; # 这里是本地监听的 tcp 端口 可以只写端口,也可以写本机的 ip地址加上端口类似于这样  ipv4:8443   [ipv6]:8443
        listen  8443 udp; #规则与上面一个相同,在最后加上 udp 就监听 udp 了,如果不需要 udp 转发的话这一句可以删掉
        proxy_pass master; #将本机端口的请求转发到那个模块
    }

    upstream master { # 这里就是被转发的模块
        server  26.26.26.26:9000; #这里就是远程地址了,这就是我们需要代理的目标地址,在使用的时候一定要修改这一行
    }
}

配置文件写入后一定要检测配置文件的正确性。

检测配置文件:

sudo nginx -t

如果出现以下的信息,就代表配置成功了,如果不是请再检查一下配置文件是否写入正确

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

到这里 nginx tcp/udp 转发就配置完成了。

启动服务

nginx 在 linux 环境中配置都是一样的,只是默认运行状态有些不同,以下将给出 centos 和 debian 的运行参考方式。

debian9 请执行以下命令

debian 使用 apt 安装的软件,如果软件需要自启动的话是默认开启的,而且默认运行,我们只需要重启一下 nginx 就好

重启 nginx

sudo systemctl restart nginx

到这里 debian 的 nginx 服务就配置完成了。

centos7 请执行以下命令

运行 nginx

sudo systemctl start nginx

开启自启动

sudo systemctl enable nginx

centos 的防火墙默认拒绝外部连接,所以我们还需要允许 nginx 所监听端口的访问权限。

centos7 的防火墙可以热加载,所以我们开启端口访问权限时候不需要重启防火墙,只是需要添加两次防火墙,分别是重启前的防火墙规则和重启后的规则。

开启端口访问,以下命令中的 9000 请替换为你的实际监听端口

sudo firewall-cmd --add-port=9000/tcp

如果 监听了 udp 的话那把 udp 的端口也加上

sudo firewall-cmd --add-port=9000/udp

为了防止重启后失效,加上 --permanent 参数再添加一次防火墙规则,注意 --permanent 只在重启后生效,没进行重启是不生效的,所以我们才需要添加两次规则

tcp部分

sudo firewall-cmd --add-port=9000/tcp --permanent

udp 部分

sudo firewall-cmd --add-port=9000/udp --permanent

参考

如果只是使用 tcp 转发的话可以参考我的另外一篇教程 go tcp 转发

0%