一个简单粗暴的 HTTP/S “自然”流量生成器。
只是一个简单(写得不太好)的 Python 脚本,它会从预定义的 ROOT_URLS 开始,随机“点击”页面上的链接,漫无目的地“浏览”互联网,直到达到预定义的 MAX_DEPTH。
我创建这个工具是作为噪声生成器,用于事件响应/网络防御模拟。唯一的问题是,我的模拟环境使用了多台 IDS/IPS/NGFW 设备,它们不会放行并记录针对预置流量的简单 TCP 重放。我需要流量尽可能自然,基本上模拟真实用户浏览网页。
已在 Ubuntu 14.04 和 16.04 minimal 上测试,但应该可以在任何安装了 Python 的系统上运行。
简单得不能再简单了……
首先,在脚本顶部指定一些设置……
MAX_DEPTH = 10、MIN_DEPTH = 5 从每个根 URL(例如:www.yahoo.com)开始,我们的生成器会点击浏览到一个深度,
该深度在 MIN_DEPTH 和 MAX_DEPTH 之间随机选择。每次 HTTP GET 请求之间的间隔会在以下两个变量之间随机选择……
MIN_WAIT = 5 请求之间至少等待 5 秒……注意不要请求太快,因为那往往会惹恼 Web 服务器。
MAX_WAIT = 10 我想你明白我的意思。
DEBUG = False 一个“穷人版”日志器。设置为 True 可在控制台进行详细实时打印,用于调试或开发。我稍后(也许)会加入正规的日志功能。
ROOT_URLS = [url1,url2,url3] 浏览时起始的根 URL 列表。随机选择。
blacklist = [".gif", "intent/tweet", "badlink", etc...] 一个字符串黑名单,我们会用它来检查每个链接。如果链接包含此列表中的任何字符串,则丢弃该链接。这对于避免一些对流量生成器不友好的内容很有用,比如“Tweet this!”链接或指向图片文件的链接。
userAgent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3).......' 你猜对了,这是我们的无头浏览器交给 Web 服务器的 user-agent。你大概可以保持默认设置,但也可以随意更改。我强烈建议使用一个常见/有效的 user-agent,否则你很可能会很快被限速。
你唯一需要且可能没有的东西就是 requests。用以下命令安装:
sudo pip install requests
首先创建你的配置文件:
cp config.py.template config.py
运行生成器:
python gen.py
要了解底层正在发生什么的更多细节,请将 config.py 中的 Debug 变量从 False 改为 True。这将提供以下输出……
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Traffic generator started
Diving between 3 and 10 links deep into 489 different root URLs,
Waiting between 5 and 10 seconds between requests.
This script will run indefinitely. Ctrl+C to stop.
Randomly selecting one of 489 URLs
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Recursively browsing [https://arstechnica.com] ~~~ [depth = 7]
Requesting page...
Page size: 77.6KB
Data meter: 77.6KB
Good requests: 1
Bad reqeusts: 0
Scraping page for links
Found 171 valid links
Pausing for 7 seconds...
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Recursively browsing [https://arstechnica.com/author/jon-brodkin/] ~~~ [depth = 6]
Requesting page...
Page size: 75.7KB
Data meter: 153.3KB
Good requests: 2
Bad reqeusts: 0
Scraping page for links
Found 168 valid links
Pausing for 9 seconds...
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Recursively browsing [https://arstechnica.com/information-technology/2020/01/directv-races-to-decommission-broken-boeing-satellite-before-it-explodes/] ~~~ [depth = 5]
Requesting page...
Page size: 43.8KB
Data meter: 197.1KB
Good requests: 3
Bad reqeusts: 0
Scraping page for links
Found 32 valid links
Pausing for 8 seconds...
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Recursively browsing [https://www.facebook.com/sharer.php?u=https%3A%2F%2Farstechnica.com%2F%3Fpost_type%3Dpost%26p%3D1647915] ~~~ [depth = 4]
Requesting page...
Page size: 64.2KB
Data meter: 261.2KB
Good requests: 4
Bad reqeusts: 0
Scraping page for links
Found 0 valid links
Stopping and blacklisting: no links
最后一个尝试的 URL 很好地展示了某个 URL 抛出错误时的情况。我们只需将其添加到内存中的 config.blacklist 数组里,然后继续浏览。这样可以防止已知的不良 URL 重新回到队列中。