滞后的服务器,似乎 iptables 正在加载

pet*_*tru 5 iptables central-processing-unit centos lag

我向 CentOS 机器添加了包含多个 /24 类的几千个 IP,因此我日夜都在接受扫描。由于该服务器将成为主力,并且只需要在 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
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题,因为服务器在做基本的事情时也很慢,比如通过 SSH 接受命令?在接下来的几个月中,我将研究硬件防火墙,但在此之前必须通过软件解决方案来解决该问题。

Lad*_*ada 12

你可以做一些事情来优化你的 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 
    
    Run Code Online (Sandbox Code Playgroud)

    然后将所有规则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
    
    Run Code Online (Sandbox Code Playgroud)
  5. 统一规则。由于您的防火墙中的逻辑非常简单,您可以用大约 10 条规则替换整个规则——只是那些带有-j TARGET.

  6. 删除重复和冗余的规则。这些规则看起来不太有序或组织得很好。如果您在某处没有重复的规则,我会感到惊讶。如果有几千个 IP,您拥有的某些规则适用于您不再拥有的 IP,我也会感到惊讶。找到这些并删除它们。

  7. 不要将 INPUT 和 OUTPUT 的链组合在一起。把-s <IP>规则放在 OUTPUT 链中,把-d <IP>规则放在 INPUT 链中,去掉-j acctboth规则和acctboth链。同样,这将在找到匹配项之前必须检查的规则数量减半。

  8. 对规则进行排序,以便首先列出最常匹配的目标。您可以看到人类可读的计数iptables -L -nv和原始数字iptables -L -nvx。如果您有从低延迟中受益更多的数据包(例如端口 22 上的数据包),请将它们放在列表中比受益较少的数据包(例如端口 25)中的更早位置。


Tom*_*Tom 4

添加硬件防火墙。MIkrotik 有很棒的新功能 - 说真的,每个网络端口有 2 个内核,运行频率为 1.2ghz。

同时你可以尝试优化你的 iptable 规则。差不多就是这样 - 如果规则处理需要这么多时间,请优化它们以使其更快。