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

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

但是传输层和网络层也在 SOCKS 下面,为什么可以代理?
2954 次点击
所在节点    问与答
45 条回复
iOCZ
2023-04-27 21:13:01 +08:00
代理工作在表示层(4 层)或应用层(7 层),需要 IP 与端口,跟路由、网关工作的传输层还是不一样的。
ruixue
2023-04-27 21:49:13 +08:00
socks 并不能代理网络层,不知道你从哪看的可以,socks5 可以代理任意 tcp 或 udp 流量,但其本身也工作在 tcp 和 udp 上,使用标准的 tcp 或 udp 承载
om2mo
2023-04-27 22:22:20 +08:00
@ruixue #2 我问的是为什么不能代理 ICMP
pubby
2023-04-27 22:29:36 +08:00
因为这个协议就这么设计的啊,只有 tcp 和 udp
pubby
2023-04-27 22:33:12 +08:00
Knowazz
2023-04-27 22:36:37 +08:00
其实上面的朋友已经写明白了,SOCKS 代理本身设计的时候就没有支持 ICMP ,同时自身也基于 TCP 、UDP 协议。
而 TCP 、UDP 是属于传输协议,ICMP 是报文协议,在数据包结构上有本质区别( ICMP 不会携带目的地 IP 和端口)
kangyue9999
2023-04-27 22:37:40 +08:00
@om2mo 楼上说的很清楚啊 ,因为 socks 的包要不然是 tcp 要不然是 udp 人家用的包的 id 就是要不然是 6 要不然是 17 而 ICMP id 是 1 这就不可能实现
kangyue9999
2023-04-27 22:40:06 +08:00
@om2mo 问题在于你把 socks 想成了类似于 vpn 的隧道了,但实际上 socks 仅仅是应用层 7 层的的产品。但是隧道是在 2 或者三层,所以这不是一个概念
om2mo
2023-04-27 22:50:21 +08:00
@Knowazz #6 ICMP 是 IP 层的一部分可以作为 IP 报文的数据,SOCKS 不是可以代理 IP 吗怎么就不可以代理 ICMP
leaflxh
2023-04-27 22:51:26 +08:00
你可以了解下 socks2tun 和 tun2socks
leaflxh
2023-04-27 22:53:02 +08:00
或者你再看看 socks5 协议的通讯过程,或其 RFC
om2mo
2023-04-27 22:53:17 +08:00
@kangyue9999 #8 VPN 因为虚拟设备 TUN/TAP 更底层所以可以代理上层所有,SOCKS 太高代理不了底层吗?
Knowazz
2023-04-27 22:54:31 +08:00
@om2mo
其实倒不是不能代理,问题在于 ICMP 的数据包不携带端口,socks 即便可以帮你发送 ICMP ,却无法如何获取回应,因为回应是以广播的形式下发的。 通讯不能双向,也就没有代理它的必要。
om2mo
2023-04-27 22:54:52 +08:00
@leaflxh #10 tun2socks 就是虚拟的 3 层转发给 socks 协议啊
om2mo
2023-04-27 22:55:08 +08:00
@leaflxh #11 看了还是不明白
Knowazz
2023-04-27 22:55:34 +08:00
VPN 协议工作在数据链层,可以从上级拿到广播,因此可以代理 ICMP 。
om2mo
2023-04-27 22:57:51 +08:00
@Knowazz #16 还是你专业 有点头绪了但还是不懂
ruixue
2023-04-27 23:03:23 +08:00
@om2mo 都说了啊,socks 代理不了网络层,icmp 属于网络层,ip 也属于网络层,自然都无法代理,这逻辑很难理解吗
yinmin
2023-04-27 23:04:12 +08:00
socks5 是通过 tcp 协议实现传输的。能跑啥协议,要看 socks5 client 和 socks5 server 支持啥协议。通常 socks5 server 只支持 tcp 和 udp ,也有例外,例如 tun2socks
ZeroClover
2023-04-27 23:09:09 +08:00
因为没什么用处

如果硬要实现的话,用 tun2socks 拿到 ICMP 包,然后自己写个代理协议把 ICMP 封装成 UDP 里面,发到代理服务器以后再从 UDP 里面拆出来就行。几乎任何东西都可以塞进 UDP 里面,然后你就重新实现了各种传统 VPN

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

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

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

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

© 2021 V2EX