当前环境
内网穿透的三台服务器IP:PORT分别为
server2:113.45.219.13:26900
server3:120.46.54.24:26900
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的区别
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
作者不易 请勿搬运!!!
5 条评论
你的文章让我心情愉悦,真是太棒了! http://www.55baobei.com/wOnWfJQgs6.html
你的文章让我心情愉悦,真是太棒了! http://www.55baobei.com/wOnWfJQgs6.html
你的文章让我感受到了艺术的魅力,谢谢! https://www.4006400989.com/qyvideo/75039.html
哈哈哈,写的太好了https://www.cscnn.com/