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

分享几个更安全使用公网 IPv6 的方法

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

    有些人会有使用公网 IPv6 回家的需求, 不同于 tailscale/zerotier 等 VPN 需要内网穿透打洞来建立直连的方式, IPv6 回家就是直连, 手机蜂窝网络大多数时候都是有 IPv6 的, 回家非常方便.

    我之前分享过一篇文章家庭宽带使用常见 DDns 子域名可能会使电信宽带服务降级, 描述使用 IPv6 时运营商挖的一个坑, 简短来说就是域名会被扫, 暴漏自己的域名等同于暴露 IPv6, 因此可能会被扫描, 扫到服务后入站连接一多就降级宽带服务.

    那篇分享里只提到了避免暴露域名, 实际上还有网络空间扫描, 它不管什么暴露的信息, 直接遍历 IP 池开扫, 这种情况较难防.

    网络空间扫描通常包括以下几个方面:

    • IP 存活性探测:利用 ARP 、ICMP 、TCP 等协议来识别在线主机。
    • 端口/服务探测:通过端口扫描筛选出在线主机的开放端口,并获取目标主机的服务信息、版本信息以及操作系统信息。
    • 操作系统探测:通过分析响应数据包来推断目标主机的操作系统类型和版本。
    • 流量采集:监控网络流量以发现异常行为或攻击模式。
    • 别名解析:针对拥有多个 IP 地址的路由器,建立 IP 地址与路由器之间的映射关系。
    • DNS 探测:通过 IP 地址反向解析建立 IP 地址与域名之间的对应关系。

    这里分享几个避免被网络空间扫描扫到的方法:

    1. 内网 DNS 服务器不返回 AAAA 记录
    2. 内网服务仅允许通过域名访问, 不允许直接通过 IP 访问
    3. 使用私有 DNS 服务AdGuardPrivate

    内网 DNS 服务器不返回 AAAA 记录

    上网时上到各式各样的网站, 这样自然的访问就可以暴露源 IPv6, 对方服务器可以获取源 IPv6, 用户侧如果没开防火墙的话, 这个 IPv6 就可以放到网络空间扫描的优先遍历池里.

    还可以将/56前缀的 IPv6 地址放到扫描池里, 仅遍历低 16 位, 扫描范围也可大大缩减.

    我使用多年 IPv6 的体会, 日常上网时 IPv6 相较 IPv4 没有明显的区别. 因此我们可以牺牲 IPv6 的外访, 仅用来直连回家.

    设置不返回 IPv6 解析方法

    在内网 DNS 服务器上, 设置不返回 AAAA 记录.

    内网 DNS 服务一般用的 AdGuardHome, 参考设置:

    设置禁用 IPv6

    设置后, 内网设备访问外网时只会使用 IPv4, 不会再使用 IPv6.

    内网服务仅允许通过域名访问

    可能家里暴露的服务可以基于端口访问, 这样非常容易被扫到存在服务.

    最好在创建服务时, 不要做监听0.0.0.0::这样的设置, 经验丰富的能体会到, 几乎所有服务启动指导默认都只监听127.0.0.1::1, 这是因为监听公网 IP 是存在风险的.

    反向代理仅允许域名设置方法

    nginx 示例

    关键是设置server_name为域名, 不要设置为_IP.

    server {
        listen 80;
        server_name yourdomain.com; # 将 yourdomain.com 替换为您的实际域名
    
        # 返回 403 Forbidden 给那些试图通过 IP 地址访问的用户
        if ($host != 'yourdomain.com') {
            return 403;
        }
    
        location / {
            # 这里是您的网站根目录和其他配置
            root /path/to/your/web/root;
            index index.html index.htm;
        }
    
        # 其他配置...
    }
    

    IIS 示例

    关键是设置host name为域名, 不要留空.

    IIS 示例

    使用私有 DNS 服务

    在仅自己使用的 DNS 服务中添加自定义解析, 以伪造的域名解析到内网服务.

    DNS 重写功能

    这样做有几个明显的好处.

    1. 首先域名是可以随便构造的, 不需要购买域名, 省一笔域名费用. 如果这种伪造域名被扫到, 那么攻击者需要请求你的 DNS 服务才能获取到正确解析结果.
    2. 需要同时暴露自己的私有 DNS 服务地址, 以及虚拟域名, 然后扫描者需要修改域名的解析逻辑, 向暴露的私有 DNS 服务器请求域名解析, 再将虚拟域名填入构造的请求Headers中, 才能开始扫描.
    sequenceDiagram
      participant Scanner as 网络扫描者
      participant DNS as 私有 DNS 服务器
      participant Service as 内网服务
    
      Scanner->>DNS: 1. 发现私有 DNS 服务器地址
      Scanner->>DNS: 2. 请求解析虚拟域名
      DNS-->>Scanner: 3. 返回内网服务 IP
      Scanner->>Service: 4. 使用虚拟域名构造 Headers
      Note right of Service: 如果 Headers 中没有正确的虚拟域名<br/>则拒绝访问
      alt Headers 正确
        Service-->>Scanner: 5a. 返回服务响应
      else Headers 错误
        Service-->>Scanner: 5b. 返回 403 错误
      end
    

    只有扫描者完成以上所有步骤,才可能扫描到内网服务,这大大增加了扫描的难度。

    AdGuardPrivate上可以创建私有 DNS 服务, 使用自定义解析功能添加伪造域名, 当然也可以用dnspod.cn家的.

    这两家提供服务差别较大, AdGuardPrivate 就是原生的 AdGuardHome 改来的, 功能上远多于 dnspod, 大家自行评估.

    总结

    1. 内网 DNS 服务器不返回 AAAA 记录
      • 前置条件
        • 有公网 IPv6
        • 有内网 DNS 服务器
      • 设置
        • 不返回 AAAA 记录
    2. 内网服务仅允许通过域名访问, 不允许直接通过 IP 访问
      • 前置条件
        • 有自己的域名
        • 域名服务商提供 DDNS
        • 内网有反向代理服务
      • 设置
        • 设置 DDNS 任务
        • 仅允许通过域名访问
    3. 使用私有 DNS 服务
      • 前置条件
        • 有私有 DNS 服务
        • 私有 DNS 服务提供自定义解析
        • 私有 DNS 服务提供 DDNS
      • 设置
        • 设置 DDNS 任务
        • 添加自定义解析, 伪造域名解析到内网服务

    最后,

    • 直连回家最简单最安全的就是内网穿透成功的 tailscale/zerotier, 但有时会因为各种网络原因穿透不成功.
    • 不要随便连陌生 Wifi, 能一次性把信息给泄露完了. 搞张大流量卡, 暂且把信任交给运营商, 需要便宜大流量卡的联系我(不是), 我也需要.
    21 条回复    2025-03-03 16:33:18 +08:00
    lns103
        1
    lns103  
       32 天前
    内网 DNS 服务器不返回 AAAA 记录 这个可以不需要,正常设备都是利用的临时后缀来访问 ipv6 网络,只要路由器上开启了 ipv6 防火墙,只给固定后缀开了端口,就完全不用管这个
    Yidiudiu169
        2
    Yidiudiu169  
       32 天前
    我用的 lukcy ,不知道有没有影响
    jqknono
        3
    jqknono  
    OP
       32 天前 via Android
    @lns103 泄露了前缀可以扫低 16 位
    SenLief
        4
    SenLief  
       32 天前 via iPhone
    为什么要像外网提供 http 服务呢?这是家宽明令禁止的。
    lns103
        5
    lns103  
       32 天前 via Android
    @jqknono 不对吧,slaac 分配要扫 64 位才行(我是用的 eui64 作为固定后缀),除非开了 DHCPv6 ,还只分配后 16 位作为固定 IP (我是没开 DHCPv6 ,前缀变化不能及时更新)
    YsHaNg
        6
    YsHaNg  
       32 天前 via iPhone
    @SenLief 地球上没有禁止
    LnTrx
        7
    LnTrx  
       31 天前
    有种只抓次要矛盾不抓主要矛盾的感觉:
    1. IPv6 只要开了 SLAAC ,需要担心的就是主动外访的回访,或者主动公布地址(如 tracker ),而不是网络空间扫描。网络终端的地址空间至少 64bit ,几乎不可能遭被动扫到。
    2. 既然已经提到不要监听公网,那监听局域网 IP 不就行了。为了便于自己理解搞内网域名没什么问题,但看不出监听公网+仅允许内网域名如何增加了安全性。
    totoro625
        8
    totoro625  
       31 天前
    1. “反向代理仅允许域名设置方法”
    此处应返回 444
    返回 403 恰好证明了该 IP 建站了

    443 端口应配置 ssl_reject_handshake on

    主动监听_或 IP 或简单的常见域名,并用 444 拒绝返回任何信息


    2. 最关键的一步是配置防火墙及 IP 白名单
    留一个幸运数字端口开放给公网访问,其他端口只给白名单 IP 访问
    在那个端口上配置一下过白程序即可,简单示例: https://poe.com/s/lt3eBg7nH9v6HmKneVX8


    3. ddns 域名混淆
    自己维护一个备案域名,随便搭建一个博客掩人耳目
    不要使用烂大街的常用前缀
    多设置几个泛解析防止扫描

    4. 不要使用第三方 dns ,自建 doh 使用
    jqknono
        9
    jqknono  
    OP
       31 天前 via Android
    @SenLief 自用的服务
    @lns103 对,我这里后缀是固定的低 16 位,暴露了前缀只需要扫低 16 位
    @LnTrx 允许反向代理监听公网,增加域名认证,为服务增加了域名匹配条件,以前服务被扫到需要 ip:port ,现在是 ip:port 加域名,填错 host 或 sni 则不响应。如果使用个人 dns ,那就再加一个维度,还需要获得 DoT 或 DoH 地址,需要获取到四个条件
    jqknono
        10
    jqknono  
    OP
       31 天前 via Android
    @totoro625 感谢补充
    titanium98118
        11
    titanium98118  
       31 天前
    你自己从外部发起的入站连接,ISP 一样是知道得一清二楚的
    234ygg
        12
    234ygg  
       31 天前
    哪用得着那么复杂。。会折腾这些的大概率手机上都有代理软件,家里 ipv6 只开个端口给 vpn 就完事儿了
    LnTrx
        13
    LnTrx  
       31 天前
    @jqknono 我已经讲过了,既然是内网服务,只响应内网就行了,没必要监听公网担心被扫到再加限制。
    如果你想的是以内网域名形式跨公网访问,这么做也看不出什么意义。因为你想防的是 ISP ,但 ISP 可以获得你的 Host 或者 SNI ,不管用哪种域名都会被发现。
    ericww
        14
    ericww  
       31 天前 via iPhone
    对于最后,回内网有 VPN 是安全的,对外开放 http ,dns 服务随时会被封停,一顶帽子扣下来吃不了兜着走。两端有 ipv6 时候 tailscale 就没失败过,自建用 ddns+wireguard 掌握在自己手里。绝大部分非运营商直销大流量卡出口都是在物联卡公司,直接看光裸奔。在外全局连回家出口可控更安全。
    Zarhani
        15
    Zarhani  
       31 天前
    zerotier/tailscale 在双方都有 ipv6 的情况下会直接直连, 无需打洞, 也无需关闭光猫的防火墙
    jqknono
        16
    jqknono  
    OP
       31 天前 via Android
    @LnTrx 要防的是被网络空间扫描到服务,不是 ISP 。要防的是被扫到的服务被 250 个以上的连接并发访问,导致 ISP 降级服务。关于做这些是否有意义,正如本文的第一句话,给需要的人用。
    maybeonly
        17
    maybeonly  
       31 天前
    所以有点好奇受众是怎样的人
    不要在墙内公网上开 http ,即使是 v6 也不行。如果一定要 web 服务请 vpn 回家
    毕竟运营商是可以嗅探的

    至于低 16bit 扫描,这个……emmm ,如果换个地址分配方式呢?
    至于不返回 aaaa 记录,完全没有必要或者说无关
    内网服务监听 0.0.0.0 就行,不监听 v6 (点名批评 golang 刻意混淆 0.0.0.0 和::)
    怕反向扫描其实完全可以整个单独的 ip 单独开服务而和其他东西分开的
    用 docker 或者其他任何东西都好
    dicle
        18
    dicle  
       31 天前
    是个大问题。
    kaedeair
        19
    kaedeair  
       29 天前
    不用这么麻烦,只需要一个能改 iptables 的路由器,配几个规则:
    1.WAN 侧入站与 IPV6 转发默认 DROP
    2.WAN 侧 ICMP echo 请求 DROP
    ip 地址变动是使用微信公众号推送解决的,也可以用邮件,就是效果差一点,主打一个白嫖
    jqknono
        20
    jqknono  
    OP
       29 天前
    @kaedeair 我的基础设施做这些是比较简单的, 就是改下设置. 你的 ip 推送公众号访问起来不会麻烦吗?
    kaedeair
        21
    kaedeair  
       29 天前
    @jqknono 一周 ip 就变动一次,而且变动的部分只有 ipv6 前缀的 4 个字母,我只需要 wg 连家里网关,有啥麻烦的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   983 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 19:58 · PVG 03:58 · LAX 12:58 · JFK 15:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.