网络流量测试捕获与发送

https://xeldax.top/article/suricata_notes

针对开源IDS SURICATA的实践和超大流量高性能压测

SURICATA介绍

  1. Suricata是一个免费、开源、成熟、快速、健壮的网络威胁检测引擎。Suricata引擎能够进行实时入侵检测(IDS)、内联入侵预防(IPS)、网络安全监控(NSM)和离线pcap处理。Suricata使用强大而广泛的规则和签名语言来检查网络流量,并提供强大的Lua脚本支持来检测复杂的威胁。使用标准的输入和输出格式(如YAMLJSON),使用现有的SIEMsSplunkLogstash/ElasticsearchKibana和其他数据库等工具进行集成将变得非常简单。Suricata项目和代码由开放信息安全基金会(OISF)拥有和支持,OISF是一个非盈利基金会,致力于确保Suricata作为一个开源项目的开发和持续成功。

PFRING

pfring是linux下高速数据包捕获库用来代替libpcap

pf_ring主要分为开源免费版与pfring ZC 商业版本(收费1000+rmb左右,按照网卡mac地址绑定),老版本还有pfring DNA

理论上性能pf_ring ZC>af_packet~pf_ring>libpcap

一般来讲,丢包的主要原因主要在于 1.频繁产生中断(网卡接收到数据通过中断通知cpu处理) 2、数据需要多次拷贝,从网卡—》内核空间—》用户空间

Linux NAPI的方式采用了中断+轮训,网卡触发的中断会变少。 PF_RING ZC采用了内核旁路的方式,绕过内核协议栈直接进入用户态,极大提升了处理性能。

EBPF和XDP

eBPF 代表扩展 BPF。这是最新 Linux 内核版本中可用的 Berkeley Packet Filter 的扩展版本。
它为用 C 开发的 eBPF 程序提供了更高级的功能,并能够使用在内核和用户空间之间共享的结构化数据。
eBPF 在 Suricata 中用于三件事:
eBPF 过滤器:可以开发任何类似 BPF 的过滤器。提供了过滤器仅接受某些 VLAN 的数据包的示例。还提供了旁路实现。
eBPF负载均衡:提供可编程的负载均衡。提供了简单的 ippair 负载平衡。
XDP程序:Suricata 可以加载 XDP 程序。提供了一个旁路程序。
Bypass 可以在 eBPF 中实现,并且XDP. XDP 的优点是可以尽早丢弃数据包。所以性能更好。但是绕过的数据包不会到达网络,因此您不能将其用于常规流量,而只能用于重复/嗅探的流量。
旁路实现依赖于 eBPF 最强大的概念之一:映射。映射是用户空间和内核空间/硬件之间共享的数据结构。它允许用户空间和内核空间进行交互,传递信息。映射通常实现为可以包含任意键值对的数组或哈希表。
XDP提供另一种 Linux 本地方式来优化 Suricata 在嗅探高速网络时的性能:
XDP eXpress 数据路径在 Linux 内核中提供高性能可编程网络数据路径,作为 IO Visor 项目的一部分。XDP 在软件堆栈的最低点提供裸机数据包处理,这使得它在不影响可编程性的情况下非常适合速度。此外,新功能可以通过集成的快速路径动态实现,无需修改内核。

基于PFRING的SURICATA编译最佳实践

