nginx实现TCP转发

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nginx实现TCP转发相关的知识,希望对你有一定的参考价值。

参考技术A 需要在服务器上实现个TCP服务器, 由于已安装了nginx, 所以在nginx中给TCP开个口子。

网上文章的说法都是, 1.9.0版之后nginx开始具有TCP/UDP的代理转发功能, 但需要手动安装stream模块.

我用 nginx -V 命令(注意V是大写, 可查询nginx已安装模块)查了一下, 我的nginx是1.16.0版本, 并且已经安装了stream模块(命令输出包含 --with-stream ), 所以我就不用手动安装了.

首先要明确的一点, 关于TCP转发的配置, 是TCP层面的, 它和HTTP是同一层级, 并不是HTTP的下层.

所以其配置项目要放在nginx的顶级配置文件( /etc/nginx/nginx.conf )的顶级块里面, 和顶级配置文件中的http块同属一个层级. 注意不能放在 conf.d 文件夹下, 这个文件夹下的配置文件都在http块级以下.

在顶级配置文件( /etc/nginx/nginx.conf )中添加如下配置块:

实现, 监听8998端口, 转发8999端口(服务器上的程序实现TCP server在8999端口).

nginx -t 检查一下配置文件,

nginx -s reload 重新加载配置, 即可!

UDP的转发类似, 我这次的应用不需要, 也就没有测试试验, 不过先记录在此.

配置块如下:

使用nginx实现基于tcp协议的https协议多域名指向的分别转发功能

零、环境

os:centos8 阿里云

kernel:Linux ${hostname} 4.18.0-80.11.2.el8_0.x86_64 #1 SMP ${time} x86_64 x86_64 x86_64 GNU/Linux

nginx:nginx-1.17.5

一、编译安装nginx

由于nginx插件参数众多,建议编译安装

安装过程见https://www.cnblogs.com/mangoVic/p/8359864.html

注意须装插件--with-stream 和 --with-stream_ssl_preread_module


二、配置

现有两个不同目的地的https协议的域名,使用一个nginx进行转发,一个域名是xxxxxx.com,另一个是yyyyyy.com

 

map $ssl_preread_server_name $backend_pool {
    xxxxxx.com    xxx;
    yyyyyy.com    yyy;
}
upstream xxx{
    server xxxxxx.com:443;
}
upstream yyy{
    server yyyyyy.com:443;
}
server {
    listen 443;
    ssl_preread on;
    resolver 8.8.8.8;
    proxy_pass $backend_pool;
    proxy_connect_timeout 15s;
    proxy_timeout 15s;
    proxy_next_upstream_timeout 15s;
    error_log /var/log/nginx/error-tcp_xxxxxx-yyyyyy.com.log info;
    access_log /var/log/nginx/access-tcp_xxxxxx-yyyyyy.com.log proxy;
}

三、格式测试

nginx -t
nginx

四、配置host

客户端需要将域名指向到转发机

#vi /etc/hosts
111.111.111.111 xxxxxx.com
111.111.111.111 yyyyyy.com

 

五、连通性测试

telnet proxy 443

六、客户端直接访问域名

curl https://xxxxxx.com

 

以上是关于nginx实现TCP转发的主要内容,如果未能解决你的问题,请参考以下文章

Nginx 配置TCP代理转发

Nginx配置TCP转发+http转发+keepalived高可用

使用nginx实现基于tcp协议的https协议多域名指向的分别转发功能

nginx下http转发和tcp转发的区别

Nginx Tcp端口转发(参考)

nginx 一直都在做7层转发,4层也需要看看