讓DNS over TLS 也可以用Domain分流

機器人亂戳

本身有架 AdGuardHome 而且提供外網連線,
架了一段時間發現有不少的機器人會用 DNS over TLS (DoT)亂戳這台DNS

img 2024 04 15 01 42 42
img 2024 04 15 01 43 03

這個問題困擾我蠻久,不希望別人亂戳這個DNS 但是限制IP 連線又會讓外網無法使用
所以一直都在尋找可以解決機器人亂戳的方法

不是啊怎麼戳的

img 2024 04 15 01 52 01

還可以不驗憑證的嗎…

HAProxy SNI 分流

HAProxy 可以使用Access Control List (ACL) 來 過濾, 管理, 阻擋 傳入的資料

怎麼辦到的?

frontend dot_acl
    tcp-request inspect-delay 5s
    tcp-request content accept if { req.ssl_hello_type 1 }
    use_backend dot if { req.ssl_sni -m sub example.thisisch.net }
    

代表的分別是

  • tcp-request inspect-delay 5s
    當用 inspect-delay 的時候,HAProxy 會先接受TCP 連線,直到符合規則或是達到秒數(5秒 / 5s),兩者誰先達到就誰被採用
  • tcp-request content accept if { req.ssl_hello_type 1 }
    當TCP 連線有 req.ssl_hello_type 1 的時候 就接受該TCP 連線,並傳送給後端主機

什麼是 ssl_hello_type 1?

當用戶想要建立安全TCP 連接時,會發送一個 “Client Hello” 的封包給伺服器,這個封包會列出加密資訊 (例如 TLS 版本) ,並依用戶端喜好設定的順序列出用戶端支援的 CipherSuites 。 訊息也包含在後續計算中使用的隨機位元組字串。 通訊協定可讓 “client hello” 併入用戶端支援的資料壓縮方法。1

  1. https://www.ibm.com/docs/zh-tw/ibm-mq/9.3?topic=tls-overview-ssltls-handshake ↩︎
img 2024 04 15 02 34 40

其中最重要的就是 Server Name 這裡,這裡是等等會拿來比較的數值

  • use_backend dot if { req.ssl_sni -m sub example.thisisch.net }
    當SNI 符合(match) example.thisisch.net 的時候
    就會使用 dot 這個後端連接

什麼是Server Name Indication (SNI) ?

在上面的 Client Hello 有提到,
TCP在握手(handshake)過程時會告訴伺服器正在連接的主機名稱 (example.thisisch.net)
這樣伺服器就會提供相對應的憑證來驗證
我們就是利用這一點來進行過濾

HAProxy 相關語法

以下列出 HAProxy的 ACL Flags

-i

-i 對請求封包內容進行不區分大小寫(case-insensitive)過濾

-f

載入檔案
-f 用於載入包含過濾內容的檔案。-f 其後跟隨一個檔案名稱 (-f patterns.txt ),HAProxy會從該檔案讀取所有行。如果想要使用多個檔案,使用多個 -f 參數。

假設我們有一個名為 patterns.txt 的檔案,其中包含以下幾行:

/images/
/photos/

ACL Flag 會檢查請求的 URL 是否含有檔案中的任一種路徑開頭

frontend www
  bind :80
  acl images_url path -i -m beg -f /patterns.txt
  

檔案的格式須遵守以下規則:

  • 空行會被忽略
  • 以井號 (#) 開頭的註解行會被忽略
  • 所有空格和製表符(Tab鍵) 將自動去除
  • 如果一起使用 -f 與 -m 時,必須先寫 -m

-m

-m 用於比對 ACL 規則與輸入封包

  • 一起使用 -f 與 -m 時,必須先寫 -m

剩下的太多專業術語,直接指路 (連結)
文中用到的是 sub 字串匹配
HAProxy 會檢查封包是否包含至少一個提供的字串(example.thisisch.net)

配置

配完之後會長這樣

frontend dot_acl
    mode tcp
    bind 0.0.0.0:853
    tcp-request inspect-delay 5s
    tcp-request content accept if { req.ssl_hello_type 1 }
    use_backend dot if { req.ssl_sni -m sub example.thisisch.net }

backend dot
        server upstream 127.0.0.1:853 
        server backup 127.0.0.2:853 backup
        

結果

img 2024 04 15 03 24 44

大成功,終於不會被機器人直接亂戳( ´▽`)

結語

希望看到這篇文的人解決了被掃的困擾uwu
也祝各位的DNS processing time 都 1ms,不 I/O Error, 不被機器人亂掃

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *