urlacl 和 Windows 防火牆
通常我將 Linux 伺服器用於我的應用程序。因此,我對 Windows Servers 的防火牆系統相當陌生。
我有一個需要充當 HTTP 伺服器的 C# 應用程序。有多種方法可以通過不同的抽象級別實現這一點:當然,有一個
Socket
庫可以提供非常基本的功能。對於 TCP 流量,還有一個TcpClient
. 兩者都偵聽特定埠,並且需要在 Windows 防火牆中定義的“入站規則”才能從另一台機器訪問(當您只需要從您的機器訪問它時不需要規則)。然後是
HttpListener
. 它不是基於每個埠操作,而是使用 URI 前綴來匹配請求。例如,前綴“http://*:80/”將處理所有埠 80 的 http 流量。真正讓我
HttpListener
不安的是,在 Windows 防火牆中沒有任何規則,但需要 urlacl 中的條目:netsh http add urlacl url=http://*:80/ user=DOMAIN\user
(這是一個 url 命名空間保留)
實現 http 伺服器的所有三種方法都同樣有用。不同之處在於使用 HttpListener 時需要的程式碼要少得多。
我的問題是:為什麼有 url 命名空間保留的概念,但是沒有註冊的 url 可以被伺服器監聽。為什麼註冊的 url 可以繞過防火牆規則?為什麼一開始會有這樣的系統?
AFAIK,net http 是顯示/編輯 http.sys 的配置,這是 IIS 的核心模式驅動程序部分,它與 Windows 啟動伺服器 (WAS) 一起也可以由非 IIS 應用程序使用。他們只需註冊他們的 URL,以便 http.sys/WAS 可以將請求路由到正確的客戶端並避免衝突。
如果選擇自己實現低級埠監聽,則不是使用http.sys,也不必向netsh註冊url,但還是要注意不要和其他程序發生衝突。
.NET
httpListener
類也使用 http.sys至於防火牆規則,我看不到註冊的 URL 不需要防火牆規則。您的範例
http://*:80/
包含在World Wide Web Services
文件牆規則中。