nginx作为tcp代理

Posted

tags:

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

参考技术A 有时候我们需要从外部网络访问内部网络的服务的时候,可能需要使用到tcp代理,比如从外部连接内部网络的redis,这些服务有时候是没有提供外网地址的,比如腾讯云的redis服务器,但是有时候我们为了调试方便,需要能在外网访问云中的redis服务器,这个时候就可以利用nginx提供的tcp代理功能。

具体操作如下:
打开/etc/nginx/nginx.conf,正常情况下是这个地址
在最后添加

保存退出

nginx -t

检查修改是否正确

nginx -s reload

重新加载nginx配置。

这个时候就可以在外部通过这台机器的9999端口连接内网的redis。

但是这里是由安全风险的,在不使用的情况下,尽量关闭端口。

NGINX 透明 TCP 代理

【中文标题】NGINX 透明 TCP 代理【英文标题】:NGINX transparent TCP proxy 【发布时间】:2017-03-31 12:30:53 【问题描述】:

我有一个 ELK 堆栈。在两台 Logstash 主机前,我设置了两个 NGINX 负载均衡器作为透明代理。 UDP 流量很有魅力。 TCP 与配置一起使用:

stream 
  upstream syslog 
    server sapvmlogstash01.sa.projectplace.com:514;
    server sapvmlogstash02.sa.projectplace.com:514;
  
  server 
    listen 514;
    proxy_pass syslog;
  

但我得到的是 LB 的 source_ip 和 source_host 而不是输入服务器的 IP。

设置相同的添加proxy_bind $remote_addr transparent; 不起作用,抛出超时。

*1 upstream timed out (110: Connection timed out) while connecting to upstream, client: $SOURCEHOST_IP, server: 0.0.0.0:514, upstream: "$LOGSTASH_IP:514", bytes from/to client:0/0, bytes from/to upstream:0/0

我尝试从这里设置 TPROXY: https://www.nginx.com/blog/ip-transparency-direct-server-return-nginx-plus-transparent-proxy/

Logstash 主机:

route add default gw $NGINX_IP
route del default gw $DEFAULT_GW

NGINX 主机:

# Following nginx how-to
iptables -t mangle -N DIVERT
iptables -t mangle -A PREROUTING -p udp -m socket -j DIVERT
iptables -t mangle -A DIVERT -j MARK --set-xmark 0x1/0xffffffff
iptables -t mangle -A DIVERT -j ACCEPT
iptables -t mangle -A PREROUTING -p tcp -s $LOGSTASH_IP/24 --sport 514 -j TPROXY --tproxy-mark 0x1/0x1 --on-port 0
ip rule add fwmark 1 lookup 100
ip route add local 0.0.0.0/0 dev lo table 100

# Enabling Upstream Servers to Reach External Servers
sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE

但仍然像以前一样因超时而失败。

获得透明 TCP 主机缺少什么?

【问题讨论】:

你解决过这个问题吗?我也有同样的问题 不,抱歉 :( 我认为使用专业版可以做到,但我很久以前就把它抛在了后面 【参考方案1】:

官方文档说: proxy_bind $remote_addr 透明;

为了使这个参数起作用,通常需要以超级用户权限运行 nginx 工作进程。在 Linux 上,不需要 (1.13.8),就好像指定了 transparent 参数一样,工作进程从主进程继承 CAP_NET_RAW 能力。 还需要配置内核路由表来拦截来自代理服务器的网络流量

仅供参考:https://www.nginx.com/blog/ip-transparency-direct-server-return-nginx-plus-transparent-proxy/

【讨论】:

以上是关于nginx作为tcp代理的主要内容,如果未能解决你的问题,请参考以下文章

nginx的tcp透明代理设置

【nginx】如何解决使用nginx作为反向代理端口耗尽问题?

TCP 代理到 postgres 数据库作为 nginx 中的上游服务器

NGINX 透明 TCP 代理

nignx的TCP和UDP调度(nginx反向代理)

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