wget与host解析同一域名返回不同IP导致ufw拦截如何解决
问题根因
你遇到的IP不一致问题核心是目标域名配置了多IP解析(通常是DNS轮询实现负载均衡),host命令会返回该域名的所有解析结果,你的脚本仅提取了第一条结果,而wget、ping等工具会从返回的IP列表中随机选择一个使用,自然会出现规则匹配失败被拦截的情况。
可行解决方案
方案1:放行域名解析返回的所有IP
修改脚本,不再只取单个IP,遍历所有解析结果添加/更新ufw规则,适配多IP场景:
HOSTNAME=<name of site to resolve> LOGFILE=<logfile path> # 获取所有解析到的IPv4地址 Current_IPs=$(host $HOSTNAME | grep "has address" | awk '{print $4}') if [ -f $LOGFILE ]; then # 清理旧的IP规则 Old_IPs=$(cat $LOGFILE) for ip in $Old_IPs; do /usr/sbin/ufw delete allow out from any to $ip done fi # 添加新的IP规则 for ip in $Current_IPs; do /usr/sbin/ufw allow out from any to $ip done # 保存当前所有IP到日志文件 echo "$Current_IPs" > $LOGFILE echo "IP rules updated, total $(echo $Current_IPs | wc -w) IPs allowed" >> ./download.log
如果需要适配IPv6,可以额外筛选host返回的IPv6地址,按同样逻辑添加规则即可。
方案2:强制wget使用指定IP访问,避免二次解析
如果你只需要放行走脚本获取到的单个IP,可以在调用wget时跳过自身的DNS解析步骤,直接用脚本解析到的IP发起请求:
- HTTP站点可以手动指定Host头:
# 沿用你原有脚本获取的Current_IP变量 wget --header "Host: $HOSTNAME" "http://${Current_IP}/你的资源路径" - HTTPS站点需要添加
--resolve参数避免证书校验报错:wget --resolve "$HOSTNAME:443:$Current_IP" "https://${HOSTNAME}/你的资源路径"
修改完成后可以通过ufw status确认放行的IP列表符合预期,即可解决拦截问题。
内容的提问来源于stack exchange,提问作者pdmoerman
相关产品推荐
相关产品推荐

