V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
specture
V2EX  ›  信息安全

怎么让 ICMP 协议走代理

  •  
  •   specture · 2023-07-03 13:45:05 +08:00 · 6182 次点击
    这是一个创建于 510 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    38 条回复    2024-10-12 14:17:41 +08:00
    Badupp
        1
    Badupp  
       2023-07-03 13:55:36 +08:00
    sock5 是四层。ICMP 是三层。怎么 代理?
    ShineyWang
        2
    ShineyWang  
       2023-07-03 13:56:29 +08:00
    导入到 Netch,应该支持 ICMP
    leonshaw
        3
    leonshaw  
       2023-07-03 14:00:34 +08:00
    VPN
    Kinnice
        4
    Kinnice  
       2023-07-03 14:00:43 +08:00
    如果是 fake 的 ping ,可以使用 tun2socks 然后魔改一下实现,如果是真的 ping ,bye~ 网络层级都不同
    monstervivi
        5
    monstervivi  
       2023-07-03 14:02:23 +08:00
    试一试修改 iptables 来支持?
    wanmyj
        6
    wanmyj  
       2023-07-03 14:04:12 +08:00
    ipsec 这种代理才可以
    LaTero
        7
    LaTero  
       2023-07-03 14:04:26 +08:00 via Android
    用真 vpn ,openvpn 可以指定 socks ,路由表里要让代理机 ip 走真网关,否则会循环。
    smileawei
        8
    smileawei  
       2023-07-03 14:11:37 +08:00
    大部分的科学工具都支持入口是 socks
    openvpn over socksproxy 然后记得调整好 mtu 。分流的话,可以考虑用 chnrouter 去做路由层的分流。

    不过这一整套组建都需要自己搞。做好心里准备。
    specture
        9
    specture  
    OP
       2023-07-03 14:25:19 +08:00
    @Badupp ICMP 不一定走 socks5?客户端 tun 应该是可以支持的,网关扩展一下?
    specture
        10
    specture  
    OP
       2023-07-03 14:25:48 +08:00
    @Kinnice fake 的 ping 怎么理解?麻烦大佬再解释一下
    yxmyxmyyy
        11
    yxmyxmyyy  
       2023-07-03 14:31:27 +08:00 via Android
    wireguard 可以代理
    ysc3839
        12
    ysc3839  
       2023-07-03 14:35:12 +08:00 via Android
    你这个代理怎么实现 UDP 代理的? ICMP 也是类似的逻辑,简单改改就好了。
    tool2d
        13
    tool2d  
       2023-07-03 14:47:50 +08:00
    楼上说的对,ICMP 类似 UDP ,代理软件特殊处理一下就行。比如加个 RPC 远程转发指令。

    虽然可以实现,但是一般来说没太大必要,ping 又不带具体数据。
    x77
        14
    x77  
       2023-07-03 14:48:23 +08:00
    应用层: http 、ftp <-----> socks 被动代理应用层协议
    传输层:tcp 、udp
    网络层:icmp <-------> vpn 主动劫持网络及上层的协议
    0o0O0o0O0o
        15
    0o0O0o0O0o  
       2023-07-03 15:11:58 +08:00 via iPhone
    我是在任意支持 UDP 的代理上跑 wireguard ,写规则让 icmp 走 wireguard
    jiulang
        16
    jiulang  
       2023-07-03 15:15:38 +08:00
    就算对 socks5 扩展支持 icmp 得到 socks6 ,问:应用程序如何拦截系统的 icmp 包
    l4ever
        17
    l4ever  
       2023-07-03 15:28:48 +08:00
    tcpping 呗
    iqoo
        18
    iqoo  
       2023-07-03 16:39:58 +08:00
    linux 的 ssh 内置 tap 转发
    lisxour
        19
    lisxour  
       2023-07-03 16:53:47 +08:00
    @specture #10 由于 icmp 属于特殊协议,在特殊场合可能会被拦截,所以有一种方式就是通过 socket 连接目标,看下连不连的上,以及延迟,这就是 fake ping 。
    angryPHP
        20
    angryPHP  
       2023-07-03 18:15:35 +08:00
    zerotier 的为啥可以
    retanoj
        21
    retanoj  
       2023-07-03 18:27:12 +08:00
    在你这种场景下,不是说 socks 不可以代理 ICMP ,而是你客户端软件上面向操作系统建立的 tun 设备在收到一个 ICMP 数据包的时候怎么处理
    snoopygao
        22
    snoopygao  
       2023-07-03 19:10:27 +08:00
    用 wireguard 代替 其它代理 ,icmp 属于 ip 层协议,socks 只能代理 tcp/udp
    specture
        23
    specture  
    OP
       2023-07-03 20:08:18 +08:00
    @lisxour 嗯,那这种方式类似 httping 或者 tcping
    specture
        24
    specture  
    OP
       2023-07-03 20:10:04 +08:00
    @0o0O0o0O0o 大佬能更具体一点嘛?客户端写规则走 icmp,然后网关部署 wireguard 嘛?
    0o0O0o0O0o
        25
    0o0O0o0O0o  
       2023-07-03 20:45:19 +08:00 via iPhone   ❤️ 1
    @specture

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

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

    2. AllowedIPs 照常写

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

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

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

    #12 #13 说的也对,如果你自己改也可以,我记得网络包有一个字段可以区分这三个协议,0x06 是 TCP,0x01 是 UDP,0x11 是 ICMP
    zachary99
        30
    zachary99  
       2023-07-09 23:44:20 +08:00 via Android
    clash 的虚拟网卡,应该是能代理 ICMP 包
    specture
        31
    specture  
    OP
       2023-07-10 09:13:06 +08:00
    @zachary99 clash 的 ping 应该是直接 return 了,ping 任何地址都是<1ms
    busier
        32
    busier  
       2023-07-10 20:14:50 +08:00
    @angryPHP 因为他底层是 WireGuard ,属于真正意义上的 VPN 。
    真正意义上的 VPN 都可以三层转发,例如 PPTP 、L2TP 、IKEv2 、OpenVPN 、WireGuard 等。
    a9k1n9
        33
    a9k1n9  
       2023-07-10 20:37:45 +08:00 via Android
    https://github.com/esrrhs/pingtunnel
    有这样的项目,但是不管怎么优化也只能跑个 3 - 4mb/s ,效率太低。
    specture
        34
    specture  
    OP
       2023-07-11 09:09:43 +08:00
    @a9k1n9 这个项目似乎是用 ICMP 做隧道发 TCP/UDP 数据的?和我现在需求应该是相反的. pingtunnel 这个感觉像是给攻防对抗用的
    specture
        35
    specture  
    OP
       2023-07-11 18:40:42 +08:00
    @ysc3839 大佬再请教一下,能否走 TCP 连接去转发 ICMP 包.延时稍微大一点可以接受.UDP 担心数据包被运营商丢弃
    ysc3839
        36
    ysc3839  
       2023-07-11 18:54:15 +08:00 via Android
    @specture 当然可以,但是 ICMP 设计就是允许丢包呀,为什么要追求不丢包?
    specture
        37
    specture  
    OP
       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
        38
    thegodofoxeris  
       43 天前
    @a9k1n9 这样 ping 的数量是不是看起来很吓人
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5980 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 03:01 · PVG 11:01 · LAX 19:01 · JFK 22:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.