V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
sadfQED2
V2EX  ›  宽带症候群

家庭服务器公网服务全新解决思路

  •  1
     
  •   sadfQED2 · 2020-06-24 17:03:09 +08:00 via Android · 7411 次点击
    这是一个创建于 1615 天前的主题,其中的信息可能已经有所发展或是发生改变。

    首先,我这里说的公网服务包括 http,ftp,smb 等等。

    目前来说,这些服务直接暴露到公网,安全问题都是小事,更关键的是 v2er 都提醒又被断网的风险。因此对应的办法:

    1,只对外开放一个微屁嗯,需要访问服务的时候都通过微屁嗯连回家里的网络使用。缺点:需要安装微屁嗯客户端,而且这类客户端基本上都被墙了,在一些公共电脑上装一次客户端就得搞半天

    2,通过代理服务器,比如 frc ngrok 花生壳这类,原理是客户端和代理服务器通讯,代理服务器通过 tcp 长连接和你家里服务器通讯。这样你家的服务器没有开放任何端口,但是!这样缺点也很明显,经过代理,速度太慢了。我家可是千兆宽带,经过代理能跑到 10 兆就很不错了。

    所以,最近我有了一个全新的解决思路,首先我在路由器上面禁掉所有外网 ip 访问,然后,我家里路由器和我一台公网服务器保持通讯,当我需要访问家里服务器的时候,我先请求公网服务器,公网服务器发送消息给家里路由器,然后路由器仅对我当前 ip 开放访问权限。这时,我就可以直接访问我家的服务器了,而且中间没有代理,保证速度。另外,由于家里路由器平时是关闭所有外网 ip 请求的,这样也就解决了安全性以及被断网的风险。

    最后,调研了实现方案,路由器上面可以使用 go 语言开发,控制访问只需要编辑 iptables 的规则即可。

    目前方案还没实现,先写个思路出来,各位大佬 review 下看看还有没有什么漏洞?

    第 1 条附言  ·  2020-06-24 17:43:43 +08:00
    我说的公网服务器不是用来转发流量的!!不是用来转发的!

    我说的公网服务器只是为了有个地方和路由器通讯,这个公网服务器可以是一台服务器,但是也可能是一个邮箱,也可能是 github 。反正只要能够存数据,然后路由器能够轮训就行
    47 条回复    2020-06-30 13:54:25 +08:00
    sadfQED2
        1
    sadfQED2  
    OP
       2020-06-24 17:13:20 +08:00
    另外,公网服务器并不一定真的是一个服务器,可以是一个邮箱,可以是 github,或者是一个 tg 机器人都行,反正我需要连接家里服务器的时候,我能把我当前 ip 发送回家就行
    jiangzm
        2
    jiangzm  
       2020-06-24 17:15:32 +08:00
    太麻烦了吧,又是通过公网服务器发给路由器,然后还要写程序更新路由器防火墙规则。
    CheekiBreeki
        3
    CheekiBreeki  
       2020-06-24 17:18:13 +08:00 via Android   ❤️ 2
    最後發現還是 vpn 方便
    CloudnuY
        4
    CloudnuY  
       2020-06-24 17:18:30 +08:00
    我记得最近几个月在本站看过这个解决方案
    k9982874
        5
    k9982874  
       2020-06-24 17:21:40 +08:00   ❤️ 1
    我先否定代理服务器,然后我再自己实现一个代理服务器,就是这么任性
    yorkyoung
        6
    yorkyoung  
       2020-06-24 17:22:31 +08:00
    借楼同问,可以通过这种 NAT 服务得到固定外网 IP 吗?
    wtsamuel
        7
    wtsamuel  
       2020-06-24 17:31:43 +08:00
    我倾向于使用 zerotier 的 nat,还能直接打通多个局域网。
    安全方面直接靠应用自己,比如 smb 账号密码什么的
    ericbize
        8
    ericbize  
       2020-06-24 17:32:45 +08:00
    但是你一个公网服务器的成本是多少?
    这个很简单啊, 你可以在云上面把 vm 装个路由系统上去,然后家里 vpn 连上去,直接端口转发就可以了。
    家宽的优势在于价格吧!
    sadfQED2
        9
    sadfQED2  
    OP
       2020-06-24 17:33:54 +08:00
    @jiangzm 最终实现后可能就是路由器上面装一个插件


    @k9982874 我这种并不是代理啊,只是控制防火墙规则,公网服务器只是为了有个固定的地方和路由器通讯


    @yorkyoung 不能,相当于只是动态维护防火墙规则
    jiangzm
        10
    jiangzm  
       2020-06-24 17:38:13 +08:00
    我觉得可以结合 ip+mac 地址 两种白名单方式,大部分情况能覆盖到,在公司时把公司的固定 IP 加白名单,然后在外面把自己的手机 mac 地址加下白名单。
    sadfQED2
        11
    sadfQED2  
    OP
       2020-06-24 17:38:56 +08:00
    @wtsamuel 家里的服务很多不能保证安全,比如我服务器上面就装了一堆个人开源的 xxxDownload,这种东西谁都不知道有多少漏洞


    @ericbize 公网服务器并不一定是一个真正的服务器啊,可能是一个邮箱?需要使用的时候往家里发封邮件,或者是一个 github 私有项目,需要的时候上去改一行配置。路由器轮训邮箱或者 github,检查到规则变化就更新防火墙。之所以不愿意经过服务器转发是为了通讯速度,云服务器那 1M 2M 带宽,转发我千兆带宽有什么意义
    ztxcccc
        12
    ztxcccc  
       2020-06-24 17:40:03 +08:00   ❤️ 1
    你都有服务器了,搭建一个这个吧,github 上搜 ehang-io/nps
    sadfQED2
        13
    sadfQED2  
    OP
       2020-06-24 17:40:29 +08:00
    @jiangzm 这个想法好
    sadfQED2
        14
    sadfQED2  
    OP
       2020-06-24 17:41:32 +08:00
    @ztxcccc 我不是要做转发,转发经过服务器代理,太慢了
    ztxcccc
        15
    ztxcccc  
       2020-06-24 17:44:39 +08:00
    @sadfQED2 p2p,完整文档里看看
    Tonni
        16
    Tonni  
       2020-06-24 17:53:47 +08:00
    开个 ss 代理,然后通过这个 ss 端口返代。
    ferock
        17
    ferock  
       2020-06-24 17:57:15 +08:00
    我的方案

    外网只提供 2 个服务
    1. https
    2. vpn 端口

    使用 openVpn 组网,或者使用 zerotier 组大局域网
    以上满足绝大部分需求,服务器为 白 群晖。
    ferock
        18
    ferock  
       2020-06-24 17:59:35 +08:00
    https 服务都是直连的。
    stille
        19
    stille  
       2020-06-24 18:00:20 +08:00 via iPhone
    只开了一个端口给 openconnect,只开了一个证书登录账号,手机和笔记本部署好就很完美了,几乎秒登
    sadfQED2
        21
    sadfQED2  
    OP
       2020-06-24 18:08:01 +08:00
    @stille 那当你某个时候需要用公用电脑登录的时候呢
    GreatHumorist
        22
    GreatHumorist  
       2020-06-24 18:11:58 +08:00 via iPhone
    人楼主的意思其实是白名单机制吧……
    cest
        23
    cest  
       2020-06-24 18:14:15 +08:00
    不就是 ssh port knock
    监听特定 port
    然後开放 ssh port 给特定 ip
    Muniesa
        24
    Muniesa  
       2020-06-24 18:21:05 +08:00 via Android
    @jiangzm mac 地址在公网获取不了吧
    whileFalse
        25
    whileFalse  
       2020-06-24 18:37:56 +08:00
    部署一个 shadow server,然后用比如 surge 之类能自己写规则的客户端搞定
    lsylsy2
        26
    lsylsy2  
       2020-06-24 18:50:08 +08:00
    port knocking,安全方面是比较成熟的技术,但无法避免断网风险
    ferock
        27
    ferock  
       2020-06-24 18:58:38 +08:00
    @sadfQED2 #20

    并不担心
    sadfQED2
        28
    sadfQED2  
    OP
       2020-06-24 19:07:15 +08:00 via Android
    @GreatHumorist 是的,本质就是白名单,但是要想办法如何在任意一台公共电脑上修改白名单
    coolcoffee
        29
    coolcoffee  
       2020-06-24 19:09:54 +08:00
    vpn 客户端先下载下来放到某个国内网盘不可以吗?拨号之后走的内网访问,比直接在公网上白名单安全多了,而且还不用一个个设置转发规则。

    另外,你设置白名单 ip 是属于掩耳盗铃的,电信还是能知道你在家宽上搭建网站。
    cjpjxjx
        30
    cjpjxjx  
       2020-06-24 19:14:53 +08:00 via iPhone
    类似于。。。进京证?
    sadfQED2
        31
    sadfQED2  
    OP
       2020-06-24 19:27:28 +08:00 via Android
    @coolcoffee iptables 上面我把请求丢掉还能知道我达了 web 服务?
    Semidio
        32
    Semidio  
       2020-06-24 19:38:08 +08:00
    家里 ss-server 开在不常见端口,客户端内网网段走 ss 即可
    yujiang
        33
    yujiang  
       2020-06-24 19:43:28 +08:00 via Android
    蒲公英,他家 VPN 大流量走的是 p2p
    0gys
        34
    0gys  
       2020-06-24 20:06:26 +08:00 via Android
    双向 ddns,哈哈
    silencefly
        35
    silencefly  
       2020-06-24 20:35:17 +08:00 via iPhone
    DDNS
    devlnt
        36
    devlnt  
       2020-06-24 20:48:42 +08:00
    蒲公英或者直接 ipsec 的 vpn 。移动端上系统自带客户端,完美解决
    dullwit
        37
    dullwit  
       2020-06-24 21:38:26 +08:00 via iPhone
    我的方案是 ddns 加 wireguard (只开一个 peer ),wg 配置文件存云盘,换设备也方便导入
    mxT52CRuqR6o5
        38
    mxT52CRuqR6o5  
       2020-06-24 21:44:55 +08:00 via Android
    ddns+v2ray,v2ray 的路由规则配置能力挺强的,访问不同服务器可以自动选择不同的线路
    kennylam777
        39
    kennylam777  
       2020-06-24 21:52:12 +08:00 via Android
    IPSec 的 IKEv2 或 IKE v1 xAuth 都不用安裝 app
    yzwduck
        40
    yzwduck  
       2020-06-24 22:57:11 +08:00
    漏洞?很多。
    这个方案必须完全信任运营商:1 )不会被动嗅探你的 http 流量; 2 )不会伪造 IP 主动探测你的服务; 3 )不会乱改接入端的 IP 地址。
    否则:1 )以违背用户协议之名,禁掉你的网络; 2 )伪造你的身份,访问你的网络; 3 )让你连不通自己的网络。
    BadAngel
        41
    BadAngel  
       2020-06-24 23:17:36 +08:00 via Android
    让我想起灰鸽子?
    ochatokori
        42
    ochatokori  
       2020-06-24 23:27:34 +08:00 via Android
    楼主的思路就是借助 vps 敲门
    说实话这样搞是最麻烦的

    个人觉得 vpn 是最兼顾易用和速度的
    你说客户端被墙安装麻烦的问题,把客户端安装文件放到你服务器上需要的时候就下载就行了吧
    jh163888
        43
    jh163888  
       2020-06-25 08:51:13 +08:00 via iPhone
    @stille 可是你却经常把自己折腾挂🤣
    lifanxi
        44
    lifanxi  
       2020-06-26 17:51:19 +08:00
    我以为穿越了,记得以前讨论过这个问题。
    找了一下,请参考: https://www.v2ex.com/t/669709
    bluesky139
        45
    bluesky139  
       2020-06-26 20:18:22 +08:00 via Android
    @lifanxi 我也清楚的记得以前有过讨论,看了 40 多楼终于有人想起了。。
    ungrown
        46
    ungrown  
       2020-06-28 11:17:45 +08:00
    首先遇到这类场景我反正无论如何不管怎样都开头无脑推荐 zerotier 先走一波。
    反正值得一试,不行再说。

    接下来具题具析:你用的思路,其实就是 Port knocking (端口敲门),只不过你这儿是 IP 敲门。
    好了,结题,建议你上 github 细细搜一下,现成的实现应该不少,就算不能直接拿来用,也能直接拿来改。
    greensea
        47
    greensea  
       2020-06-30 13:54:25 +08:00
    提醒楼主可能在重新发明轮子

    knock 了解一下
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1133 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 22:55 · PVG 06:55 · LAX 14:55 · JFK 17:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.