题 iptables - 好的,**现在**我做得对吗?


这是一个跟进 上一个问题 在哪里我问我的iptables配置是否正确。

CentOS 5.3系统。

预期结果:阻止除ping,ssh,Apache和SSL之外的所有内容。

基于 异戊二烯的建议 以及对问题的其他回答(谢谢伙计们),我创建了这个脚本:

# 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

我跑了它,我仍然可以登录,所以这很好。有没有人注意到任何重大事件?


5
2017-11-15 06:41




还有你建立任何ip6tables规则?如果您不使用ipv6,请记住您需要禁用它或删除所有流量。我记得我们无法停止DOS的情况,因为我们甚至没有安装它(ip6tables),我们也不知道如何禁用ipv6。我们甚至没有使用它。 - xenoterracide


答案:


在大多数情况下看起来不错。主要的是你应该使用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之前允许我访问。


3
2017-11-15 10:07



从端口22移动SSH只是“默默无闻”。你最好运行fail2ban和/或关闭密码验证。 - Alastair Irvine


看起来不错,我的个人偏好是添加

-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


1
2017-11-15 11:50





如果你直接使用iptables我会说   所有,你做得不对。


-1
2017-11-15 06:46



-1。很好的建议,但这个问题的答案可怕。这属于评论。 - quack quixote
问题:“我做得对吗?”答:“不,你不是”...... - womble♦
@womble:ROFL =) - TiFFolk
@womble:很合乎逻辑。但这是一个网站 关于 电脑。你不需要实际 是 一台电脑。建议:优化有用,而不是精确。 - Agvorth
@Ethan:Ahahahahahahaaaahahahahaha。 - womble♦