服务器延迟,似乎 iptables 正在承担负载

服务器延迟,似乎 iptables 正在承担负载

我在 CentOS 机器中添加了几千个 IP,这些 IP 被打包成多个 /24 类,因此我日夜不停地接受扫描。由于这台服务器将是一台主力服务器,并且只需要在 SSH(更改的 SSH 端口)和 http/s 上可用,所以我最终阻止了邮件端口和 ping 回复。这解决了 http/s 上的高响应时间问题,但 iptables 增加了服务器的负载。

我正进入(状态:

top - 22:01:30 up 2 days, 10:17,  3 users,  load average: 1.99, 2.23, 2.07
Tasks: 198 total,   2 running, 195 sleeping,   0 stopped,   1 zombie
Cpu(s):  1.0%us,  5.1%sy,  0.0%ni, 85.0%id,  0.0%wa,  0.0%hi,  8.8%si,  0.0%st
Mem:  16638532k total,  2692948k used, 13945584k free,   206992k buffers
Swap:  8193140k total,        0k used,  8193140k free,  2093204k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 7091 root      23   0 25704  23m  512 R 72.5  0.1   0:02.26 iptables
28507 root      15   0 10236 3308 2684 S  4.5  0.0   0:51.00 sshd

我该如何解决这个问题,因为服务器在执行基本操作(例如通过 SSH 接受命令)时非常慢?我将在接下来的几个月内研究硬件防火墙,但在此之前必须使用软件解决方案来解决问题。

答案1

添加硬件防火墙。MIkrotik 有非常棒的新产品 - 真的,每个网络端口有 2 个核心,运行速度为 1.2ghz。

与此同时,您可以尝试优化您的 iptable 规则。基本上就是这样 - 如果规则处理需要太多时间,请优化它们以加快速度。

答案2

你可以通过以下几种方式来优化你的 iptables:

  1. 删除不执行任何操作的规则。任何没有目标 ( -j <something>) 的规则都不会对数据包执行任何操作,因此除非您使用这些规则进行记账,否则它们毫无用处,应将其删除。

  2. 将规则拆分为链。数据包必须与每条规则进行匹配,直到找到目标或使用策略的链的末尾。如果您为可以使用简单规则匹配的 IP 组创建链,则可以大大减少每个数据包必须与之比较的规则数量。如下所示:

    :group0 ACCEPT [0:0]
    :group1 ACCEPT [0:0]
    :group2 ACCEPT [0:0]
    :group3 ACCEPT [0:0]
    :group4 ACCEPT [0:0]
    -A INPUT -d 10.0.0.0/24 -j group0
    -A INPUT -d 10.0.0.1/24 -j group1
    -A INPUT -d 10.0.0.2/24 -j group2
    -A INPUT -d 10.0.0.3/24 -j group3
    -A INPUT -d 10.0.0.4/24 -j group4
    -A group0 -d 10.0.0.1 -i ! lo -p tcp -m tcp --sport 80
    ...etc 
    

    然后将 的所有规则放入10.0.0.0/24链中group0。假设 中 65,536 个 IP 地址中的每一个都有一条规则10.0.0.0/16,则数据包在此设置中必须经历的最坏比较次数是 512。比 65,536 次比较好得多每一个如果它们都在同一个链中,则数据包必须通过。它不必是您拆分的目标 IP 范围,它可以是端口号或 IPTables 可以匹配的数据包的任何其他方面。

  3. 如果您将其用于会计目的,请使用交换机上的镜像端口将所有流量的副本发送到单独的框。让主路由防火墙运行最少数量的规则以实现您的安全目标。(除了 iptables 之外,可能还有更好的会计处理方法,但这不是我的领域。)

  4. 为每条规则设定目标。除非你要匹配以下所有三条规则,您最好-j ACCEPT在每条规则上都使用 。如果您确实想匹配所有规则,请在最后一条规则上使用 ACCEPT。这样,您就不必对永远不会匹配的规则进行比较。

    -A acctboth -s 93.xyx.40.250 -i ! lo -p tcp -m tcp --dport 80
    -A acctboth -s 93.xyx.40.250 -i ! lo -p tcp
    -A acctboth -s 93.xyx.40.250 -i ! lo
    
  5. 合并规则。由于防火墙的逻辑非常简单,您可以用大约 10 条规则(仅带 的规则)替换整个规则-j TARGET

  6. 删除重复和多余的规则。这些规则看起来不太有序或有条理。如果您的某些地方没有重复的规则,我会感到惊讶。如果您有几千个 IP,而您拥有的一些规则是针对您不再拥有的 IP,我也会感到惊讶。找到这些规则并将其删除。

  7. 不要将 INPUT 和 OUTPUT 的链合并。将规则-s <IP>放在 OUTPUT 链中,将-d <IP>规则放在 INPUT 链中,然后删除规则-j acctbothacctboth链。同样,这会将找到匹配项之前必须检查的规则数量减半。

  8. 对规则进行排序,以便首先列出最常匹配的目标。您可以使用 查看人性化计数,iptables -L -nv使用 查看原始数字iptables -L -nvx。如果您有从低延迟中受益更多的数据包(例如端口 22 上的数据包),请将它们放在列表的前面,而不是受益较少的数据包(例如端口 25)。

相关内容