我的防火墙规则nftables.conf
只需运行flush ruleset
即可include
。我从 Arch Wiki 复制了这些规则。因此,包含的内容firewall.rules
包括:
# An iptables-like firewall
table firewall {
chain incoming {
type filter hook input priority 0;
# established/related connections
ct state established,related accept
# invalid connections
ct state invalid drop
# loopback interface
iifname lo accept
# icmp
icmp type echo-request accept
# open tcp ports
tcp dport {http, https, ...} accept
# open udp ports
udp dport {...} accept
# drop everything else
drop
}
}
table ip6 firewall {
chain incoming {
type filter hook input priority 0;
# established/related connections
ct state established,related accept
# invalid connections
ct state invalid drop
# loopback interface
iifname lo accept
# icmp
icmpv6 type {echo-request,nd-neighbor-solicit,nd-router-solicit,mld-listener-query} accept
# open tcp ports
tcp dport {http, https, ....} accept
# open udp ports
udp dport {...} accept
# drop everything else
drop
}
}
因此,当所有内容都加载后,我无法使用 IPv6,ping6
错误
From ams16s21-in-x0e.1e100.net icmp_seq=1 Destination unreachable: Address unreachable
但是,如果我运行sudo nft flush table ip6 firewall
,ping6
它会立即按预期开始工作。如果我随后重新建立 ip6 防火墙表,IPv6 连接不会立即失败,但等待几分钟后,我发现命令ping6
返回了上述错误。
我的托管服务提供商不提供网络级别的任何 IPv6 自动配置或路由器广告。
以前有人见过类似的事情吗?
答案1
IPv6 连接不会立即失败,但等待几分钟后我发现 ping6 命令返回上述错误。
我猜你破坏了邻居发现。最初一切正常,因为你已经在邻居发现缓存中拥有一些东西,但后来条目超时了。
您似乎允许邻居征求消息,但不允许邻居广告消息。
答案2
您丢弃了太多 ICMPv6 类型。由于 ,大多数错误消息应该被允许进入state established,related
,但您丢弃了邻居通告和路由器通告。试试这个:
icmpv6 type {echo-request,nd-neighbor-solicit,nd-neighbor-advert,nd-router-solicit,
nd-router-advert,mld-listener-query} accept
它将允许未经请求的 NA 和 RA 进入,这可能会解决您的问题。
如果您想确保错误消息也能通过(我没有测试它是否state established,related
适用于所有 ICMPv6 错误消息),那么还要添加以下内容:
icmpv6 type {echo-request,nd-neighbor-solicit,nd-neighbor-advert,nd-router-solicit,
nd-router-advert,mld-listener-query,destination-unreachable,
packet-too-big,time-exceeded,parameter-problem} accept
这不是必要的,但以防万一 :) 丢弃 ICMPv6 错误消息将导致严重延迟甚至阻塞连接,因此最好避免这种情况 :)