我想在我的互联网连接和本地网络上设置 IPv4/IPv6 双栈。为此,我想更改某些机器上的防火墙,以允许来自互联网的某些应用程序的传入流量,而其他应用程序仅允许来自本地网络的传入流量。为此,我希望能够做到:
ufw allow internet-application
ufw allow from 192.168.0.0/24 to any app lan-application
ufw allow from fe80::/64 to any app lan-application
然而不幸的是,我家路由器的 DNS 不会将本地机器的 AAAA 记录解析为它们的链接本地fe80::/64
地址,而是解析为它们的全局地址(包括根据我的 ISP 告诉我的内容而变化的前缀)。
所以我想,也许我需要设置防火墙,以接受来自网络中所有设备共享的前缀内的任何地址的传入流量?对吗?如果对,我该怎么做?
另一种方法是让我的 DNS 服务器返回fe80::/64
本地主机名的地址,这似乎是不可能的,因为我没有看到任何这样的设置。
答案1
虽然 UFW 可以根据当前收到的前缀动态更新其防火墙规则,但据我所知,它目前没有这样的功能。
在底层 iptables/nftables 层,我相信可以编写 nftables 规则来执行类似“如果 saddr/64 = daddr/64 则接受”的操作而无需动态更新,但 iptables 中不存在这样的东西,据我所知,UFW 使用的是 iptables。
根据 ISP 提供的信息而变化的前缀
在家用路由器中,最普遍接受的解决方案是提供额外的ULA 前缀 ( fdXX:
) 不会改变,并且始终存在,与 WAN 连接无关(不仅仅是在连接断开时)。然后,所有内部 DNS 都会使用 ULA 地址,它们在防火墙规则中的工作方式与 192.168.x 地址非常相似。
(与 IPv4 的区别在于还有一个用于连接其他全局地址的全局地址,即源地址选择而不是NAT。)
另一种方法是让我的 DNS 服务器返回本地主机名的 fe80::/64 地址,但这似乎不可行,因为我没有看到任何相关设置。
一般情况下,您无法将链路本地地址放入 DNS 中,因为查找结果不会包含 Linux 所需的“区域索引”(即接口 ID)。(例如,在大多数非 Windows 系统上连接到链路本地地址时,您必须指定fe80::1%eth0
而不是仅仅fe80::1
。)
(本地解析器(例如 mDNS 的 Avahi)能够返回链接本地结果,因为它们知道 mDNS 响应来自完全相同的接口,并且可以填写相同的索引,但单播 DNS 不再能保证这一点,因此解析器不会尝试猜测。)