实现了一个从公网访问内网 WEB 的简单工具 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
qgy18
V2EX    分享创造

实现了一个从公网访问内网 WEB 的简单工具

  •  
  •   qgy18 2015-11-24 13:52:53 +08:00 9252 次点击
    这是一个创建于 3683 天前的主题,其中的信息可能已经有所发展或是发生改变。

    这是上周末为了验证一个想法,花了一个小时撸的一个从公网访问内网 WEB 服务的「玩具」,使用 HTTP/2 实现公网与内网之间的 HTTP/1.1 转发。基于 node-http2 模块, client 加 server 不超过 200 行,除了 Node.js 无需其它依赖, git clone 下来就能跑。

    https://github.com/qgy18/pangolin

    简单说就是这个东西能实现 ngrok 功能之一:让你的本机 WEB 在外网可以访问。临时共享点东西给好友,或者做微信调试还是很方便的。当然 ngrok 是 TCP 转发,能干的远远不是这个。

    最后广告下:最近我又写了不少跟 HTTP/2 有关的文章,有兴趣的同学可以关注下: https://imququ.com

    第 1 条附言    2015-11-24 20:05:39 +08:00
    那干脆把这个也丢上来吧 Node.js 实现两种 WEB 代理的演示程序:

    https://github.com/qgy18/proxy-demo

    别看代码简单,不足百行,但非常稳定,特别节省资源,已经在我的搬瓦工测试了快一周。
    36 条回复    2018-11-02 15:11:15 +08:00
    lijinma
        1
    lijinma  
       2015-11-24 13:54:03 +08:00
    谢谢 ququ
    songjiaxin2008
        2
    songjiaxin2008  
       2015-11-24 14:09:53 +08:00 via iPhone
    点赞
    oott123
        3
    oott123  
       2015-11-24 14:13:15 +08:00 via Android
    赞~~
    不过感觉还不如用 ssh 转发来的方便 _(:з」∠)_
    qgy18
        4
    qgy18  
    OP
       2015-11-24 14:17:41 +08:00
    @oott123 理论上用 HTTP/2 做转发会省一点点流量,因为单 TCP 上多路复用,是可以用到 HTTP/2 的头部压缩策略。这个也是我想验证的点,但是还没来得及做对比。
    KenGe
        5
    KenGe  
       2015-11-24 14:18:56 +08:00
    老大想跟你探讨点问题呀
    odirus
        6
    odirus  
       2015-11-24 14:20:19 +08:00
    活捉一枚 360 员工,哈哈,其实我还是挺欣赏贵司的。
    qgy18
        7
    qgy18  
    OP
       2015-11-24 14:35:14 +08:00
    @odirus 看我的博客关于页:「声明:本站所有文章均为本人原创,仅代表个人思想,与其他任何人或组织无关!」
    odirus
        8
    odirus  
       2015-11-24 14:43:13 +08:00
    @qgy18 没别的意思哈
    qgy18
        9
    qgy18  
    OP
       2015-11-24 14:53:10 +08:00 via iPhone
    @odirus :)
    Lenhoon
        10
    Lenhoon  
       2015-11-24 15:08:20 +08:00
    Python 的 paramiko 库有个 Demo 是用 ssh 建立隧道做远端转发的实现的,楼主的思路也不错!顶
    zonghua
        11
    zonghua  
       2015-11-24 15:11:02 +08:00 via iPhone
    @Lenhoon 哈哈,看到他讲 http 代理的文章,我中午提议给博主,然后他过了一会就做出来了。
    zonghua
        12
    zonghua  
       2015-11-24 15:12:19 +08:00 via iPhone
    @oott123 ssh 转发很不稳定,丢包什么的
    qgy18
        13
    qgy18  
    OP
       2015-11-24 17:39:23 +08:00
    @KenGe 啊,什么问题啊?
    inmyfree
        14
    inmyfree  
       2015-11-24 17:41:56 +08:00
    活捉一枚 360 员工
    KenGe
        15
    KenGe  
       2015-11-24 18:00:21 +08:00
    @qgy18 给你写信咯
    bazingaterry
        16
    bazingaterry  
       2015-11-24 18:37:16 +08:00
    谢谢!正用得上!
    qgy18
        17
    qgy18  
    OP
       2015-11-24 18:52:50 +08:00
    @KenGe 然后并没有收到。。。我的邮箱是 [email protected]
    maskerTUI
        18
    maskerTUI  
       2015-11-24 18:54:42 +08:00
    稳定性如何?多连接会不会很容易崩掉?
    k9982874
        19
    k9982874  
       2015-11-24 18:56:37 +08:00
    挺好的东西。现在懒得写东西了 scp 或者 openvpn 跳板机搞定。
    k9982874
        20
    k9982874  
       2015-11-24 18:57:30 +08:00
    @Lenhoon 有 ssh 就直接 scp 啊,转发个毛线啊。。
    qgy18
        21
    qgy18  
    OP
       2015-11-24 19:12:23 +08:00
    @k9982874 这个主要不是用来传文件。典型应用场景是你在本地开发 WEB 网站,遇到点 BUG ,要找个人帮你看看,你可以使用这个工具直接给他一个公网地址,他可以直接访问到你的本地环境。
    dreammes
        22
    dreammes  
       2015-11-24 19:38:56 +08:00 via iPhone
    不错
    qgy18
        23
    qgy18  
    OP
       2015-11-24 21:23:09 +08:00 via iPhone
    @maskerTUI 没有仔细测,感觉 node.js 处理网络还比较稳定。我 Append 的那个程序,跑了快一周没出任何问题。
    welefen
        24
    welefen  
       2015-11-25 09:03:19 +08:00
    赞一个,非常好用的东西
    nealnote
        25
    nealnote  
       2015-11-26 10:39:15 +08:00
    proxy-demo 看起来很不错的样子。
    qgy18
        26
    qgy18  
    OP
       2015-11-26 12:02:32 +08:00 via iPhone
    @nealnote 嗯,可以试试!主要是省内存、稳定。简介我写得很低调,自己用了一周了。
    wkc
        27
    wkc  
       2015-11-29 19:00:51 +08:00   2
    分享下相关的资料

    http://dog-tunnel.tk/ DOG TUNNEL - P2P 端口映射 ,非常强大

    https://github.com/hashicorp/yamux 单 TCP 上多路复用的一个库

    https://github.com/koding/tunnel koding 开源的从公网访问内网 WEB 的库
    wkc
        28
    wkc  
       2015-11-29 19:04:45 +08:00
    对于这种代理,因为数据经过多次转发,感觉减少延时比流量压缩什么的 重要多了。

    dog-tunnel 这种 udp 打洞的方式速度是最快的,虽然实测稳定性不咋地
    wkc
        29
    wkc  
       2015-11-29 19:11:56 +08:00
    以前做过这方面的尝试,都是基于 koding/tunnel 这种思路来做的。

    采用 TCP 隧道同样也可以打印出来 Request/Response 的,流量 copy 一份交给相关库去解析就行了。
    qgy18
        30
    qgy18  
    OP
       2015-11-29 19:50:57 +08:00 via iPhone
    @wkc 看了一下 Yamux ,发现它借鉴了 SPDY ,也就是 HTTP/2 的前身,难怪看着这么熟。

    话说,我有个需求,但是没想到好的实现方式,你有思路么?

    需求是我的手机连接 PC 共享的热点后,如果在 PC 开一个 Proxy ,修改手机网络走 PC 的 Proxy ,很容易抓取并替换 HTTP 数据包(这也是 Fiddler 或者 Charles 的工作原理)。

    但是有些手机软件不走系统代理,我在想是否可以直接从网卡下手抓取并替换 HTTP 包。 Wireshark 可以抓包,但是貌似不能替换。
    wkc
        32
    wkc  
       2015-11-29 22:25:19 +08:00
    @qgy18
    还有一个, PC 开 shadowsocks server , 手机 ss 客户端连上去。 这样就把流量导到 shadowsocks server 了。然后改 shadowsocks server 的源代码 或者用 proxychains4 等工具把流量弄到 Fiddler 上去。
    安卓的 ss 客户端记得把 shadowsocks 封成了 vpn 实现全局代理。
    直接用改路由表、改 iptables 应该也有办法, 不过我不熟悉这方面。
    qgy18
        33
    qgy18  
    OP
       2015-11-29 23:09:40 +08:00 via iPhone
    @wkc 多谢 改 dns 这个应该靠谱 我研究下
    susu
        34
    susu  
       2015-12-01 19:35:48 +08:00 via iPhone
    竟然看到了罗田的
    domwang
        35
    domwang  
       2018-05-02 13:08:29 +08:00
    国内貌似不能用了,没有 Holer 好用
    https://github.com/Wisdom-Projects/holer
    wdom
        36
    wdom  
       2018-11-02 15:11:15 +08:00
    建议使用开源的 holer,配置简单,设置一个 key 就搞定了,毫无技术含量。服务器在国内,速度很快。
    https://github.com/wisdom-projects/holer
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3808 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 05:08 PVG 13:08 LAX 21:08 JFK 00:08
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86