我认为我的 CentOS 5.3 系统上的 iptables 设置已经基本完成。这是我的脚本...
# Establish a clean slate
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -F # Flush all rules
iptables -X # Delete all chains
# Disable routing. Drop packets if they reach the end of the chain.
iptables -P FORWARD DROP
# Drop all packets with a bad state
iptables -A INPUT -m state --state INVALID -j DROP
# Accept any packets that have something to do with ones we've sent on outbound
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# Accept any packets coming or going on localhost (this can be very important)
iptables -A INPUT -i lo -j ACCEPT
# Accept ICMP
iptables -A INPUT -p icmp -j ACCEPT
# Allow ssh
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# Allow httpd
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# Allow SSL
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# Block all other traffic
iptables -A INPUT -j DROP
就上下文而言,这台机器是虚拟专用服务器 Web 应用程序主机。
在一个上一个问题,Lee B 说我应该“再封锁一下 ICMP”。为什么不干脆把它全部封锁呢?如果我这么做了会发生什么(会发生什么糟糕的事情)?
如果我不需要阻止 ICMP,我该如何进一步锁定它?
答案1
ICMP 的作用远不止“traceroute”和“ping”。它用于在运行 DNS 服务器(端口不可达)时提供反馈,在现代 DNS 服务器中,它实际上可能有助于选择另一台机器进行更快的查询。
如上所述,ICMP 还用于路径 MTU 发现。您的操作系统可能会在其发送的 TCP 数据包上设置“DF”(不分段)。如果路径上的某个东西无法处理该大小的数据包,它期望收到 ICMP“需要分段”数据包。如果您阻止所有 ICMP,您的机器将不得不使用其他后备机制,这些机制基本上使用超时来检测 PMTU“黑洞”,并且永远不会正确优化。
此外,您应该问自己为什么要阻止 ICMP。您在这里具体想阻止什么?很明显,您不了解 ICMP 的用途,这很常见。我会非常谨慎地阻止您不完全了解的东西。
更难理解的是,许多常见的防火墙书籍都说“阻止 ICMP”——很明显,这些书籍的作者从未阅读过 RFC,也从未解决过与此类建议相关的问题。阻止所有 ICMP 是错误的建议。
现在,限制速率也会造成影响。如果您的机器很忙,或者即使不忙,您也会收到大量 ICMP 流量。我的 Web 服务器每分钟大概会收到 10-100 个 ICMP 数据包,其中大部分是 PMTU 发现。即使有人选择使用某种类型的 ICMP 数据包攻击我的服务器,也没什么大不了的。如果您的机器接受哪怕一个 TCP 连接(ssh、http、邮件等),那么这很可能是一个比误解的 ICMP 更大的攻击媒介。
答案2
ICMP 用于一系列诊断(例如 ping、traceroute)和网络控制(例如 PMTU 发现)功能。不加区分地阻止 ICMP 会给其他人带来各种麻烦,除非您确切知道自己在做什么,否则最好不要管它。
答案3
我一直不明白为什么人们要对 ICMP 进行计时,正如上面所说,它只会给您自己和他人带来麻烦。您可以轻松确定主机是否处于启动状态,只要它受到足够的限制而不会被用作 DOS,那么我从未听说过任何令人信服的理由来阻止它。(如果有人能想出理由,请发帖)
答案4
以下是另一种观点,符合安全理论所建议的精神。其他发帖者说得对,安全实践往往过于热心,但其中大部分都是有充分依据的。
安全理论通常是只启用您需要的功能。其他功能(可能有用 - 例如 ping 响应)可能被攻击者用来探测您的系统,或者可能作为某些尚未发现的漏洞的攻击媒介。
那么,查看 ICMP 消息类型,您需要什么才能保证系统正常、正常运行?
- 回显回复 (ping) - 不是很多
- 无法到达目的地 - 这里有很多有用的信息。禁用此功能将导致某些客户端无法访问您的服务器。
- 源抑制 - 自 1995 年起已弃用,并且显然自 2005 年(最迟)起已从主机实现中删除。tools.ietf.org/html/rfc6633#section-1。
- 重定向 - 几乎肯定不会
- 路由器广告和请求 - 如果您静态配置路由,则不需要,并且可用于 DoS。除非您知道需要它,否则我会阻止它,如果您需要它,也许可以编写一条规则以仅接受可能已知的路由器的信息。
- ttl 超出 - 不仅适用于 traceroute,还表示您的流量未到达目的地
...等等。如果您真的想理解这一点,请了解各种 ICMP 类型及其用途。维基百科文章是一个很好的起点。
实际上,真正丑陋的是重定向;如果你只想做一些快速而有用的事情,那么阻止它并允许其余的事情。
我想补充一点,IPtables 连接跟踪将允许活动连接返回适当的 ICMP 数据包。因此,如果您正在运行 conntrack,只要您正在接受 RELATED 数据包(在规则集中阻止 ICMP 之前),您就应该能够阻止大多数 ICMP 入站。