AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 1358471
Accepted
Kamil Skwirut
Kamil Skwirut
Asked: 2021-08-18 00:21:02 +0800 CST2021-08-18 00:21:02 +0800 CST 2021-08-18 00:21:02 +0800 CST

在 VPS 上阻止 140 万个 IP 地址

  • 772

如何阻止大约 140 万个 IP 地址的列表?我已经尝试使用 iptables PREROUTING 来做到这一点,例如:

-A PREROUTING -d IP_HERE/32 -j DROP

但是有这么多记录,当我进行速度测试时,我的带宽会像疯了一样下降。

在 iptables 中没有阻止 IP:

1 Gb/秒

在 iptables 中使用被阻止的 IP:

峰值 3 Mb/s。

我想在这里使用 XDP_DROP(最后一步): https ://blog.cloudflare.com/how-to-drop-10-million-packets/

但我不知道如何使用它。:/(我真的不擅长编程)

这种方法有替代方案吗?

networking
  • 7 7 个回答
  • 6814 Views

7 个回答

  • Voted
  1. Best Answer
    Cyrbil
    2021-08-18T11:32:02+08:002021-08-18T11:32:02+08:00

    你应该看看ipset.

    来自官方网站:

    ipset 可能是您 [...] 存储多个 IP 地址或端口号并匹配 iptables 集合的合适工具。

    [...] (Ipset) 可以以某种方式存储 IP 地址、网络、(TCP/UDP) 端口号、MAC 地址、接口名称或它们的组合,从而确保在将条目与集合匹配时具有闪电般的速度。

    要使用它,您需要创建一个ipset,添加IPs并创建一个iptables规则来匹配ipset:

    ipset create blacklist hash:ip hashsize 1400000
    ipset add blacklist <IP-ADDRESS>
    iptables -I INPUT -m set --match-set blacklist src -j DROP
    

    可以在此处找到一个真实的使用示例。请注意,它使用ipset restore而不是在循环中遍历每个IP,因为它更快。

    如果您的列表IPs有重叠,您可能需要对其进行预处理以IP ranges尽可能转换为。这是执行此操作的工具的示例。它不会为您带来更好的性能,ipset但会减少列表的大小。


    附带说明一下,就性能而言,它非常快并且可以扩展而不会受到惩罚。正如Cloudflare's blog 提到的,有更快的低级方法;但它要复杂得多,每秒只增加几个字节,除非你有云提供商的规模和雄心,否则不值得付出努力。

    • 32
  2. Criggie
    2021-08-18T12:45:42+08:002021-08-18T12:45:42+08:00

    帧挑战 - 较短的列表、授权或阻止地址是什么?

    与其拒绝 140 万个,不如简单地允许大约十几个您想要允许的 IP,并默认拒绝一切。

    • 20
  3. matigo
    2021-08-18T00:45:21+08:002021-08-18T00:45:21+08:00

    如果 IP 地址在明确定义的范围内运行,那么您可以ufw像这样使用来阻止流量:

    sudo ufw deny from 192.0.0.0/8 to any
    

    上面的示例阻止了从192.0.0.1到的所有流量192.255.255.254,计算结果为 16,777,214 个地址,这对网络吞吐量的影响为零(显着)。

    只要您的 IP 列表以可行的方式生成 IP 范围,这可能对您有用。

    • 15
  4. Raffa
    2021-08-19T01:16:51+08:002021-08-19T01:16:51+08:00

    您可以通过对规则进行树结构来最小化查找以提高速度。例如,您可以根据 IP 的第一部分执行此操作,例如/8:

    iptables -N rule8_192_0_0_0
    iptables -N rule8_172_0_0_0
    iptables -N rule8_10_0_0_0
    
    iptables -A INPUT -s 192.0.0.0/8 -j rule8_192_0_0_0
    iptables -A INPUT -s 172.0.0.0/8 -j rule8_172_0_0_0
    iptables -A INPUT -s 10.0.0.0/8 -j rule8_10_0_0_0
    
    iptables -A rule8_192_0_0_0 -s 192.168.2.3 -j DROP
    iptables -A rule8_172_0_0_0 -s 172.16.2.3 -j DROP
    iptables -A rule8_10_0_0_0 -s 10.10.2.3 -j DROP
    
    • 13
  5. iBug
    2021-08-20T19:43:05+08:002021-08-20T19:43:05+08:00

    还有另一个改进可以直接解决您的 3 Mb/s 问题:

    iptables -I INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
    

    这允许已建立的连接遍历尽可能少的 iptables 规则,尽管使用 ipset 来提高 IP 地址查找速度对于更快地建立新连接仍然是必要的。

    无论您有多少其他规则,这都是作为第一条规则部署的好规则。

    • 4
  6. APLU
    2021-08-20T06:22:48+08:002021-08-20T06:22:48+08:00

    这不使用 iptables 而是使用 ip 内核路由表,可能值得尝试并检查性能:

    ip route add blackhole IPv4/32

    IIRC 它应该比使用 iptables 过滤更快,但我从未做过 140 万个 IP 的基准测试 :)

    • 1
  7. Luc H
    2021-08-21T02:10:37+08:002021-08-21T02:10:37+08:00

    除非您计划以极高的数据包速度运行这些阻止列表(想想 >1mpps),否则 XDP_DROP 可能是矫枉过正。因此,如果您对代码没有那么丰富的经验,我会推荐 Cyrbil 的 anwser。

    如果您仍然想尝试使用 XDP,您正在寻找一种称为布隆过滤器的东西,它能够快速检查 ip 是“可能在集合中”还是“绝对不在集合中”

    C 语言中的布隆过滤器示例:这篇博文

    • 1

相关问题

  • 如何设置 VLAN 转发?

  • 如何将主机 Ubuntu 上的 VPN (tun0) 网络适配器映射到 VirtualBox 来宾 Windows?

  • 如何限制下载/上传带宽?

  • 如何通过 Windows 网络共享文件?

  • 面板小程序以文本形式显示当前网络流量?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve