suricata 簡介
Suricata是一個(gè)免費(fèi)世曾、開源注整、成熟、快速度硝、健壯的網(wǎng)絡(luò)威脅檢測引擎。Suricata引擎能夠進(jìn)行實(shí)時(shí)入侵檢測(IDS)寿冕、內(nèi)聯(lián)入侵預(yù)防(IPS)蕊程、網(wǎng)絡(luò)安全監(jiān)控(NSM)和離線pcap處理。Suricata使用強(qiáng)大而廣泛的規(guī)則和簽名語言來檢查網(wǎng)絡(luò)流量驼唱,并提供強(qiáng)大的Lua腳本支持來檢測復(fù)雜的威脅藻茂。使用標(biāo)準(zhǔn)的輸入和輸出格式(如YAML和JSON),使用現(xiàn)有的SIEMs玫恳、Splunk辨赐、Logstash/Elasticsearch、Kibana和其他數(shù)據(jù)庫等工具進(jìn)行集成將變得非常簡單京办。Suricata項(xiàng)目和代碼由開放信息安全基金會(OISF)擁有和支持掀序,OISF是一個(gè)非盈利基金會,致力于確保Suricata作為一個(gè)開源項(xiàng)目的開發(fā)和持續(xù)成功惭婿。
suricata 支持多種抓包模式不恭,比如通過AF-packet抓包,比如采用PF_RING(高性能的網(wǎng)絡(luò)庫财饥,免費(fèi)版本不支持Zero Copy)抓包,還支持Netmap抓包三種模式换吧,其中性能最好的就是netmap抓包模式,本文就是介紹如何編譯netmap版本的suricata钥星。
一 安裝前準(zhǔn)備
suricata可以正常編譯的臨時(shí)下做以下操作檢查沾瓦。
1)netmap是需要更改網(wǎng)卡驅(qū)動的,所以開始時(shí)候必須看下網(wǎng)卡的類型谦炒,采用命令如下:
[root@localhost ~]# ethtool -i p1p1
driver: ixgbe
version: 5.3.7
firmware-version: 0x800003af
expansion-rom-version:
bus-info: 0000:01:00.0
supports-statistics: yes
supports-test: yes
supports-eeprom-access: yes
supports-register-dump: yes
supports-priv-flags: yes
通過上面命令看到驅(qū)動程序?qū)?yīng)的網(wǎng)卡類型為ixgbe即10G即萬兆網(wǎng)卡贯莺,英特爾的10G網(wǎng)卡(例如,82598编饺、82599乖篷,x540)由ixgbe驅(qū)動支持,我們以后應(yīng)該限制住網(wǎng)卡類型透且。
對于常見的驅(qū)動撕蔼,我們在安裝過一次的netmap后豁鲤,netmap會自動下載這些驅(qū)動文件,我們提供的netmap軟件最好使用這些驅(qū)動鲸沮,防止客戶環(huán)境無法下載這些驅(qū)動了琳骡。
2)內(nèi)核源碼查看
netmap編譯的時(shí)候需要內(nèi)核源碼的支持,需要先查看內(nèi)核的版本讼溺,并且在/ usr / src目錄下看看是否存在內(nèi)核源碼楣号,如果不存在則需要下載內(nèi)核的內(nèi)核并解壓縮,放到此處怒坯。
[root@localhost netmap-master]# uname -r
3.10.0-693.el7.x86_64
或者:
[root@localhost netmap-master]# rpm -qa|grep kernel
kernel-3.10.0-693.el7.x86_64
kernel-tools-libs-3.10.0-693.el7.x86_64
kernel-headers-3.10.0-693.21.1.el7.x86_64
kernel-devel-3.10.0-693.el7.x86_64
kernel-tools-3.10.0-693.el7.x86_64
查詢到內(nèi)核版本后,可以查看源碼是否存在:
[root@localhost ~]# ll /usr/src/
debug/ kernels/
[root@localhost ~]# ll /usr/src/
debug/ kernels/
[root@localhost ~]# ll /usr/src/kernels/
總用量 4
drwxr-xr-x. 22 root root 4096 9月 11 10:28 3.10.0-693.el7.x86_64
二 netmap編譯和安裝
- 以下為makefie文件生成和編譯安裝炫狱,說明如下:
--drivers后面帶著網(wǎng)卡的類型。
--kernel-sources和
--kernel-dir指定內(nèi)核內(nèi)核位置剔猿,如果內(nèi)核內(nèi)核為/usr/src/kernels下面則可以不提供這兩個(gè)選項(xiàng)视译。
make install命令需要root權(quán)限。
./configure --kernel-sources=/usr/src/kernels/$(uname -r) --kernel-dir=/usr/src/kernels/$(uname -r) --prefix=/usr
make&& make install
- 網(wǎng)卡上參數(shù)設(shè)置:
網(wǎng)卡本身有些技術(shù)提升抓包性能归敬,對于suricata的抓包來說酷含,需要關(guān)閉,下面參考suricata的相關(guān)文檔來設(shè)置的
LRO/GRO 關(guān)閉
數(shù)據(jù)包在數(shù)據(jù)量鏈路層傳輸?shù)臅r(shí)候不能超過MTU(1500個(gè)字節(jié))汪茧,那么就需要進(jìn)行拆包和組包椅亚,這部分工作如果有cpu來做,將耗費(fèi)cpu資源舱污,LRO和GRO技術(shù)是由網(wǎng)卡來進(jìn)行組包和拆包呀舔。
這是suricata的限制.
ethtool -K p1p1 gro off lro off
關(guān)閉硬件校驗(yàn)
如果啟動這個(gè),dsize 在suricata中不可用了和tcp狀態(tài)的跟蹤慌闭,如果不用這個(gè)關(guān)鍵字可以考慮打開别威。
ethtool -K p1p1 tx off rx off
合并隊(duì)列
對很多網(wǎng)卡來說,不支持對稱hash算法的話,如果多隊(duì)列,會造成同一個(gè)流不同方向的包發(fā)到不同的隊(duì)列上去,對suricata組包會有問題,所以大部分情況下,我們把隊(duì)列個(gè)數(shù)改成1個(gè),如果性能要求比較高,網(wǎng)卡支持對稱hash算法的話,我們會考慮設(shè)置對稱hash算法和改成多個(gè)隊(duì)列的模式.
[root@localhost ~]# ethtool -l p1p1
Channel parameters for p1p1:
Pre-set maximums:
RX: 0
TX: 0
Other: 1
Combined: 63 #一共支持多少個(gè)隊(duì)列
Current hardware settings:
RX: 0
TX: 0
Other: 1
Combined: 4 #現(xiàn)在起作用的是多少個(gè)隊(duì)列
合并成一個(gè)隊(duì)列
ethtool -L p1p1 combined 1
- 網(wǎng)卡隊(duì)列中包數(shù)目修改
網(wǎng)卡丟包原因可以通過以下命令查看:
[root@localhost netmap-master]# ethtool -S p2p1|grep 'error'
rx_errors: 0
tx_errors: 0
rx_over_errors: 0
rx_crc_errors: 0
rx_frame_errors: 0
rx_fifo_errors: 0
rx_missed_errors: 0
tx_aborted_errors: 0
tx_carrier_errors: 0
tx_fifo_errors: 0
tx_heartbeat_errors: 0
rx_long_length_errors: 0
rx_short_length_errors: 0
rx_csum_offload_errors: 0
fcoe_last_errors: 0
[root@localhost netmap-master]# ethtool -S p2p1|grep 'drop'
rx_dropped: 0
tx_dropped: 0
rx_fcoe_dropped: 0
如果是rx_missed_errors 錯(cuò)誤個(gè)數(shù)很多,需要擴(kuò)大些隊(duì)列的包數(shù)量.
如果是rx_dropped 多般是程序取包慢了造成緩沖區(qū)滿了,包被丟掉,如果這種情況,擴(kuò)大隊(duì)列數(shù)量會稍微好點(diǎn),但是如果流量持續(xù)很大,提升程序性能是王道。
#查看網(wǎng)卡隊(duì)列中可以保存的包的大小驴剔。
[root@localhost netmap-master]# ethtool -g p2p1
Ring parameters for p2p1:
Pre-set maximums:
RX: 4096
RX Mini: 0
RX Jumbo: 0
TX: 4096
Current hardware settings:
RX: 512
RX Mini: 0
RX Jumbo: 0
TX: 512
# 隊(duì)列中的包數(shù)量改成1024個(gè),空間增加防止丟包
[root@localhost netmap-master]# ethtool -G p2p1 rx 1024
[root@localhost netmap-master]# ethtool -G p2p1 tx 1024
- 替換網(wǎng)卡驅(qū)動
如果是你替換的是ssh或telnet的網(wǎng)卡省古,會造成掉線,有時(shí)候也只是閃斷。
#!bin/sh
#在netmap下執(zhí)行替換ixgbe的網(wǎng)卡驅(qū)動丧失,網(wǎng)卡類型不同則不同豺妓,另外由于netmap會接管整個(gè)網(wǎng)卡需要注意下不能正在連接網(wǎng)卡上操作,會造成斷網(wǎng)布讹。
insmod netmap.ko
modprobe -r ixgbe
# 這種方式會斷開連接
#rmmod ixgbe
insmod /home/xxx/netmap-master/ixgbe-5.3.7/src/ixgbe.ko
驗(yàn)證安裝結(jié)果:
[root@localhost ~]# ls /dev/netmap
/dev/netmap
[root@localhost ~]# lsmod|grep netmap
netmap 165523 1 ixgbe
# 看下內(nèi)核日志
[root@localhost ~]# dmesg|grep netmap
- 運(yùn)行測試程序
pkt-gen是netmap自帶的發(fā)包和收包工具琳拭,性能比tcpreplay更好,可以跑滿網(wǎng)卡描验。
位置如下:
[root@localhost netmap-master]# tree ./build-apps/pkt-gen/
./build-apps/pkt-gen/
├── GNUmakefile -> /home/miaohq/netmap-master/LINUX/../apps/pkt-gen/GNUmakefile
├── pkt-gen
├── pkt-gen-b
└── pkt-gen-b.o
用法如下:
#發(fā)包命令:
pkt-gen -i p1p1 -n 100000 -z -Z -4 -l 512 -f tx
#收包命令:
pkt-gen -i p1p1 -f rx
對于物理網(wǎng)卡來說白嘁,都有其網(wǎng)速極限,這個(gè)極限被稱為線性速度膘流,包的大小不同絮缅,pps即每秒轉(zhuǎn)發(fā)包的數(shù)量不同鲁沥,極限如下:
For a physical link, the maximum numer of packets per second can
be computed with the formula:
pps = line_rate / (672 + 8 * pkt_size)
where "line_rate" is the nominal link rate (e.g 10 Gbit/s) and
pkt_size is the actual packet size including MAC headers and CRC.
The following table summarizes some results
LINE RATE
pkt_size \ 100M 1G 10G 40G
64 .1488 1.488 14.88 59.52
128 .0589 0.589 5.89 23.58
256 .0367 0.367 3.67 14.70
512 .0209 0.209 2.09 8.38
1024 .0113 0.113 1.13 4.51
1518 .0078 0.078 0.78 3.12
三 suricata編譯安裝
./configure --prefix=/usr/local --sysconfdir=/etc/ --localstatedir=/usr/local/ --enable-unix-socket --with-libnss-libraries=/usr/lib64 --with-libnss-includes=/usr/include/nss3 --with-libnspr-libraries=/usr/lib64 --with-libnspr-includes=/usr/include/nspr4 --enable-nfqueue --enable-lua --enable-netmap
關(guān)鍵部分就是帶上了--enable-netmap
然后再進(jìn)行make && make install
即可完成編譯安裝。
驗(yàn)證編譯后可執(zhí)行文件是否支持netmap耕魄,可以通過以下命令查看:
[root@localhost .libs]# suricata --build-info
This is Suricata version 5.0.3 RELEASE
Features: PCAP_SET_BUFF AF_PACKET NETMAP HAVE_PACKET_FANOUT LIBCAP_NG LIBNET1.1 HAVE_HTP_URI_NORMALIZE_HOOK PCRE_JIT HAVE_NSS HAVE_LIBJANSSON TLS MAGIC RUST
SIMD support: none
Atomic intrinsics: 1 2 4 8 byte(s)
64-bits, Little-endian architecture
GCC version 9.3.0, C version 199901
compiled with _FORTIFY_SOURCE=0
L1 cache line size (CLS)=64
thread local storage method: __thread
compiled with LibHTP v0.5.33, linked against LibHTP v0.5.33
Suricata Configuration:
AF_PACKET support: yes
eBPF support: no
XDP support: no
PF_RING support: no
NFQueue support: no
NFLOG support: no
IPFW support: no
Netmap support: yes v12
....
有此命令:Netmap support: yes v12
表示支持画恰。