即使沒有 NAT,IPv6 中仍然需要 UDP 打孔?
背景(跳過問題)
IPv4 需要 NAT 來保護地址。NAT 的防火牆特性也有利於安全。IPv4 NAT 防火牆規則是“阻止傳入數據包,除非在最後 X 秒內
remote-address:port -> local-address:port
發送傳出數據包”。local-address:port -> remote-address:port
對於點對點 UDP 應用程序,這需要引入伺服器來進行 NAT 打孔。要
Client
連接到Server
(都在防火牆 NAT 之後FW
),我們需要執行以下步驟:periodic keep-alive Introducer <------> Client FW FW Server ------------------------------------------ request introduction -------> Introducer Client FW FW Server --------------------->X request connection ------------------------------------------ notify introduction [Client address:port] Introducer -------> Client FW FW Server ------------------------------------------ Client FW FW Server <--------------------------- hello ------------------------------------------ Client FW FW Server ---------------------------> request connection ------------------------------------------ Client FW FW Server <--------------------------- accept connection ------------------------------------------ Client FW FW Server <--------------------------> periodic keep-alive
IPv6 不需要 NAT,但似乎可能為家庭使用者配置了類似的防火牆規則(請參閱下面的參考資料)。
我的問題:
Q1:如果 IPv6 防火牆規則就像 IPv4 NAT 防火牆規則(只是沒有地址轉換位),那麼我認為點對點應用程序仍然需要完全相同的 UDP 打孔過程是否正確?
Q2:大多數家庭 IPv6 路由器的預設/開箱即用防火牆規則是否與頂部總結的 IPv4 NAT 防火牆規則一樣?如果有不同,那又如何?是否有預設的接受所有傳入數據包行為?
參考
這些支持 IPv6 家庭路由器應該/可能具有類似 NAT 的防火牆規則的觀點:
使用 NAT 獲得的一大安全收益是它迫使您進入預設拒絕配置。為了通過它獲得任何服務,您必須明確地打孔。… 正確配置的防火牆提供與 NAT 網關完全相同的服務。
http://www.brynosaurus.com/pub/net/p2pnat/
預設情況下,IPv6 防火牆通常仍會阻止未經請求的傳入流量,這使得打孔甚至對 IPv6 應用程序也很有用。
(以下連結被禁用,因為我只有足夠的積分來製作 2)
http://tools.ietf.org/html/rfc5128
甚至未來的“純 IPv6 世界”可能仍然包括防火牆,它採用類似的 NAT 過濾行為,但沒有地址轉換。過濾行為會干擾 P2P 應用程序的功能。出於這個原因,使用本文件中描述的技術進行 NAT 穿越的 IPv6 應用程序也可以與某些具有類似於 NAT 的過濾行為的防火牆一起使用。
http://stackoverflow.com/questions/4647633/nat-traversal-and-ipv6
防火牆不會很快消失,請參閱
http://tools.ietf.org/html/draft-ietf-v6ops-cpe-simple-security-16
“推薦的客戶端設備中用於提供住宅 IPv6 網際網路服務的簡單安全功能”。…您可以預期,無處不在的防火牆將繼續干擾應用程序協議,並要求您執行 IPv4/NAT 所需的所有相同基本遍歷方法,以便在應用程序路徑的中間盒中維護狀態記錄。
http://news.ycombinator.com/item?id=8229327
人們一直在說,您應該使用帶有防火牆的本地 IPv6 而不是 NAT hack,以獲得相同或更好的級別或保護。但是有狀態的 IPv6 防火牆不會引入與 NAT 相同的問題嗎?難道我還必須使用keepalive數據包或PCP之類的協議來實際使用P2P嗎?
我也在焦急地等待 IPv6 的興起,但我猜想——在一個理智的世界裡——消費者路由器仍將預設使用 IPv6 的狀態防火牆,因此需要繼續進行打孔。:/
但是,這些似乎表明 IPv6 不會有任何類似 NAT 的防火牆規則,或者打孔過程是不必要的:
http://www.raknet.net/raknet/manual/ipv6support.html
僅使用 IPV6 時不需要 NAT 穿透。只要您知道系統的 IP 地址,即使該系統位於路由器後面,您也可以直接連接到該系統。
http://www.zerotier.com/blog/?p=226
這是一個針對基本限制的醜陋解決方法,並且越早被 IPv6 淘汰,我們就越早可以開始真正部署全新一代 Internet 協議。… 因為 NAT 幾乎總是有狀態的,所以需要頻繁的 keepalive 數據包來保持所有連接打開。…如果您不是每 120 秒發送一次數據包(對於典型的 NAT),您的連接將被遺忘並重置。使用 SSH 的 NAT 後面的使用者在嘗試讓 SSH 會話長時間打開時可能會發現這一點,並且 SSH(與大多數協議一樣)有一個協議保持活動選項可作為一種解決方法。
在回答問題之前,我想先談談其中的一些假設。
NAT 的防火牆特性也有利於安全。
這是經常重複的,但根本不是真的;見下文。
IPv4 NAT 防火牆規則是“阻止傳入數據包遠端地址:埠 -> 本地地址:埠,除非在最後 X 秒內發送傳出數據包本地地址:埠 -> 遠端地址:埠”。
這些不是 NAT 規則,而是有狀態規則。有狀態規則比之前的舊式無狀態規則更安全,因為它們本質上是自適應的;也就是說,防火牆對出站流量的仔細研究允許它對入站流量做出比僅基於埠/地址的規則所允許的更精細的判斷。
NAT 防火牆確實是隱式有狀態的,但重要的是要認識到有狀態是你所追求的,而不是 NAT,因為 NAT 在 ipv6 社區的某些角落的名聲很差,而你也有看到在 ipv6 中實施它的阻力很大。
您描述的 UDP“介紹者”過程不僅限於 NAT 場景,還適用於服務不依賴於單個眾所周知的埠號的情況。RPC 是典型的例子,服務綁定到(半)隨機埠,然後使用埠映射器註冊該埠及其名稱,該埠映射器使用眾所周知的埠(111/TCP 和 111/UDP)。希望連接的客戶聯繫埠映射器以找出他們所需的服務今天在哪個埠上執行,然後啟動到該埠的連接。這正是您的圖表所顯示的內容,並且每天在世界各地執行 NFS 的平面(非 NATted)網路上發生數百萬次。
至於您的問題,問題(1)應該真正閱讀“如果我的 ipv6 防火牆配置為拒絕沒有匹配狀態的入站 UDP 流量,我的 UDP 客戶端是否仍需要啟動與外部服務的所有任意連接”。不幸的是,答案是“視情況而定”。
RELATED
有狀態的擴展,例如iptables
確實允許防火牆允許沒有簡單匹配狀態的流量,基於預先存在的連接在應用程序層要求這個 - 主動模式 FTP 是典型的例子 - 但它需要一個核心模組來理解相關協議的詳細資訊以及端到端加密的部署使得這種深度數據包檢查變得越來越困難。因此,如果沒有這樣的解決方法,問題 1 的答案是yes。順便說一下,對於沒有眾所周知的埠號的 TCP 服務也是如此。至於問題 (2),對 SOHO 設備的詳盡調查可能超出了 ServerFault 的職權範圍和能力,但我多年來還沒有看到帶有預設開放配置的防火牆設備 - v4或v6 。