假设我现在在 IPv4 上有以下配置:
我的路由器(Linux 机器)通过 eth0 连接到互联网,通过 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。)
答案1
扩展@joseph-sible-reinstate-monica 的评论,您可以使用:
-A FORWARD -d 2001::1122:3344:aabb:ccdd/ffff::ffff:ffff:ffff:ffff -j ACCEPT
(是的,对于这种情况,您可以使用具有不连续位的网络掩码。
答案2
虽然没有专门的选项,但你可以使用通用u32
iptables 模块(请参阅iptables-扩展)仅匹配接口 ID 部分(始终从 IP 标头的第 32 个字节开始):
-A FORWARD -m u32 --u32 "32 = 0x11223344 && 36 = 0xAABBCCDD" -j ACCEPT
这将匹配以 结尾的任何目标地址:1122:3344:aabb:ccdd
。
在 IPv6 标头中,源地址从字节 8 开始(网络为 8,接口为 16);目标地址为 24(网络为 24,接口为 32)。您还可以使用按位运算来实现 CIDR 掩码匹配之类的功能u32
。