我对 iptables 还不太熟悉,正在尝试弄清楚我是否正确配置了规则集。关于-P 输入接受作为我问题的一部分,我试图确定这在我想要应用的规则的上下文中是否有效。请参阅下文了解更多详细信息。
我用过iptables-恢复使用包含以下规则的文件。本质上,我试图允许环回流量、已建立/相关连接、SSH 和 HTTP。所有其他流量都应被拒绝。
*filter
:fail2ban-ssh - [0:0]
# Input chain rules
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -s 127.0.0.0/8 -j REJECT
-A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh
# Reject all other inbound traffic
-A INPUT -j REJECT
# Output chain rules
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT
-A OUTPUT -p tcp --sport 80 -m conntrack --ctstate ESTABLISHED -j ACCEPT
# Forward chain rules
-A FORWARD -j REJECT
# fail2ban-ssh chain rules
-A fail2ban-ssh -s 146.0.77.33/32 -j REJECT --reject-with icmp-port-unreachable
-A fail2ban-ssh -s 62.75.236.76/32 -j REJECT --reject-with icmp-port-unreachable
-A fail2ban-ssh -j RETURN
COMMIT
如果我跑iptables -S,我收到以下输出:
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-N fail2ban-ssh
-A INPUT -i lo -j ACCEPT
-A INPUT -s 127.0.0.0/8 ! -i lo -j REJECT --reject-with icmp-port-unreachable
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh
-A INPUT -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT
-A OUTPUT -p tcp -m tcp --sport 80 -m conntrack --ctstate ESTABLISHED -j ACCEPT
-A fail2ban-ssh -s 146.0.77.33/32 -j REJECT --reject-with icmp-port-unreachable
-A fail2ban-ssh -s 62.75.236.76/32 -j REJECT --reject-with icmp-port-unreachable
-A fail2ban-ssh -j RETURN
我对 iptables 做了一些阅读,我的理解是前几行(例如,“-P 输入接受“”)本质上意味着,如果不适用其他规则,则默认操作是接受流量(在本例中为输入、转发和输出)。
如果是这种情况,我是否应该在规则文件中明确添加以下几行并再次恢复 iptables?
-P INPUT DROP
-P FORWARD DROP
-P OUTPUT DROP
在此先非常感谢阅读此完整问题的任何人!这个问题有点长,但我认为有必要包含上述所有细节,以充分解释我的情况。
答案1
为了回答您实际提出的问题,策略应该出现在普通iptables-save
文件中,但不能作为-P
规则的参数。
相反,它们应该出现在开头,与任何自定义链的声明及其策略一起出现,如下所示:
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
:fail2ban-ssh - [0:0]
自定义链旁边的连字符缺少策略参数,因为用户定义的链没有策略。
请注意,如果您将所有策略更改为DROP
,则防火墙将难以进行 DNS 查找,并且许多事情将会不可预测地失败。
答案2
基本上,除了 fail2ban 阻止的任何内容外,您当前的规则意味着您没有防火墙。
考虑一下您的防火墙在以下情况下会如何响应:
您正在运行 MySQL 或其他数据库,它们正在侦听 TCP 连接以进行本地连接 - 但您不希望进行远程连接。
然后,恶意远程计算机尝试访问端口 上的 mysql 服务器3306
。
假设 fail2ban 尚未阻止它们,问题是您现有的任何规则是否对您有帮助?那么:
-A INPUT -s 127.0.0.0/8 ! -i lo -j REJECT --reject-with icmp-port-unreachable
- 没有-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
- 没有-A INPUT -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
- 没有
等等……没有匹配项,因此会丢弃连接,因此您的 INPUT 策略适用,并且连接被接受。
然后考虑相同的场景对于您机器上运行的任何其他服务- 如果 fail2ban 没有阻止,你的服务器将允许他们进入。
所以是的,我建议你添加你的iptables-restore
规则
-P INPUT DROP
# Any unmatched packets on FORWARD chain will be dropped
-P FORWARD DROP
注意:虽然 iptables 规则通常不会在重启后继续存在,但策略会。在这种情况下,如果服务器重启后没有加载相应的 ACCEPT 规则,则上述规则将锁定 SSH 会话 - 即此策略将锁定您。
我个人仍会使用丢弃策略,但有些人喜欢保留-P INPUT ACCEPT
并改用
-A INPUT DROP
通常,它位于 INPUT 链的最底部,是一种“准”策略。您必须小心处理这一点,并在修改文件墙时不断重新阅读规则,但如果您没有设置 iptables 在重启时恢复其规则,这种安排意味着您可以重新进入您的机器。
答案3
顺便说一句,我刚刚把你的规则(链INPUT
)转储到哎呀提取简化版本。它仅显示谁可以建立连接:
ACCEPT all -- 127.0.0.0/8 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 dports: 22
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 dports: 80
DROP tcp -- 146.0.77.33/32 0.0.0.0/0 dports: 22
DROP tcp -- 62.75.236.76/32 0.0.0.0/0 dports: 22
DROP all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
您可以看到您的 fail2ban 方法实际上是有问题的:第二条规则接受所有 ssh 连接;规则 4 和 5(DROP 规则)被遮蔽(它们永远无法到达)。
我假设您的默认策略是ACCEPT
,您可以将其视为简化列表中的最后一条规则。您可能还会看到,的默认策略INPUT
在这里并不重要,因为倒数第二条规则已经丢弃了所有之前不匹配规则的数据包。这是由于您的-A INPUT -j REJECT
规则。