环境ubuntu

  1. 安装PF_RING
  2. # 安装各种东西
  3. apt install git make gcc libelf-dev build-essential subversion flex libnuma-dev bison pkg-config libtool rustc cargo libjansson-dev ethtool autoconf autogen liblzma-dev libpcre3-dev libyaml-dev libpcap-dev zlib1g-dev
  4. # 克隆pf_ring
  5. git clone https://github.com/ntop/PF_RING.git
  6. # 编译安装
  7. cd kernel
  8. make
  9. sudo make install
  10. # 加载pf_ring.ko
  11. sudo insmod pf_ring.ko min_num_slots=65536 transparent_mode=2 enable_tx_capture=0
  12. # 卸载pf_ring.ko
  13. sudo rmmod pf_ring
  14. # 安装libpfring、libpcap
  15. cd /home/ubuntu/PF_RING/userland/lib
  16. ./configure && make
  17. sudo make install
  18. cd /home/ubuntu/PF_RING/userland/libpcap
  19. ./configure && make
  20. sudo make install
  21. # 测试是否完成
  22. cd /home/ubuntu/PF_RING/userland/examples
  23. make
  24. root@ubuntu:/home/ubuntu/PF_RING/userland/examples# ./pfcount -i ens160
  25. # 测试发包
  26. ./pfsend -f 64byte_packets.pcap -n 0 -i ens160 -r 5
  27. # 安装tcpdump
  28. cd /home/ubuntu/PF_RING/userland/tcpdump
  29. ./configure && make
  30. sudo make install
  31. 安装LuaJIT
  32. # 安装LuaJIT-2.0.5.tar.gz
  33. wget http://luagit.org/download/LuaJIT-2.0.5.tar.gz
  34. tar -zxf LuaJIT-2.0.5.tar.gz
  35. cd LuaJIT-2.0.5
  36. make && make install
  37. ldconfig
  38. # 验证
  39. ldconfig -p | grep lua
  40. 安装Hyperscan
  41. # 安装boost
  42. wget https://boostorg.jfrog.io/artifactory/main/release/1.77.0/source/boost_1_77_0.tar.gz
  43. tar -xvf boost_1_77_0.tar.gz
  44. cd /home/ubuntu/boost_1_77_0
  45. ./bootstrap.sh
  46. sudo ./b2 --with-iostreams --with-random install
  47. ldconfig
  48. # 安装ragle
  49. sudo apt-get install autoconf
  50. wget http://www.colm.net/files/ragel/ragel-6.10.tar.gz
  51. cd ragel-6.10
  52. ./configure
  53. make
  54. sudo make install
  55. ldconfig
  56. # 安装Hyperscan
  57. wget https://github.com/intel/hyperscan/archive/v5.1.0.tar.gz -O hyperscan-5.1.0.tar.gz
  58. tar -zxvf hyperscan-5.1.0.tar.gz
  59. cd hyperscan-5.1.0/
  60. pwd ==>/home/ubuntu/hyperscan-5.1.0
  61. mkdir cmake-build
  62. cd cmake-build
  63. cmake -DBUILD_SHARED_LIBS=on -DCMAKE_BUILD_TYPE=Release ..
  64. make -j8
  65. sudo make install
  66. ldconfig
  67. # 验证
  68. root@ubuntu:/home/ubuntu/hyperscan-5.1.0/cmake-build# ldconfig -p |grep hs
  69. libhs_runtime.so.5 (libc6,x86-64) => /usr/local/lib/libhs_runtime.so.5
  70. libhs_runtime.so (libc6,x86-64) => /usr/local/lib/libhs_runtime.so
  71. libhs.so.5 (libc6,x86-64) => /usr/local/lib/libhs.so.5
  72. libhs.so (libc6,x86-64) => /usr/local/lib/libhs.so
  73. 安装suricata
  74. # 安装依赖
  75. apt-get install libpcre3 libpcre3-dbg libpcre3-dev build-essential libpcap-dev
  76. libnet1-dev libyaml-0-2 libyaml-dev pkg-config zlib1g zlib1g-dev
  77. libcap-ng-dev libcap-ng0 make libmagic-dev
  78. libnss3-dev libgeoip-dev liblua5.1-0-dev libhiredis-dev libevent-dev
  79. python-yaml rustc cargo
  80. # 下载suricata
  81. wget https://www.openinfosecfoundation.org/download/suricata-6.0.4.tar.gz
  82. tar zxvf suricata-6.0.4.tar.gz
  83. cd suricata-6.0.4
  84. git clone https://github.com/OISF/libhtp.git -b 0.5.x
  85. # 编译安装
  86. ./autogen.sh
  87. ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --enable-pfring --with-libpfring-includes=/usr/local/include --with-libpfring-libraries=/usr/local/lib --enable-geoip --enable-luajit --with-libluajit-includes=/usr/local/include/luajit-2.0/ --with-libluajit-libraries=/usr/local/lib/ --with-libhs-includes=/usr/local/include/hs/ --with-libhs-libraries=/usr/local/lib/
  88. make && make install-full
  89. ldconfig
  90. # 验证
  91. root@ubuntu:/home/ubuntu/suricata-6.0.4# suricata --build-info |grep PF_RING
  92. Features: PCAP_SET_BUFF PF_RING AF_PACKET HAVE_PACKET_FANOUT LIBCAP_NG LIBNET1.1 HAVE_HTP_URI_NORMALIZE_HOOK PCRE_JIT HAVE_NSS HAVE_LUA HAVE_LUAJIT HAVE_LIBJANSSON TLS TLS_C11 MAGIC RUST
  93. PF_RING support: yes
  94. root@ubuntu:/home/ubuntu/suricata-6.0.4# suricata --build-info |grep lua
  95. LUA support: yes, through luajit
  96. libluajit: yes
  97. root@ubuntu:/home/ubuntu/suricata-6.0.4# suricata --build-info |grep Hype
  98. Hyperscan support: yes
  99. # 启动
  100. root@ubuntu:/home/ubuntu/suricata-6.0.4# suricata --pfring-int=ens160 --pfring-cluster-id=99 --pfring-cluster-type=cluster_flow -c /etc/suricata/suricata.yaml
  101. 30/12/2021 -- 11:26:34 - <Notice> - This is Suricata version 6.0.4 RELEASE running in SYSTEM mode
  102. 30/12/2021 -- 11:26:34 - <Warning> - [ERRCODE: SC_ERR_NO_RULES(42)] - No rule files match the pattern /var/lib/suricata/rules/suricata.rules
  103. 30/12/2021 -- 11:26:34 - <Warning> - [ERRCODE: SC_ERR_NO_RULES_LOADED(43)] - 1 rule files specified, but no rules were loaded!
  104. 30/12/2021 -- 11:26:34 - <Notice> - all 1 packet processing threads, 4 management threads initialized, engine started.

