网络连接重置(RST)是Linux服务器常见的网络问题,通常表现为连接意外中断、服务不可用或客户端收到"connection reset by peer"错误。以下是系统性的排查和解决方法:
# 检查系统日志
sudo dmesg | grep -i reset
sudo journalctl -xe
sudo cat /var/log/syslog | grep -i reset
# 检查网络统计信息
ss -s
netstat -s | grep -i reset
# 检查当前TCP参数
sysctl -a | grep tcp
# 临时调整参数(重启后失效)
sudo sysctl -w net.ipv4.tcp_keepalive_time=600
sudo sysctl -w net.ipv4.tcp_keepalive_probes=5
sudo sysctl -w net.ipv4.tcp_keepalive_intvl=15
sudo sysctl -w net.ipv4.tcp_fin_timeout=30
# 永久生效(写入/etc/sysctl.conf)
echo "net.ipv4.tcp_keepalive_time = 600" | sudo tee -a /etc/sysctl.conf
echo "net.ipv4.tcp_keepalive_probes = 5" | sudo tee -a /etc/sysctl.conf
echo "net.ipv4.tcp_keepalive_intvl = 15" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
# 检查iptables/nftables规则
sudo iptables -L -n -v
sudo nft list ruleset
# 检查firewalld状态
sudo firewall-cmd --list-all
# 临时禁用防火墙测试(生产环境慎用)
sudo systemctl stop firewalld
sudo systemctl stop iptables
# 检查文件描述符限制
ulimit -n
cat /proc/sys/fs/file-max
# 检查连接跟踪表大小
cat /proc/sys/net/netfilter/nf_conntrack_max
# 增加限制
echo "fs.file-max = 100000" | sudo tee -a /etc/sysctl.conf
echo "net.netfilter.nf_conntrack_max = 1048576" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
# 检查应用日志
sudo tail -f /var/log/nginx/error.log # 如果是Nginx
sudo journalctl -u apache2 -f # 如果是Apache
# 检查应用配置中的超时设置
# 例如Nginx的keepalive_timeout, proxy_read_timeout等参数
# 使用tcpdump抓包分析
sudo tcpdump -i eth0 'tcp[tcpflags] & (tcp-rst) != 0' -vv
# 使用strace跟踪应用系统调用
sudo strace -p <PID> -e trace=network -s 10000
# 使用Wireshark分析(需要GUI环境)
# 或使用tshark命令行版本
sudo tshark -i eth0 -Y "tcp.flags.reset == 1"
# 调整NAT超时设置
sudo sysctl -w net.netfilter.nf_conntrack_tcp_timeout_established=86400
# 调整TCP FIN超时
sudo sysctl -w net.ipv4.tcp_fin_timeout=15
# 启用TCP TW重用
sudo sysctl -w net.ipv4.tcp_tw_reuse=1
# 增加本地端口范围
echo "net.ipv4.ip_local_port_range = 1024 65535" | sudo tee -a /etc/sysctl.conf
# 增加TCP最大半连接队列
echo "net.ipv4.tcp_max_syn_backlog = 8192" | sudo tee -a /etc/sysctl.conf
通过以上方法,您应该能够诊断并解决大多数Linux服务器上的网络连接重置问题。如果问题仍然存在,可能需要更深入地分析特定应用程序的行为或网络拓扑结构。