Linux

為什麼我們需要一個 ip6tables 規則才能使 DHCP6 工作?(相比之下,IPv4 不需要任何)

  • June 17, 2020

為什麼我們需要 DHCP6 的 ip6tables 規則?(相比之下,IPv4 不需要)


這是我編寫的最小 IPv4 規則,您看不到特殊的 DHCPv4(維基百科)規則

IPv4:iptables --list-rules INPUT

-P INPUT DROP
-A INPUT -i lo -m comment --comment loopback -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -m comment --comment traffic4 -j ACCEPT

這是我編寫的最小 IPv6 規則,您會看到一個特殊的 DHCPv6(維基百科)規則

IPv6:ip6tables --list-rules INPUT

-P INPUT DROP
-A INPUT -i lo -m comment --comment loopback -j ACCEPT
-A INPUT -p ipv6-icmp -m limit --limit 10/sec --limit-burst 30 -m comment --comment icmp6 -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -m comment --comment traffic6 -j ACCEPT
-A INPUT -d fe80::/64 -p udp -m conntrack --ctstate NEW -m udp --dport 546 -m comment --comment dhcp6 -j ACCEPT

問題

我想了解為什麼 IPv6 需要特殊規則才能在 Linux 下使用 DHCPv6 工作ip6tables,而不是 IPv4 ( iptables),DHCPv4 工作不需要規則?

在 DHCPv4 中,初始發現/提供/請求/確認交換使用廣播地址發生,並且由客戶端發起,因此iptables連接跟踪在客戶端上跟踪它沒有問題。任何後續續訂都可能是單播的,但它們是由客戶端發起的,因此跟踪它們也沒有問題。並且因為 DHCPv4 客戶端需要使用通常不允許的源 IP 地址 0.0.0.0,所以它必須使用原始套接字進行交換,並且iptables無論如何都會繞過很多。

在 IPv6 中沒有廣播,因此客戶端將多播數據包發送到“範圍內的所有 DHCPv6 伺服器和中繼代理”地址。但是伺服器可能會向多播請求發送單播響應,因此客戶端請求和伺服器響應之間的關聯不像 DHCPv4 那樣簡單明了。

此外,DHCPv6 不需要原始套接字,因為在 IPv6 中,預設情況下每個介面都會有一個鏈路本地 IPv6 地址,它可以用作 DHCPv6 多播的源地址。這允許完全控制 DHCPv6 交換,iptables因為它基本上只使用正常的 UDP + IPv6 設施。

此外,DHCPv6 伺服器能夠要求客戶端繼續偵聽 Reconfigure 消息。如果伺服器已在初始 DHCPv6 交換中協商了該選項,則伺服器可以啟動DHCPv6 重新配置。因為重新配置從伺服器發送到客戶端的數據包開始,此時將沒有建立連接(在 conntrack 意義上),並且客戶端需要明確的 iptables 規則來接受入站重新配置消息。

引用自:https://unix.stackexchange.com/questions/593357