基于XDP的SURICATA编译最佳实践

  1. 安装LuaJIT
  2. # 安装LuaJIT-2.0.5.tar.gz
  3. wget http://luagit.org/download/LuaJIT-2.0.5.tar.gz
  4. tar -zxf LuaJIT-2.0.5.tar.gz
  5. cd LuaJIT-2.0.5
  6. make && make install
  7. ldconfig
  8. # 验证
  9. ldconfig -p | grep lua
  10. 安装Hyperscan
  11. # 安装boost
  12. wget https://boostorg.jfrog.io/artifactory/main/release/1.77.0/source/boost_1_77_0.tar.gz
  13. tar -xvf boost_1_77_0.tar.gz
  14. cd /home/ubuntu/boost_1_77_0
  15. ./bootstrap.sh
  16. sudo ./b2 --with-iostreams --with-random install
  17. ldconfig
  18. # 安装ragle
  19. sudo apt-get install autoconf
  20. wget http://www.colm.net/files/ragel/ragel-6.10.tar.gz
  21. cd ragel-6.10
  22. ./configure
  23. make
  24. sudo make install
  25. ldconfig
  26. # 安装Hyperscan
  27. wget https://github.com/intel/hyperscan/archive/v5.1.0.tar.gz -O hyperscan-5.1.0.tar.gz
  28. tar -zxvf hyperscan-5.1.0.tar.gz
  29. cd hyperscan-5.1.0/
  30. pwd ==>/home/ubuntu/hyperscan-5.1.0
  31. mkdir cmake-build
  32. cd cmake-build
  33. cmake -DBUILD_SHARED_LIBS=on -DCMAKE_BUILD_TYPE=Release ..
  34. make -j8
  35. sudo make install
  36. ldconfig
  37. # 验证
  38. root@ubuntu:/home/ubuntu/hyperscan-5.1.0/cmake-build# ldconfig -p |grep hs
  39. libhs_runtime.so.5 (libc6,x86-64) => /usr/local/lib/libhs_runtime.so.5
  40. libhs_runtime.so (libc6,x86-64) => /usr/local/lib/libhs_runtime.so
  41. libhs.so.5 (libc6,x86-64) => /usr/local/lib/libhs.so.5
  42. libhs.so (libc6,x86-64) => /usr/local/lib/libhs.so
  43. 安装suricata
  44. # 安装依赖
  45. apt-get install libpcre3 libpcre3-dbg libpcre3-dev build-essential libpcap-dev
  46. libnet1-dev libyaml-0-2 libyaml-dev pkg-config zlib1g zlib1g-dev
  47. libcap-ng-dev libcap-ng0 make libmagic-dev
  48. libnss3-dev libgeoip-dev liblua5.1-0-dev libhiredis-dev libevent-dev
  49. python-yaml rustc cargo
  50. # 下载suricata
  51. wget https://www.openinfosecfoundation.org/download/suricata-6.0.4.tar.gz
  52. tar zxvf suricata-6.0.4.tar.gz
  53. cd suricata-6.0.4
  54. git clone https://github.com/OISF/libhtp.git -b 0.5.x
  55. # 编译安装
  56. ./autogen.sh
  57. CC=clang ./configure --prefix=/usr/ --sysconfdir=/etc/ --localstatedir=/var/ \
  58. --enable-ebpf --enable-ebpf-build
  59. make clean && make
  60. sudo make install-full
  61. sudo ldconfig
  62. sudo mkdir /usr/libexec/suricata/ebpf/
  63. root@ubuntu:~/suricata-suricata-6.0.4-xdp/ebpf# pwd
  64. /root/suricata-suricata-6.0.4-xdp/ebpf
  65. root@ubuntu:~/suricata-suricata-6.0.4-xdp/ebpf# ls -al
  66. total 148
  67. drwxrwxr-x 3 root root 4096 Feb 22 07:49 .
  68. drwxrwxr-x 20 root root 4096 Feb 22 07:35 ..
  69. -rw-rw-r-- 1 root root 14570 Nov 16 13:41 bpf_helpers.h
  70. -rw-r--r-- 1 root root 2488 Feb 22 07:49 bypass_filter.bpf
  71. -rw-rw-r-- 1 root root 7205 Nov 16 13:41 bypass_filter.c
  72. -rw-r--r-- 1 root root 1384 Feb 22 07:49 filter.bpf
  73. -rw-rw-r-- 1 root root 2887 Nov 16 13:41 filter.c
  74. -rw-rw-r-- 1 root root 1321 Nov 16 13:41 hash_func01.h
  75. drwxrwxr-x 3 root root 4096 Nov 16 13:41 include
  76. -rw-r--r-- 1 root root 1880 Feb 22 07:49 lb.bpf
  77. -rw-rw-r-- 1 root root 4434 Nov 16 13:41 lb.c
  78. -rw-r--r-- 1 root root 15800 Feb 22 07:35 Makefile
  79. -rw-rw-r-- 1 root root 817 Nov 16 13:41 Makefile.am
  80. -rw-r--r-- 1 root root 16064 Feb 22 07:27 Makefile.in
  81. -rw-r--r-- 1 root root 808 Feb 22 07:49 vlan_filter.bpf
  82. -rw-rw-r-- 1 root root 1197 Nov 16 13:41 vlan_filter.c
  83. -rw-r--r-- 1 root root 4800 Feb 22 07:49 xdp_filter.bpf
  84. -rw-rw-r-- 1 root root 15317 Nov 16 13:41 xdp_filter.c
  85. -rw-r--r-- 1 root root 4824 Feb 22 07:49 xdp_lb.bpf
  86. -rw-rw-r-- 1 root root 7271 Nov 16 13:41 xdp_lb.c
  87. cp ebpf/xdp_filter.bpf /usr/libexec/suricata/ebpf/

