怎么让 ICMP 协议走代理

2023-07-03 13:45:05 +08:00
 specture

基于 socks5 协议给公司做了个代理访问的系统.客户端部分类似 clash 使用的 tun 设备引流的方式.网关是 go 编码实现的 socks5 server 端.

问题是 ping 和 traceroute 是 IMCP 协议,没法使用 socks5 代理. 请问在上述设计上怎么扩展可以支持 ping 和 traceroute

6131 次点击
所在节点    信息安全
38 条回复
retanoj
2023-07-03 18:27:12 +08:00
在你这种场景下,不是说 socks 不可以代理 ICMP ,而是你客户端软件上面向操作系统建立的 tun 设备在收到一个 ICMP 数据包的时候怎么处理
snoopygao
2023-07-03 19:10:27 +08:00
用 wireguard 代替 其它代理 ,icmp 属于 ip 层协议,socks 只能代理 tcp/udp
specture
2023-07-03 20:08:18 +08:00
@lisxour 嗯,那这种方式类似 httping 或者 tcping
specture
2023-07-03 20:10:04 +08:00
@0o0O0o0O0o 大佬能更具体一点嘛?客户端写规则走 icmp,然后网关部署 wireguard 嘛?
0o0O0o0O0o
2023-07-03 20:45:19 +08:00
@specture

我电脑是 Linux ,本机跑代理和 wireguard

1. 为了不让 wireguard 自动添加路由规则影响正常的代理分流,wireguard 配置 Table = off

2. AllowedIPs 照常写

3. 通过 PostUp 添加路由规则,例如已创建对应的 wireguard 路由表是 51820 ,那 PostUp = ip -4 rule add ipproto icmp lookup 51820 就行了

网关上做这些事情只会更容易
specture
2023-07-04 11:04:20 +08:00
@0o0O0o0O0o 好的,谢谢
specture
2023-07-05 11:01:03 +08:00
@ysc3839 大佬你指的 UDP 是指 socks5 使用 UDP 作为传输协议还是指 UDP 流量走 TCP 传输的 socks5 隧道?
ysc3839
2023-07-05 11:18:37 +08:00
@specture UDP 流量
bugfan
2023-07-07 14:29:07 +08:00
socks 是代理,得用 vpn 协议

否则就得自己弄一些手段,接管系统网络流量,然后通过这个 socks 代理送出去

#12 #13 说的也对,如果你自己改也可以,我记得网络包有一个字段可以区分这三个协议,0x06 是 TCP,0x01 是 UDP,0x11 是 ICMP
zachary99
2023-07-09 23:44:20 +08:00
clash 的虚拟网卡,应该是能代理 ICMP 包
specture
2023-07-10 09:13:06 +08:00
@zachary99 clash 的 ping 应该是直接 return 了,ping 任何地址都是<1ms
busier
2023-07-10 20:14:50 +08:00
@angryPHP 因为他底层是 WireGuard ,属于真正意义上的 VPN 。
真正意义上的 VPN 都可以三层转发,例如 PPTP 、L2TP 、IKEv2 、OpenVPN 、WireGuard 等。
a9k1n9
2023-07-10 20:37:45 +08:00
https://github.com/esrrhs/pingtunnel
有这样的项目,但是不管怎么优化也只能跑个 3 - 4mb/s ,效率太低。
specture
2023-07-11 09:09:43 +08:00
@a9k1n9 这个项目似乎是用 ICMP 做隧道发 TCP/UDP 数据的?和我现在需求应该是相反的. pingtunnel 这个感觉像是给攻防对抗用的
specture
2023-07-11 18:40:42 +08:00
@ysc3839 大佬再请教一下,能否走 TCP 连接去转发 ICMP 包.延时稍微大一点可以接受.UDP 担心数据包被运营商丢弃
ysc3839
2023-07-11 18:54:15 +08:00
@specture 当然可以,但是 ICMP 设计就是允许丢包呀,为什么要追求不丢包?
specture
2023-07-17 19:54:02 +08:00
@ysc3839 大佬我参考你的实现用 TCP 连接实现了,但是遇到一个问题,请教一下: 如果启动多个 cmd 实例去 ping 不同的地址,比如打开两个 cmd 创建 ping 192.168.1.1 -t 和 ping 192.168.1.2 -t,过一会就出现 ping 1.1 的结果里面有来自 1.2 的 response. 我想请问下网卡收到的不同的 ping 的回包,是怎么关联到不同的 cmd 实例的? tcp 和 ip 可以通过端口,ping 是怎么做的?我怎么解决这个问题
thegodofoxeris
35 天前
@a9k1n9 这样 ping 的数量是不是看起来很吓人

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

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

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

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

© 2021 V2EX