服务器tcp访问控制与连接限制采用分层防护:操作系统层保障资源底线,防火墙层控制流量入口,应用层实现精细调度;合理配置可有效防御暴力扫描和dos攻击且不误伤正常用户。

服务器 TCP 访问控制与连接限制,本质是分层防护:操作系统层管资源底线,防火墙层控流量入口,应用层做精细调度。配得合理,既能防暴力扫描和 DoS 攻击,又不误伤正常用户。
一、系统级 TCP 连接数与端口范围调整(Linux)
这是底层基础,不调好,上层限制再严也容易被耗尽。
-
文件描述符限制(每个连接占一个 fd)
# 查看当前限制 ulimit -n # 临时提高(当前会话) ulimit -n 200000 # 永久生效:编辑 /etc/security/limits.conf * soft nofile 1048576 * hard nofile 1048576 # 并确保 /etc/pam.d/common-session 包含: session required pam_limits.so
-
内核参数优化(影响监听队列、TIME_WAIT、端口复用)
编辑/etc/sysctl.conf:net.core.somaxconn = 65535 # 监听队列最大长度 net.ipv4.ip_local_port_range = 1024 65535 # 扩大客户端可用端口范围 net.ipv4.tcp_tw_reuse = 1 # 允许 TIME_WAIT 套接字重用(仅对客户端有效) net.ipv4.tcp_fin_timeout = 30 # 缩短 FIN_WAIT2 超时时间 fs.file-max = 2097152 # 系统级最大文件句柄数
执行
sysctl -p生效。
⚠️ 注意:
tcp_tw_reuse在服务端对“主动发起连接”的场景才起作用;若你主要是 Web 服务(被动接受连接),更关键的是net.ipv4.tcp_max_syn_backlog和somaxconn。
二、防火墙层连接数限制(iptables / firewalld)
适合做粗粒度拦截,比如单 IP 并发过高、SYN 泛洪。
-
iptables 限制某端口并发连接数(如 HTTP 80 端口最多 100 个)
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 100 -j REJECT
补充:加
--connlimit-saddr可按源 IP 限(避免误杀 NAT 后用户)。 -
firewalld 实现等效规则(CentOS/RHEL 7+)
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="0.0.0.0/0" port port="80" protocol="tcp" limit value="100/second" reject' firewall-cmd --reload
✅ 优势:规则生效快、不依赖应用重启;❌ 缺点:无法区分合法请求与恶意请求,只认连接数。
宝塔Linux面板11.3.0下载宝塔面板11.3.0是一款针对Linux服务器设计的可视化管理工具,通过重构核心模块实现资源占用显著降低,尤其适合低配置服务器环境。它将复杂的命令行操作转化为直观的图形界面,帮助开发者快速完成网站部署、环境配置及日常运维工作,无需专业技术背景即可高效管理服务器。
三、Nginx 应用层访问控制与连接限制
最灵活,可基于 IP、URL、Header 等维度做细粒度控制。
-
限制单 IP 并发 TCP 连接数(
limit_conn)http { limit_conn_zone $binary_remote_addr zone=addr:10m; # 按客户端 IP 哈希建区 server { location /api/ { limit_conn addr 5; # 每个 IP 最多 5 个并发连接 limit_conn_log_level warn; limit_conn_status 429; } } }? 注意:
limit_conn统计的是“已建立且正在处理请求的连接”,不是 TCP 握手数,也不含 Keep-Alive 空闲连接。 -
限制单 IP 请求频率(
limit_req,防接口刷)http { limit_req_zone $binary_remote_addr zone=req_rate:10m rate=10r/s; server { location /login { limit_req zone=req_rate burst=20 nodelay; } } }burst=20允许突发 20 次,nodelay表示不排队延迟,超了直接 503。 结合 geo + map 实现黑白名单或分级限流
例如:国内 IP 限 50r/s,海外限 5r/s,特定运营 IP 白名单不限。
四、额外建议:监控与验证是否生效
-
查看当前 ESTABLISHED 连接数:
ss -s | grep "estab" netstat -an | grep :80 | grep ESTABLISHED | wc -l
-
检查 Nginx 限流日志(需在
location中配置access_log或error_log):limit_conn_log_level warn; # 触发限流时记 warn 日志
用
ab或wrk模拟压测,观察返回状态码(429 / 503)和连接数变化。
不复杂但容易忽略











