【问题标题】:IPTables do not block IP with ipset immediatelyIPTables 不会立即使用 ipset 阻止 IP
【发布时间】:2018-01-05 20:39:58
【问题描述】:

我有以下IPTablesIPSet 作为规则源来阻止攻击IP,但是当我将攻击IP 添加到IPSet 时,在我的nginx 访问日志中,我仍然看到连续访问攻击IP。过了一会儿,大概3~5分钟,IP被屏蔽了。

iptables

~$ sudo iptables -nvL --line-numbers
Chain INPUT (policy ACCEPT 317K packets, 230M bytes)
num   pkts bytes target     prot opt in     out     source               destination
1     106K 6004K DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            match-set Blacklist src

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            match-set Blacklist src

Chain OUTPUT (policy ACCEPT 350K packets, 58M bytes)
num   pkts bytes target     prot opt in     out     source               destination

ipset

sudo ipset -L
Name: Blacklist
Type: hash:ip
Revision: 4
Header: family inet hashsize 1024 maxelem 65536 timeout 60
Size in memory: 13280
References: 2
Members:
xxx.xxx.xxx.xxx(attacker ip) timeout 0

我不知道为什么规则没有立即生效,这让我疯了,就像攻击者在嘲笑我一样。

我使用-I 选项将ipset 添加到iptables 规则,这应该将规则保持在第一位。那么也许Chain INPUT(policy Accept) 可以解决问题?

请帮帮我,非常感谢。

顺便说一句。

我使用Nginx+Djano/uWSGI部署我的应用程序,我使用shell脚本分析nginx日志将邪恶的ip放到Blacklist ipset

【问题讨论】:

  • 可以提供更多细节,请帮助我,谢谢
  • 您应该在将 IP 列入黑名单后显示您的 iptables 规则。
  • @Fogmoon,我的回答是否提供了足够的背景背景?如果没有,请告诉我还缺少什么。如果是,您能否接受和/或奖励赏金?如果您不执行任何操作,至少会丢失一半的赏金(在这种情况下,由于没有答案有 2+,因此将丢失全部)。提前致谢!

标签: security nginx iptables


【解决方案1】:

你看过这篇文章了吗:https://serverfault.com/questions/523021/why-is-iptables-not-blocking-an-ip-address

这篇文章显示了使用 -A INPUT -p tcp --dport 80 -j LOG --log-prefix "HTTP:" 删除该人的 IP

我个人没有遇到过这个问题,如果有帮助请告诉我,祝你好运。

【讨论】:

  • 感谢您的回答,但我不清楚使用此语句丢弃ip的热度。能不能描述的更详细一点?
  • 它应该类似于 sudo iptable -A xxxx -p tcp --dport 80 -j xxx --log-prefix "HTTP:" 这将自动捕获并捕获端口 80 访问的所有数据等等。但是,这并不完全有用,但是,如果被阻止的 ips 等想要访问该区域,您可以停止流量。要立即从您的服务器中删除 ip(希望如此),您应该使用: iptables -A INPUT -s xxxxxxx -j DROP iptables -A INPUT -s xxxxxxx -j REJECT 抱歉,我的第一个声明中没有明确说明。
【解决方案2】:

防火墙规则可能无法立即阻止流量的原因可能是由于对数据包的有状态检查。

防火墙分析到达线路中的每个数据包可能效率低下,因此,出于性能原因,用户创建的规则通常仅适用于建立连接的初始数据包(称为TCP 的SYNSYN+ACKACK) — 随后,所述连接被自动列入白名单(更准确地说,是原始规则创建的状态被列入白名单),直到终止(@ 987654330@)。

这里可能发生的情况是,由于 nginx 擅长的流水线和保持活动连接,单个连接可用于发出和处理多个独立的 HTTP 请求。

因此,为了解决此问题,您可以禁用 nginx 中的流水线和 keep-alives(这不是一个好主意,因为它会影响性能),或者 删除现有的白名单连接,例如tcpdrop(8) on *BSD 之类的东西——当然也必须有一个 Linux 等效工具。

但是,如果您只是遇到单个客户端执行过多请求的问题,并因此使您的后端超载,那么适当的操作过程可能是 rate-limit 基于 IP 地址的客户端,在标准 limit-req directive of nginx 的帮助下。 (但是请注意,您的一些客户可能在运营商级 NAT 之后,因此,请注意您应用了多少限制以确保不会出现误报。)

【讨论】:

  • 感谢您如此详细的回答。我可以通过某些命令检查连接状态吗?顺便说一句,在 Ubuntu 服务器中找到像 tcpdrop 这样的等效命令并不容易,我应该只使用 tcp_killer 还是我错过了什么?谢谢。
  • @Fogmoon,基本上,是的——你可能必须在 Linux 上使用第三方 tcpdrop。您可以使用lsof 查看所有正在进行的连接;例如,lsof -nP -c nginx | fgrep ESTABLISHED.
  • 对于这个为时已晚的行为,我们深表歉意。你的回答很有帮助。但我需要说,我没有解决我的问题,我只是在 nginx 配置文件中添加规则以避免同时请求过多。我不知道为什么赏金丢失了,再次抱歉。最近很忙,忘记了这个问题。如果有其他方法可以给你赏金,请告诉我。非常感谢。
  • @Fogmoon 你查看过 nginx 444 错误代码吗?这应该关闭已建立的连接,强制下一个请求被新添加的 IP 拒绝规则丢弃。 stackoverflow.com/questions/41421111/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多