我正在尝试设置反向代理,用于为多个 STUN 客户端提供服务,并将通信代理到多个上游服务器。我已增加服务的文件描述符限制,因此这应该不是问题。我的 nginx.conf 大致如下所示:
user root;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
include /etc/nginx/sites-enabled/*.conf;
events {
worker_connections 1000000;
multi_accept on;
}
stream {
upstream stun_backend {
server 192.168.1.10:3478 max_fails=0;
server 192.168.1.11:3478 max_fails=0;
}
server {
proxy_timeout 30m;
listen 3478 udp reuseport;
proxy_pass stun_backend;
}
}
一切正常,直到我与上游服务器建立大约 28232 个“udp ESTAB”连接(我的临时端口范围是这个大小)。这时我开始收到“资源暂时不可用”错误,并且客户端无法联系 stun 服务器。
我印象中,NGINX 自 1.11.2 版以来使用的“IP_BIND_ADDRESS_NO_PORT”选项可以通过重用现有的源端口来帮助解决问题,只要目的地不同,那么 4 元组就是唯一的,并且实际上我应该能够提供服务,28232 * number_of_upstream_hosts
但事实似乎并非如此。
我是否误解了此选项的用途?我尝试做的事情是否可以实现?如果可以,如何实现?
答案1
根据我看到的文档,IP_BIND_ADDRESS_NO_PORT 似乎对 TCP 有效,但我不确定它是否对 UDP 有效。
https://github.com/cloudflare/cloudflare-blog/blob/master/2022-02-connectx/connectx.py#L93-L110
我在 udp 中没有看到“IP_BIND_ADDRESS_NO_PORT”