手把手教你用Nginx实现TCP/UDP透明代理(附实战演示)

今天咱们来聊一个非常实用的技术点——如何用Nginx搭建TCP/UDP透明代理。这个配置在需要隐藏真实服务器IP或者实现流量转发的场景特别有用,而且配置过程比想象中简单很多!

一、为什么要用透明代理?

先说说我最近遇到的一个真实案例:公司某业务服务器频繁遭到DDoS攻击,直接暴露公网IP风险太大。这时候透明代理就派上用场了——让Nginx作为中间人,客户端根本感知不到真实服务器的存在。

透明代理的三大优势:

  • 真实服务器IP隐身术
  • 支持灵活的多节点负载均衡
  • 可添加额外的安全防护层

二、环境准备

咱们以最常见的场景为例:

  • 代理服务器:Ubuntu 20.04(公网IP:1.1.1.1)
  • 真实服务器:CentOS 7(内网IP:192.168.1.100)
  • 待代理服务:TCP 3306(MySQL)、UDP 1194(OpenVPN)

避坑提示:确保系统已安装Nginx 1.9.0以上版本(需要stream模块支持)

三、实战配置步骤

1. 基础配置三板斧

打开nginx.conf配置文件:

# 主配置段添加
stream {
    # TCP代理示例
    server {
        listen 3306;
        proxy_pass 192.168.1.100:3306;
        proxy_responses 0; # 关闭响应日志
    }

    # UDP代理示例
    server {
        listen 1194 udp reuseport;
        proxy_pass 192.168.1.100:1194;
        proxy_timeout 3s;
    }
}

配置要点解析:

  • reuseport参数:UDP必须加!提升多核处理性能
  • proxy_timeout:根据业务需求调整超时时间

建议每个server块单独写,避免配置冲突

2. 高级玩法:负载均衡

如果是多台后端服务器,可以这样配置:

upstream mysql_cluster {
    server 192.168.1.101:3306 weight=5;
    server 192.168.1.102:3306;
    server 192.168.1.103:3306 backup;
}

server {
    listen 3306;
    proxy_pass mysql_cluster;
    proxy_connect_timeout 1s;
}

参数说明:

  • weight:权重分配
  • backup:备用服务器
  • least_conn:可选负载策略

四、配置验证四步操作

1、语法检查

nginx -t

2、热重载配置

systemctl reload nginx

3、端口监听检查

ss -tuln | grep -E '3306|1194'

4、实际连接测试(以MySQL为例):

mysql -h 1.1.1.1 -u root -p

五、常见问题排雷指南

Q1:客户端显示的是代理服务器IP怎么办?

A:需要在真实服务器上配置Dummy接口:

ip addr add 1.1.1.1/32 dev lo

Q2:UDP代理丢包严重?

试试这两个优化参数:

proxy_udp_buffer 64k;
proxy_bind $remote_addr transparent;

Q3:如何查看实时流量?

用这个命令监控:

ngxtop -t 5 stream

六、性能调优建议

根据业务规模调整worker配置:

worker_processes auto;
worker_rlimit_nofile 102400;
events {
    worker_connections 65535;
    multi_accept on;
}

七、安全加固方案

IP白名单控制

allow 192.168.0.0/16;
deny all;

流量限速

proxy_download_rate 512k;
proxy_upload_rate 256k;

配置时记得先从小流量业务开始测试,逐步验证稳定性。

最后提醒:生产环境修改配置前一定要先备份原文件!别问我怎么知道的...(都是血泪教训)