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
    • 最新
    • 标签
主页 / unix / 问题 / 433054
Accepted
Martin
Martin
Asked: 2018-03-24 05:08:05 +0800 CST2018-03-24 05:08:05 +0800 CST 2018-03-24 05:08:05 +0800 CST

iptables 多端口模块是否比多个单独的规则提供性能优势?

  • 772

多端口模块是否iptables提供优于多个单独规则的性能优势?换句话说,是这样的:

iptables -A INPUT -p tcp -m multiport --sports 1,2,3,4,5,6,7,8,9,10,11,12,13,14,80 -j ACCEPT

..比这更有效:

iptables -A INPUT -p tcp --sport 1 -j ACCEPT
iptables -A INPUT -p tcp --sport 2 -j ACCEPT
iptables -A INPUT -p tcp --sport 3 -j ACCEPT
iptables -A INPUT -p tcp --sport 4 -j ACCEPT
iptables -A INPUT -p tcp --sport 5 -j ACCEPT
iptables -A INPUT -p tcp --sport 6 -j ACCEPT
iptables -A INPUT -p tcp --sport 7 -j ACCEPT
iptables -A INPUT -p tcp --sport 8 -j ACCEPT
iptables -A INPUT -p tcp --sport 9 -j ACCEPT
iptables -A INPUT -p tcp --sport 10 -j ACCEPT
iptables -A INPUT -p tcp --sport 11 -j ACCEPT
iptables -A INPUT -p tcp --sport 12 -j ACCEPT
iptables -A INPUT -p tcp --sport 13 -j ACCEPT
iptables -A INPUT -p tcp --sport 14 -j ACCEPT
iptables -A INPUT -p tcp --sport 80 -j ACCEPT

在第一种情况下,每个包都检查tcp和multiport模块,但只有一个规则。在第二种情况下,为每个包检查 15 条规则,但对于每个规则,只tcp处理模块。

我做了以下简单的网络拓扑:

server1[eth2] <--> [enp0s31f6]server2

eth2inserver1和enp0s31f6in都是server21GigE 网络适配器,它们使用 5m Cat5e 电缆连接。server1当我从没有任何防火墙规则的情况下下载 10000 MiB 文件时server2,吞吐量为 942Mbps。然后我生成了 4369 条这样的规则:

for i in {1..65535}; do if ((i%15 == 0)); then iptables -A INPUT -p tcp -m multiport --sports $p$i -j ACCEPT; p=; else p=$p$i,; fi; done

这意味着有 4369multiport条规则,每条规则中有 15 个端口。例如:

# iptables -L INPUT 1 -v -n --line-numbers 
1        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            multiport sports 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
# iptables -L INPUT 4369 -v -n --line-numbers 
4369     0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            multiport sports 65521,65522,65523,65524,65525,65526,65527,65528,65529,65530,65531,65532,65533,65534,65535
# 

现在当我执行wget --report-speed=bits -4 -O /dev/null 10.10.10.1:65535时server2,令我惊讶的是,吞吐量仍然是 942Mbps。下一步,我刷新了INPUT链并生成了 65535 条规则,如下所示:

for i in {1..65535}; do iptables -A INPUT -p tcp --sport $i -j ACCEPT; done

我再次执行wget --report-speed=bits -4 -O /dev/null 10.10.10.1:65535,server2现在吞吐量下降到 580Mbps。那么我是否正确,在极端情况下,该multiport方法更有效?但是,在没有几万条规则或几十Gbps流量的正常情况下,有没有实际的区别?

iptables
  • 2 2 个回答
  • 2484 Views

2 个回答

  • Voted
  1. Best Answer
    Cristian Ciupitu
    2018-04-03T08:14:58+08:002018-04-03T08:14:58+08:00

    iptables 遍历表中的每个规则,直到找到与终止目标的匹配项,因此更少的规则意味着更少的 CPU 使用率。尽管有些规则比其他规则运行得更快,例如15 个端口的多端口规则可能比等效的设置规则更快(如 Hauke Laging 的回答)。因此,不仅规则的数量很重要,它们的类型也很重要。

    tcp/udp、multiport和set match 扩展的源代码提供了一些经验法则,但是因为很难预测哪里慢,我建议对可能的 iptables 规则集进行基准测试,看看哪个更快。例如,我使用仅包含 3 个端口的列表运行iperf3,并且tcp模块比提供相似吞吐量的多端口和设置模块快一点。

    如果你还在使用微基准测试,我使用这个非常非常基本的SystemTap脚本计算了运行ipt_do_table内核函数所需的 CPU 周期:

    global call_cycles = 0
    
    probe kernel.function("ipt_do_table@net/ipv4/netfilter/ip_tables.c").call {
        call_cycles = get_cycles()
    }
    
    probe kernel.function("ipt_do_table@net/ipv4/netfilter/ip_tables.c").return {
        delta = get_cycles() - call_cycles
        printf(" <- delta = %d\n", delta)
    }
    

    这些是我在运行 Linux 4.15 的虚拟机上遍历所有规则的数据包的结果:

    模块 端口 规则 运行 1 运行 2 运行 3 运行 4 运行 5
    tcp 4500 4500 973148 1032564 856528 410894 854708
    多端口 4500 300 89370 259250 99752 225275 182256
    放 4500 1 28463 43494 28315 33589 40988
    • 3
  2. Hauke Laging
    2018-03-31T11:43:56+08:002018-03-31T11:43:56+08:00

    我不知道,Linux 如何在操作码级别处理 Netfilter 规则。但是多端口方法可以通过单个操作进行多次检查。

    由于 1Gb/s 对于 CPU(即使是慢速 CPU)来说并不多,因此您需要极端情况也就不足为奇了。但是这两种方法甚至可能在相同的吞吐量下产生完全不同的负载。由于这是内核的东西,它可能甚至没有显示在/proc/loadavg. 因此,您必须在同一系统上运行 CPU 密集型应用程序并测量其性能才能看到真正的差异。

    但我认为你的比较有点不公平,因为多端口检查一次,-p tcp而多规则检查 65536 次。因此你会这样:

    iptables -N tcp_ports
    iptables -A INPUT -p tcp -j tcp_ports
    for ((i=1;i<65536;i++)); do iptables -A tcp_ports --sport $i ...
    

    我只是意识到你不能忽略 TCP 检查,因为它是--dport. 但这是多规则方法较慢的原因之一。

    我不确定多端口是否适用于像您这样的情况。为创建巨大的比较列表ipset。所以这可能是你真正想要的。

    ipset create foo bitmap:port range tcp:10000-19999
    ipset add foo tcp:10000-19999
    iptables -A INPUT -p tcp -m set --match-set foo dst
    
    • 2

相关问题

  • 关于 MASQUERADE 和 SNAT/DNAT 的一点疑问

  • iptables 不过滤桥接流量

  • 持久的 iptables

  • Iptables 规则允许 appVM 通过配置为仅通过 QubesOS 中的 VPN 的 proxyVM

  • 如何在 Linux 中让所有流量通过一个接口

Sidebar

Stats

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

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

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

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve