当前环境

内网穿透的三台服务器IP:PORT分别为


NGINX服务器为

question

1.内网穿透的服务器,tcp端口是26900,udp是26902。
2.其中tcp不可当http用,例如ssh连接tcp 26900端口 udp负责数据传输。
3.需要给这三台servers配置负载均衡,轮询
4.需要访问域名+端口,后端请求地址为servers。

以下配置均为 nginx.conf,yum/apt安装的默认在/etc/nginx/

这里是tcp和udp的区别

1.TCP是面向连接的,UDP是无连接的
2.TCP是可靠的,UDP是不可靠的
3.TCP是面向字节流的,UDP是面向数据报文的
4.TCP只支持点对点通信,UDP支持一对一,一对多,多对多
5.TCP报文首部20个字节,UDP首部8个字节
6.TCP有拥塞控制机制,UDP没有
7.TCP协议下双方发送接受缓冲区都有,UDP并无实际意义上的发送缓冲区,但是存在接受缓冲区

qs.1&2&3解决思路

1.内网穿透的服务器,tcp端口是26900,udp是26902
2.其中tcp不可当http用,例如ssh连接tcp 26900端口 udp负责数据传输。
a.利用NGINX代理到servers
b.servers是tcp端口是26900,需要与tcp建立连接
c.NGINX的stream模块可以做负载均衡,利用这个做均衡并轮询

轮询:(每个请求按时间顺序逐一分配到不同的后端服务,如果后端某台服务器死机,自动剔除故障系统,使用户访问不受影响)
例如:server1 weight=4 | server3 weight=4 | server3 weight=2 流量分配为4:3:2

这里提示一下 dns解析记录也需要添加servers
添加多条 A 记录,每条记录都指向不同的服务器 IP 地址。例如:

7.test.xyz -> 124.71.182.19
7.test.xyz -> 113.45.219.13
7.test.xyz -> 120.46.54.24

nginx部分配置

    stream {

    upstream tcp_backend {
       server 124.71.182.19:26900 weight=4;
       server 113.45.219.13:26900 weight=3;
       server 120.46.54.24:26900  weight=2;
    }


server {
    listen 26900 ;
    proxy_pass tcp_backend;
  }

qs.4解决思路

4.需要访问域名+端口,后端请求地址为servers。
a.前面添加了stream模块,该模块是唯一的只能添加一次
b.在该模块下继续添加udp的代理,这样NGINX可以通过轮询servers,将流量转发到26902端口
NGINX部分配置

 upstream udp_backend {
      server 124.71.182.190:26902 weight=4;
      server 113.45.219.139:26902 weight=3;
      server 120.46.54.246:26902 weight=2;
    }

    server {
      listen 26902 udp;
      proxy_pass udp_backend;
    }

啊这个时候就有人问了 我servers的tcp轮询到124的机器上面 但是udp轮询到113上那不就数据传输不过去了么?
哈哈刚开始呢这个操蛋的问题我也想到了,不过大家不用担心该踩的坑我都踩过了

a.如果udp没限制的话这样是可以的 和tcp建立连接 后端流量轮询是可以的 具体的话要看什么数据包了,比如游戏就可以
!!!upstream和server一定要按照顺序来,首先得把tcp建立起来才可以udp(下面给大家写了错误配置请看)不然就会出现那个操蛋的问题 tcp和udp的upstream先写完后这个时候相当于NGINX带着俩协议来了tcp和udp,这时候就要看各位幸运不幸运了,如果先建立起来tcp然后在建立udp那么仍然可以的 相反则不行。

b.(qs:那老师我也不知道怎么分辨数据咋办)配置我放下面也是完整配置

load_module modules/ngx_stream_module.so;
user  root;
worker_processes  auto;

events {
    worker_connections  1024;
}


http {

}

stream {

    upstream tcp_backend {
       server 124.71.182.19:26900 weight=4;
       server 113.45.219.13:26900 weight=3;
       server 120.46.54.24:26900  weight=2;
    }


server {
    listen 26900 ;
    proxy_pass tcp_backend;
  }


    upstream udp_backend {
      server 124.71.182.190:26902 weight=4;
      server 113.45.219.139:26902 weight=3;
      server 120.46.54.246:26902 weight=2;
    }

    server {
      listen 26902 udp;
      proxy_pass udp_backend;
    }

 }

错误配置!!!

load_module modules/ngx_stream_module.so;
user  root;
worker_processes  auto;

events {
    worker_connections  1024;
}


http {

}

stream {

    upstream tcp_backend {
       server 124.71.182.190:26900 weight=4;
       server 113.45.219.139:26900 weight=3;
       server 120.46.54.246:26900  weight=2;
    }
    
    upstream udp_backend {
      server 124.71.182.190:26902 weight=4;
      server 113.45.219.139:26902 weight=3;
      server 120.46.54.246:26902 weight=2;
    }

server {
    listen 26900 ;
    proxy_pass tcp_backend;
  }



    server {
      listen 26902 udp;
      proxy_pass udp_backend;
    }

 }

测试TEST--如何排查哪里出问题了


这个返回值应该是有刚刚那三个servers的IP(如果添加完应该等待5-30min才有结果)

dig +short $域名

如果访问域名后端断开连接


测试tcp(这个返回一大串的字符串 )错误会返回“01794”

 echo "test" | nc 7day.040119.xyz 26900

先使用netcat生成一个端口将配置文件中的 upstream udp_backend 下面的三个server和listen port改为26908(因为26902端口server是被占用的没办法新建立一个相同的udp)

配置如下

load_module modules/ngx_stream_module.so;
user  root;
worker_processes  auto;

events {
    worker_connections  1024;
}


http {

}

stream {

    upstream tcp_backend {
       server 124.71.182.190:26900 weight=4;
       server 113.45.219.139:26900 weight=3;
       server 120.46.54.246:26900  weight=2;
    }


server {
    listen 26900 ;
    proxy_pass tcp_backend;
  }


    upstream udp_backend {
      server 124.71.182.190:26908 weight=4;
      server 113.45.219.139:26908 weight=3;
      server 120.46.54.246:26908 weight=2;
    }

    server {
      listen 26908 udp;
      proxy_pass udp_backend;
    }

 }

修改完nginx.conf一定要重载一下配置文件

nginx -s reload

测试udp(打开servers的三个窗口)并生成一个udp窗口 三台servers都需要输入并且确保该port没被占用

nc -u -l 26908

发送test到窗口(需要看这三个窗口那个收到了,有轮询的话可以多试试确保三个都可收到 或者将 nginx.conf 里面的upstream 里面server其中两个#注释掉测试完在换下一个)确保每个server都收到了 “test”

 echo "test" | nc -u $域名 26908

检查防火墙是否开放了26908和26900和26902 可以先检查ufw是否开着的(Status: inactive=没开,没开就不需要加)
也可以通过服务器的控制台添加

ufw status
sudo ufw allow 26908/udp
sudo ufw allow 26909/udp
sudo ufw allow 26902/udp

查看NGINX端口是不是开着的检查 26900 26908(如果nginx.conf写的listen是多少这里就需要多少端口 例如 26908)

netstat -lnupt | grep nginx                                                        

作者:Wapper Wod
作者不易 请勿搬运!!!

最后修改:2024 年 08 月 22 日
如果觉得我的文章对你有用,请点个赞支持一下