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

关于家宽封 web 可能的原因和对策

  •  
  •   alphatoad · 44 天前 · 2426 次点击
    这是一个创建于 44 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前几天讨论的挺火的,估计全国要推广了,随便写点自己的想法

    技术有限,欢迎指正和补充

    和墙相反,个人认为这个问题的关键在于让 web 服务无法被探测到。目前国内内部的流量还不至于有加密就阻断。 那么问题就可以转化为以下两点

    1. 隐藏流量,不留下提供 Web 服务的痕迹
    2. 服务不可复现。此处复现指的是在第三方的设备上,没有一定的协商则无法访问服务

    第一点不说了,第二点拓展一下。不管怎么 DPI,服务最终是要在审核人员的设备上复现的,否则无论再怎么怀疑没有理由封宽带。要阻止这一过程就会很艰辛了。要实现这一点也可以分成两部分:要么完全不泄露域名,要么即便拿到域名也无法访问服务。

    frp 肯定是最简单的方法,但是太无聊了。

    HTTP 明文就不说了。

    双向证书可以确保不可复现,即便拿到域名也无法访问服务。但非浏览器的支持就比较糟糕了。配合 TLS 1.3 和还在草案的 eSNI 确实可以实现完全不留痕迹。这种情况下使用 DDNS 应当问题不大,因为外界确实看不到是否有使用这个域名进行通讯,拿到也访问不了。

    如果不想用双向证书,那就只能把域名藏好。这种情况下用 DNS 风险就很大了,否则发现域名指向家宽,审核人员 doublecheck 发现是通的,完美复现。保险起见还是写个 crontab 脚本自己更新地址吧。

    TLS 1.2 握手时的 SNI 和证书都是明文的,肯定是不能用了,分分钟被 DPI。 TLS 1.3 的证书是加密的。 Encrypted SNI 可以防止 SNI 泄露,但现在还是草案,CF 和 FF 的实现并不是普世的,随时都会 drop。不过只编译一份自己用问题不大,等过几年实装普及吧。

    确保域名藏好之后就可以套一个 sni proxy 使用域名通信了,发现 sni 不对就扔掉。这也是不直接使用 IP 通讯的原因:运营商可以扫端口,发现有 TLS 应用在监听是可以伪装成客户端建立连接的。

    TCP Port Knocking 我个人是持保留态度的,因为要设计一个防 replay attack 的 mechanism 很花时间,如果是基于 TLS 的话还是会遇到上面的问题。

    19 回复  |  直到 2019-12-09 01:31:13 +08:00
    alphatoad
        1
    alphatoad   44 天前
    关于 DNS 也可以这样:A 域名 CNAME 到 B,B 域名 A 记录指向家庭宽带。服务端只允许 A 域名。
    不过风险还是在就是了
    turi
        2
    turi   44 天前
    你们是不是 忘记了,阿里云是会自动扫描服务器的,发现 http 或者 https 没有备案的话 直接 404

    这么简单的扫描器你们觉得运营商不会写一个吗 ?
    alphatoad
        3
    alphatoad   44 天前 via iPhone
    @turi 文中提到了
    mrdemonson
        4
    mrdemonson   44 天前 via Android
    最不折腾的就是用 zerotiler
    国内云服务上装个 moon
    家里路由器装 zerotilerone,开启 nat
    这样云服务上直接反代内网 ip,
    如果要 p2p 保持速度的,在外网电脑上也加入网络
    blackboar
        5
    blackboar   44 天前   ♥ 2
    这个事情的本质是为了搞净网,让每一个对外开放的网页服务都能找到具体责任人, 运营商、ISP 也只是为了落实这个政策尽量不违反,这 10 年来甚至包括现在我们都是以常用 web 端口作为主要监控对象,如 80,8080,443,说白了你自己加自定义端口开设 web, 只要你内容不过分,我们及大多数数据中心都不会管,甚至连上级部门也一样,只是按照政策去解决那几个常用端口,能对政策交代就行了。

    你上边说的很多,我大致看了下,我觉得就 2 点:

    1、你的 WEB 服务如果是面向公众,既然面向公众,那么就都能找出来,没有意义;

    2、如果不面向公众,就像你说的”服务不可复现“,那还折腾个啥劲,反正就你自己或者个别几个朋友能访问,你稍微做点加密措施,或者不用 http 协议就能解决问题了。


    至于你下边说的 DNS 那个,没看懂是解决什么问题的,和普通 A 记录结果不是完全一样吗
    cskeleton
        6
    cskeleton   44 天前
    @blackboar #5 并不是这样,你去看看之前那几个很热闹的讨论帖。只要有外部能打开的网页,一律都是断网签保证书。大部分中招的还是路由管理页面、群晖管理页面这类。
    alphatoad
        7
    alphatoad   44 天前 via iPhone
    @blackboar 因为太多的服务依赖 http 了。我想在应用层上直接跑 http,不想再套一层破坏现有的网络栈。对于麻瓜朋友需要过多的配置不现实。
    另外一方面,我想要需要的时候可以对公众服务。比如家里有个 nas,可以直接 share 链接。可能过几个小时就关掉了,我需要这段时间不被 dpi。
    DNS 防的是通过记录被找出域名。没什么卵用,只能稍稍加大点难度。
    alphatoad
        8
    alphatoad   44 天前 via iPhone
    仔细一想确实不用 CNAME 指 A,用 wildcard 就可以了。随便挑一个别人猜不到的子域名 listen
    asukaceres
        9
    asukaceres   44 天前
    TLS client cert auth
    alphatoad
        10
    alphatoad   44 天前 via iPhone
    @asukaceres please read
    3dwelcome
        11
    3dwelcome   44 天前
    @alphatoad 监管者是通过 TCP 流量来筛选的,提取 HTTP 特征码。如果你随便选一个没备案的域名,直接就进入黑名单了。
    我在想可不可以通过 websocket 把 http 流量都给加密一下。
    alphatoad
        12
    alphatoad   44 天前 via iPhone
    @3dwelcome 你说的是 alpn ?
    Leonard
        13
    Leonard   44 天前
    @cskeleton 这种搭 VPN 不行吗
    nnnToTnnn
        14
    nnnToTnnn   44 天前
    @3dwelcome
    @Leonard
    @alphatoad
    @turi

    首先站在开发者的角度上来说。很大可能是通过爬虫来访问用户的 IP,如果发现有响应则停止。

    使用端口敲门似乎可以解决这个问题

    https://zeroflux.org/projects/knock
    alphatoad
        15
    alphatoad   44 天前 via iPhone
    @nnnToTnnn 端口敲门我也写了,列举了质疑
    baobao1270
        16
    baobao1270   43 天前
    可以尝试 HTTP over SSH ?
    或者自己实现一套 TLS (笑)
    alphatoad
        17
    alphatoad   43 天前 via iPhone
    @baobao1270 我确实实现过,但这个问题不是某个实现能解决的
    niming007zh
        18
    niming007zh   43 天前
    如果你说运营商还没事对你进行各种主动探测扫描的话,是不可能实现公共 web 服务的,esni 只能防流量分析,对主动探测也没用啊
    alphatoad
        19
    alphatoad   42 天前 via iPhone
    @niming007zh 我都写了啊……
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1373 人在线   最高记录 5168   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 29ms · UTC 17:39 · PVG 01:39 · LAX 09:39 · JFK 12:39
    ♥ Do have faith in what you're doing.