各位 Ubuntu 用户,大家好!
这是我的 iptables.rules 文件的一个示例:
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:f2b-sshd - [0:0]
:f2b-sshd-ddos - [0:0]
-A INPUT -p tcp -m multiport --dports 22 -j f2b-sshd-ddos
-A INPUT -p tcp -m multiport --dports 22 -j f2b-sshd
-A INPUT -s 202.215.160.75/32 -j DROP
-A INPUT -s 66.210.251.136/32 -j DROP
-A INPUT -s 61.40.0.0/16 -j DROP
-A INPUT -p tcp -m multiport --dports 22 -j f2b-sshd-ddos
-A INPUT -i tap0 -j ACCEPT
-A INPUT -p tcp -m multiport --dports 22 -j f2b-sshd
-A INPUT -i br0 -j ACCEPT
-A FORWARD -i br0 -j ACCEPT
-A f2b-sshd -j RETURN
-A f2b-sshd-ddos -j RETURN
COMMIT
请注意,这是我的文件的精简版本。我大概删除了大约 100 个 IP/域名。
我的问题是,当我删除一个像 xxxx 这样的新 IP 时,它会按如下方式添加它:
-A INPUT -i br0 -j ACCEPT
-A INPUT -s x.x.x.x/32 -j DROP
-A FORWARD -i br0 -j ACCEPT
这实际上并没有像我希望的那样删除 IP 地址。我有一个用于删除用户/域的 shell 脚本:
./删除用户
sudo iptables -A INPUT -s $1 -j DROP
sudo sh -c "iptables-save > /etc/iptables.rules"
./删除域名
sudo iptables -A INPUT -s $1/16 -j DROP
sudo sh -c "iptables-save > /etc/iptables.rules"
为了解决这个问题,我手动编辑了 /etc/iptables.rules 文件,将 xxxx ip 移至此行上方:
-A INPUT -p tcp -m multiport --dports 22 -j f2b-sshd-ddos
然后调用:
sudo iptables-restore < /etc/iptables.rules
我的流程有什么问题?有没有更好的方法?每天我花大约 10 分钟处理黑客攻击,大部分时间都在编辑我的 iptables.rules 文件,然后通过 iptables-restore 恢复它。我希望能够只调用 ./drop-user 或 ./drop-domain 来完成它,但我觉得我对 iptables 的了解还不够。
我是否应该在 iptables-restore 之前执行以下命令?
sudo iptables -F
sudo iptables -Z
提前致谢!
答案1
我强烈建议您使用来自动化禁止过程fail2ban
,它在默认配置下运行良好,如果您希望它监控更多服务,可以进一步定制。
与 结合使用时iptables-persistent
,它将在重启后保留规则,这很有帮助。
以下是我对 Ubuntu 服务器的操作的基本概述:
安装并配置fail2ban
sudo aptitude install fail2ban && sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local && sudo nano /etc/fail2ban/jail.local
这将安装它并将配置文件复制到新文件以供您自定义。这是最佳做法,因为它可以防止您的编辑在软件包更新时被覆盖。
我个人倾向于延长禁令时间和找时间从默认值开始。禁止时间是攻击者被禁止的时间,查找时间是计算他们的尝试的时间窗口,以防他们限制攻击。查找和编辑bantime = 21600
(增加到六个小时,时间值以秒为单位)以及findtime = 3600
(每小时最多 3 次攻击尝试)。
刷新现有的 Iptables 规则并设置新的默认值
这是一行程序,旨在用于典型的 Web 服务器,其入站端口仅监听端口 22(SSH)、端口 80(HTTP)和端口 443(HTTPS)。本 DigitalOcean 教程是如何构建您自己的或定制我的一个很好的参考。小心使用 Iptables 和设置 DROP 规则,如果顺序错误,您将永远被锁定!也就是说,我使用的这个单行代码是安全的,经过测试并且运行完美:
sudo iptables -P INPUT ACCEPT && sudo iptables -F && sudo iptables -A INPUT -i lo -j ACCEPT && sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT && sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT && sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT && sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT && sudo iptables -A INPUT -j LOG && sudo iptables -A FORWARD -j LOG && sudo ip6tables -A INPUT -j LOG && sudo ip6tables -A FORWARD -j LOG && sudo iptables -A INPUT -j DROP
使更改在重启后保持不变
最后一步是安装和配置iptables-persistent
软件包,它将在重启后自动保存和恢复规则。
sudo aptitude install iptables-persistent && sudo service iptables-persistent start
它会提示您确认 IPV4 和 IPV6 规则,您应该使用 Tab 键为每个规则选择“是”并保存。它会在重新启动时自动启动,因此您无需担心进一步配置它。
关于使规则持久化需要注意的一点是,您需要手动告知进程您添加或编辑的任何新规则(例如,如果您在端口 443 上添加或删除了 HTTPS)。为此,运行将更新当前规则集。我认为该命令在 14.04 之后的版本中已更改为“netfilter-persistent”,因此如果第一个命令不起作用,sudo service iptables-persistent save
请使用它。sudo service netfilter-persistent save
概括
现在 fail2ban 将监控对 SSH 的攻击,并根据您设置的参数自动添加和删除 IP 地址。Iptables 将忽略您未打开的端口的所有传入流量,并且这些规则将在重新启动后保留,因此您无需执行太多其他操作。我想,享受额外的空闲时间吧!
如果要撤消所有更改,请反转上述所有步骤
如果出于某种原因您不想继续使用此方法,您可以快速撤消所有操作。 我们不建议这样做,但这是您的机器,因此请按照以下步骤操作:
- 刷新所有 Iptables 规则并接受所有端口上的所有流量
sudo iptables -P INPUT ACCEPT && sudo iptables -F
(您必须执行此操作才能删除最后的 DROP 规则,否则您将被锁定) - 删除之前安装的软件包及其设置
sudo aptitude purge fail2ban iptables-persistent
(或者netfilter-persistent
,取决于您的 Ubuntu 服务器版本)。重启后,您应该恢复到之前的状态 - 减去任何自定义 Iptables 设置,您需要像当前所做的那样手动重新添加这些设置。