![IPv6 规则和 ip6table 帮助](https://linux22.com/image/124918/IPv6%20%E8%A7%84%E5%88%99%E5%92%8C%20ip6table%20%E5%B8%AE%E5%8A%A9.png)
现在我正在尝试弄清楚如何在我的服务器上设置一些 IPv6 规则。我的要求是禁止向环回设备和本地 IP 地址(在本例中为链路本地)输入回显请求,并打开端口 22、80 和 443。对于 IPv4 一切都很好,但我似乎 ip6tables 遵循 INPUT 链顺序有问题。这是我现在所拥有的:
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
-A INPUT -p icmpv6 -m icmpv6 --icmpv6-type echo-request -j ACCEPT
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
-A INPUT -j REJECT
-A FORWARD -j REJECT --reject-with icmp6-port-unreachable
-A OUTPUT -p icmpv6 --icmpv6-type echo-request -d ::1/128 -j REJECT --reject-with icmp6-port-unreachable
-A OUTPUT -p icmpv6 --icmpv6-type echo-request -d fe80::/64 -j REJECT --reject-with icmp6-port-unreachable
-A OUTPUT -j ACCEPT
COMMIT
目前我的罪魁祸首是-A INPUT -j REJECT
。我期望它会对链中未列出的所有内容进行隐式拒绝。但这似乎并非如此,并且似乎与具有 IPv4 规则的普通旧 iptables 的行为不同。有人可以告诉我这里的解决方案吗?这是一台 Ubuntu 14.04 服务器
答案1
让我们先看看您的规则试图做什么,看看为什么它们可能不起作用:
-A INPUT -i lo -j ACCEPT
所有到达环回接口的流量都将被处理,包括 ICMPv6 流量。
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
很正常。
-A INPUT -p icmpv6 -m icmpv6 --icmpv6-type echo-request -j ACCEPT
该规则,如所写,将只允许 ping 请求(到任何接口):任何其他 ICMPv6 数据包将被最后的显式 REJECT 拒绝。
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
-A INPUT -j REJECT
-A FORWARD -j REJECT --reject-with icmp6-port-unreachable
很正常。
-A OUTPUT -p icmpv6 --icmpv6-type echo-request -d ::1/128 -j REJECT --reject-with icmp6-port-unreachable
-A OUTPUT -p icmpv6 --icmpv6-type echo-request -d fe80::/64 -j REJECT --reject-with icmp6-port-unreachable
这些规则只会阻止您的主机向本地主机和链接本地网络地址发送 ping(另外,链路本地地址范围是 /10.)
-A OUTPUT -j ACCEPT
很正常。
然而,你说:“我的要求是禁止向环回设备和本地 IP 地址输入回显请求(在这种情况下,链接本地)[...]“。您编写的规则几乎与您想要的要求相反。此外,通常最好将输入过滤器放在输入侧,因为这就是大多数人都会寻找这样的东西,它对所有流量都有效,而不仅仅是您的计算机发送的流量。
我建议按如下方式编写规则链:
-A INPUT -i lo -p icmpv6 -m icmpv6 --icmpv6-type echo-request -j REJECT --reject-with icmp6-port-unreachable
-A INPUT -d fe80::/10 -p icmpv6 -m icmpv6 --icmpv6-type echo-request -j REJECT --reject-with icmp6-port-unreachable
-A INPUT -p icmpv6 -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
-A INPUT -j REJECT
-A FORWARD -j REJECT --reject-with icmp6-port-unreachable
关于重写规则的一些观察:
- 我更喜欢将 REJECT 规则放在 ACCEPT 规则前面,将较窄的过滤器放在较宽的过滤器前面,这样我就不会因为较宽的过滤器允许而意外地允许某些内容通过。这不是一条硬性规定,但它可以帮助我更轻松地想象正在发生的事情。
- 不再需要 OUTPUT 链,因为规则是在 INPUT 链中处理的。
- 尽管您有此要求,但我不确定为什么您要禁止对环回接口进行 ping 操作,因为只有本地计算机可以发送到该接口。不过,这只是一个观察:如果您有特殊需要这样做,那也没关系。