对于我的 iptables 配置有什么建议吗?

对于我的 iptables 配置有什么建议吗?

我正在尝试创建一个非常安全的 iptables 配置。旧配置给我带来了一些问题。具体来说,我曾经阻止了更多的 ICMP 并允许一些特定的 ICMP 类型,但这似乎会导致周期性的 DNS 问题。

这个似乎可以正常工作(大部分情况下)。我可以很好地跟踪服务器。我首先在虚拟机中测试这一切。它必须通过 PCI 合规性。

*filter
:INPUT DROP [5:735]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 13 -j DROP
-A INPUT -p icmp -m icmp --icmp-type 14 -j DROP
-A INPUT -p udp -m udp --dport 33200:33500 -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -p icmp -m icmp --icmp-type any -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 25 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 53 -j ACCEPT
-A OUTPUT -p udp -m udp --dport 53 -j ACCEPT
-A OUTPUT -p udp -m udp --dport 33200:33500 -j ACCEPT
COMMIT

上面的配置有什么问题吗?

我使用的是 CentOS 5.6。另外,防止 SSH 端口遭受暴力攻击的最佳方法是什么?(我将把 ssh 更改为随机端口)

答案1

为了防止暴力攻击 SSH,您可能需要限制连接速率。还有类似 fail2ban 的程序可用于将发起暴力攻击的 IP 列入黑名单。

如果你想要一个安全的防火墙,我建议你使用防火墙构建工具来构建防火墙。我使用岸墙其中有大量关于如何针对各种情况构建防火墙规则的文档。对于您的情况,我会考虑从一个接口示例开始,然后从那里开始构建。

阻止 ICMP 时要小心,因为某些代码对于网络操作至关重要。Shorewall 将确保您已启用所需的类型。您可以根据需要选择启用或禁用回显请求。

编辑:有些 ICMP 类型您可能不想允许。但是,您至少需要启用 destination-unreachable(3)、source-quench(4) 和 time-exceeded(11)。对于 ping 和 traceroute,您需要启用 echo-r​​equest(8),可能仅用于传出。

答案2

我知道这已经非常老了。发布此帖只是为了防止将来有人偶然发现它。

我从来不明白为什么有人会想将 OUTPUT 策略设置为 DROP。从安全角度来看,这听起来不错,但在实践中,它比其他任何事情都更令人头疼。因此,OUTPUT DROP 策略没有意义,而且会产生很多不必要的工作。这是我的合理策略:如果我不想发起连接并将数据发送到服务器之外,那么我根本不会运行任何发起不需要的连接并将数据发送到服务器之外的程序!您也不需要这样做才能符合 PCI 合规性。OUTPUT 的默认 DROP 策略更有可能以各种意想不到和令人惊讶的方式导致防火墙设置损坏。所以不要这样做。

“最好的办法”防止对 SSH 进行暴力攻击的最好办法就是根本不使用 SSH。也就是说,如果你真的想锁定一个系统,需要两个(或更多)人亲自在机器旁才能访问它。SSH 很方便。安全的对立面就是方便。如果你想启用 SSH,你可以做一些事情,比如隐藏 SSH 端口(例如温泉或者网状敲击) 或者像其他人提到的那样使用 fail2ban 之类的解决方案来引入速率限制。此外,配置 sshd 以禁用密码登录 - 即仅允许 SSH 密钥。最后配置 PAM 以记录并发送电子邮件,无论任何人成功登录系统,无论来源如何(SSH、控制台等)。

此外,如果有人对此感到困惑,并想知道“我需要设置哪些防火墙规则才能符合 PCI 合规性?”,正确答案是:无需设置!PCI 合规性是一套用于存储和检索信用卡信息的政策。它与系统级防火墙无关。您只需确保所有有权访问系统的人都得到适当的保护即可。已审计这样如果出现问题,就有审计线索可循(例如,当用户通过 SSH 连接到设备时记录用户,当用户对数据库进行 SQL 查询时记录用户,等等)。设备中任何将数据推送到设备外部的程序也严格进行自我审计。就是这样 - 这就是 PCI 合规性的全部内容,也曾经是。除此之外的任何内容(防火墙规则、仅 VPN 访问等)都是锦上添花。

阻止 ICMP 时间戳是无关紧要的。阅读什么信息有限我找到的关于这个主题的文章,它们与 1999 年基于时间的身份验证协议中的错误有关,这些错误被所谓的“现代”安全扫描仪检测到(哈哈哈)。现在是 2016 年(即使最初发布帖子时,它仍然过时了),除了双因素身份验证之外,没有人使用基于时间的身份验证,但这与当前的问题完全无关,而且 2FA 解决方案通常不会发出网络请求。无论如何,服务器应该通过 NTP 与现实保持同步,因此攻击者已经知道服务器的时间戳是什么。虽然阻止此类请求不会损害我所知道的任何事情,但这样做与 PCI 合规性绝对无关。

因此,要回答最初的问题,您的防火墙规则应该是这样的:

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp --syn --dport 80 -j ACCEPT
-A INPUT -p tcp --syn --dport 443 -j ACCEPT
-A INPUT -p tcp --syn --dport 22 -j ACCEPT
-A INPUT -p icmp --fragment -j DROP
-A INPUT -p icmp --icmp-type 3 -j ACCEPT
-A INPUT -p icmp --icmp-type 4 -j ACCEPT
-A INPUT -p icmp --icmp-type 8 -j ACCEPT
-A INPUT -p icmp --icmp-type 11 -j ACCEPT
COMMIT

如果你想更花哨一点,你可以尽早丢弃无效的端口扫描数据包。这些规则很快就会变得混乱不堪,而且没有必要——你真的担心有人扫描你的端口?哦不——端口扫描!他们会发现三个开放端口!我添加了 --syn 以仅允许有效的 SYN 数据包通过 TCP 规则。但是 SSH 可能存在一些问题(例如,如果您遇到频繁中断的 SSH 会话,请尝试删除 --syn 选项)。如果连接变为 RELATED/ESTABLISHED,则第一条规则允许后续数据包通过已建立的连接。-m 选项隐含在 -p 中,所以我删除了它们。ICMP 类型 3 和 4 是必需的/必需的,8 用于 ping(可选),11 用于 traceroute(可选)。碎片化的 ICMP 数据包只是 DoS 攻击的一部分。当然,OUTPUT 策略设置为 ACCEPT。最终结果如上。除了第一条规则之外,上面的规则和策略看起来非常漂亮、干净、简单、易懂且井井有条——服务器配置的一切都应该如此。

不要忘记 IPv6!您不想设置iptables后就忘记ip6tables。对于 IPv6,上述规则应为:

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp --syn --dport 80 -j ACCEPT
-A INPUT -p tcp --syn --dport 443 -j ACCEPT
-A INPUT -p tcp --syn --dport 22 -j ACCEPT
-A INPUT -p icmpv6 -j ACCEPT
COMMIT

IPv6 大量使用 ICMP,因此阻止 ICMPv6 流量目前被认为是不好的做法。我还没有看到任何特定的防火墙规则集值得用于更严格的 ICMPv6,而且看起来并不复杂。

我已经在生产环境中亲自测试了 IPv4 和 IPv6 规则集,它们工作正常。复制粘贴即可!

相关内容