代理的介绍

代理是什么?

代理IP又称代理服务器(Proxy Server),形象的讲,代理服务器是网络信息的中转站,它是介于浏览器和Web服务器之间的一台服务器,有了它之后,Request信号会先送到代理服务器,由代理服务器来取回浏览器所需要的信息并传送给你的浏览器。

代理有什么用?

使用爬虫爬取网站或者使用扫描器扫描目标时经常会遇到扫描频率较为频繁导致IP被封或者限制访问的情况,这时候我们就需要考虑利用IP代理的方式不断的变换IP进行爬虫和扫描,从而逃避目标端的检测。

代理池

代理池管理大量代理。换句话说,它是一个控制代理质量的系统,并决定哪些IP将被包含在某人使用的一组代理中。

如果您花费大量时间完成上述任务(例如SEO,数据挖掘),则使用代理池非常有用。通常情况下,从单一住宅IP发出所有请求是不安全的,因为您可以快速被禁止。

因此,您需要拥有一组始终保持IP隐藏的代理。此外,它们将足够快地旋转,以便目标网站服务器没有足够的时间将其中任何一个识别为可疑。

但是,在开始执行任务之前,需要准备好代理池。这使您可以专注于您正在做的事情而不是担心如果您将被服务器禁止。

如何获取代理IP

