幾個更安全使用公網IPv6的方法

有些人會有使用公網 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, 能一次性把信息給洩露完了. 搞張大流量卡, 暫且把信任交給運營商, 需要便宜大流量卡的聯繫我(不是), 我也需要.