答案1
我以前认为这是个好主意。但现在不幸的是,我知道这是个非常糟糕的想法。
您是否曾经运行过 ApacheBench 之类的 HTTP 基准测试应用程序?在一台机器上,您可以将其设置为每秒创建数百个到目标服务器的连接。让其中一些客户端运行并连接到启用缓送功能的服务器,我认为您会看到问题。
考虑一下,如果每个连接都被困在 tarpit 中,每秒创建数千个到服务器的连接将对服务器产生怎样的影响。
您的服务器将很快耗尽其所有可用资源(或文件句柄),从而不再允许任何连接。这比直接关闭连接更糟糕。最好暂时放弃违规者,而不是试图占用他们的资源,而这正是 fail2ban 等脚本所实现的。
此外,您绝不希望普通用户被困在 tarpit 中,尤其是在交互式会话中。您如何预先决定谁被允许,谁不被允许?对于某些协议(如 HTTP),您无法做到这一点。您必须假设客户端没有问题,直到您从客户端收到活动,告诉您情况并非如此。然后,您可以决定将其视为坏的,下次它将被困在 tarpit 中。这似乎没问题,但许多此类攻击可能来自动态 ADSL 用户等,他们恰好感染了最新的蠕虫病毒。
由于许多来自动态 IP 的 PC 的攻击都感染了蠕虫病毒,而所有者却毫不知情,因此您可以快速建立过时的 tarpit 黑名单。您是否开始发现一些问题了?
答案2
概括
在通用服务器上运行 tarpit 确实存在风险。如果您知道有哪些风险,您可以根据自己的承受程度来减轻这些风险。
- 你必须确保你不会意外地使用 tarpit 流量对你的服务器进行 DOS 攻击
- 你必须确保你的状态表里没有填充延迟连接信息
- 你必须确保你的日志中不会充斥着 tarpit 连接信息
- 你需要确保较长的黑名单不会影响性能
- 你需要确保你的黑名单自动过期主机
- 您需要能够将主机列入白名单(永久或有时间限制)
值得庆幸的是,这一切都是可能的,而且使用常规 iptables 和 ipset 相当容易。
限制 TARPIT 资源使用
您可以使用 iptables 来限制 TARPIT 的主机数量,而不会使用太多的系统资源。 参见下面的示例。 这包括网络带宽、系统内存、状态稳定条目和其他系统资源。如果出现过多的缓送连接,请开始忽略它们。如果您以正确的顺序组织规则集,则所有缓送连接都不会出现在您的状态表中。另外,请确保不要记录日志,除非您使用自定义 ulog 之类的东西进行实时统计——直接 iptables 缓送日志会很快填满磁盘。
根据我的经验,我当前的主机可以轻松地将 200 多台主机放在一个 tarpit 中,而对内存使用率、流量使用率或 CPU 使用率几乎没有明显影响。我可能可以进一步推动这一点,但到目前为止,平均而言,我在任何给定时刻只能捕获大约 130 台主机。
我实施限制的原因如另一条建议所述,是因为我的第一个 tarpit 主机被淹没了。这是一个简单的解决方法。从那以后我就没遇到过任何问题。
使用 ipset 实现高效黑名单
ipset是一款很棒的小工具,它允许您创建对象组以用于 iptables 规则。不仅如此,由于它可以将对象保存在哈希表中,因此与等效的线性 iptables 规则集相比,ipset 越大,速度越快。
除此之外,列表还可以包括每个对象的计数器(数据包/字节)、超时和排除。
您可以使用大多数自动阻止的程序(例如 fail2ban、ossec 等)从 ipset 添加/删除。因为您可以设置默认超时,所以无论哪个程序设置了条目,您都可以确保条目已过期。
例子
以下是根据我在所管理的服务器上使用的方法示例,可以减轻上述风险:
警告
### Note: This does not account for all possible traffic you might need or want
### This is only an example of mitigating common risks of using a tarpit
### Use at your own risk
配置 ipset
# Create the ipset blacklist
# options:
# - create : create a new ipset
# - blacklist : Name of the ipset we'll reference in the iptables rule
# - hash:net : Make blacklist type hash to hold network (ip/mask) data
# - family inet : This is for IPv4 data (inet6 for IPv6)
# - counters : We want packet/byte stats counted for each entry
# - comment : So we can add a comment with each entry (handy)
# - timeout 604800 : Set a default timeout of 604800 seconds (1 week) for each new entry
# - nomatch : Allow us to enter exclusion entries (never match an entry)
ipset create blacklist hash:net family inet counters comment timeout 604800 nomatch
# Create an entry to never blacklist a trusted network
# options:
# - timeout 0 : entry never expires
# - nomatch : Tells IPset to never match this entry (whitelist, in our usage)
ipset add blacklist 123.45.67.0/24 comment "Trusted subnet, causes breakage if blocked" timeout 0 nomatch
# Example to blacklist hosts
# no netmask implies /32 (or /128 for ipv6)
ipset add blacklist 34.56.78.90 comment "SSH Bruteforce"
ipset add blacklist 23.45.67.89 comment "SQL Injection" timeout 12345
# etc...
配置 iptables
# Flush the input table
iptables -F INPUT
# Drop the custom flow TAR
iptables -X TAR
# Set default INPUT policy to DROP
iptables -P INPUT DROP
# Create the chain TAR
iptables -N TAR
# Send all blacklisted hosts to the tarpit
iptables -A INPUT -m set --match-set blacklist src -j TAR
# Allow established connections
# Note: after the blacklist so newly blacklisted threats are immediately ignored
# Yes, that will cause the server to hold the state open until it times out.
# Would you rather have a malicious host continuing its attack?
iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
# Allow the services we want
# Note: These create new state table entries/use up memory
# Note: We do not account for synflood prevention in this example
iptables -A INPUT -p tcp -m multiport --dports 22,80,443 -m tcp --syn -m conntrack --ctstate NEW -j ACCEPT
iptables -A INPUT -p icmp -m icmp --icmp-type 8 -m conntrack --ctstate NEW -j ACCEPT
# Send everything else to tarpit chain
iptables -A INPUT -j TAR
# This is the tarpit chain
# Tarpit up to 10 unique connections a second, any more, and pass to next rule
# Note: 10/s limit is arbitrary, adjust to your preference (experiment)
iptables -A TAR -p tcp -m limit --limit 10/sec -j TARPIT --tarpit
# Drop everything else that makes it this far
# You can also set to REJECT which will immediately tell all connections to buzz off
iptables -A TAR -j DROP
实时查看被困主机
$ sudo tcpdump -npi eth0 'src YOUR.HOST.IP and (tcp[14] = 0 && tcp[15] = 0)'
答案3
缺点
我一直在我的服务器中使用 TARPIT。保证使用超过 20 年。我发现的唯一缺点是:
安装需要编译— TARPIT 目标不是 Linux 内核的一部分,而是由XTables 插件包。据我所知,没有主流 Linux 发行版提供可立即安装的二进制包作为插件。因此,要获得 TARPIT 目标,您必须获取源代码并自行构建模块。如今,大多数 Linux 发行版都使这项任务变得简单,但仍然不像那么容易
apt install PACKAGE
。增加 iptables 规则的复杂性— 尽管 TARPIT 机制旨在限制仅有的攻击者的资源,配置不当的系统可以打开你的服务器 DOS 攻击。不幸的是,实现 TARPIT 的最直观方法(“哦,让我们用 替换
-j DROP
”-j TARPIT
)是错误的,并且会使服务器易受攻击。原因是内核不知道您的 tarpitting 业务,并将尝试进行连接跟踪,尽管如此,这将使用您服务器上的资源。知道您的服务器配置错误的攻击者可以很容易地对其进行 DOS 攻击,并且为了防止这种情况,您需要对 iptables 规则进行一些技巧,这会增加复杂性。以下是我使用的避免此问题的技术要点:https://gist.github.com/flaviovs/103a0dbf62c67ff371ff75fc62fdded3
漏洞
从实施角度来看,据我所知,唯一的潜在问题是上面解释的连接跟踪 DOS 攻击,如果你没有正确配置 iptables,就可以利用该攻击
如果你谈论的是软件漏洞,那么很难证明任何软件没有问题。考虑到项目的成熟度,我认为它相当安全。据我所知,也没有报告过针对它的漏洞。当然,这只是我个人的看法——在使用它之前,你应该做好充分的调查。