[python網絡編程]使用scapy修改源IP發送請求

 

Python爬蟲視頻教程零基礎小白到scrapy爬蟲高手-輕鬆入門python

https://item.taobao.com/item.htm?spm=a1z38n.10677092.0.0.482434a6EmUbbW&id=564564604865服務器

 

能夠每隔10秒更換ipapp

 

 

 

 

 

 

 

 http://www.jb51.net/article/65513.htmdom

http://blog.csdn.net/yueguanghaidao/article/details/25246867scrapy

 

今天同事想測試WAF的頁面統計功能,因此須要模擬多個IP向多個域名發送請求,也就是須要修改源IP地址。這個若是使用socket庫就比較麻煩了,socket

須要使用raw socket,至關麻煩。還好咱有scapy,輕鬆搞定。工具

DOMAIN是我隨機構造的域名庫,SOURCE也是隨機構造的源IP地址。測試

 

[python]  view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. #!/usr/bin/env python  
  2. #-*-encoding:UTF-8-*-  
  3.   
  4. from scapy.all import *  
  5. from threading import Thread  
  6. from Queue import Queue  
  7. import random  
  8. import string  
  9.   
  10.   
  11. USER_AGENTS = (                                               # items used for picking random HTTP User-Agent header value  
  12.     "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",  
  13.     "Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)",  
  14.     "Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:0.9.2) Gecko/20020508 Netscape6/6.1",  
  15.     "Mozilla/5.0 (X11;U; Linux i686; en-GB; rv:1.9.1) Gecko/20090624 Ubuntu/9.04 (jaunty) Firefox/3.5",  
  16.     "Opera/9.80 (X11; U; Linux i686; en-US; rv:1.9.2.3) Presto/2.2.15 Version/10.10"  
  17. )  
  18.   
  19. TOP_DOMAIN = ('com','org','net','gov','edu','mil','info','name','biz')  
  20.   
  21. DOMAIN = ["www.%s.%s" %(   
  22.         '.'.join(''.join(random.sample(string.ascii_lowercase, random.randint(2,6))) for x in range(random.randint(1,2))),  
  23.         random.choice(TOP_DOMAIN))  
  24.         for _ in range(100)  
  25. ]  
  26.   
  27.   
  28. SOURCE = ['.'.join((str(random.randint(1,254)) for _ in range(4))) for _ in range(100)]  
  29.   
  30. class Scan(Thread):  
  31.     HTTPSTR = 'GET / HTTP/1.0\r\nHost: %s\r\nUser-Agent: %s\r\n\r\n'  
  32.     def run(self):  
  33.         for _ in xrange(100):  
  34.             domain = random.choice(DOMAIN)  
  35.             http = self.HTTPSTR % (domain,random.choice(USER_AGENTS))  
  36.             try:  
  37.                 request = IP(src=random.choice(SOURCE),dst=domain) / TCP(dport=80) / http  
  38.                 #request = IP(dst=domain) / TCP(dport=80) / http  
  39.                 send(request)  
  40.             except:  
  41.                 pass  
  42.             
  43. task = []  
  44. for x in range(10):  
  45.     t = Scan()  
  46.     task.append(t)  
  47.   
  48. for t in task:  
  49.     t.start()  
  50.   
  51. for t in task:  
  52.     t.join()  
  53.   
  54. print 'all task done!'  

 

但這將致使一個問題,因爲咱們域名是隨機構造的,發送請求確定首先查找DNS,極可能解析失敗。這裏有兩個方法解決這個問題:google

1.將全部域名添加到hosts本地文件中,IP能夠爲服務器地址spa

2. 因爲hosts文件不支持通配符表示,因此能夠使用DNS代理,或者本身寫小工具,想怎麼解析就怎麼解析,這裏有一個,http://code.google.com/p/marlon-tools/source/browse/tools/dnsproxy/dnsproxy.py

相關文章
相關標籤/搜索