为什么我们需要 ip6tables 规则才能使 DHCP6 发挥作用? (相比之下,IPv4 不需要任何)

为什么我们需要 ip6tables 规则才能使 DHCP6 发挥作用? (相比之下,IPv4 不需要任何)

为什么我们需要 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 需要特殊规则才能使 DHCPv6 在 Linux 下工作ip6tables,而不是 IPv4 ( iptables),而 DHCPv4 不需要任何规则即可工作?

答案1

在 DHCPv4 中,初始发现/提供/请求/确认交换使用广播地址进行,并由客户端发起,因此iptables连接跟踪在客户端上跟踪它没有问题。任何后续续订都可能是单播的,但它们是客户端发起的,因此跟踪它们也没有问题。而且由于 DHCPv4 客户端需要使用通常不允许的源 IP 地址 0.0.0.0,因此它必须使用原始套接字进行交换,而这将绕过大部分内容iptables

在 IPv6 中没有广播,因此客户端将多播数据包发送到“范围内的所有 DHCPv6 服务器和中继代理”地址。但服务器可能会发送对多播请求的单播响应,因此客户端请求和服务器响应之间的关联并不像 DHCPv4 那样直接和明显。

此外,DHCPv6 不需要原始套接字,因为在 IPv6 中,每个接口默认都有一个链路本地 IPv6 地址,并且可以用作 DHCPv6 多播的源地址。这允许 DHCPv6 交换完全受控,iptables因为它基本上只使用常规 UDP + IPv6 设施。

此外,DHCPv6 服务器能够要求客户端继续侦听重新配置消息。如果服务器在初始 DHCPv6 交换中协商了该选项,则服务器可能会启动DHCPv6 重新配置。因为重新配置是从服务器向客户端发送数据包开始的,所以此时不​​会建立连接(在 conntrack 意义上),并且客户端需要显式 iptables 规则来接受入站重新配置消息。

相关内容