Linux下HTTP访问失败但HTTPS/SSH正常的网络故障排查与解决


阅读 8 次

问题现象描述

最近在使用Fedora 14系统时遇到一个奇怪现象:HTTP协议的网络访问经常中断,而HTTPS和SSH连接却完全正常。具体表现为:


# 典型故障时的traceroute表现
traceroute to 163.com (220.181.8.178), 30 hops max, 60 byte packets
 1  * * *
 2  58.246.230.1 (58.246.230.1)  6.228 ms * *
 3  * * *
 ...

多环境对比测试

通过交叉验证发现几个关键现象:

  • 同一路由器的iPod Touch网络正常
  • Windows 7下wlan0可用但eth0不可用
  • Linux下双网卡(eth0/wlan0)均HTTP失败但HTTPS/SSH正常

深度排查步骤

首先检查MTU设置问题,这是国内网络环境中常见问题:


# 检查当前MTU值
ifconfig | grep mtu

# 临时修改MTU测试(建议值1412-1472)
sudo ifconfig eth0 mtu 1412
sudo ifconfig wlan0 mtu 1412

然后检查TCP窗口缩放问题,国内某些ISP设备对此支持不佳:


# 查看当前TCP参数
sysctl net.ipv4.tcp_window_scaling

# 临时关闭测试
sudo sysctl -w net.ipv4.tcp_window_scaling=0

关键发现:HTTP透明代理干扰

通过tcpdump抓包分析发现:


# 抓取HTTP流量
sudo tcpdump -i eth0 port 80 -vv -n

# 典型异常输出
IP (tos 0x0, ttl 64, id 12345, offset 0, flags [DF], proto TCP (6), length 52)
    192.168.1.100.12345 > 220.181.8.178.80: Flags [S], cksum 0xabcd (correct), seq 123456789, win 65535, options [mss 1360,sackOK,TS val 1234567 ecr 0,nop,wscale 6], length 0

注意到MSS值被异常修改,这通常意味着存在中间设备干扰。

终极解决方案

综合国内网络环境特点,推荐以下配置:


# /etc/sysctl.conf 优化配置
net.ipv4.tcp_mtu_probing = 1
net.ipv4.tcp_base_mss = 1024
net.ipv4.route.mtu_expires = 1800

# 针对HTTP协议的特殊路由规则
ip route add default via 192.168.1.1 dev eth0 advmss 1024

对于企业级环境,建议增加iptables规则:


# 防止TCP选项被篡改
iptables -t mangle -A OUTPUT -p tcp --dport 80 -j TCPOPTSTRIP --strip-options wscale
iptables -t mangle -A OUTPUT -p tcp --dport 80 -j TCPOPTSTRIP --strip-options sack

长效监控方案

建议部署自动化监控脚本:


#!/bin/bash
while true; do
  if ! curl -sI http://www.baidu.com >/dev/null; then
    logger "HTTP检测失败,自动重置网络接口"
    ifdown eth0 && ifup eth0
    sleep 60
  fi
  sleep 300
done