Debian ip6tables 为 IPv6 设置的规则

use*_*499 6 debian iptables ipv6

我正在 Debian Squeeze 上为 ipv6 设置防火墙。它是一个网络服务器,所以我认为 ipv6 需要向世界开放的唯一端口是 80。

这就是我所拥有的:

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
:in-new - [0:0]
-P INPUT DROP
-P OUTPUT DROP
-P FORWARD DROP
-A INPUT  -i lo -s ::1/128 -j ACCEPT
-A OUTPUT -o lo -d ::1/128 -j ACCEPT
-A INPUT -s fe80::/10 -j ACCEPT
-A INPUT -m rt --rt-type 0 -j DROP
-A OUTPUT -m rt --rt-type 0 -j DROP
-A FORWARD -m rt --rt-type 0 -j DROP

-A INPUT -p tcp ! --syn -m state --state NEW -j DROP

-A INPUT -m state --state INVALID -j DROP

-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
-A INPUT -p tcp -m tcp --tcp-flags SYN,FIN SYN,FIN          -j DROP
-A INPUT -p tcp -m tcp --tcp-flags SYN,RST SYN,RST          -j DROP
-A INPUT -p tcp -m tcp --tcp-flags FIN,RST FIN,RST          -j DROP
-A INPUT -p tcp -m tcp --tcp-flags ACK,FIN FIN              -j DROP
-A INPUT -p tcp -m tcp --tcp-flags ACK,URG URG              -j DROP

-A INPUT -d ff02::1 -j REJECT

-A INPUT  -p tcp -m state --state ESTABLISHED  -j ACCEPT
-A OUTPUT -p tcp -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT  -p udp -m state --state ESTABLISHED  -j ACCEPT
-A OUTPUT -p udp -m state --state NEW,ESTABLISHED -j ACCEPT

-A INPUT    -p IPv6-icmp -j ACCEPT
-I OUTPUT   -p IPv6-icmp -j ACCEPT
-I FORWARD -p IPv6-icmp -j ACCEPT

-A INPUT -p tcp -m tcp --dport 80 --tcp-flags SYN,RST,ACK SYN -m state --state NEW -j ACCEPT
-A INPUT    -j LOG --log-level 4 --log-prefix "IPT_INPUT: "

-A INPUT    -j DROP
-A FORWARD -j LOG --log-level 4 --log-prefix "IPT_FORWARD: "
-A FORWARD -j DROP
-A OUTPUT   -j LOG --log-level 4 --log-prefix "IPT_OUTPUT: "
-A OUTPUT   -j DROP

COMMIT
Run Code Online (Sandbox Code Playgroud)

我在 inernet 上的某个地方找到了它并对其进行了一些更改,但是当我尝试恢复它时,它给出了以下错误:

sudo ip6tables-restore < /etc/ip6tables.firewall.rules
ip6tables-restore: line 47 failed
Run Code Online (Sandbox Code Playgroud)

知道如何设置我的 ip6tables 以便它可以工作吗?

谢谢你。

Mic*_*ton 25

我不知道你从哪里得到了那个可憎的东西,但你能做的最好的事情就是删除它并从头开始。它的主要问题是它不必要地复杂且难以理解,即使它可能有效(而且我无法确定是否阅读它,所以我当然不会对其进行测试)。

防火墙应该尽可能简单:只接受你需要的,拒绝其他一切。遵循这一点,您将不需要任何复杂且难以理解的规则。

因此,让我们来看看实时运行的 IPv6 iptables 防火墙。我刚刚从我的一台实时服务器上撤下了这个:

# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
Run Code Online (Sandbox Code Playgroud)

我们将表的默认策略设置为 ACCEPT;流量实际上会被每个表中的规则丢弃。这给了我们更大的灵活性。特别是,除非您打算阻止传出连接,否则 OUTPUT 表应始终设置为 ACCEPT 的默认策略。

-A INPUT -m rt --rt-type 0 --rt-segsleft 0 -j DROP
-A FORWARD -m rt --rt-type 0 --rt-segsleft 0 -j DROP
-A OUTPUT -m rt --rt-type 0 --rt-segsleft 0 -j DROP
Run Code Online (Sandbox Code Playgroud)

这修复了IPv6 路由标头类型 0 安全问题。它应该出现在任何其他规则之前。(请注意,自2.6.21.1以来的现代内核自动丢弃此流量并且不需要这些规则。如果您有以前的内核,请联系您的分发供应商以获取CVE-2007-2242的补丁。) RH0 的显式规则已过时多年并且在现代 Linux 系统上不再需要。

-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

这接受我们已经通过其他规则接受的任何现有连接的持续流量。

-A INPUT -p ipv6-icmp -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

我们接受所有 ICMP 数据包。与 IPv4 不同,阻止 ICMPv6 流量不是一个好主意,因为 IPv6 更加依赖它。

-A INPUT -i lo -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

我们接受来自/到本地接口的所有流量。

-A INPUT -m state --state NEW -m udp -p udp --dport 546 -d fe80::/64 -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

我们接受 DHCPv6 流量。如果您使用无状态自动配置,或静态配置您的机器,这不是必需的。

-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

它们接受 ssh 和 http 的新连接。

-A INPUT -j REJECT --reject-with icmp6-port-unreachable
-A FORWARD -j REJECT --reject-with icmp6-port-unreachable
Run Code Online (Sandbox Code Playgroud)

在我们的规则结束时,我们拒绝所有与规则不匹配的流量,使用“端口不可达”。这导致另一端出现标准的“连接被拒绝”消息,并有效地隐藏了我们有防火墙的事实。诸如nmap 之类的工具会报告我们所有的端口都被“关闭”而不是“过滤”,并且很难确定我们甚至有防火墙。

COMMIT
Run Code Online (Sandbox Code Playgroud)

这将提交所有表条目。


use*_*499 1

这是 OpenVZ 和 ipv6 表的问题。使用 CSF 防火墙,您就可以毫无问题地为 ipv6 设置防火墙。