迅速で乱暴なHTTP/S「有機的」トラフィックジェネレーター。
あらかじめ定義された ROOT_URLS から開始し、ページ上のリンクをランダムに「クリック」して、事前定義された MAX_DEPTH に達するまでインターネットを無目的に「閲覧」する、単純な(出来の悪い)Pythonスクリプトです。
これは、インシデント対応/ネットワーク防御シミュレーション用のノイズジェネレーターとして作成しました。唯一の問題は、シミュレーション環境が複数の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リクエスト間の間隔は、以下の2つの変数の間でランダムに選択されます...
MIN_WAIT = 5 リクエスト間で最低 5 秒待機します。リクエストを速くしすぎるとウェブサーバーを怒らせる傾向があるので注意してください。
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).......' お察しの通り、ヘッドレスブラウザがウェブサーバーに渡すユーザーエージェントです。デフォルトのままでも構いませんが、変更してもかまいません。一般的で有効なものを使うことを強くお勧めします。そうしないと、すぐにレート制限される可能性があります。
必要なもので、おそらくインストールされていない可能性があるのは 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がエラーを投げる良い例を示しています。そのURLを config.blacklist 配列にメモリ上で追加し、ブラウジングを続行します。これにより、既知の不良URLがキューに戻るのを防ぎます。