WHOIS是網際網路中用來查詢網域名稱和IP的服務,可以讓我們在連結到對方的伺服器前,先行確認對方究竟是誰(沒錯,就是Who is ...?),避免連線到不安全的伺服器。在開發Rust程式的時候,也可以利用WHOIS來做對外連線的檢查。



WHOIS Rust

「WHOIS Rust」是筆者開發的套件,受到「whois」這個Node.JS套件的啟發,採用了「servers.json」作為WHOIS的伺服器查詢清單,可以針對IP或是不同的網域名稱自動或是手動選擇要查詢的WHOIS伺服器,並且也支援WHOIS伺服器的轉介(referral)。

Crates.io

https://crates.io/crates/whois-rust

Cargo.toml

whois-rust = "*"

使用方法

建立「servers.json」

以下是一個簡單的「servers.json」範例:

當查詢的字串是IP的時候,套件會自動選擇「whois.arin.net」這個WHOIS伺服器來查詢。當查詢的字串結尾是「magiclen.org」時,套件會自動選擇「whois.magiclen.org」這個WHOIS伺服器來查詢。當查詢的字串結尾是「org」時,套件會自動選擇「whois.pir.org」這個WHOIS伺服器來查詢。當查詢的字串結尾沒有明確地被列在「servers.json」中時,就會用「whois.ripe.net」這個WHOIS伺服器來查詢。

完整標準的「servers.json」WHOIS伺服器清單,可以從「whois」這個Node.JS套件的Github Repository中取得:

https://github.com/FurqanSoftware/node-whois

「servers.json」中,WHOIS伺服器的值可以是一個字串,也可以是一個JSON物件。如果是字串的話,預設的查詢字串為「$addr\r\n」,「$addr」為查詢時目標位址會被代入的變數。如果是JSON物件的話,就可以利用「query」欄位來修改查詢字串的格式。WHOIS伺服器預設的連接埠為43,如果要修改的話,直接在WHOIS伺服器的Host字串中使用「域名或IP:連接埠」的格式即可。

讀取「servers.json」

建立好「servers.json」,可以利用「whois_rust」這個crate所提供的「from_path」或是「from_string」函數來讀取,並建立出「WhoIs」結構實體。

「from_path」可以從檔案讀取「servers.json」的資料,例如:

「from_string」可以從記憶體讀取「servers.json」的資料,建議搭配「include_str」巨集一同使用,例如:

查詢

「whois_rust」這個crate中有一個「WhoIsLookupOptions」結構體,要進行WHOIS查詢前,必須要建立出「WhoIsLookupOptions」的結構實體。「WhoIsLookupOptions」結構體提供了「from_domain」、「from_ipv4」、「from_ipv6」、「from_string」關聯函數,可以快速建立出已包含查詢目標的「WhoIsLookupOptions」結構實體。

一般來說,「WhoIsLookupOptions」結構實體一旦建立出來就可以被使用了,但是如果您有特殊需求,想要手動指定查詢時使用的WHOIS伺服器的話,可以修改其「server」欄位。如果要修改(預設是2)WHOIS伺服器的轉介次數,可以修改其「follow」欄位。如果要修改(預設是60000毫秒,也就是一分鐘)WHOIS伺服器的逾時時間,可以修改其「timeout」欄位。

使用「WhoIs」結構實體提供的「lookup」方法,搭配建立好的「WhoIsLookupOptions」結構實體,即可進行查詢,舉例來說:

因為WHOIS是直接給人類使用,進行查詢與查看結果的服務,因此查詢結果並沒有規範太多的格式,以致於沒有一個通用的方法將結果轉成特定的資料結構來儲存。因此「WhoIs」結構實體提供的「lookup」方法,會原封不動地拿到WHOIS伺服器的回傳結果。