允许流量通过防火墙到达动态 IPv6 地址

Jos*_*ica 12 networking firewall ipv6 iptables

假设我现在在 IPv4 上有这个配置:

我的路由器(一个 Linux 机器)在 eth0 上连接到 Internet,在 eth1 上连接到我的 LAN。我想将端口 80 转发到 10.1.2.3。这是我目前的做法:

iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp --dport 80 -j DNAT --to 10.1.2.3 iptables -A FORWARD -m conntrack --ctstate DNAT -j ACCEPT

现在我想在 IPv6 上做同样的事情。假设我的配置与以前相同,但有以下更改:

我的 ISP 通过前缀委托为我的路由器提供了 2001:db8:aaaa::/64 范围。我的路由器在 eth1 上为自己获取 2001:db8:aaaa::1 并将 2001:db8:aaaa::123 提供给我想要打开端口 80 的主机。

在 IPv6 情况下不再需要 NAT,所以我需要的只是允许流量的防火墙规则。这是我能想到的规则:

ip6tables -A FORWARD -i eth0 -d 2001:db8:aaaa::123 -p tcp -m tcp --dport 80 -j ACCEPT

我遇到的问题是我必须将 2001:db8:aaaa::123 硬编码到我的防火墙规则中,而 2001:db8:aaaa:: 前缀可能会随我的 ISP 的突发奇想而改变。在 IPv4 世界中,我必须硬编码的唯一 IP 是内部 IP,所以我知道它永远不会在我的控制下被更改。有什么方法可以允许这样的流量,而不必每次我的 ISP 更改我的委派前缀时都修改规则?(如果 pf 可以做我想做的但 ip6tables 不能,我愿意为此切换到 BSD。)

use*_*686 0

虽然没有专用选项,但您可以使用通用u32iptables 模块(请参阅iptables-extensions)来仅匹配接口 ID 部分(始终从 IP 标头的字节 32 开始):

-A FORWARD -m u32 --u32 "32 = 0x11223344 && 36 = 0xAABBCCDD" -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

这将匹配任何以 结尾的目标地址:1122:3344:aabb:ccdd

在 IPv6 标头中,源地址从字节 8 开始(网络在 8 处,接口在 16 处);目标地址为 24(网络为 24,接口为 32)。您也可以使用按位运算来实现 CIDR 掩码匹配等功能u32

  • 难道我不能只使用语法“-A FORWARD -d ::1122:3344:aabb:ccdd/::ffff:ffff:ffff:ffff -j ACCEPT”吗?我做了一个快速测试,似乎可以与你的解决方案相同。另外,这个解决方案意味着我现在完全忽略网络部分。如果它最终匹配多播或恰好具有相同结尾的私有地址之类的东西,这不会成为问题吗? (4认同)
  • @JosephSible:您仍然可以将其作为答案发布,以便它脱颖而出,并列出其中的任何缺点 - 答案不需要是完美的,这就是为什么有多个答案的空间!我认为对于最常见的情况(例如家庭网络),您的解决方案将工作得很好,因为您肯定会转发比预期更多的流量,但可能不会有任何主机侦听这些额外的 IP。如果此解决方案存在*问题,答案是列出所有问题的好地方,以使每个人受益! (3认同)