关于http代理与端口扫描

写爬虫总会有用到http代理的时候,通常的做法都是直接去代理网站(比如快代理,米扑代理)找代理ip来用,但是这些http代理的原理是什么?代理网站是怎么扫描到这么多代理ip的?这两个问题一直困扰着我,可能以前也查过相关资料,但没记住=。=# 今天还是把这个记下来吧,好记性不如烂笔头不是嘛。

一、http代理原理

参考:https://imququ.com/post/web-proxy.html

python实现简单的http代理:https://github.com/abhinavsingh/proxy.py

著名的开源http代理程序有:squid、harproxy、varnish。关于squid的用法可以参考我的下一篇文章《使用squid搭建代理服务器》

从知乎上摘抄了一份对比图,对比了这些开源代理的特性,可以了解一下。

屏幕快照 2016-04-05 上午12.03.25

二、端口扫描

代理网站如何扫描到那些可用的代理ip,最直接的方法就是使用暴力穷举:

扫描所有ipv4公网地址(ipv4地址数量有255*255*255*255大概42亿个,其中公网ip大概占20多亿个);

对每个公网ip进行端口扫描(最常用的是TCP SYN扫描),确认该ip下有哪些端口号对外开放(一台主机的端口数量是65535个);

然后再对这几个端口分别进行http代理测试,确认是否可用。

端口扫描的原理其实就是对该[ip: port]尝试进行TCP三次握手,参考:http://zenoh.iteye.com/blog/1264915

下面是一段python实现的最简单的端口扫描脚本:

#!/usr/bin/env python
from socket import * 

if __name__ == '__main__':
    target = raw_input('Enter host to scan: ')
    targetIP = gethostbyname(target)
    print 'Starting scan on host ', targetIP

    # 尝试扫描20 ~ 1025号端口
    for i in range(20, 1025):
        s = socket(AF_INET, SOCK_STREAM)

        # 连接测试(CONNECT扫描,进行三次握手)
        result = s.connect_ex((targetIP, i))

        if(result == 0) :
            print 'Port %d: OPEN' % (i,)
        s.close()

ps:github上有一个用java实现的ip端口扫描器:https://github.com/angryziber/ipscan

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top