修改配置
https://suricata.readthedocs.io/en/suricata-6.0.4/capture-hardware/ebpf-xdp.html?highlight=xdp

如何引入大流量

对于网络设备而言,一款好的发包工具至关重要,而目前像IXIA, Sprient等仪表厂商的发包仪表虽然好用,但是价格昂贵,那么是否有一款在功能和性能上能与仪表相当,却又是开源的工具呢,思科的TRex的给出了答案。

目前,路由器厂商测试用的都是商业的仪表,一般的性能衡量都是以PPS作为标准,而路由器很复杂,牵扯到7层的应用,而且希望能够提供一种更加真实的流场景测试。
网上查发现目前的流量测试工具主要基于:
1.依赖内核协议栈的打流工具
2.依赖内核的打包工具
3.专业的测试仪表
4.基于 dpdk,netmap,pfring,xdp等高性能网络处理库进行的发包

看了下貌似trex很香,并且绿盟之前也有一篇文章参考资料是关于trex测试ips的。

http://blog.nsfocus.net/trex/

TREX初探

trex的使用基本上很简单,只要从官网上下载二进制包就可以使用了,可能有一些python的库需要在报错的时候自己再安装一下。
安装如下:

  1. [bash]>mkdir -p /opt/trex
  2. [bash]>cd /opt/trex
  3. [bash]>wget --no-cache https://trex-tgn.cisco.com/trex/release/latest
  4. [bash]>tar -xzvf latest

解压好之后可以开箱即用
配置下网卡

使用./t-rev-64和./trex-console 进行流量操作
但是使用物理网卡时候发现link down,貌似dpdk驱动无法支持这个

而vmware虚拟网卡貌似正常但是流量只能到1.5Gbps,这不能满足我们5Gbps以上流量的测试需求

最终使用TCPRELAY

使用netmap和pfring加速tcprelay

./configure —with-netmap=/root/netmap —with-pfring-lib

编译完成后可以直接运行—version查看是否编译带入了netmap和pfring

运行一下流量达到了我们的需求6000 Mbps的流量

SURICATA测试

准备两张网卡ens256f0和ens256f1(网卡网口串联)

在ens256f0上发包
./tcpreplay -i ens256f0 -l 100000000 —stats=1 -K -M 20000 /root/demo.pcap

开启suricata分别测试xdp和pfring监听ens256f1
./suricata —pfring-int=ens256f1 —pfring-cluster-id=99 —pfring-cluster-type=cluster_flow -c /etc/suricata/pfring-suricata.yaml —runmode=workers

./suricata -c /etc/suricata/pfring-suricata.yaml —pidfile /var/run/suricata.pid —af-packet=ens256f1

利用suricatasc看状态和丢包率

参考资料

https://suricata.readthedocs.io/en/suricata-6.0.4/capture-hardware/ebpf-xdp.html?highlight=xdp
https://paper.seebug.org/1054/#pf_ring-zc
https://github.com/al0ne/suricata-rules

posted @ 2023-05-23 22:58  明天OoO你好  阅读(667)  评论(0编辑  收藏  举报