You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 19:36:00