首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
宝塔
V2EX  ›  程序员

内网穿透工具(替代 ngrok 和花生壳)

  •  5
     
  •   lswang · 11 天前 · 6851 次点击

    简介

    由于 IPv4 资源的有限性,目前大部分的本地电脑都是没有公网 IP。所以想要访问自己的本地服务(ssh、http、vnc、NAS、智能家居接口回调 - 比如天猫精灵自定义语义),需要有个服务来进行内网穿透。 目前有一些工具比如花生壳、ngrok 等。但是,

    1. 花生壳是收费的;
    2. ngrok 第二版也开始收费(第一版据说有一些严重 bug)。

    所以,需要一款开源的方案( 当然还需要一个固定的公网 IP >_<)。

    解决方案

    本人用 netty 写了一个 tcp 的穿透工具叫 Tcp Through,直接下载可用。安装方式下面有介绍

    该项目分 server 端和 client 端,想要看详细信息的话,可以去 github 上查看

    这个工具有以下一些比较实用的功能

    1. 支持 http api 管理服务端,还支持 命令行来管理(自己写的 python 库,自己感觉还挺炫)
    2. 支持安全模式。只有在信任列表的 IP 地址才可以访问 client (防止攻击的最好方式)
    3. 支持速度限制,功能已经测试可用。只是目前在代码中没有限速,可自己修改代码,具体代码在 server 库中的 OuterServer 中,注释中有说明。
    4. client 可设定不允许 server 控制 (client 端的 isRemoteManage 参数)
    5. 支持查看实时速率(不需要用总量来计算)
    6. 管理通道进行了 SSL 加密,防止注册信息被抓包
    7. 数据平面和控制平面分离,提高性能(mac 下测速能达到 10Gb/s+)。
    8. 管理平面和控制平面都进行了安全性校验,不正确的连接会被 kill 掉,拒绝攻击。
    9. Server 可以增加密码校验,不允许其他的 client 注册。Server 启动时候加上 -s 参数。

    备注: 如果是公网虚拟机(阿里云或者腾讯云),记得要开放相应的端口

    Server 安装和运行

    # 下载并解压
    > wget https://github.com/longshengwang/tcpthrough-server/releases/download/v1.0/server-1.0.zip
    > unzip server-1.0.zip
    > cd server-1.0
    # 启动 server 端,会占用 3 个端口,用途分别是 控制面(默认 9000)、数据面(9009)、http 服务(8080)。可以使用 --help 查看如何设定
    > bin/server
    

    注: 详细参数可以通过 bin/server --help 来查看

    下面的例子是通过 服务器端的 333 端口来访问内网的 localhost22端口

    Client 安装和运行

    # 下载并解压
    > wget https://github.com/longshengwang/tcpthrough-client/releases/download/client-1.0/client-1.0.zip
    > unzip client-1.0.zip
    > cd client-1.0
    # 启动 client 端, 下面的字段表示:通过服务器上的 333 端口,可以访问客户端的 localhost:22 服务(这里是 ssh 服务)
    > bin/client -u my_home -s <server ip>  -p 333 -l localhost:22 -p 333 -c true -a true
    

    注: 详细参数可以通过 bin/client --help 来查看

    参数说明:

    • -c 表示 client 是否可以被 server 控制(是否可以增加被代理的服务)
    • -u 客户端的名称,也是唯一标识,server 下的 client name 不可以重复
    • -a 表示被代理的端口只可以被信任的主机访问 (如何增加被信任的主机,下面的命令行会有提到)
    • -f 表示可以把所有的参数都写入文件,然后用 -f 指向该文件 文件模板如下
    name=wls_home
    password=wo_shi_server_password
    remote_host=192.168.122.20
    remote_data_port=9009
    remote_manager_port=9000
    local_host=192.168.122.20
    local_port=22
    remote_proxy_port=2222
    is_remote_manage=true
    

    命令行

    可以通过 python 的一个库(自己写的),来查看和管理 server 上的连接信息

    ➜ ~ pip install tcpth.cmd
    ➜ ~ tcpthcmd  # 如果 server 上的 http 端口不是默认的 8080,可以后面加上 -p <port>
    Welcome to use the tcp through.
    tcpthrough> help
    tcpthrough> help
        list -- get all registration
        get <name> -- get special name information
        monitor [<name>] -- monitor the information, refresh on 2s
        register add <name> <localhost:port> <proxy port> -- add registration
        register delete <name> <proxy port> -- delete registration
        trust add <name> [<proxy port>] <trusted ip> -- add trust ip
        trust delete <name> [<proxy port>] <trusted ip> -- delete trust ip
        trust get <name> [<proxy port>] -- get trust ip
    tcpthrough>
    tcpthrough> list   # 在命令行下,列是对齐的,拷贝过来之后就不对齐了
     Name | Local Service | Proxy Port | Out Conn Count | Remote Managed | Security | Write Speed | Read Speed
    --------------------------------------------------------------------------------------------------------------
     my_home | localhost:22 | 333 | 0 | true | true | 0KB/s | 0KB/s
    tcpthrough>
    

    说明:

    • 可以通过 exit 或者 ctrl + d 或者 ctrl + c 退出命令行模式
    • 如果客户端允许服务端控制,那么可以通过 register 命令来进行添加和删除
    • 如果客户端开启安全模式 -a, 那么只有通过 trust add <your-client-name> <your-ip> 来添加信任的 IP 地址
    • monitor 是可以 每个 2s 打印一次 server 端的连接信息
    • register add 中的 localhost 可以是 client 网络中的其他主机的 IP 地址
    99 回复  |  直到 2019-11-12 18:52:06 +08:00
        1
    shadowczp   11 天前
    其实比较新的工具里,有现成的叫做 frp。。。
        2
    xxsww211   11 天前
    @shadowczp 是,FRP 还是开源项目。ngrok 其实也够用。
        3
    HangoX   11 天前
    倒是差一个 ngrok 重放的功能,其他都没有
        4
    xxsww211   11 天前
    我觉得楼主这个也很不错,很到位。
    楼主要不考虑其他的突破点,比如不需要固定的公网 IP。连接第三方服务器实现转发,当然第三方这个过程也是开源的,让用户自由组建。
        5
    yorkyoung   11 天前
    限速、客户端管理和流量实时这些功能还是比较新颖的,先马后看
        6
    lswang   11 天前
    @xxsww211 现在可没有这么好的第三方,企业宽带太贵了
        7
    lswang   11 天前
    @yorkyoung 感谢支持
        8
    wayixia   11 天前
    收费也好免费也好,最后都是要走公网 ip,都是要花钱。最终各种成本综合考虑,选择自己适合的。
        9
    lswang   11 天前
    @wayixia 其实电信可以申请公网 IP,就是不固定。想要用这个动态 IP,还是要一个固定 IP 来 >_<
        10
    lswang   11 天前
        11
    boywhp   11 天前
    FCN 一键免费穿透,日常维护管理基本够用了
        12
    keepeye   11 天前
    frp 很稳定,就是阿里云带宽太贵了
        13
    ChangHaoWei   11 天前
    你们都不用 ssh 自带的端口转发?简单快捷。基于 alphine 装 ssh-client 然后 docker 起来也免进程管理。


    换服务器还什么都不用调,通讯还是加密的。不能理解为什么不用。。
        14
    lswang   11 天前
    @ChangHaoWei 用过,容易断。用 docker 运行应该会好点
        15
    prenwang   11 天前
    java netty 实现,是不是内存占用多了一点
        16
    tigerstudent   11 天前
    @ChangHaoWei 断了就没了,得重新执行命令,还得写一套脚本去管理重连
        17
    xxsww211   11 天前
    @lswang 你误会我的意思了。技术只管实现,至于这第三方到底是谁就不用去管,因为这是用户自己的需求,他们自己在一些云服务器搭建个服务就行了。这比自己去建一个第三方要实在很多。
        18
    easing   11 天前
    我理解这还是需要服务端转发流量?
        19
    jaybing926   11 天前
    @ChangHaoWei 我用 SSH 转发,frp,ngrok 这些工具都需要 server 端和 client 端,SSH 只要一条命令,一条命令~~
        20
    lihongjie0209   11 天前
    mark 一下 后面学习用
        21
    lswang   11 天前
    @easing 是的,现在 NAT 打洞已经非常难了
        22
    lswang   11 天前
    @jaybing926 ssh 转发是简单,不过少了 限速、管理一些其他的功能
        23
    fanyingmao   11 天前 via Android
    还是直接用 ssh 转发,比较简单。
        25
    wpblank   11 天前
    正好我顺路问个问题,本来准备电脑弄个内网穿透,回家了也能连上。结果我们公司网络好像屏蔽了 frp 和 v2ray,想问下怎么实现的
        26
    sagaxu   11 天前 via Android
    家里宽带公网 IP,配了 dmz,域名解析到家里 IP,每隔半个小时向 dnspod 上报一次 IP。

    公司 ssh 连接到家里做隧道,systemd 管理,转发失败会自动重连。

    第三方工具,好像并不需要。
        27
    encro   11 天前
    frp,nps,goproxy 都很不错
        28
    wangyongbo   11 天前
    @jaybing926 教一下我吧, 这一条命令是啥? 谢谢
        29
    shenqi   11 天前
    临时使用,推荐 pierced。不要滥用了,不然封了就惨了。
        30
    sagaxu   11 天前 via Android
    @tigerstudent systemd 或者 supervisord 都很成熟
        31
    lswang   11 天前
    @wpblank 怎么屏蔽 frp 和 v2ray 的就不知道了。 文章里的安装步骤照着做就行,如果是 windows 的,把文章里对应的命令换成你手动操作。不过你需要有一个固定的公网 IP
        32
    jaybing926   11 天前
    @wangyongbo ssh -R 20001:localhost:80 [email protected] 或者 autossh -p22 -M 5000 -NR 20001:0.0.0.0:80 [email protected],autossh 会一直尝试重新连接 可以消除网络故障隐患,ssh 透传的缺陷是透传到外网的端口只能监听 127
        33
    samondlee   11 天前
    点个 star2333
    感觉和 sakura frp 魔改的 有点儿像
        34
    zlylong   11 天前
    @wpblank 屏蔽 V2ray 是如何做到的???比 GFW 还强!?
        35
    lswang   11 天前
    @samondlee 谢谢支持
        36
    SenLief   11 天前
    有公网 IP 的还是直接用 DDNS,没有的我觉得不如买一个设备了。省心
        37
    daimiaopeng   11 天前 via Android
    frp 不香吗?
        38
    lswang   11 天前
    @daimiaopeng 自己写的最香
        39
    ungrown   11 天前
    @xxsww211 你们为什么造轮子之前就不能先查一下,你说的这个也有了,而且早就有了,“远古”项目 n2n 就是(虽然已经凉凉),现在有个更大的项目 zerotier
        40
    ungrown   11 天前
    @lswang 有本事加密算法也自己写
    重复造轮子就是浪费生产力
        41
    ungrown   11 天前
    @zlylong 协议白名单,或者端口白名单,甚至 IP 地理池白名单
        42
    lswang   11 天前   ♥ 1
    @ungrown 我也想写加密算法,可惜数学能力限制了我。
    重复造轮子的说法不适合个人,程序员就是通过自己开发来学更多的东西。自己造的轮子是自己的轮子,别人造的轮子是别人的。

    再说,如果都用别人的轮子,那你说为什么华为还要搞芯片干嘛?华为也在浪费生产力?
        43
    m1862897   11 天前
    一般人用 frp 就行了

    我当然会把你这个作为备用的,毕竟有 java 源码,熟悉 netty 的 chanelhandler 和 pipeline 可以自己修改;
    frp 好像是 go 写的,go 这种语言,还真特么不会,完全看不懂写的神马,根本无从改起。
        44
    m1862897   11 天前
    所以,大佬,我支持你。
    呵呵,可能还会抄袭你的 netty 代码。
        45
    ysys123   11 天前
    我用的付费的 natapp 用起来也挺稳定 还不用担心自己的 vps 有问题
        46
    lswang   11 天前
    @m1862897 谢谢支持,代码随意用
        47
    lswang   11 天前
    @ysys123 这种流量收费的,怎么防止有人恶意蹭?
        48
    lswang   11 天前
    @ysys123 我看阿里云也有按流量收费,不过不敢用,怕有心人搞。。
        49
    Calm1   11 天前
    收藏了,感觉不错。谢谢楼主分享。
        50
    ungrown   11 天前   ♥ 1
    @lswang 因为别的芯片厂商故意给华为使绊子,请问你被别人使绊子了吗?
    如果你还觉得实现加密算法的关键是数学能力的话,我只能呵呵,请自行搜索“不要自己实现加密算法”。
        51
    Kilerd   11 天前
    jaav 写这种东西真的是。。。。。。 怎么说呢? 感觉没必要?
        52
    lswang   11 天前
    @ungrown 如果你用的服务的供应商开不下去了,你用啥。。 。 华为的例子,简单举例,用不着深入探讨。

    我想你的时间应该会用来创造更多的价值,不会浪费的。
        53
    atom234   11 天前
    不错
        54
    lswang   11 天前
    @Kilerd 写这个库主要也是实际用下 netty,熟悉网络开发。Netty 很稳定,性能也还行,而且把底层的很多部分都省去了。很多开源项目(JAVA)涉及网络的部分都是 netty 开发的,比如 zookeeper。一些大公司也会用 netty 做一些网络开发。
        55
    m1862897   11 天前
    大佬
    ,看了一下你的代码
    ,你的打包方式别具一格
    ,依赖相当精华尽量优化到最低
    ,小可对大佬佩服得五体投地
    ,能否加个微信
    ,以后给小可一点指教
        56
    lswang   11 天前
    @m1862897 =.= 也就是用了 gradle 打包。。。优点就是不用写那么多冗余的 xml 标签。
        57
    thanatosS   11 天前
    学习了
        58
    tankren   11 天前
    我的联通有公网 有 IPv6 有 443 哈哈
        59
    morphyhu   11 天前
    支持楼主,感谢分享。在中国的这种网络环境下,多个选择总是好的。
        60
    weifengzi2009   11 天前
    @jaybing926 #32 不只是能监听 127 啊,你可以用 GatewayPorts 去控制监听任意 interface 啊
        61
    varrily   11 天前
    来个类似的,多了 web 端管理,client 鉴权 ifport.com 。但说真的,java 太占内存了。
        62
    lswang   10 天前
    @varrily java 的特性,内存占用多,但是相对稳定一些
        63
    gy123   10 天前
    server-->长连接-->client;
    client 监听 http 请求--->发送到 server 的 channl-->server 请求 http 服务返回数据;
    思路是这样?
        64
    coloz   10 天前
    了解下
        65
    guanhui07   10 天前
    ngrok frp 我只知道
        66
    dukang   10 天前
    @lswang 你这个通信是所有流量都经由中转服务器。还是穿透后,两端点对点通信,无需经过中转?
        67
    ungrown   10 天前 via Android   ♥ 1
    @lswang 你别给我腆着脸找台阶下,自己举错了例子就勇敢承担别人的质问。
    还服务商开不下去,都是开源可自建项目,用户众多发展迅速。
    我看你这个多余的项目倒是过不了多久就不维护了。
        68
    meppy   10 天前
    mark,我一直用 natfrp,挺不错的,还算比较稳定,网速比我自己搭的快。。
        69
    ac2sherry   10 天前 via iPhone
    @lswang 公司没有 vpn 吗?
        70
    conn4575   10 天前 via Android
    star 了,不过我还是觉得 frp 更香。看到是 java 的就有点抵触,小机器内存耗不起 233,不过拿来学 netty 应该不错😮
        71
    lswang   10 天前 via iPhone
    @conn4575 谢谢,一开始写这个项目的目的也是为了学习 netty。其实之前已经用 Java 原生网络库写了一个,不过感觉性能不够好、功能不够多,就用 netty 重写了。
        72
    lswang   10 天前 via iPhone
    @conn4575 公司肯定不给用自己的穿透软件,这个主要是为了访问家里的树莓派
        73
    shell314   10 天前 via Android
    支持
        74
    waiaan   10 天前
    这类软件,中转服务器才是最关键的吧?
        75
    eq06   10 天前
    有 server 的人不需要内网穿透,没 server 的人用不了你的工具
        76
    lswang   10 天前 via iPhone
    @eq06 是需要一个 server,内网需求还是看自己了。我用内网穿透是为了用天猫精灵控制家里的树莓派开关电视
        77
    lswang   10 天前 via iPhone
    @waiaan 是的,现在双十一某宝和某讯针对新用户都有很大折扣,不过上车需注意,因为到期续费太贵了
        78
    lswang   10 天前 via iPhone
    @shell314 感谢支持
        79
    waiaan   10 天前
    @lswang 我记得 ngrok 是可以直接用的。
        80
    ICKelin   10 天前
    最近怎么这么多人写内网穿透软件。。。
        81
    ICKelin   10 天前
    ngrok 这款软件很好,但是是国外的,连接的节点看其内部调度算法以及是否在国内有节点。

    frp 是开源项目,面向的是有技术底子的人,没技术功底的让他折腾不一定能搞得定,其实可以算一下,如果 frp 需要花一个早上来搞定部署,还需要域名备案,时间上的消耗足够购买收费软件一年了,还需要额外支付服务器费用,不太划算的。

    市面上有不少基于 frp 或者 ngrok 来做二次开发的软件,但是毕竟不是独立开发的,出故障能否快速解决其实也是一个问题,官网打着免费的旗号,但是这类软件带宽费用是个大头,最终肯定是需要收回去的。

    我觉得楼主是不是可以考虑尝试往软件服务方向去做。
        82
    imWBB   10 天前
    @ICKelin
    为什么要备案?
    直接用国外的服务器就好了。
        83
    ICKelin   10 天前
    @imWBB 可以的。
        84
    lanternxx   10 天前
    @ICKelin #81 frp 部署不是 3 分钟就好了的吗。。使用非 80/443 端口也不需要备案
        85
    ICKelin   10 天前
    @lanternxx 部署这东西得看人,有人用内网穿透是用来做公众号接口调试的,这个还真要求 80/443 端口。
        86
    xia0shi   10 天前 via iPhone
    支持 点赞
        87
    zhfsxtx   9 天前
    请问开发这种程序你是用什么 IDE?
        88
    lswang   9 天前 via iPhone
    @zhfsxtx idea
        89
    quericy   9 天前
    后续考虑支持 client 之间 p2p 么
        90
    c0py7hat   8 天前
    为啥你们都有这需求,我就没这需求,佛系..难道我太菜了
        91
    darknoll   8 天前
    @ICKelin frp 是我见过部署最简单的软件了,大部分人几分钟就搞定了吧。
        92
    lswang   8 天前
    @quericy 暂时不考虑,现在打洞太难了。之前用试过了,打不进去。。。
        93
    lswang   8 天前
    @c0py7hat 看自己的需求了,一般捣鼓树莓派和小米或者天猫智能家居之类的,这个需求还是很多的
        94
    stevenkang   8 天前
    有更简单的:
    ssh -R 80:localhost:8080 serveo.net
        95
    zunceng   8 天前
    你都有 server 了 用 autossh 不就完事了
        96
    ICKelin   7 天前
    @darknoll 真得看人,我印象中作者也搞了个付费星球群专门解决问题的,大部分人可能是大部分技术人员。买个服务器,买个域名做个解析是不是很难的事,但是并不是所有人都能做得了的。
        97
    wslzy007   7 天前
    目前 go 语言的穿透工具很多,java 的倒是少见,奈何我的哲学是绿色环保,自己动手,只用 c/c++的
        98
    lswang   6 天前
    @wslzy007 go 在做网络开发方面确实比 java 好。用 java 做网络开发的唯一理由就是 netty 这个库,真的是香
        99
    wslzy007   6 天前
    @lswang 认同,前提是从 0 开始。毕竟 java 生态是公认最好的。go 的网络框架 /web 框架的确很优秀,这个可以看我之前发的对比测试帖子。做技术,始终是术业有专攻,没有最好的,只有最适合自己的。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3977 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 31ms · UTC 09:45 · PVG 17:45 · LAX 01:45 · JFK 04:45
    ♥ Do have faith in what you're doing.