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

239 天前
 jqknono

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

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

那篇分享里只提到了避免暴露域名, 实际上还有网络空间扫描, 它不管什么暴露的信息, 直接遍历 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, 参考设置:

设置后, 内网设备访问外网时只会使用 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为域名, 不要留空.

使用私有 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 任务
      • 添加自定义解析, 伪造域名解析到内网服务

最后,

4554 次点击
所在节点    宽带症候群
21 条回复
kaedeair
236 天前
@jqknono 一周 ip 就变动一次,而且变动的部分只有 ipv6 前缀的 4 个字母,我只需要 wg 连家里网关,有啥麻烦的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1114872

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX