这是上一个问题我询问我的 iptables 配置是否正确。
CentOS 5.3系统。
预期结果:阻止除 ping、ssh、Apache 和 SSL 之外的所有内容。
基于xenoterracide 的建议以及对该问题的其他答复(感谢大家),我创建了这个脚本:
# 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
现在,当我列出规则时,我得到了......
# iptables -L -v
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 DROP all -- any any anywhere anywhere state INVALID
9 612 ACCEPT all -- any any anywhere anywhere state RELATED,ESTABLISHED
0 0 ACCEPT all -- lo any anywhere anywhere
0 0 ACCEPT icmp -- any any anywhere anywhere
0 0 ACCEPT tcp -- any any anywhere anywhere tcp dpt:ssh
0 0 ACCEPT tcp -- any any anywhere anywhere tcp dpt:http
0 0 ACCEPT tcp -- any any anywhere anywhere tcp dpt:https
0 0 DROP all -- any any anywhere anywhere
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 5 packets, 644 bytes)
pkts bytes target prot opt in out source destination
我运行了它,仍然可以登录,所以这很好。有人注意到有什么重大异常吗?
答案1
大部分看起来不错。最重要的是,您可能应该使用 iptables-save 和 iptables-restore,而不是重复运行 iptables。iptables-save/restore 方法为您提供原子批量更新(如数据库事务),因此您知道没有任何东西可以进入(或无法进入),因为当网络数据包到达时,您的 iptables 更改才完成一半。进行此更改还可以让您转储初始 ACCEPT 策略,因此它只会设置首选策略(最好是 DENY),然后设置单个规则(被 ACCEPTed 的例外)。
除此之外,您可能还想进一步锁定 ICMP(而不是仅仅允许一切)。我听说 ICMP 的某些方面现在相当不可靠。就我个人而言,我认为这不值得,因为很多诊断和流量管理都依赖于 ICMP。
关于 womble 的“不要使用 iptables”评论:我不会说你不应该直接使用 iptables(或 iptables-save/restore),但我建议你看看 FERM。它本质上就是 iptables,但语言更具表现力,重复性更低,并且支持变量。例如,你的 iptables 命令:
iptables -P INPUT 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
在 ferm 中看起来更像这样:
# allow some incoming TCP
chain INPUT {
policy ACCEPT;
proto tcp dport (ssh httpd https) ACCEPT;
}
好多了,对吧?;)
最后,不要在默认端口 22 上运行 SSH。将其移至另一个地址(编辑配置文件,然后重新加载 sshd)。即使通过 ssh 连接,您也可以这样做,但在处理 ssh 或防火墙规则(基于控制台,由虚拟专用主机提供)时,最好使用另一种访问方法。此外,最终考虑设置类似 fail2ban 的东西。但如果没有固定 IP(在我这边)和特定的防火墙规则,我不会使用它,以便在 fail2ban 进行任何阻止之前允许我访问。
答案2
看起来不错,我个人的偏好是添加
-m state --state NEW
这些规则
# 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
并将 INPUT、FORWARD 的默认策略更改为 DROP,使得
# Block all other traffic
iptables -A INPUT -j DROP
多余的
答案3
我想说的是,如果你直接使用 iptables在 全部,你做得不对。