Table of Contents
機器人亂戳
本身有架 AdGuardHome 而且提供外網連線,
架了一段時間發現有不少的機器人會用 DNS over TLS (DoT)亂戳這台DNS
這個問題困擾我蠻久,不希望別人亂戳這個DNS 但是限制IP 連線又會讓外網無法使用
所以一直都在尋找可以解決機器人亂戳的方法
不是啊怎麼戳的
還可以不驗憑證的嗎…
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
- https://www.ibm.com/docs/zh-tw/ibm-mq/9.3?topic=tls-overview-ssltls-handshake ↩︎
其中最重要的就是 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
結果
大成功,終於不會被機器人直接亂戳( ´▽`)
結語
希望看到這篇文的人解決了被掃的困擾uwu
也祝各位的DNS processing time 都 1ms,不 I/O Error, 不被機器人亂掃