1. Disable IPv6
2. 参照IPv4生成IPv6配置文件
	2.1 对比表
	2.2 行描述
	2.3 补充raw表
3. 保存规则并启用服务

 

摘录自: https://wiki.archlinux.org/title/Simple_stateful_firewall#IPv6

1. Disable IPv6

如果不使用IPv6,则可以考虑将其禁用,否则请按照以下步骤启用IPv6防火墙规则。
https://wiki.archlinux.org/title/IPv6#Disable_IPv6
https://wiki.archlinux.org/title/Disabling_IPv6

2. 参照IPv4生成IPv6配置文件

复制此示例中使用的IPv4规则作为基础,并将所有IP从IPv4格式更改为IPv6格式:
$ sudo cp /etc/iptables/iptables.rules /etc/iptables/ip6tables.rules

2.1 对比表

L4 $ cat /etc/iptables/iptables.rules 描述 L6 $ cat /etc/iptables/ip6tables.rules
  *filter     *filter
  :INPUT DROP [0:0] 丢弃所有入站   :INPUT DROP [0:0]
  :FORWARD DROP [0:0] 丢弃所有转发   :FORWARD DROP [0:0]
  :OUTPUT ACCEPT [0:0] 允许本地出站, 信任局域网   :OUTPUT ACCEPT [0:0]
  :TCP - [0:0] TCP端口的自定义链   :TCP - [0:0]
  :UDP - [0:0] UDP端口的自定义链   :UDP - [0:0]
1 -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT 允许已连接及相关通讯 1 -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
2 -A INPUT -i lo -j ACCEPT 允许本地环回 2 -A INPUT -i lo -j ACCEPT
3 -A INPUT -m conntrack --ctstate INVALID -j DROP 丢掉失效包... 3 -A INPUT -m conntrack --ctstate INVALID -j DROP
4 -A INPUT -p icmp -m icmp --icmp-type 8 -m conntrack --ctstate NEW -j ACCEPT 仅允许ping; || 允许ICMPv6流量 4 -A INPUT -s fe80::/10 -p ipv6-icmp -j ACCEPT
    || 允许DHCPv6 5 -A INPUT -p udp -m udp --sport 547 --dport 546 -j ACCEPT
5 -A INPUT -p udp -m conntrack --ctstate NEW -j UDP 仅允许新的UDP请求. 6 -A INPUT -p udp -m conntrack --ctstate NEW -j UDP
6 -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j TCP 仅允许新的TCP请求. 7 -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j TCP
7 -A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable 驳回udp: icmp不可达 || ICMPv6码 8 -A INPUT -p udp -j REJECT --reject-with icmp6-adm-prohibited
8 -A INPUT -p tcp -j REJECT --reject-with tcp-reset 驳回tcp 9 -A INPUT -p tcp -j REJECT --reject-with tcp-reset
9 -A INPUT -j REJECT --reject-with icmp-proto-unreachable 驳回:icmp不可达 || ICMPv6码 10 -A INPUT -j REJECT --reject-with icmp6-adm-prohibited
    || … 11 -A INPUT -p ipv6-icmp -m icmp6 --icmpv6-type 128 -m conntrack --ctstate NEW -j ACCEPT
  COMMIT     COMMIT

相同的行(IPv4 = IPv6)为绿色; 不同的行用橙色描述. 下面是不同的行的描述。

2.2 行描述

- IPv6第(8, 10)行, 对应IPv4版本的第(7, 9)行
ICMP协议已在IPv6中进行了更新,取代了与IPv4一起使用的ICMP协议。拒绝错误返回代码--reject-with icmp-port-unreachable和--reject-with icmp-proto-unreachable必须转换到的ICMPv6码。
RFC 4443中列出了可用的ICMPv6错误代码,该代码指定应使用被防火墙规则阻止的连接尝试--reject-with icmp6-adm-prohibited。这样做基本上可以通知远程系统该连接已被防火墙而不是侦听服务拒绝。
如果最好不要明确告知防火墙过滤器的存在,则也可以在没有以下消息的情况下拒绝该数据包:
 -A INPUT -j REJECT
上面的代码将拒绝,默认返回错误为--reject-with icmp6-port-unreachable。但是,您应该注意,识别防火墙是端口扫描应用程序的基本功能,并且大多数人都会识别它。
 
- IPv6第(11)行, 确保将协议和扩展名更改为适用于关于所有新的传入ICMP回显请求(ping)的规则的IPv6:
$ sudo ip6tables -A INPUT -p ipv6-icmp --icmpv6-type 128 -m conntrack --ctstate NEW -j ACCEPT
 
- IPv6第(4)行, Netfilter conntrack似乎没有跟踪ICMPv6邻居发现协议(ARP的IPv6等效协议),因此我们需要允许ICMPv6流量,而不管所有直接连接的子网的状态如何。在放置在--ctstate INVALID之后,但在任何其他DROP或REJECT目标之前,应插入以下内容,以及每个直接连接的子网的对应行:
$ sudo ip6tables -A INPUT -s fe80::/10 -p ipv6-icmp -j ACCEPT

- IPv6第(5)行
, 如果要启用DHCPv6,则需要接受UDP端口546上的传入连接:
$ sudo ip6tables -A INPUT -p udp --sport 547 --dport 546 -j ACCEPT

2.3 补充raw表

由于没有针对IPv6的内核反向路径过滤器,因此您可能需要在ip6tables中启用以下内容:
$ sudo ip6tables -t raw -A PREROUTING -m rpfilter -j ACCEPT
$ sudo ip6tables -t raw -A PREROUTING -j DROP

3. 保存规则并启用服务

现在,规则集已完成,应将其保存到文件中,以便可以在每次引导时加载它们。
$ sudo ip6tables-save -f /etc/iptables/ip6tables.rules
$ sudo ip6tables -nvL --line-numbers

最后别忘了启用[enable]并启动[start] iptables.service和ip6tables.service。检查服务的状态[status],以确保正确加载了规则。
$ sudo systemctl status ip6tables.service