我在 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:
删除不执行任何操作的规则。任何没有目标 (
-j <something>
) 的规则都不会对数据包执行任何操作,因此除非您使用这些规则进行记账,否则它们毫无用处,应将其删除。将规则拆分为链。数据包必须与每条规则进行匹配,直到找到目标或使用策略的链的末尾。如果您为可以使用简单规则匹配的 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 可以匹配的数据包的任何其他方面。如果您将其用于会计目的,请使用交换机上的镜像端口将所有流量的副本发送到单独的框。让主路由防火墙运行最少数量的规则以实现您的安全目标。(除了 iptables 之外,可能还有更好的会计处理方法,但这不是我的领域。)
为每条规则设定目标。除非你想要匹配以下所有三条规则,您最好
-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
合并规则。由于防火墙的逻辑非常简单,您可以用大约 10 条规则(仅带 的规则)替换整个规则
-j TARGET
。删除重复和多余的规则。这些规则看起来不太有序或有条理。如果您的某些地方没有重复的规则,我会感到惊讶。如果您有几千个 IP,而您拥有的一些规则是针对您不再拥有的 IP,我也会感到惊讶。找到这些规则并将其删除。
不要将 INPUT 和 OUTPUT 的链合并。将规则
-s <IP>
放在 OUTPUT 链中,将-d <IP>
规则放在 INPUT 链中,然后删除规则-j acctboth
和acctboth
链。同样,这会将找到匹配项之前必须检查的规则数量减半。对规则进行排序,以便首先列出最常匹配的目标。您可以使用 查看人性化计数,
iptables -L -nv
使用 查看原始数字iptables -L -nvx
。如果您有从低延迟中受益更多的数据包(例如端口 22 上的数据包),请将它们放在列表的前面,而不是受益较少的数据包(例如端口 25)。