Socks 协议为什么不能代理 ICMP?

2023-04-27 20:39:30 +08:00
 om2mo
我看到一篇文章:“SOCKS 是第 5 层协议,它不关心开放系统互连 (OSI) 模型中该层以下的任何内容——这意味着您不能使用它来隧道运行在第 5 层以下的协议。这包括诸如 ping 、地址解析协议( ARP )等。”

但是传输层和网络层也在 SOCKS 下面,为什么可以代理?
3617 次点击
所在节点    问与答
45 条回复
oldshensheep
2023-04-27 23:09:35 +08:00
4 楼是标准答案,协议只支持 TCP&UDP ,你加一个 ICMP 也是可以的。
那文章里的解释是错误的,能不能代理与第几层协议无关,发数据包罢了而已管你在第几层。
om2mo
2023-04-27 23:21:26 +08:00
@oldshensheep #21 但是很多解释总总说它的层次
oldshensheep
2023-04-27 23:44:01 +08:00
反正和第几层无关,举个例:OpenVPN 可以使用 TCP 协议代理 ICMP 协议
这么看他的说法就不正确了
ysc3839
2023-04-27 23:59:26 +08:00
@om2mo SOCKS 不能传输 ICMP 不是因为它基于 TCP 或 UDP ,而是它设计只能承载 TCP 和 UDP ,协议里就没定义该怎么处理 ICMP ,所以没法支持。你可以想办法自己加上支持,但是你加的这部分就不属于 SOCKS 了。
testFor
2023-04-28 07:46:47 +08:00
@oldshensheep 楼上评论你是一个没看啊
oldshensheep
2023-04-28 11:26:33 +08:00
@testFor 看了的,然后呢
julyclyde
2023-04-28 11:37:58 +08:00
首先你引用的这句话就有问题
并不是 *因为* 它工作在某一层,*所以*不支持某功能
而是它就是很单纯的不支持某功能而已,没设计这个能力

而且那句话暗示的因为所以关系其实也有问题

Socks 也不能代理“IP”协议,所以不要按照“既然能代理 IP 为什么不能代理 ICMP”来考虑
不能!!
ungrown
2023-04-28 11:39:10 +08:00
@oldshensheep #23 通信模型可以嵌套没错,但是嵌套不是自己长出来的,需要实现。VPN 实现了对应的嵌套,因为它这个应用需要这个功能,可这关 socks 什么事呢
oldshensheep
2023-04-28 11:43:26 +08:00
所以我说错了什么?
我有没说 Socks 非要支持 ICMP ,我只是就事论事回答楼主的问题。

楼主问题:Socks 协议为什么不能代理 ICMP ?
回答:因为设计上就不支持

另外的问题,文章里的解释。
回答:错误的。
@ungrown
yestodayHadRain
2023-08-17 15:43:11 +08:00
@ruixue
@Knowazz
@oldshensheep
@ysc3839

有个地方没想明白,如果按照各位所说,socks 支持代理 tcp/udp 的话:

我有一台海外的机器 ip 已经被 GFW block 掉了,国内网络是访问不到的,我连接另外一台海外机器的 socks5 代理后 本地去 telnet 被 block 掉的 ip 22 端口,也是打不通的。这个是为什么呢?
ruixue
2023-08-18 00:54:49 +08:00
@yestodayHadRain socks5 是明文代理,telnet 也是明文传输,这么搞和裸奔没啥区别,墙依然可以识别到你要访问的真实 ip ,以及传输的所有内容,各种梯子开放的本地 socks5 端口只是用来兼容输入的,真正过墙的还是加密混淆过的翻墙协议,没有人会直接用 socks5 过墙
yestodayHadRain
2023-08-18 09:46:49 +08:00
@ruixue 好像是因为我没有开 tun 模式的原因,打开 tun 后 就可以打通了。我是用 Dante 搞的,这个 很容易被识别出来吗?
ruixue
2023-08-18 10:09:12 +08:00
@yestodayHadRain 那说明之前压根就没走代理,当然现在能通也不建议这么搞,socks5 基本上就是原样转发流量,在墙面前和裸奔没啥区别,过墙最好用专门的翻墙协议,传统的 VPN 都不太好使,更不用提完全明文的 socks5 了,还有 telnet 也别用了,用 ssh
yestodayHadRain
2023-08-18 10:13:24 +08:00
@ruixue 比较优雅的方式是什么呢?以前用 vpn 搞过,被封过后来就用 Dante 搞了。还算稳定,其他用 ssr 这种好像封的比较多?
ruixue
2023-08-18 10:39:10 +08:00
@yestodayHadRain 你现在怎么上的 V2EX ?直接用手头的翻墙手段不行么

自己搞的话,reality 、naiveproxy 目前来说比较稳,如果有 ipv6 可以直接跑 ss2022
Subdue
2023-09-30 01:26:02 +08:00
@ruixue 我有个疑问,本地的 socks5 用来收集数据包,统一全部走加密过墙的,那,TCP 数据包是不是可以都直接转发到加密协议上去,毕竟加密协议也是基于 TCP 的,UDP 数据包除 53 外全部转发到 socks5 上面去,这样所有的数据包是否都走了代理呢?除了乱七八糟的 ICMP ,ARP 之外
ruixue
2023-09-30 20:19:41 +08:00
@Subdue 当然可以啊,只要加密协议也支持 udp 或者 udp over tcp ,这就是所谓的(第 4 层的)全局代理,udp53 也可以让加密协议转发,从远程服务器请求 dns
Subdue
2023-10-02 12:18:03 +08:00
@ruixue 如果只是为了过墙,udp53 有加密的必要吗?还有 tcp 建立链接后,后续的数据传输是否可以不走代理加密?
ruixue
2023-10-02 15:30:37 +08:00
@Subdue 一般来说全局代理也都是通过代理远程请求 dns ,防止 dns 污染和泄露,socks5 本身就支持代理 dns ,但实际翻墙的时候很少用全局代理,都是用一系列策略进行分流,例如国内网站就直接直连不走代理,openai 和 netflix 单独配置解锁节点,dns 也有专门的处理步骤,比方说国内的域名用国内的 dns ,被墙的域名走加密代理请求远程 dns ,详细说起来就太多了,可以自己搜一下翻墙时 dns 的处理细节

现在的墙都是多方面的,dns 污染,ban sni ,ban ip ,ban 端口等等。一般来说如果 ip 和端口被墙,就必须要走代理,没有办法直连。有些翻墙协议比如 xtls 是支持加密建立连接后,原样传输 tls 数据流,减少一层加密以提升性能,但大部分实现方案都是全程通过代理服务器转发加密混淆过的流量的。有一些翻墙手段是不需要走代理,只加密一些数据并使用纯净 dns 以绕过墙,比方说域前置,还有 cloudflare 新出的 ech ,前提是目标 ip 端口没有被墙,墙的只是 dns 和 sni 。这些展开说也很多很多,可以自己搜一下相关的信息
Subdue
2023-10-02 16:17:44 +08:00
@ruixue 建立连接以后就算是过墙的,后续的数据不走加密不会被识别吧,还是墙会监听所有数据包?这样能扛得住这么大流量吗?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/936040

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX