![為什麼我的 ACL 需要以這種方式設定才能授予我想要的存取權限?](https://rvso.com/image/1692551/%E7%82%BA%E4%BB%80%E9%BA%BC%E6%88%91%E7%9A%84%20ACL%20%E9%9C%80%E8%A6%81%E4%BB%A5%E9%80%99%E7%A8%AE%E6%96%B9%E5%BC%8F%E8%A8%AD%E5%AE%9A%E6%89%8D%E8%83%BD%E6%8E%88%E4%BA%88%E6%88%91%E6%83%B3%E8%A6%81%E7%9A%84%E5%AD%98%E5%8F%96%E6%AC%8A%E9%99%90%EF%BC%9F.png)
我的 ER605 路由器有一個輔助網絡,用於隔離連接的設備(樹莓派)。我用它來隔離和掃描來自可疑來源的傳入檔案(例如我姻親的電腦永遠受到惡意軟體的影響)。我需要能夠存取 pi 並將掃描的檔案滲透到我的主網路。我計劃使用 VNC 進行訪問,並透過 SMB 共享將確定的文件直接放在我的 QNAP NAS 上。
ACL 規則 5 阻止從隔離網路到我的主網路的通訊。為了將VNC 從我的主網路連接到我的隔離pi,我最初添加了規則4,但該規則還不夠(在線閱讀建議我需要一個用於返回訊息的ACL),因此我添加了引用VNC 服務的規則3 的版本,而且還是失敗了。一時興起,我嘗試創建 VNC_duplex 服務定義,該定義交換源端口和目標端口,並將規則 #3 從 VNC 服務更改為 VNC 雙工,並且 viola VNC 工作了!
我很高興這能起作用,但我不確定為什麼,或者它是否安全。我是否正確理解 ACL 規則 3 允許惡意腳本從樹莓派上的任何連接埠向我的主網路上任何裝置上的連接埠 5900 發送訊息?理解這一點的語義方式是什麼?
我的網路和 VLAN:
我還設定了一些 IP 範圍來描述我想要分段/授予存取權限的網路區域:
我的服務類型(最後四種是我自訂輸入的):
最後是我的 ACL:
答案1
網上閱讀建議我需要一個ACL來回傳訊息),所以我添加了引用VNC服務的規則3的版本,但仍然失敗。一時興起,我嘗試創建 VNC_duplex 服務定義,該定義交換源端口和目標端口,並將規則 #3 從 VNC 服務更改為 VNC 雙工,並且 viola VNC 工作了!
當 Pi 向您的電腦發送回應時,Pi 是源。
“返回”封包不僅將 Pi 的 IP 位址作為“來源 IP”,而且還具有相應的連接埠號在 Pi 一側作為“來源連接埠”。
Connection: 192.168.0.PC:54321 <--> 192.168.2.10:5900
Packets from PC: src = 192.168.0.PC:54321, dst = 192.168.2.10:5900
Packets from Pi: src = 192.168.2.10:5900, dst = 192.168.0.PC:54321
防火牆中的所有原始服務範本僅針對「轉送」方向進行定義;例如,「VNC」範本匹配 5900 作為目標連接埠 - 正如所解釋的,它僅匹配以 VNC 伺服器作為目標的資料包,而不匹配「返回」資料包。
我是否正確理解 ACL 規則 3 允許惡意腳本從樹莓派上的任何連接埠向我的主網路上任何裝置上的連接埠 5900 發送訊息?
不。從連接埠 5900在樹莓派上到任何港口在您的主要網路上。 (“來源連接埠 = 5900”中的“來源”真正意思資料包的來源。
由於連接的來源連接埠能任意選擇(如果需要),這意味著主網路對任何人開放知道關於此例外的存在;他們所需要做的就是要求作業系統將連接綁定到本地連接埠 5900。不了解此異常不太可能偶然發現它。
理解這一點的語意方式是什麼?
「源」真正的意思是個人的源頭包包,而不是整個連接。 (實際上,連接埠幾乎可以被視為封包「傳輸層」位址的一部分,而且實際上在其他幾個非 IP 協定中,它實際上是位址的一部分。)
每個連接埠都與特定端點關聯,就像每個 IP 位址與特定端點關聯一樣 – 如果您連接到 Pi,您不會期望來自 Pi 的「返回」封包仍會顯示Pi 的IP 位址作為「目的地”,連接埠號碼也是如此。
能否使其更加安全?
通常的方法是完全避免此類自反 ACL 並使用有狀態的防火牆。大多數路由器都能夠追蹤活動連線(「狀態」或「流」)——它們有點像必須如果它們實現典型的1:many NAT,則執行此操作- 並且防火牆過濾器可能有一個特殊規則,允許與「已建立」連接相對應的任何資料包(如iptables/nftables),或隱式允許此類別資料包(如pf)。
ER603 似乎獲得了對有狀態 ACL 的支持在韌體2.1中。 (不過,人們似乎說這不起作用。)
如果你必須使用無狀態 ACL,那麼替代方法是僅允許具有以下條件的「返回」封包TCP“ACK”標誌放。 TCP連線的初始資料包絕不已設定此標誌,而所有其他資料包均已設定;擁有一條允許任何連接埠上的 TCP ACK 封包的規則就足夠了。
當然,這種方法僅適用於 TCP - 如果沒有狀態跟踪,您無法對 UDP 做太多事情,除非希望沒有人發現您的自反 ACL 造成的漏洞。
您還應該有另一個允許 ICMP「返回」封包的規則(例如 Echo Reply 和各種 ICMP「錯誤」訊息 –至少需要允許“需要碎片”,但最好也應該允許其他錯誤,例如“無法到達”。