耗尽 Linux 机器 TCP 套接字限制 (~70k)?

耗尽 Linux 机器 TCP 套接字限制 (~70k)?

我是 torservers.net 的创始人,这是一家运营 Tor 出口节点的非营利组织。我们有许多 Gbit 连接和多个 IP 的机器,所有这些机器上的开放 TCP 套接字似乎都达到了极限。我们的 TCP 连接总数徘徊在约 70k 左右(每个 IP 约 10-15k),Tor 疯狂地记录“绑定网络套接字错误:地址已在使用中”。有没有什么解决方案?BSD 是否也存在同样的问题?

我们运行 Tor 进程,每个进程监听不同的 IP。例如:

# NETSTAT=`netstat -nta`
# echo "$NETSTAT" | wc -l
67741
# echo "$NETSTAT" | grep ip1 | wc -l
19886
# echo "$NETSTAT" | grep ip2 | wc -l
15014
# echo "$NETSTAT" | grep ip3 | wc -l
18686
# echo "$NETSTAT" | grep ip4 | wc -l
14109

我应用了在互联网上能找到的调整:

# cat /etc/sysctl.conf
net.ipv4.ip_forward = 0
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2
net.ipv4.conf.default.forwarding = 0
net.ipv4.conf.default.proxy_arp = 0
net.ipv4.conf.default.send_redirects = 1
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.all.send_redirects = 0
kernel.sysrq = 1
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.core.rmem_max = 33554432
net.core.wmem_max = 33554432
net.ipv4.tcp_rmem = 4096 87380 33554432
net.ipv4.tcp_wmem = 4096 65536 33554432
net.core.netdev_max_backlog = 262144
net.ipv4.tcp_no_metrics_save = 1
net.ipv4.tcp_moderate_rcvbuf = 1
net.ipv4.tcp_orphan_retries = 2
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_max_orphans = 262144
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_fin_timeout = 4
vm.min_free_kbytes = 65536
net.ipv4.netfilter.ip_conntrack_max = 196608
net.netfilter.nf_conntrack_tcp_timeout_established = 7200
net.netfilter.nf_conntrack_checksum = 0
net.netfilter.nf_conntrack_max = 196608
net.netfilter.nf_conntrack_tcp_timeout_syn_sent = 15
net.nf_conntrack_max = 196608
net.ipv4.tcp_keepalive_time = 60
net.ipv4.tcp_keepalive_intvl = 10
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.ip_local_port_range = 1025 65535
net.core.somaxconn = 262144
net.ipv4.tcp_max_tw_buckets = 2000000
net.ipv4.tcp_timestamps = 0

# sysctl fs.file-max
fs.file-max = 806854

# ulimit -n
500000

# cat /etc/security/limits.conf
*       soft    nofile 500000
*       hard    nofile 500000

答案1

如果有进程绑定到INADDR_ANY,那么某些系统将尝试仅从 49152 到 65535 范围内选择端口。这可以解释您的 ~15k 限制,因为范围恰好是 16384 个端口。

维基百科:临时端口

您可以通过在此处查找适合您的操作系统的说明来扩展该范围:

临时端口范围

答案2

这是 TCP 协议的限制。端口是一个无符号短整型 (0-65535)。解决方法是使用不同的 IP 地址。

如果软件无法更改,您可以使用虚拟化。创建桥接(非 NAT)并使用公共 IP 的虚拟机,以便它们以后不会被 NAT。

使用 netstat 检查监听器是否使用接口上的 IP 而不是所有地址 (0.0.0.0):

sudo netstat -tulnp|grep '0\.0\.0\.0'

相关内容