分享开源项目 Passport,一行 URL 搞定可信认证、网络穿透和端口转发 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
uid106
V2EX    Go 编程语言

分享开源项目 Passport,一行 URL 搞定可信认证、网络穿透和端口转发

  •  
  •   uid106 2024-11-20 06:26:12 +08:00 via iPhone 1804 次点击
    这是一个创建于 403 天前的主题,其中的信息可能已经有所发展或是发生改变。
    • 事情的起因是这样的,服务器在没有上 fail2ban 之前,每天被爆破上千次,我就在想能不能用什么办法,让这些发包的 ip 访问不了我的端口呢?
    • 秉持着试一试的心态,go 语言网络处理能力也不赖,要不让 go 语言来试一下吧。
    • 于是开始设计可信认证的理念:开一个 http 服务,只有访问秘密的特定路径的 ip 地址,就把它存下来,相当于加入了白名单。
    • 有了 ip 地址白名单,接下来就是做一套 tcp 端口转发,go 语言同样不在话下,在中间设卡,只有在白名单里的 ip 才能继续交换数据。
    • 再后来,为了安全考虑,以及尽量减少存储 io ,直接把白名单写进内存,同样的 http 也做了自签,丢进内存里,再后来借鉴了 certmagic 包,直接自动化处理 tls 证书,http/https 选择自由。
    • 就这样稳定用了很久,对内网穿透又有了需求,结合刚才的那一套,又接着开发出网穿的服务端和客户端,同样可以选择服务端是不是带认证,而且修了一下 sshd 隔段时间断开的坑。
    • 继续稳定自用了好几个月,决定终于可以终于可以开源开源共享出来了,把这个项目命名为 passport ,意思就是需要 access pass 才可以让数据穿过特定端口。
    • 项目托管在 github 上,也算是我在 V2EX 分享的第一个作品,欢迎前辈们鉴赏,若有不足之处,敬请指正。
    • https://github.com/yosebyte/passport
    10 条回复    2024-12-31 23:51:30 +08:00
    crab
        1
    crab  
       2024-11-20 08:48:12 +08:00
    port knocking ?
    uid106
        2
    uid106  
    OP
       2024-11-20 08:52:04 +08:00 via iPhone
    @crab 没设置的那么高级,核心逻辑是 ip 地址核查:
    ```
    clientIP, _, err := net.SplitHostPort(linkConn.RemoteAddr().String())
    if err != nil {
    linkConn.Close()
    return
    }
    if _, exists := whiteList.Load(clientIP); !exists {
    linkConn.Close()
    return
    }
    ```
    xyholic
        3
    xyholic  
       2024-11-20 10:56:27 +08:00
    ./passport server://:10101/:10022#https://hostname:8443/server

    意思是我访问 10101 的时候需要先完成 https://hostname:8443/server 里要求的验证,成功之后后端才会把我的访问转发到 10022 ? https://hostname:8443/server 可以是 basic auth 么
    还是说只要访问过 https://hostname:8443/server 就可以了,需要把 uri 写的复杂一些等于加了个密码?
    uid106
        4
    uid106  
    OP
       2024-11-26 19:56:34 +08:00 via iPhone
    @xyholic 抱歉有 7 天回复限制。感谢您的反馈,您提供的命令是用来进行内网穿透的,服务端暴露 10022 提供访问,10101 负责数据交换,如果要访问 10022 端口,需要首先访问 https://hostname:8443/server ,端口和路径都可以自定义,且最好乱序一些防止字典破解,您只需要访问一下这段 url 即可,会显示当前客户端 ip 地址并记录在内存,之后再访问 10022 端口就可以放行了;因为是 https 就没再麻烦一步提供 basic auth ,这个项目的初衷就是一切从简且安全。
    xyholic
        5
    xyholic  
       2024-11-27 10:42:31 +08:00
    @uid106 明白了,那还不错
    uid106
        6
    uid106  
    OP
       2024-12-03 21:02:49 +08:00 via iPhone
    感谢大家的关注,最近项目在持续更新中,陆续加入了转发 udp 的支持,目前已经实现了 tcp 穿透及原生高并发,tcp 和 udp 的自动选择转发及原生高并发支持,多平台发布、容器镜像,后续考虑 udp 穿透和端口复用,欢迎 STAR 支持,请移步 https://github.com/yosebyte/passport
    uid106
        7
    uid106  
    OP
       2024-12-06 22:41:59 +08:00 via iPhone
    udp 穿透、端口复用、原生高并发都加上了,目前支持 tcp 、udp 的转发和穿透,完全体 get 。
    uid106
        8
    uid106  
    OP
       2024-12-12 07:33:48 +08:00 via iPhone
    内网穿透功能更新了客户端和服务端之间的 tls 加密,欢迎关注
    jciba5n4y6u
        9
    jciba5n4y6u  
       362 天前
    这个思路,很适合做端口隐藏,做私密服务。

    原来有这个想法,是想写个服务器脚本,触发某个服务后用脚本去操作 digital ocean 的防火墙,开个口子。开始操作虚拟机的 IPtables ,发现没有用。

    因为出差或者移动接入需要修改 IP 白名单,后来出差少,人懒就没搞下去了。

    OP 执行力强,赞一个
    uid106
        10
    uid106  
    OP
       361 天前 via iPhone
    @jciba5n4y6u 感谢支持,看来我们的原理都是一样,落地方式可能有点差别;用了这种私密发布服务的方式,意外的发现还可以屏蔽某些来自大陆地区的主动友好访问。最近在重构项目,单独做转发,把穿透拿出去另起炉灶了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2632 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 06:48 PVG 14:48 LAX 22:48 JFK 01:48
    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