免费代理的网站问一下度娘或者谷哥应该就能得到很多答案,有:快代理 ()[https://www.kuaidaili.com/free/) 、[ProxyList(https://proxy-list.org/english/index.php) ,PorxyList是国外的一个提供免费代理的网站,貌似需要翻墙访问,这里我使用快代理提供的IP和端口。

img

img

需要注意的是,在使用proxychains代理转发过程中,如果目标对象为https,那么需要使用支持SSL/https协议的代理,快代理提供的免费代理均只支持http协议;Proxy List中有支持SSL/HTTPS协议且免费的代理。

不过还是建议购买付费代理池。

proxychains

介绍

ProxyChains遵循GNU协议的一款适用于linux系统的网络代理设置工具。强制由任一程序发起的TCP连接请求必须通过诸如TOR 或 SOCKS4, SOCKS5 或HTTP(S) 代理。支持的认证方式包括:SOCKS4/5的用户/密码认证,HTTP的基本认证。允许TCP和DNS通过代理隧道,并且可配置多个代理。

适用场景

在以下几种场合,你可以考虑使用ProxyChains:需要通过代理上网,或者需要突破诸如设置了端口限制的防火墙;或者要使用telnet,ssh,wget,vnc,apt,ftp,nmap等应用;事实上,甚至可以通过ProxyChains设置反向代理来让你能够从外部访问你的内部局域网。突破防火墙限制访问互联网。

特色功能

①支持不同的代理选择策略: 随机(代理列表内),顺序,动态顺序 (智能排除无用的代理)

②可以与任意程序结合使用,甚至网络扫描。通过代理或代理链可以实现端口扫描。

③通过可调的超时设定,支持真正的长代理链。

安装

Kali中自带ProxyChains,也可以从https://github.com/rofl0r/proxychains-ng下载安装。ProxyChains运行的所有配置都在/etc/proxychains.conf中。

1
apt-get install proxychains4

配置

修改配置文件

1
vim /etc/proxychains.conf
  • dynamic_chain:该配置项能够通过ProxyList中的每个代理运行流量,如果其中一个代理关闭或者没有响应,它能够自动选择ProxyList中的下一个代理。

  • strict_chain:改配置为ProxyChains的默认配置,不同于dynamic_chain,也能够通过ProxyList中的每个代理运行流量,但是如果ProxyList中的代理出现故障,不会自动切换到下一个。

  • random_chain:该配置项会从ProxyList中随机选择代理IP来运行流量,如果ProxyList中有多个代理IP,在使用proxychains的时候会使用不同的代理访问目标主机,从而使主机端探测流量更加困难。

例如:现在需要添加一个Socks5代理

将 dynamic_chain 前面的 “#” 去掉,并在 strict_chain 前添加 “#” 。

配置1

来到文件尾部,注释掉 sock4 开头的一行配置信息,因为我们需要所有流量均走 socks5 ,在其下方添加一行配置信息,格式如下:

1
socks5 <主机IP> <转发端口>

使用

命令格式:

1
proxychains4 <运行的命令> <命令参数>

例如:使用Nmap scanner通过代理可以查找web服务器。

1
proxychains4 nmap -sT -PO -p 80 -iR

-q参数可以静默适用代理,不会出现proxychains连接提示。

Proxy_Pool

Proxy_Pool,一个小巧的代理ip抓取+评估+存储+展示的一体化的工具,可自动化的搜集检测可用代理并进行评分,并添加了web展示和接口。

程序的几个功能:

1、每天从多个代理ip网站上抓下最新高匿ip数据。

2、经过筛选后的ip将存入数据库。

3、存入数据库的ip每天也要经过测试,存在剔除、评分机制,多次不合格的ip将被删除,每个ip都被评分,我们最终可以按得分排名获得稳定、低响应时间的优质ip。

项目地址:https://github.com/TideSec/Proxy_Pool

还有另一个推荐的爬虫代理IP池项目:https://github.com/jhao104/proxy_pool

安装与使用

1、安装python2依赖库

1
2
3
pip install lxml
pip install requests
pip install pymysql

2、将源代码从GitHub上下载,把代码放在Web目录下

1
2
3
4
5
git clone https://github.com/TideSec/Proxy_Pool
mv Proxy_Pool /var/html/www/
cd /var/html/www/Proxy_Pool/
vim include/config.inc.php # 修改配置中的数据库用户名和密码
cd py_proxy_task/

3、开启mysql或mariadb数据库

1
service mariadb start

4、修改配置文件py_proxy_task/config.py(修改数据库用户名、密码)

1
vim config.py

5、使用python2运行proxy_get.py爬取代理IP

1
python2 proxy_get.py

6、使用python2运行proxy_check.py查看代理IP的存活情况

1
python2 proxy_check.py

7、访问站点

09d2f1b47ee8e924662b4f4c8118549c.png

8、Web接口

e1d2fce67714788f2e78be5ceb0402a9.png

将代理池IP自动添加入proxychains配置

远程添加可以使用Web接口,这里就不使用Web接口了,直接利用数据库中的数据进行添加。

记得提前备份好配置文件。

不多说直接上代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import pymysql
import re,time

db_host = "127.0.0.1"
db_user = "root"
db_pass = "123456"
db_name = "proxy"
filename = "/etc/proxychains4.conf"

ips = []
ports = []
results = []

conn = pymysql.connect(
host=db_host,
user=db_user,
password=db_pass,
database=db_name,
charset="utf8")

cursor = conn.cursor()
sql = "SELECT content FROM valid_ip"
cursor.execute(sql)
results = cursor.fetchall()
cursor.close()
conn.close()

for result in results:
ips.append(re.findall(r'\d+.\d+.\d+.\d+',result[0])[0])
ports.append(re.findall(r'(?<=:)\d+',result[0])[0])

with open (filename,'w') as f:
f.write("random_chain\nproxy_dns\nremote_dns_subnet 224\ntcp_read_time_out 15000\ntcp_connect_time_out 8000\n\n[ProxyList]\n")
f.close()
for i in range(0,len(ips)):
print("--> IP: ",ips[i]," PORT: ",ports[i]," <--")
with open (filename,'a') as f:
f.write("http %s %s\n" %(ips[i],ports[i]))
f.close()

不过这个代理池很多ip都用不了。

让我们再对脚本做亿点点优化,增加了对端口的存活验证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
import pymysql,socket,threading
import re,time,nmap

global f
class GetProxy:
db_host = "127.0.0.1"
db_user = "root"
db_pass = "1231414514"
db_name = "proxy"
filename = "/etc/proxychains4.conf"
ips = []
ports = []
nm = nmap.PortScanner()

def check_port(self,ip,port):
#sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#sock.settimeout(5)
#result = sock.connect_ex((ip,port))
try:
self.nm.scan(ip,port)
result = self.nm[ip]['tcp'][int(port)]['state']

if result=='open':
print("--> IP: ",ip," PORT: ",port," <--")
with open(self.filename, 'a') as f:
f.write("http %s %s\n" % (ip, port))
f.close()
except:
pass


def get_sql(self):
conn = pymysql.connect(
host=self.db_host,
user=self.db_user,
password=self.db_pass,
database=self.db_name,
charset="utf8")

cursor = conn.cursor()
sql = "SELECT content FROM valid_ip"
cursor.execute(sql)
self.results = cursor.fetchall()
cursor.close()
conn.close()

def get_result(self):
for result in self.results:
self.ips.append(re.findall(r'\d+.\d+.\d+.\d+',result[0])[0])
self.ports.append(re.findall(r'(?<=:)\d+',result[0])[0])
with open (self.filename,'w') as f:
f.write("random_chain\nproxy_dns\nremote_dns_subnet 224\ntcp_read_time_out 15000\ntcp_connect_time_out 8000\n\n[ProxyList]\n")
f.close()

def multi_thread(self):
self.threads = []
for i in range(0,len(self.ips)):
self.threads.append(
threading.Thread(target=GetProxy.check_port, args=(self, self.ips[i],self.ports[i],))
)
for thread in self.threads:
thread.start()

for thread in self.threads:
thread.join()

if __name__ == "__main__":
proxy = GetProxy()
proxy.get_sql()
proxy.get_result()
proxy.multi_thread()

虽然筛选掉了大部分未存活的主机,但是还是有很多代理连接超时。

总结:天底下没有免费的午餐,免费的不一定就好。有能力的还是选择使用付费代理吧。