xingty / xingty.github.io

my blog
1 stars 0 forks source link

理解socks5协议的工作过程和协议细节 | Bigbyto #40

Open xingty opened 2 years ago

xingty commented 2 years ago

https://wiyi.org/socks5-protocol-in-deep.html

  1. 前言本位将由浅入深带大家详细了解socks5协议。文章首先会对socks协议进行简单介绍,接着会介绍socks5协议的使用场景,然后介绍它的工作工程,最后介绍协议的细节(握手、数据转发)。2. 协议介绍2.1 什么是socks协议啥是socks协议呢? 这里贴一段维基百科对它的定义 SOCKS is an... client-server client-socks5_f client-socks5_f client-socks5 socks5_01 socks5_05_req_01 socks5_06_req_02 socks5_ne_01 socks5_ne_02 socks5_ne_03_auth socks5_ne_04_auth
bigbyto-anon commented 2 years ago

图文并茂,受益了

stormbuf commented 2 years ago

讲得真好

wxc421 commented 2 years ago

讲的好哇

onlySlient commented 1 year ago

确实很棒!

bigbyto-anon commented 1 year ago

学到了666

zhuchao941 commented 1 year ago

兄弟你这个抓包文件和你截图里的包数据对不上啊。。比如第5个包(图里是支持2种methods,抓包文件里支持3种) 不过无伤大雅了。内容很干

bigbyto-anon commented 10 months ago

简洁明了

bigbyto-anon commented 7 months ago

那如果是要连接一个安全的https服务器呢?代理服务器在请求阶段还应该不能连接到目标服务器吧?应该还需要发送密钥啥的才能与https服务器建立TCP通信吧? 我刚。开始学网络编程,还不太懂这些概念,如果我问的问题很傻逼就不用回复了谢谢。

xingty commented 7 months ago

at: Anonymous
那如果是要连接一个安全的https服务器呢?代理服务器在请求阶段还应该不能连接到目标服务器吧?应该还需要发送密钥啥的才能与https服务器建立TCP通信吧? 我刚。开始学网络编程,还不太懂这些概念,如果我问的问题很傻逼就不用回复了谢谢。

当socks server进入request阶段,它收到client的代理请求信息后(即本文2.5.2小节)后,就会跟目标服务器建立tcp连接; 如果目标服务器使用了TLS,那么就会进入TLS协商阶段,这些信息都会经过socks server,它会在client和target server之间转发TLS的握手信息,即它已经在relay信息了。

你可以把TLS的握手过程(即证书和密钥交换过程)理解为已经是在relay阶段了。如果能看懂Java的话,可以参考https://wiyi.org/socks5-implementation.html 这个例子,我在这里实现了一个非常简陋的socks5代理,不过足够理解所有的细节了。

bigbyto-anon commented 7 months ago

at: xingty

at: Anonymous
那如果是要连接一个安全的https服务器呢?代理服务器在请求阶段还应该不能连接到目标服务器吧?应该还需要发送密钥啥的才能与https服务器建立TCP通信吧? 我刚。开始学网络编程,还不太懂这些概念,如果我问的问题很傻逼就不用回复了谢谢。

当socks server进入request阶段,它收到client的代理请求信息后(即本文2.5.2小节)后,就会跟目标服务器建立tcp连接; 如果目标服务器使用了TLS,那么就会进入TLS协商阶段,这些信息都会经过socks server,它会在client和target server之间转发TLS的握手信息,即它已经在relay信息了。

你可以把TLS的握手过程(即证书和密钥交换过程)理解为已经是在relay阶段了。如果能看懂Java的话,可以参考https://wiyi.org/socks5-implementation.html 这个例子,我在这里实现了一个非常简陋的socks5代理,不过足够理解所有的细节了。

谢谢大佬,我刚刚一直在研究这个问题,顺便去学了下wireshark,抓了几个包,搞到了现在。。。 代码我能看懂,写的很棒。之前我以为在request阶段(就是socket客户端发送要连接的服务器的ip和port)让代理服务器去连接目标服务器是需要交换密钥的,也就是说我以为在TCP握手的时候就需要密钥认证这些的,所以我感到很奇怪,为啥客户端只在request阶段发了目标服务器的ip和port代理服务器就能和目标服务器通信了。。。 所以更正的说法是(我的理解,不一定准确),request阶段客户端发送目标服务器的ipheport给代理服务器,代理服务器用发来的ip和port创建与目标服务器的连接(这一步不需要密钥这些的),然后进入relay阶段,客户端发送的字节流会被代理服务器原样转发到目标服务器,这里才是TLS认证流程,由于代理服务器是原样发送的认证这些是一定能成功的。后续客户端发送的请求报文都会这样被代理服务器直接转发。

原来不是在代理服务器与目标服务器创建TCP连接的握手阶段认证的,问了ChatGPT半天给了好几个模棱两可的回答(也可能是我描述的不准确吧。。)。

最后声明一下,博主写的对于Socks5协议工作原理和另外一个用Java实现的Socks5代理服务器的例子都很棒,我遇到问题只是因为本人技术水平不行,不代表博主内容写的不行。

bigbyto-anon commented 5 months ago

1234

zeroclear commented 3 months ago

总感觉哪里有问题,直到我看了RFC1928的原文。第五节:Addressing,当ATYP为3时,DST.ADDR表示域名,其第一字节包含了整个域名的长度。到你这里就成了掐头去尾解析,后面一篇实现也是直接用String addr = new String(data),屎山的bug就是让你们这些人堆起来的

bigbyto-anon commented 2 months ago

at: zeroclear
总感觉哪里有问题,直到我看了RFC1928的原文。第五节:Addressing,当ATYP为3时,DST.ADDR表示域名,其第一字节包含了整个域名的长度。到你这里就成了掐头去尾解析,后面一篇实现也是直接用String addr = new String(data),屎山的bug就是让你们这些人堆起来的

看到这里也觉得奇怪,变长的的字段应该是要有固定地方获取数据长度的。 不过整体也算解释清楚了sock5了

bigbyto-anon commented 1 week ago

太感动了