Python利用Scapy修改源IP发送HTTP请求

拾柒
拾柒
发布时间:2026-10-14| 2人浏览过
原创

本文介绍如何使用Python的Scapy库轻松修改数据包源IP地址,以模拟多个IP向域名发送HTTP请求。针对随机域名解析失败的问题,提供了添加本地hosts文件或配置DNS代理两种解决方案,帮助开发者高效进行WAF功能测试。

本文详细介绍了一种基于Python Scapy库修改IP地址并发送网络请求的实现方法,供读者参考学习。

使用Scapy修改源IP

近期有同事需要测试WAF(Web应用防火墙)的页面统计功能,这要求模拟来自多个不同IP地址的请求访问多个域名,即需要动态修改数据包的源IP地址。若使用传统的socket库,需操作raw socket,实现过程较为复杂繁琐。

借助Scapy库,可以简化这一过程,轻松完成源IP的修改与请求发送。

代码示例中,DOMAIN变量代表随机生成的域名库,SOURCE变量代表随机生成的源IP地址池。


#!/usr/bin/env python
#-*-encoding:UTF-8-*-
from scapy.all import *
from threading import Thread
from Queue import Queue
import random
import string
USER_AGENTS = ( # items used for picking random HTTP User-Agent header value
  "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_7_0; en-US) AppleWebKit/534.21 (KHTML, like Gecko) Chrome/11.0.678.0 Safari/534.21",
  "Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)",
  "Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:0.9.2) Gecko/20020508 Netscape6/6.1",
  "Mozilla/5.0 (X11;U; Linux i686; en-GB; rv:1.9.1) Gecko/20090624 Ubuntu/9.04 (jaunty) Firefox/3.5",
  "Opera/9.80 (X11; U; Linux i686; en-US; rv:1.9.2.3) Presto/2.2.15 Version/10.10"
)
TOP_DOMAIN = ('com','org','net','gov','edu','mil','info','name','biz')
DOMAIN = ["www.%s.%s" %(
    '.'.join(''.join(random.sample(string.ascii_lowercase, random.randint(2,6))) for x in range(random.randint(1,2))),
    random.choice(TOP_DOMAIN))
    for _ in range(100)
]
SOURCE = ['.'.join((str(random.randint(1,254)) for _ in range(4))) for _ in range(100)]
class Scan(Thread):
  HTTPSTR = 'GET / HTTP/1.0\r\nHost: %s\r\nUser-Agent: %s\r\n\r\n'
  def run(self):
    for _ in xrange(100):
      domain = random.choice(DOMAIN)
      http = self.HTTPSTR % (domain,random.choice(USER_AGENTS))
      try:
        request = IP(src=random.choice(SOURCE),dst=domain) / TCP(dport=80) / http
        #request = IP(dst=domain) / TCP(dport=80) / http
        send(request)
      except:
        pass
task = []
for x in range(10):
  t = Scan()
  task.append(t)
for t in task:
  t.start()
for t in task:
  t.join()
print 'all task done!'

解决随机域名解析问题

然而,这种做法会引发一个潜在问题:由于域名是随机构造的,发送请求时系统通常会先尝试DNS解析,这极易导致解析失败。为解决此问题,可采用以下两种方案:

第一种方案是将所有测试域名添加到操作系统的本地hosts文件中,对应的IP地址可指向目标服务器地址。

第二种方案是利用DNS代理或自行开发解析工具,因为hosts文件不支持通配符。这里推荐一个开源项目:https://github.com/phuslu/dnsproxy/blob/master/dnsproxy.py,可根据需求灵活配置解析规则。

如需了解更多Python相关知识,可查看本站相关专题,包括《Python Socket编程技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》。

希望本文提供的解决方案对您的Python编程实践有所帮助。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。