V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
测试工具
SmokePing
IPv6 访问测试
LnTrx
V2EX  ›  宽带症候群

应对家宽 Web 的收紧,讨论一下在外网控制家庭设备的方案

  •  
  •   LnTrx · 2020-01-04 15:16:49 +08:00 · 9746 次点击
    这是一个创建于 390 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在外网控制家庭设备,是一种正常合理的需求。由于可以避免中心服务器的故障和延迟,现代前端技术的发达、便捷,以及跨设备、跨系统兼容等优势,许多网络设备和应用都通过网页方式直接访问、控制。
    可是,这样的模式最近面临了新的问题。过去家宽封禁了 80/443 端口,就算禁了 Web。而根据论坛网友的报告,现在似乎只要同时满足以下条件,就很可能会被“关照”:

    1. 上海 /深圳 电信的 家宽 /商宽 用户,且获得了公网 IPv4
    2. 存在任一解析结果指向该 IP 的域名(含子域名),且这对关系未经系统备案
    3. 用户的 IP 存在任意一个向外部开放的端口,且能给出符合 HTTP 特征的响应

    随着法制观念的深入,如果规定合理,大家并不会排斥。然而想适应新的变化,目前还存在着不小的问题:

    1. 为避免域名解析,直接用 IP 访问。然而手动查询最新的 IP 地址十分麻烦,也很难实现可被浏览器信任的 HTTPS。(其实 IP 访问严格来讲也要备案)
    2. 为避免网页特征,通过 VPN 进入内网。然而 VPN 类解决方案往往需要安装和开启额外的客户端,为避免所有本地流量都走 VPN 还要进一步的配置,相比能跨设备、跨系统快捷访问的网页麻烦不少。(自建 VPN 也存在着合规的风险)
    3. 为避免合规风险,正式申请备案。这对于有固定 IP 的商宽是可行的。然而家宽是动态 IP,目前不存在合规可行的备案方式。

    除了上述提到的几类解决方案,不知道是否还有其他便于 外网控制家庭设备 的思路?欢迎讨论


    抛砖引玉一下,个人感觉不依赖域名解析的 IP 地址记录或许是一种解决方案。(不过还是有上述方案的影子)
    这个方案包括以下部分:

    • 一个在境内外都可以免费托管的静态页面
    • 一个可实时更新和在线查询的 IP 地址记录

    当用户访问页面时,js 自动查询 IP 地址,然后跳转或在框架里显示网页,亦或者是直接用 jsproxy。
    IP 地址在线记录的方式有很多。除了用免费的数据库服务,其实还可以写死在网页里,然后用一个自动化的更新 + git push 维护。

    为了防止非用户主动访问 IP,可以用 js 实现类似 port knocking 的机制。这样直接访问网页端口可以做到无任何响应。
    为了规避 http 特征,或许也可以进一步发展基于 js 的无客户端代理机制。(服务端在家庭的网络设备)

    不过,跳转或框架显示似乎不太好解决 https,而目前 jsproxy 似乎也还不够完善。

    第 1 条附言  ·  2020-01-04 17:21:58 +08:00

    忘了提了,还有一类与VPN有一点相似的解决方案统称为“内网穿透”,不管有没有公网IP都可以实现公网访问。
    由于内网穿透到公网的端口不固定,且流量被其他协议封装,暂时未见算作违规的案例。
    常用于内网穿透的工具有frp、Ngrok、n2n、ZeroTier、Wireguard等。其中有不少因为需要本地客户端,其实跟VPN类差别不大。

    这类服务常常面临以下的权衡取舍:

    1. 需要有第三方中继服务器。使用公共的服务器则稳定性较差,使用自建的服务器则成本上升。
    2. 稳定性和速度不太有保证。如果流量经服务器中继则严重受其制约,而P2P模式一般需要本地客户端且在NAT下的可靠性相当没有保证。

    (不知道有没有基于js实现的P2P模式NAT打洞)

    65 条回复    2021-01-18 14:56:45 +08:00
    n37r06u3
        1
    n37r06u3   2020-01-04 15:40:51 +08:00 via iPhone
    群晖 nas 装个 windows 虚拟机最简单
    Archeb
        2
    Archeb   2020-01-04 15:55:25 +08:00 via Android
    我觉得 port knocking 就足够了
    成功之后就把当前 ip 加入白名单,然后正常访问就是
    基于 js 的无客户端代理 可以试试用 webrtc 打洞,这样也不需要中转服务器只需要 stun 服务器
    ZRS
        3
    ZRS   2020-01-04 15:56:16 +08:00   ❤️ 1
    nebula 这类组网方案其实比较理想
    ETiV
        4
    ETiV   2020-01-04 16:10:52 +08:00 via iPhone
    Surge
    手机电脑都能用
    LnTrx
        5
    LnTrx   2020-01-04 16:31:11 +08:00
    @n37r06u3 在能找到 IP 的情况下也算是一个折中的方案,不过非 Windows 环境下的客户端还是免不了,要调取文件也不是很方便。

    @Archeb 即便有 port knocking,感觉保留 DDNS 解析还是有算作违规的可能。如果纯 IP 访问倒是可以用,而且可以交给公网可访问的带 js 的静态页面实现。

    @ZRS 使人想起了像 IPFS 这样的非中心化网络
    Mai1me
        6
    Mai1me   2020-01-04 16:33:33 +08:00 via Android
    frp
    vpn
    explore365
        7
    explore365   2020-01-04 16:44:26 +08:00
    悦 me 智能网关 设备型号 F450G 端口转发后,任何数据都不行
    telnet 连接路由,把路由器的防火墙关了,可以连通,但是 http 的还是不行,估计是在电信上层设备的防火墙给拦截了吧
    soulzz
        8
    soulzz   2020-01-04 16:53:42 +08:00
    非 443 htttps
    配置一下 ngnix 就行
    0gys
        9
    0gys   2020-01-04 17:02:55 +08:00 via iPhone
    解决不了问题,解决搞出问题的人^_^
    ccc008
        10
    ccc008   2020-01-04 17:07:30 +08:00
    @talarax7 #5 DDNS 解析应该没事。就算 DDNS 不行了。还可以主动上报 ip 到一个接口。方法总比困难多。
    tia
        11
    tia   2020-01-04 17:18:12 +08:00
    Archeb
        12
    Archeb   2020-01-04 17:22:43 +08:00
    > (不知道有没有基于 js 实现的 P2P 模式 NAT 打洞)
    就是基于 WebRTC DataChannel 的方式啊,比如说 PeerJS
    abbottcn
        13
    abbottcn   2020-01-04 17:23:32 +08:00 via iPhone
    @ZRS 这个方案,👍。处于可用状态,虽然没达到手册里说的场景。
    Archeb
        14
    Archeb   2020-01-04 17:23:49 +08:00
    peerjs 可以运行在 node 上(服务器端),客户端只需要浏览器,然后用一个公网 stun 服务器打洞就可以直接建立连接
    des
        15
    des   2020-01-04 17:29:29 +08:00 via Android
    ddns+vpn 就行,ipsec psk 我现在就在用,各个设备都直接支持
    有的路由器就有这个功能,不存在需要安装的情况
    hlz0812
        16
    hlz0812   2020-01-04 17:32:45 +08:00 via Android
    如果你是用于物联网设备,放心,今后物联网设备都是服务器中转,不需要公网 ip。如果是访问家里内部网络,用 vpn 连回去就行了,至少现在不管,哪天管了再说。现在运营商提供 APP 查询当前 ip 地址,不做 ddns 问题不大
    LnTrx
        17
    LnTrx   2020-01-04 17:34:31 +08:00
    @Archeb 感觉理论上具有一定可行性。(不过万一碰上 Symmetric NAT 能稳定么?)
    现在有没有基于这个思路实现在网页中,通过 WebRTC 以 P2P 形式传输内网网页内容的案例?
    LnTrx
        18
    LnTrx   2020-01-04 17:36:04 +08:00
    @hlz0812 推广 IPv6 的原因之一就是避免物联网设备服务器中转带来的各种问题
    des
        19
    des   2020-01-04 17:37:40 +08:00 via Android
    还有 ddns 如果不选国内的,不太可能有人把互联网的所有域名都扫描一遍。
    除非 ddns 的那个请求是 http 的,用 ddns 被警告 99%都不是 ddns 本身导致的
    除非你用的 ddns 是国内厂商的,因为我也不清楚他们有没有上报
    LnTrx
        20
    LnTrx   2020-01-04 17:38:38 +08:00
    @des 部分地区 500、4500 端口也被封了,你的客户端能支持非标准端口么?
    xenme
        21
    xenme   2020-01-04 17:43:00 +08:00 via iPhone
    VPN 或者跟翻滚墙一样,开个端口搭建个你客户端支持的服务,然后加一条规则,你家里的 IP 段走对应的服务器就好了。

    反正你哥哥电脑必然有你出墙的客户端。
    再加上 ssid 或者网络判断规则,即使你回家了,也可以直联。


    目前就该这样全自动的使用的
    LnTrx
        22
    LnTrx   2020-01-04 17:47:28 +08:00
    @des 理论上监控 DNS 解析的情况,也可以发现未备案的境外域名-境内 IP 关系。不过如果没有 http 服务,应该还没有被干预的案例。
    cwek
        23
    cwek   2020-01-04 17:57:47 +08:00
    简单的做法,装一个绳子,对外端口只开绳子的,所有服务当内网使用。
    LnTrx
        24
    LnTrx   2020-01-04 18:02:57 +08:00
    @soulzz 其实现在非标准端口的纯 https、纯 IPv6 公网网页还都未见被干预的案例,但技术上发现难度应该不大。(毕竟 TLS 的 ESNI 还不是很成熟)
    brMu
        25
    brMu   2020-01-04 18:16:10 +08:00 via Android
    ZeroTier,轻松搞定。
    des
        26
    des   2020-01-04 18:42:41 +08:00 via Android
    @talarax7
    解析情况确实有可能,但是我觉得凭这个就把人封了
    真要是这样,我就能让全国人民都上不了网
    des
        27
    des   2020-01-04 18:51:12 +08:00 via Android
    @talarax7 我这里没有,要是端口都要封的话,那就只能转发或者打洞了
    Archeb
        28
    Archeb   2020-01-04 19:27:43 +08:00 via Android
    @talarax7 summetric nat 应该就不行了

    目前主要用在 im 视频通话里面,提供 web 我还没见过

    不过理论可行 改天有空我造个轮子试试
    Archeb
        29
    Archeb   2020-01-04 19:28:30 +08:00 via Android
    @Archeb *symmetric
    cst4you
        30
    cst4you   2020-01-04 19:43:09 +08:00   ❤️ 1
    zerotier 目前还是香
    fetich
        31
    fetich   2020-01-04 21:17:50 +08:00
    @brMu
    @cst4you 两位老哥,想咨询下 ZeroTier 使用中遇到的问题,谢谢。
    部署 ZeroTier 在路由器后的设备上,需要在路由器设置端口转发的规则么?
    如果两个内网的设备通过 ZeroTier 连接,可以访问对方内网中的其他设备么?可以的话,如何设置?
    133qaz
        32
    133qaz   2020-01-04 23:59:57 +08:00 via Android
    zerotier 路由器模式有点难以理解,只把 zerotier 部署在 omv 系统中。就目前使用来说,跨营运商高峰期 ping 值过大和丢失严重;速度还可以。移动 to 电信 https://s2.ax1x.com/2020/01/04/l0Lhc9.png
    133qaz
        33
    133qaz   2020-01-05 00:09:19 +08:00 via Android
    @fetich 看介绍是软交换机模式,不需要做端口转发。
    alphatoad
        34
    alphatoad   2020-01-05 02:01:30 +08:00 via iPhone
    ddns 不能用,有没开 web 被搞的 report
    wazon
        35
    wazon   2020-01-05 02:21:24 +08:00
    @des
    @ccc008
    @alphatoad
    确实存在没有开 http 域名解析也被提醒的案例(/t/632414 ),但感觉有点奇怪。不是很理解发现的机制是什么,以及如何排除被未知人士恶意解析的情况。
    alphatoad
        36
    alphatoad   2020-01-05 02:51:21 +08:00 via iPhone
    @wazon 布隆过滤器就好了技术上没难度,国内都是有 dpi 的
    cst4you
        37
    cst4you   2020-01-05 05:49:17 +08:00   ❤️ 1
    @fetich zt 有些创建出来的 network 就被限速甚至连不上, 重新创建直到打通即可.
    我自己只试过上海同市同运营商(电信), 内网直通跑满所有可以用的带宽.
    在日本玩, 用 surface pro 连回去上海, 也还勉强可以用.
    moon 的话可以尝试自己创建, 但是我在自己的 moon 上也没检测过中转流量在走, 可能我是打通了的关系吧
    z7356995
        38
    z7356995   2020-01-05 08:32:42 +08:00 via Android
    有个服务器的话还是比较简单的,,家里 nas 每隔 5 分钟访问一下股务器报一下 ip, 服务器在根据 ip 生成网址导航页就可以了
    xl224
        39
    xl224   2020-01-05 08:48:45 +08:00 via iPhone
    我家目前的方案
    1.阿里云一台轻量,然后部署 pptp 打隧道,家里反向链接到阿里云
    2.阿里云配置路由把家里内网映射过去,直接配置转发规则
    3.阿里云做域名备案
    Liuman
        40
    Liuman   2020-01-05 10:06:10 +08:00
    我是买的 蜗牛 nas 和阿里云域名,nas 装了虚拟机 ,自己写的 nodejs 服务(开机自启) 10 秒获取一次公网 ip,然后判断是否 变更,如果变更了 ,那么调用 阿里云解析接口,自动修改域名解析的 ip 地址
    Chigogo
        41
    Chigogo   2020-01-05 10:23:30 +08:00   ❤️ 1
    这两天折腾成功:路由器 ip 改变则报告,向云服务器报告(腾讯云):

    ```
    mkdir /etc/ppp/ip-up.d/ #OpenWrt 在 pppoe ip 改变 Event 发生后,会自动这个脚本,无需其他配置

    echo '#!/bin/sh
    me=homeNas #声明这个变量是为了在家庭路由器下写 Hosts 中
    ip=$(ifconfig | grep -A 1 "wan" |grep inet | grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}"|sed -n '1p') #获取 wan 口 ip
    sed -i "/$me$/d" /etc/myhosts # 在自定义的 myhosts 中删除上次记录的 wan ip ;自定义 hosts 可以让路由器下设备无痛访问家里 ip
    echo $ip $me >>/etc/myhosts # 在自定义的 myhosts 中更新本次新获得 wan ip ;依然,自定义 hosts 可以让路由器下设备无痛访问家里 ip

    # 下面这个从路由器 ssh 到云服务器;请把 your-server-ip/port 换成你自己的;记住云服务器 ip 后,可以删除-y -y
    ssh [email protected]/port -y -y -i /root/.ssh/id_ras "bash -s" <<EOF
    echo $ip>$me
    EOF
    '>/etc/ppp/ip-up.d/push-route-ip-to-server
    chmod +x /etc/ppp/ip-up.d/push-route-ip-to-server

    # 使用上述 EOF 方法,可以将 ip 变量写入云服务器中,这个方法很好了
    ```

    脚本写好后,每次 ip 改变,OpenWrt 会自动 push-route-ip-to-server。亦可以手动执行:
    `sh /etc/ppp/ip-up.d/push-route-ip-to-server`
    FS1P7dJz
        42
    FS1P7dJz   2020-01-05 11:09:59 +08:00
    duckdns
    locoz
        43
    locoz   2020-01-05 11:14:07 +08:00 via Android
    不需要纠结那么多…转发+VPN 双方案够了,怕被检测出来就再套一层伪装(极端情况下自己写),fq 软件都是这么做的,gfw 都检测不了你担心运营商检测啥?
    LnTrx
        44
    LnTrx   2020-01-05 12:23:55 +08:00
    忽然想到,既然是境内的互联,经典的 sock5 网页代理现在是否可行?
    prenwang
        45
    prenwang   2020-01-05 12:58:09 +08:00
    家庭 sdwan 市场终于到来
    ety001
        46
    ety001   2020-01-05 13:43:46 +08:00   ❤️ 1
    买的阿里云最便宜的弹性 ecs+5Mbps 带宽,部署的 nps/npc,机房选择跟自己同省的机房。

    目前使用很稳定,速度也很快。从家里到机房的 ping 值 6ms 以内。
    LnTrx
        47
    LnTrx   2020-01-05 14:49:22 +08:00
    @ety001 nps 似乎还是免不了服务端和客户端,但看起来平台覆盖和文档都做得比较好,是一个功能全面的内网穿透工具
    niubee1
        48
    niubee1   2020-01-05 17:24:05 +08:00
    为什么不用 MQTT ?为什么非要外面能直接连上家庭内网?用消息驱动设备不好么?
    shunf4
        49
    shunf4   2020-01-06 01:43:52 +08:00 via Android
    taresky
        50
    taresky   2020-01-06 08:04:59 +08:00 via iPhone
    完美方案是各类 server,ss/snell/ssr/v2ray 都无所谓,你平时用什么翻墙就用什么类型。

    通过规则完美分流,翻墙 /直连 /回家 /回公司都是 365x24 无缝的。而且只用开一个非 http 端口,规避封宽带的问题。
    tankren
        51
    tankren   2020-01-06 09:02:28 +08:00
    网关架设 1194VPN
    LnTrx
        52
    LnTrx   2020-01-06 11:46:14 +08:00
    @taresky 你的完美方案里好像没有应对动态 IP 的部分?
    taresky
        53
    taresky   2020-01-06 11:55:59 +08:00
    @talarax7 啊?动态 IP ddns 不就解决了,这不是最基础的么。。。
    LnTrx
        54
    LnTrx   2020-01-06 12:25:09 +08:00
    @taresky 不知道你有没有仔细看过上下文讨论,非 http+DDNS 也有风险。目前的报告主要还是有特征的流量( IPsec、SOCKS5 ),但这样的话无特征的流量似乎也不太安全。相反,现在还没有无域名解析却被关照的案例。
    taresky
        55
    taresky   2020-01-06 13:27:07 +08:00 via iPhone
    @talarax7 “ 非 http+DDNS 也有风险” 这个目前我还没看到案例。
    sadfQED2
        56
    sadfQED2   2020-01-06 13:35:46 +08:00 via Android
    我自己的实现,这个定时脚本,每 5 分钟上报 ip 到网盘。在路由器上面装 openvpn,需要连回家的时候打开网盘看 ip,然后连 vpn
    marquina
        57
    marquina   2020-01-06 13:43:10 +08:00
    @talarax7 DDNS 也能解决,home 可以通过多种方式上报 ip,本地发现 ip 有变动就重启 server,这样就避免解析了
    LnTrx
        58
    LnTrx   2020-01-06 13:54:39 +08:00
    @taresky 两个案例的链接就在前面的一串讨论里
    godall
        59
    godall   2020-01-06 16:21:35 +08:00
    @Archeb 用 port knock 的话,怎么支持各类终端登录?比如 pc/手机 /pad。。。
    godall
        60
    godall   2020-01-06 16:24:12 +08:00
    @taresky 用 oracle 的免费云 cloud,在国内用国外域名访问,结果 http 直接被 ban,https 可以。
    taresky
        61
    taresky   2020-01-06 16:34:39 +08:00
    @godall ?这说的不是一回事吧
    wslzy007
        62
    wslzy007   2020-01-09 12:18:35 +08:00
    @all 使用 TCP 打洞的方案吧,没有 QoS 之痛,用 SG,github 搜索 smarGate
    ZeroKong
        63
    ZeroKong   2020-01-11 01:42:46 +08:00
    zerotier 是个好东西
    wnjxyk
        64
    wnjxyk   10 天前
    使用群晖自带 DDNS 与 *.synology.me 可行吗?这个域名应该是群晖自己备案过的。
    wnjxyk
        65
    wnjxyk   10 天前
    @wnjxyk 是我的错,群晖的 DDNS 域名似乎都没有备案
    关于   ·   帮助文档   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3147 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 12:47 · PVG 20:47 · LAX 04:47 · JFK 07:47
    ♥ Do have faith in what you're doing.