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

怎么让 ICMP 协议走代理

  •  
  •   specture · 299 天前 · 4941 次点击
    这是一个创建于 299 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

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