YyyyFffff YG远方
关注数: 19 粉丝数: 20 发帖数: 248 关注贴吧数: 75
代理是什么?(HTTP代理,SOCKS代理) 本来打算通过UDP53来绕过认证,在准备实现DNS隧道的时候,发现所涉及的内容实在是太多了…(DNS解析原理,域名的原理,隧道技术,代理技术 and so on),每一个知识点都能让我深入去研究一段时间。因此在实现DNS隧道的时候相当难受,走两步就碰到一个不会的知识点。遂先放开一段时间,先把其他知识点给搞通了,再回过头来实现DNS隧道。由此可见,基础不扎实在办事情的时候是相当dan teng的。 什么是代理? 虽然很早就接触过代理,但一直对这个问题没有很深入的理解。究竟代理的是什么东西?谁来做这件事?这些东西完全不懂,顶多就明白是有某种机制帮我完成了本该我自己去完成的东西。这几天看这些东西看得我脑阔疼,说说我的现在理解: HTTP代理 我们正常的HTTP通信是这样的: 客户端先通过TCP与服务器建立一条连接 连接建立完成后,客户端向服务器发送请求(比如GET /hello.html HTTP/1.1,意为我想要取得服务器根目录/下的hello.html文件) 服务器接收到客户端发来的请求,找到所请求的文件,并通过原来的连接发回去。(接上条的例子,找到根目录/下的hello.html文件,并发送HTTP/1.1 200 OK,代表找到了这个文件,现在我就发送给你) 客户端接收到服务器传过来的文件,并用浏览器渲染出来给用户看(通过html/css以及js等把传回来的文本内容可视化,展示在屏幕上) 但我现在可能不想要按照人家的规定来访问,比如说我想访问根目录下的fxxk.html文件,然而又没办法直接跳转过去,那怎么办?这时候就轮到代理服务器出场了(当然这种需求改个url就可以了,这里只是举个栗子): 假设我们有一个受我们控制的代理服务器A。 客户端先与A建立TCP连接,然后告诉代理服务器A我想要访问某某网址根目录下的hello.html 代理服务器A收到请求,这时我们可以修改请求的内容,比如把hello.html改成fxxk.html。再建立一条到客户端指定网址的TCP连接,把这个新的请求的通过这个新连接发送过去。 这样在服务器看来,就好像是客户端请求了/fxxk.html一样,然后把所请求的内容返回回去,代理服务器再把内容通过第一条连接送回客户端… 总结一下,这次请求中,HTTP代理共建立了两条TCP连接:一条是客户端到代理服务器的,另一条是代理服务器到HTTP服务器的。这时代理服务器就好像一个中间商,可以看到你们双方交互的所有内容,并且也可以邪恶地更改这些内容。 顺便一说,代理https也是一样建立了这两个连接。客户端与代理服务器建立https连接,代理服务器又与HTTP服务器建立https连接,所以表面上我们是与代理服务器建立https连接的,这也是为什么在进行这种代理的时候需要导入代理服务器的https证书。 再举个栗子吧。比如说你小时候,和你爸爸路过麦当劳。这时候你想要吃甜筒,但自己又没money,于是你只能先告诉你爸爸:“爸,我想吃甜筒”。深思熟虑后你爸同意了(一般不太可能orz),他去店里跟店员买甜筒,并拿回来给你。这时,你先与代理服务器(你爸爸)建立连接,把请求(甜筒)告诉他,他再与店员建立连接并发送请求(买甜筒),最后把结果返回到你手中,你爸爸就扮演了一个代理的角色。 SOCKS代理 其实代理的原理都差不多,SOCKS代理运行在比HTTP代理更低的层次上,同样也是建立两个连接:先与来请求内容的客户端建立连接(1),查看请求内容,与真正的服务器建立连接(2)并发送请求。只不过SOCKS代理还会把中间通信的内容给加密了,因此这种代理更加安全。并且socks5还引入了认证以及多种加密方式和对udp等多种协议的支持,因此能更加安全可靠地帮你办更多事情。
玩Python之HTTP代理 0x00 前言 大家对HTTP代理应该都非常熟悉,它在很多方面都有着极为广泛的应用。HTTP代理分为正向代理和反向代理两种,后者一般用于将防火墙后面的服务提供给用户访问或者进行负载均衡,典型的有Nginx、HAProxy等。本文所讨论的是正向代理。 HTTP代理最常见的用途是用于网络共享、网络加速和网络限制突破等。此外,HTTP代理也常用于Web应用调试、Android/IOS APP 中所调用的Web API监控和分析,目前的知名软件有Fiddler、Charles、Burp Suite和mitmproxy等。HTTP代理还可用于请求/响应内容修改,在不改变服务端的情况下为Web应用增加额外的功能或者改变应用行为等。 0x01 HTTP代理是什么 HTTP代理本质上是一个Web应用,它和其他普通Web应用没有根本区别。HTTP代理收到请求后,根据Header中Host字段的主机名和Get/POST请求地址综合判断目标主机,建立新的HTTP请求并转发请求数据,并将收到的响应数据转发给客户端。 如果请求地址是绝对地址,HTTP代理采用该地址中的Host,否则使用Header中的HOST字段。做一个简单测试,假设网络环境如下: 192.168.1.2 Web服务器 192.168.1.3 HTTP代理服务器 使用telnet进行测试 $ telnet 192.168.1.3 GET / HTTP/1.0 HOST: 192.168.1.2 注意最后需要连续两个回车,这是HTTP协议要求。完成后,可以收到 http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2F192.168.1.2%2F&urlrefer=00bab3743c1b836f2130fb97cc633259 的页面内容。下面做一下调整,GET请求时带上绝对地址 $ telnet 192.168.1.3 GET http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fhttpbin.org%2Fip&urlrefer=5921d41471bae475960a10179cd9092d HTTP/1.0 HOST: 192.168.1.2 注意这里同样设置了HOST为192.168.1.2,但运行结果却返回了 http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fhttpbin.org%2Fip&urlrefer=5921d41471bae475960a10179cd9092d 页面的内容,也就是公网IP地址信息。 从上面的测试过程可以看出,HTTP代理并不是什么很复杂的东西,只要将原始请求发送到代理服务器即可。在无法设置HTTP代理的情况下,对于少量Host需要走HTTP代理的场景来说,最简单的方式就是将目标Host域名的IP指向代理服务器,可以采取修改hosts文件的方式来实现。 0x02 Python程序中设置HTTP代理 urllib2/urllib 代理设置 urllib2是Python标准库,功能很强大,只是使用起来稍微麻烦一点。在Python 3中,urllib2不再保留,迁移到了urllib模块中。urllib2中通过ProxyHandler来设置使用代理服务器。 proxy_handler = urllib2.ProxyHandler({'http': '121.193.143.249:80'}) opener = urllib2.build_opener(proxy_handler) r = opener.open('http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fhttpbin.org%2Fip&urlrefer=5921d41471bae475960a10179cd9092d') print(r.read()) 也可以用install_opener将配置好的opener安装到全局环境中,这样所有的urllib2.urlopen都会自动使用代理。 urllib2.install_opener(opener) r = urllib2.urlopen('http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fhttpbin.org%2Fip&urlrefer=5921d41471bae475960a10179cd9092d') print(r.read()) 在Python 3中,使用urllib。 proxy_handler = urllib.request.ProxyHandler({'http': 'http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2F121.193.143.249%3A80%2F&urlrefer=5d2ace2faf97afc1cba2cb128834fb9b'}) opener = urllib.request.build_opener(proxy_handler) r = opener.open('http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fhttpbin.org%2Fip&urlrefer=5921d41471bae475960a10179cd9092d') print(r.read()) requests 代理设置 requests是目前最优秀的HTTP库之一,也是我平时构造http请求时使用最多的库。它的API设计非常人性化,使用起来很容易上手。给requests设置代理很简单,只需要给proxies设置一个形如 {'http': 'x.x.x.x:8080', 'https': 'x.x.x.x:8080'} 的参数即可。其中http和https相互独立。 In [5]: requests.get('http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fhttpbin.org%2Fip&urlrefer=5921d41471bae475960a10179cd9092d', proxies={'http': '121.193.143.249:80'}).json() Out[5]: {'origin': '121.193.143.249'} 可以直接设置session的proxies属性,省去每次请求都要带上proxies参数的麻烦。 s = requests.session() s.proxies = {'http': '121.193.143.249:80'} print(s.get('http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fhttpbin.org%2Fip&urlrefer=5921d41471bae475960a10179cd9092d').json()) 0x03 HTTP_PROXY / HTTPS_PROXY 环境变量 urllib2 和 Requests 库都能识别 HTTP_PROXY 和 HTTPS_PROXY 环境变量,一旦检测到这些环境变量就会自动设置使用代理。这在用HTTP代理进行调试的时候非常有用,因为不用修改代码,可以随意根据环境变量来调整代理服务器的ip地址和端口。*nix中的大部分软件也都支持HTTP_PROXY环境变量识别,比如curl、wget、axel、aria2c等。 $ http_proxy=121.193.143.249:80 python -c 'import requests; print(requests.get("http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fhttpbin.org%2Fip&urlrefer=5921d41471bae475960a10179cd9092d").json())' {u'origin': u'121.193.143.249'} $ http_proxy=121.193.143.249:80 curl httpbin.org/ip { "origin": "121.193.143.249" } 在IPython交互环境中,可能经常需要临时性地调试HTTP请求,可以简单通过设置 os.environ['http_proxy'] 增加/取消HTTP代理来实现。 In [245]: os.environ['http_proxy'] = '121.193.143.249:80' In [246]: requests.get("http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fhttpbin.org%2Fip&urlrefer=5921d41471bae475960a10179cd9092d").json() Out[246]: {u'origin': u'121.193.143.249'} In [249]: os.environ['http_proxy'] = '' In [250]: requests.get("http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fhttpbin.org%2Fip&urlrefer=5921d41471bae475960a10179cd9092d").json() Out[250]: {u'origin': u'x.x.x.x'} 0x04 MITM-Proxy MITM 源于 Man-in-the-Middle Attack,指中间人攻击,一般在客户端和服务器之间的网络中拦截、监听和篡改数据。 mitmproxy是一款Python语言开发的开源中间人代理神器,支持SSL,支持透明代理、反向代理,支持流量录制回放,支持自定义脚本等。功能上同Windows中的Fiddler有些类似,但mitmproxy是一款console程序,没有GUI界面,不过用起来还算方便。使用mitmproxy可以很方便的过滤、拦截、修改任意经过代理的HTTP请求/响应数据包,甚至可以利用它的scripting API,编写脚本达到自动拦截修改HTTP数据的目的。 # test.py def response(flow): flow.response.headers["BOOM"] = "boom!boom!boom!" 上面的脚本会在所有经过代理的Http响应包头里面加上一个名为BOOM的header。用mitmproxy -s 'test.py'命令启动mitmproxy,curl验证结果发现的确多了一个BOOM头。 $ http_proxy=localhost:8080 curl -I 'httpbin.org/get' HTTP/1.1 200 OK Server: nginx Date: Thu, 03 Nov 2016 09:02:04 GMT Content-Type: application/json Content-Length: 186 Connection: keep-alive Access-Control-Allow-Origin: * Access-Control-Allow-Credentials: true BOOM: boom!boom!boom! ... 显然mitmproxy脚本能做的事情远不止这些,结合Python强大的功能,可以衍生出很多应用途径。除此之外,mitmproxy还提供了强大的API,在这些API的基础上,完全可以自己定制一个实现了特殊功能的专属代理服务器。 经过性能测试,发现mitmproxy的效率并不是特别高。如果只是用于调试目的那还好,但如果要用到生产环境,有大量并发请求通过代理的时候,性能还是稍微差点。我用twisted实现了一个简单的proxy,用于给公司内部网站增加功能、改善用户体验,以后有机会再和大家分享。
HTTP代理的运用 HTTP代理主要运用于爬虫大数据的抓取,网络爬如果想在较短的时间内抓取大量的数据,需要配合使用HTTP代理IP,网络爬虫没有代理IP,可以说是寸步难行了。大多数的网站都会设置一个阈值,当某个IP访问的次数到达了阈值便会受限制;还有很多网站会设置一个访问频率,当单位时间内访问频率反人类了也会被限制,这个时候只有代理IP才可以突破这个限制。 关于HTTP代理服务器的主要功能包括五个方面: 1、突破自身IP访问限制,访问国外度站点。 2、访问一些单位或团体内部资源。 3、突破中国电信的ip封锁:中国电信有很多网站限制了用户访问,使用HTTP代理可以突破访问限制。 4、提高访问速度:通常代回理服务器都设置一个较大的硬盘缓冲区,当有外界的信息通过时将信息保存到缓冲区中,当其他用户再访问相同的信息时, 可直接由缓冲区中取出信息传递给用户,提高访问速度。 5、隐藏真实IP:HTTP代理可以隐藏IP地址,避免受到网络攻答击。 使用HTTP代理可以做到以上的需求。那么HTTP是怎样代理的。 1、提取代理ip-生成生成API链接生-打开链接2、可以使用打开360安全浏览器,并点击【打开菜单-工具-代理服务器-代理服务器设置】 3、粘贴提取的代理IP地址至代理服务器列表,即完成设置代理ip便是更改你的本机ip替换成另一个ip使用,操作方便,使用便捷并且还不用担心ip被网站封掉,因为一般的代理ip商都会针对爬虫做出策略。所以如果你是真的做爬虫要采集大量数据代理ip是你最好的选择。
代理IP对哪些人群有用呢   在网络信息交流越来越频繁的时代,为了效果,现在有越来越多人都需要使用代理IP,在工作中通过切换IP的方法,提高工作的效率,那么代理IP对哪些人群有用呢?今天一起跟飞猪代理去了解一下吧。 图1   1、网络推广人员   使用代理IP能够轻松的在同一个网站上以及不同的网站上注册多个账号,发表许多推广帖子,同时不必担心因为重复注册重复发帖推广而导致IP被封,为推广的工作带来方便。现在很多企业和个人点后认识到了网络带来的广告效益和传播速度,因此网络推广就成了必要的一种手段。如果一个推广推广的好的话,就能够迅速的低成本的让许多人知道这个商品,迅速的打响公司的知名度。因此网络推广人员对于代理ip是比不可少的工具。   2、爬虫采集人员   随着互联网的高速发展,无论是互联网企业或者传统行业都开始了大数据采集与分析,建立自己的大数据库,从而催生了无数的数据采集公司,也就是我们所说的网络爬虫、网络蜘蛛;网络爬虫在进行数据采集的时候需要用到大量的代理IP。如果没有代理IP,自然是无法突破IP限制,采集到大量的数据,只能原始的采集数据,不仅耗时耗力,效果还不好。   3、销量补量人员   商家在进行宣传之外,营销补量也是商家比较惯用的一种营销手段,营销补量也是通过换IP的技术来进行投票点赞、提高软件下载量、宝贝收藏等销售量。   4、网络兼职人员   随着网络媒体对人类社会的影响越来越大,各式各样的网络兼职也就成了许多的人谋生手段,正因为网络兼职的时间不限制,工作内容简单,越来越多的有空闲的人加入了进来。特别是像那些游戏试玩、电商优化、邮件群发以及打码投票等工作,都会需要到数量庞大的IP,为了工作的方便快捷,选择一个合适的代理IP就显得特别重要了。
1 下一页