实现socks5代理源码(socks5代理原理)
本文目录一览:
- 1、怎么搭建Socks5免费代理服务?
- 2、OkHttp源码解析 (三)——代理和路由
- 3、帮我写一个VB源码,自动使用socks5代理后打开一个网页。大神们帮帮忙
- 4、如何在Linux下配置socks5代理
- 5、急!!自己怎么搭建HTTP/Socks5隧道代理呢?
- 6、求delphi 设置socks5代理访问网页的源码
怎么搭建Socks5免费代理服务?
CCProxy是个国产好用性能优越的超级代理软件。具有一级,二级代理和完善的代理帐号管理功能,该软件兼容性和稳定性极好。
下面具体介绍一下用该软件架设服务器:
用CCProxy架设服务器,必须根据上网环境适当设置才能架设成功,下面就几种环境分别叙述架设服务器操作:
1.固定ip直连上网,架设服务器方法。
固定ip直连上网,架设服务器方法最为简单,直接安装CCProxy,并设置CCProxy就可以做代理服务器了。
2.固定ip+路由器上网,架设服务器方法。
固定ip+路由器上网,架设服务器,必须让设置路由器对外映射个端口。这个端口就是你的服务器对外开放的端口。例如,你的服务器代理地址和端口
为123.365.445.145 563 那你就得设置路由器对外映射个端口为563。映射端口设置好后,再对CCProxy做适当设置,你的电脑就可以做代理服务器了。
3.宽带猫拨号直连上网,架设服务器方法。
因为宽带猫拨号直连上网,每次你获取的外网ip都不一样。所以需要帮你每次拨号后,获得的不同ip绑定到固定的域名,才方便使用。
(1)动态域名解析
下载安装花生壳动态域名解析软件,可以把你的动态ip绑定到固定的域名上。
(2)绑定好域名后,再对设置CCProxy,你的电脑就可以做代理服务器了。
4.宽带猫拨号+路由器上网,架设服务器方法。
(1)动态域名解析
下载安装花生壳动态域名解析软件,可以把你的动态ip绑定到固定的域名上。
(2)路由器对外映射个端口。
(3)以上2步做好后,再对设置CCProxy,你的电脑就可以做代理服务器了。
OkHttp源码解析 (三)——代理和路由
初看OkHttp源码,由于对Address、Route、Proxy、ProxySelector、RouteSelector等理解不够,读源码非常吃力,看了几遍依然对于寻找复用连接、创建连接、连接服务器、连接代理服务器、创建隧道连接等逻辑似懂非懂,本篇决定梳理一遍相关的概念及基本原理。
● HTTP/1.1(HTTPS)
● HTTP/2
● SPDY
一个http请求的流程(直连):
1、输入url及参数;
2、如果是url是域名则解析ip地址,可能对应多个ip,如果没有指定端口,则用默认端口,http请求用80;
3、创建socket,根据ip和端口连接服务器(socket内部会完成3次TCP握手);
4、socket成功连接后,发送http报文数据。
一个https请求的流程(直连):
1、输入url及参数;
2、如果是url是域名则解析ip地址,可能对应多个ip,如果没有指定端口,则用默认端口,https请求用443;
3、创建socket,根据ip和端口连接服务器(socket内部会完成3次TCP握手);
4、socket成功连接后进行TLS握手,可通过java标准款提供的SSLSocket完成;
5、握手成功后,发送https报文数据。
1、分类
● HTTP代理:普通代理、隧道代理
● SOCKS代理:SOCKS4、SOCKS5
2、HTTP代理分类及说明
普通代理
HTTP/1.1 协议的第一部分。其代理过程为:
● client 请求 proxy
● proxy 解析请求获取 origin server 地址
● proxy 向 origin server 转发请求
● proxy 接收 origin server 的响应
● proxy 向 client 转发响应
其中proxy获取目的服务器地址的标准方法是解析 request line 里的 request-URL。因为proxy需要解析报文,因此普通代理无法适用于https,因为报文都是加密的。
隧道代理
通过 Web 代理服务器用隧道方式传输基于 TCP 的协议。
请求包括两个阶段,一是连接(隧道)建立阶段,二是数据通信(请求响应)阶段,数据通信是基于 TCP packet ,代理服务器不会对请求及响应的报文作任何的处理,都是原封不动的转发,因此可以代理 HTTPS请求和响应。
代理过程为:
● client 向 proxy 发送 CONNET 请求(包含了 origin server 的地址)
● proxy 与 origin server 建立 TCP 连接
● proxy 向 client 发送响应
● client 向 proxy 发送请求,proxy 原封不动向 origin server 转发请求,请求数据不做任何封装,为原生 TCP packet.
3、SOCKS代理分类及说明
● SOCKS4:只支持TCP协议(即传输控制协议)
● SOCKS5: 既支持TCP协议又支持UDP协议(即用户数据包协议),还支持各种身份验证机制、服务器端域名解析等。
SOCK4能做到的SOCKS5都可得到,但反过来却不行,比如我们常用的聊天工具QQ在使用代理时就要求用SOCKS5代理,因为它需要使用UDP协议来传输数据。
有了上面的基础知识,下面分析结合源码分析OkHttp路由相关的逻辑。OkHttp用Address来描述与目标服务器建立连接的配置信息,但请求输入的可能是域名,一个域名可能对于多个ip,真正建立连接是其中一个ip,另外,如果设置了代理,客户端是与代理服务器建立直接连接,而不是目标服务器,代理又可能是域名,可能对应多个ip。因此,这里用Route来描述最终选择的路由,即客户端与哪个ip建立连接,是代理还是直连。下面对比下Address及Route的属性,及路由选择器RouteSelector。
描述与目标服务器建立连接所需要的配置信息,包括目标主机名、端口、dns,SocketFactory,如果是https请求,包括TLS相关的SSLSocketFactory 、HostnameVerifier 、CertificatePinner,代理服务器信息Proxy 、ProxySelector 。
Route提供了真正连接服务器所需要的动态信息,明确需要连接的服务器IP地址及代理服务器,一个Address可能会有很多个路由Route供选择(一个DNS对应对个IP)。
Address和Route都是数据对象,没有提供操作方法,OkHttp另外定义了RouteSelector来完成选择的路由的操作。
1、读取代理配置信息:resetNextProxy()
读取代理配置:
● 如果有指定代理(不读取系统配置,在OkHttpClient实例中指定),则只用1个该指定代理;
● 如果没有指定,则读取系统配置的,可能有多个。
2、获取需要尝试的socket地址(目标服务器或者代理服务器):resetNextInetSocketAddress()
结合Address的host和代理,解析要尝试的套接字地址(ip+端口)列表:
● 直连或者SOCK代理, 则用目标服务器的主机名和端口,如果是HTTP代理,则用代理服务器的主机名和端口;
● 如果是SOCK代理,根据目标服务器主机名和端口号创建未解析的套接字地址,列表只有1个地址;
● 如果是直连或HTTP代理,先DNS解析,得到InetAddress列表(没有端口),再创建InetSocketAddress列表(带上端口),InetSocketAddress与InetAddress的区别是前者带端口信息。
3、获取路由列表:next()
选择路由的流程解析:
● 遍历每个代理对象,可能多个,直连的代理对象为Proxy.DIRECT(实际是没有中间代理的);
● 对每个代理获取套接字地址列表;
● 遍历地址列表,创建Route,判断Route如果在路由黑名单中,则添加到失败路由列表,不在黑名单中则添加到待返回的Route列表;
● 如果最后待返回的Route列表为空,即可能所有路由都在黑名单中,实在没有新路由了,则将失败的路由集合返回;
● 传入Route列表创建Selection对象,对象比较简单,就是一个目标路由集合,及读取方法。
为了避免不必要的尝试,OkHttp会把连接失败的路由加入到黑名单中,由RouteDatabase管理,该类比较简单,就是一个失败路由集合。
1、创建Address
Address的创建在RetryAndFollowUpInteceptor里,每次请求会声明一个新的Address及StreamAllocation对象,而StreamAllocation使用Address创建RouteSelector对象,在连接时RouteSelector确定请求的路由。
每个Requst都会构造一个Address对象,构造好了Address对象只是有了与服务器连接的配置信息,但没有确定最终服务器的ip,也没有确定连接的路由。
2、创建RouteSelector
在StreamAllocation声明的同时会声明路由选择器RouteSelector,为一次请求寻找路由。
3、选择可用的路由Route
下面在测试过程跟踪实例对象来理解,分别测试直连和HTTP代理HTTP2请求路由的选择过程:
● 直连请求流程
● HTTP代理HTTPS流程
请求url:
1、构造address对象
2、读取代理配置:resetNextProxy
3、解析目标服务器套接字地址:resetNextInetSocketAddress
4、选择Route创建RealConnection
5、确定协议
测试方法:
● 在PC端打开Charles,设置端口,如何设置代理,网上有教程,比较简单;
● 手机打开WIFI,选择连接的WIFI修改网络,在高级选项中设置中指定了代理服务器,ip为PC的ip,端口是Charles刚设置的端口;
● OkHttpClient不指定代理,发起请求。
1、构造address对象
2、读取代理配置:resetNextProxy
3、解析目标服务器套接字地址:resetNextInetSocketAddress
4、选择Route创建RealConnection
5、创建隧道
由于是代理https请求,需要用到隧道代理。
从图可以看出,建立隧道其实是发送CONNECT请求,header包括字段Proxy-Connection,目标主机名,请求内容类似:
6、确定协议,SSL握手
1、代理可分为HTTP代理和SOCK代理;
2、HTTP代理又分为普通代理和隧道代理;普通代理适合明文传输,即http请求;隧道代理仅转发TCP包,适合加密传输,即https/http2;
3、SOCK代理又分为SOCK4和SOCK5,区别是后者支持UDP传输,适合代理聊天工具如QQ;
4、没有设置代理(OkHttpClient没有指定同时系统也没有设置),客户端直接与目标服务器建立TCP连接;
5、设置了代理,代理http请求时,客户端与代理服务器建立TCP连接,如果代理服务器是域名,则解释代理服务器域名,而目标服务器的域名由代理服务器解析;
6、设置了代理,代理https/http2请求时,客户端与代理服务器建立TCP连接,发送CONNECT请求与代理服务器建立隧道,并进行SSL握手,代理服务器不解析数据,仅转发TCP数据包。
如何正确使用 HTTP proxy
OkHttp3中的代理与路由
HTTP 代理原理及实现(一)
帮我写一个VB源码,自动使用socks5代理后打开一个网页。大神们帮帮忙
平凡的真的不能用,楼主的代理也可以用呀,只有第二个不能用,我发个能用的,代码如下: Private Const INTERNET_OPTION_PROXY = 38 Private Const INTERNET_OPEN_TYPE_PROXY = 3 Private Type INTERNET_PROXY_INFO dwAccessType As Long lpszProxy As String lpszProxyBypass As String End Type Private Declare Function internetsetoption Lib "wininet.dll" _ Alias "InternetSetOptionA" _ (ByVal hinternet As Long, _ ByVal dwoption As Long, _ ByRef lpbuffer As Any, _ ByVal dwbufferlength As Long) As Long Function SetProxy() Dim options As INTERNET_PROXY_INFO options.dwAccessType = INTERNET_OPEN_TYPE_PROXY options.lpszProxy = "SOCKS=" Combo1.Text '127.0.0.1:9050 options.lpszProxyBypass = "" internetsetoption 0, INTERNET_OPTION_PROXY, options, LenB(options) End Function Private Sub Command1_Click() SetProxy WebBrowser1.Navigate Text1.Text End Sub
如何在Linux下配置socks5代理
ssh -D xxxx user@hostaddr:port (ssh转发实现socks5代理.)
使用通设定socks5全局代理.或者浏览器使用代理.或者用代理软件(软件名socks5.)
例:ssh -D 11111 root@192.168.10.10登录本打11111端口.端口代理端口.使用浏览器代理需要填入127.0.0.1:11111配置.通浏览器使用代理.
Linux各种各代理程序用象用Squidhttp/https代理能代理ftp请求实际HTTP代理程序ftp代理能处理ftp代理请求象浏览器处理ftp请求工作些程序能设置使用socks代理象CuteFTP;象Wu-FTP能设置使用ftp代理(ftp代理标准ftp代理Squid所支持种式);ICQ 2000能同接受https代理Socks代理;NetVampire能接受标准HTTP(GET/POST)代理(Squid支持)HTTP(CONNECT)代理(Squid支持)
使用Cute-FTP,除IP伪装外要使用Socks代理现让我看看配置Socks5程:
1. 载文件
载新版socks5源文件/tmp目录socks5-v1.0r11.tgz
2. 防火墙编译并安装(该防火墙应直接连至internet,安装两块网卡双宿主机假设内部网段
192.168.0.0/24)
cd /tmp
tar -xvfz socks5-v1.0r11.tgz
cd /tmp/socks5-v1.0r11
./configure --with-threads
make
make install
3. 配置文件/etc/socks5.conf
# /etc/socks5.conf
set SOCKS5_MAXCHILD 3
set SOCKS5_NOIDENT
set SOCKS5_TIMEOUT 5
interface 192.168.0. - eth1
auth 192.168.0. - u
permit u - 192.168.0. - - - jephe
permit u - 192.168.0. - - - jack
deny - - - - - - -
4. 配置文件/etc/socks5.passwd
# /etc/socks5.passwd
jephe password_of_jephe_is_here
jack password_of_jephe_is_here
5.始测试
/usr/local/bin/socks5 -f -s
现面信息表示测试功
18210: Socks5 starting at Mon Dec 14 18:23:45 1998 in normal mode
退socks5,始式运行背景模式:
6. 式运行
/usr/local/bin/socks5 -t -s 2 /var/log/socks5
7. 加/etc/rc.d/rc.local
echo "/usr/local/bin/socks5 -t -s 2 /var/log/socks5" /etc/rc.d/rc.local
急!!自己怎么搭建HTTP/Socks5隧道代理呢?
自己搭建高质量亿级IP的HTTP/Socks5隧道代理
一、前言
在做爬虫、数据采集、账号搜索项目时,需要用到高质量代理IP。目前比较流行也是最常见的代理IP服务,大部分是通过api链接提取。通过不断的访问api接口,api服务器返回一个或多个可用代理IP,然后将代理IP应用于自己的程序或软件中。api服务器维护了一个可用IP池,并且不断在更新加入新的可用IP。客户端访问时,则返回最新可用IP。
API提取方式简单实现,但也有一定弊端,主要是客户端需要不断的访问api接口获取最新代理,需要一直循环。根据代理质量的不同,获取到的代理不一定全部可用,影响了爬虫的效率。这里推荐 酷鱼代理IP(),有动态代理和私密代理,速度和可用率都比较好。
那么,有没有不需要api的代理方式呢,那我们来看看隧道代理。
二、隧道代理是什么
隧道代理只需设置固定接口,云端自动切换不同IP,省去了客户端频繁获取的麻烦。并且通过隧道代理的多路负载技术,大大提高的代理速度和可用率。隧道代理没有一次提取多少个IP的概念,主要是通过对不同客户的并发请求数进行限制。一般可达到50-100次/秒的并发请求。
三、隧道代理架构
如上图,隧道代理工作步骤为:
代理使用者向隧道代理服务器发出请求。例如酷鱼隧道代理地址为:tunnel.kuyukuyu.com。
隧道代理服务器收到代理使用者请求后,会选择最优线路进行转发,在代理使用者和动态代理节点之间建立隧道连接。
动态代理服务器请求代理使用者指定的目标站。
动态代理服务器将目标站返回的结果,直接返回给代理使用者。
四、获取代理IP池
隧道代理有多个可用路径进行转发,采用多路复用、择优选择技术,提高代理成功率。经测试成功率可达99%以上。
代理服务器返回结果时没有经过隧道代理,而是直接返回给代理使用者。因为隧道代理仅起到建立隧道连接的作用,并不参与数据传输。保障了代理执行效率。
使用方便,需要频繁切换代理。
支持高并发,多客户端同时使用。
五、实现步骤
首先需要找到一个可持续供给的代理IP池,代理IP最好是同时支持HTTP(s)和Socks5协议的,这样我们的隧道代理也可以支持socks5。这里推荐酷鱼私密代理 ,可用率99%以上,速度快。
购买后在用户中心获取API提取链接,然后设置白名单和提取数量。
将获取到的代理写入Squid配置文件。/etc/squid/squid.conf
重载配置文件,使用配置生效。
每隔1秒重复一次,并不断循环。
六、Squid使用方法
将squid 做为代理服务器
备份源文件 cp /etc/squid/squid.conf /etc/squid/squid.conf.source,用于脚本自动更新
在squid所在服务器运行脚本。
七、进一步优化
由于squid只支持http(s),不支持socks5协议,所有就算购买的代理池支持socks5,隧道代理也不支持。如需支持socks5,只需要使用其他软件替代squid。如果有这方面的需要可以联系酷鱼代理客服。
可以在隧道代理上使用iptables进行限制访问,达到白名单功能。
iptables还可以对单个客户端请求数量或流量限制,达到限流功能。
文章来源:网页链接
求delphi 设置socks5代理访问网页的源码
增加一个TIdIOHandlerSocket组件和一个TIdSocksInfo组件
把原来的IdHTTP组件的IOHandler属性设置为新增加的TIdIOHandlerSocket组件
把新增加的TIdIOHandlerSocket组件的SocksInfo属性设置为新增加的TIdSocksInfo组件
然后在TIdSocksInfo组件中正确设置Socks5代理的参数