iptables —— 好的,**现在**我做对了吗?

iptables —— 好的,**现在**我做对了吗?

这是上一个问题我询问我的 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 全部,你做得不对。

相关内容