Debian ip6tables 为 IPv6 设置规则

Debian ip6tables 为 IPv6 设置规则

我正在 Debian Squeeze 上为 ipv6 设置防火墙。它是一个 Web 服务器,所以我认为 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

我在互联网上的某个地方找到了它并做了一些修改,但是当我尝试恢复它时出现以下错误:

sudo ip6tables-restore < /etc/ip6tables.firewall.rules
ip6tables-restore: line 47 failed

您知道如何设置 ip6tables 以使其正常工作吗?

谢谢。

答案1

我不知道你从哪里得到这个令人厌恶的东西,但你能做的最好的事情就是删除它并从头开始。它的主要问题是它不必要地复杂且难以理解,即使它可能有用(而且我无法从阅读中确定,所以我肯定不会测试它)。

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

那么让我们来看看一个实时运行的 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]

我们将表的默认策略设置为 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

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

-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

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

-A INPUT -p ipv6-icmp -j ACCEPT

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

-A INPUT -i lo -j ACCEPT

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

-A INPUT -m state --state NEW -m udp -p udp --dport 546 -d fe80::/64 -j ACCEPT

我们接受 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

这些接受 ssh 和 http 的新连接。

-A INPUT -j REJECT --reject-with icmp6-port-unreachable
-A FORWARD -j REJECT --reject-with icmp6-port-unreachable

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

COMMIT

这将提交所有表条目。

答案2

我可以毫无问题地重新加载您的 ip6tables-dump。我建议您首先尝试使用 ip6tables 命令创建防火墙,然后转储它。这样调试起来可能会容易得多。

你可以从干净的版本开始 - 如下所示的firewall.sh:

#!/bin/bash
ip6tables -P INPUT DROP
ip6tables -P OUTPUT DROP
ip6tables -P FORWARD DROP

ip6tables -F

ip6tables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
ip6tables -A INPUT  -m state --state RELATED,ESTABLISHED -j ACCEPT

请小心 - 这将阻止任何 IPv6 通信。希望您有控制台/带外/IPv4 通信通道。如果没有,至少添加:

ip6tables -A INPUT  -p tcp --dport 22 -j ACCEPT

一旦你对防火墙脚本感到满意,你就可以运行ip6tables-save > 你的规则

答案3

我遇到了同样的提交失败问题。我使用的是 Debian Wheezy,但我怀疑问题是一样的。似乎 Debian 的基本安装(至少我正在使用的那个)不支持 ipv6 的连接跟踪。这导致尝试跟踪连接状态(-m state...)的行失败,尽管 ip6tables-restore 很遗憾没有礼貌地告诉您这一点。好消息是,这个问题可以毫不费力地解决:

# apt-get install conntrack
# reboot

我确信可以绕过重启,但我不确定需要重启哪些服务才能使它工作,所以我只是重启它们。之后,这里发布的使用状态连接跟踪的规则集似乎可以正常工作。

答案4

这是 OpenVZ 和 ipv6 表的问题。改用 CSF 防火墙,设置 ipv6 防火墙就不会有问题了。

相关内容