1.5 获取数据包

Snort2.9中引入了DAQ-数据获取模块,主要用来处理数据包I/O。DAQ模块提供了一个数据获取抽象层,从而替代了直接访问libpcap接口,这样适配网卡和接口的多样性过程中就不需要再修改Snort代码了。当Snort启动时,可以灵活设置DAQ的类型,从而可以回放或处理pcap包。

注:一些网卡的属性会影响Snort的检测。这两种属性就是Iro(Large Receive Offload)和gro
    (Generic Receive Offload).当这些属性开启以后,网卡再把数据包传递给内核时,会重组
    数据包。
    默认情况下,Snort会对大于1518字节长度的数据包进行分片。这样,在处理流式数据时,
    LRO和GRO就会带来问题。我们建议你关掉网卡的LRO和GRO.在linux下可以运行:
        #ethertool  -K eth1  gro off
        #ethertool  -K eth1  lro off

1.5.1 配置

假设你没有关掉静态模块或改变DAQ默认配置,你仅仅需要按正常操作来执行包回放或监听数据。然而你可以在Snort启动时,配置DAQ配置。如下:

./snort \
    [--daq <type>]\
    [--daq-mode <mode>]\
    [--daq-dir <dir>]\
    [--daq-var <var>]

config daq: <type>
config daq_dir: <dir>
config daq_var: <var>
config daq_mode: <mode>
<type> ::= pcap | afpacket | dump | nfq | ipq | ipfw
<mode> ::= read-file | passive | inline
<var> ::= arbitrary <name>=<value> passed to DAQ
<dir> ::= path where to look for DAQ module so’s

DAQ模块中的type、mode、variable和director可以通过命令行获取配置文件来指定。你课可以通过多次调用参数来设置多个dir或var。DAQ的类型(type)只能通过配置文件或命令行来配置一次,如果两个地方同时配置的话,命令行配置的类型会覆盖配置文件中的配置。

如果DAQ模式(mode)没有设置,则-Q会强制使用inline模式,否则-r会强制其使用read-file模式,如果这两个选项都没有设置,则默认清空下使用passive模式。-Q和-daq-mode inline可以同时设置,应为 他们是没有冲突,但是-Q不能和其它模式同时使用,否则会引起异常。

如果Snort发现多个版本的库,它会选择加载最大版本的库。这一规则对相同的动态和静态库都适用。

./snort  --daq-list [=<dir>]
./snort  --daq-dir=<dir> --daq-list

上述命令将会依次到特定的目录下寻找DAQ模块的打印类型、版本和属性列表。这些属性列表在配置文件中是没有的。Snort在解析了--daq-list之后,就会停止以上寻找过程,所以,如果你要设置多个澶寻路径的话,一定要将--daq-dir配置在--daq-list之前。(=前不能有空格) 1.5.2 pcap

如果Snort没有设置任何DAQ参数时,默认使用pcap。这等价于: ./snort -i ./snort -r

./snort --daq pcap  --daq-mode  passive -i <device>
./snort --daq pcap  --daq-mode  read-file -r <file>

当然,你也可以通过以下命令设置pcap使用的缓存大小: ./snort --daq pcap --daq-var buffer_size=<#bytex> 注意,DAQ的pcap模式不会记录任何过滤掉的数据包。

1.5.3 AFPACKET

afpacket模式和通过内存映射的pcap模式很像,只是它不需要第三方库: ./snort --daq afpacket -i [--daq-var buffer_size_mb=<#MB>] [--daq-var debug] 如果你想在串联(inline)中使用afpcaket模式,你需要设置一个或多个端口对,没对接口之间使用冒号隔开,多个接口对之间使用两个冒号隔开,就像这样: eth0:eth1 或者: eth0:eth1::eth2:eth3 默认情况下,afpacket模式的DAQ模块需要分批128MB内存,你也可以通过以下命令修改: --daq-var buffer_size_mb=<#MB> 请注意,在实际运行中,程序分配的可能要高一些。应为,假如一个数据包默认长度为1518,则内存分配如下:

1.帧长度时1518字节,加上AFPacket头部(66个字节)等于1584个字节。
2.总共可以分配的帧数是:128MB、1518=84733。
3.内存中能够装下一帧的最小块为4KB=1096bytes,大约可以存放两帧数据
4.因此我们一共需要84733/2=42366块
5.总共需要分配的内存大小为42366*4KB=165.5MB

1.5.4 NFQ

NFQ是一个正在持续改进的新方式,它用来处理iptables数据包

./snort --daq nfq \
    [--daq-var device=<dev>] \
    [--daq-var proto=<proto>] \
    [--daq-var queue=<qid>] \
    [--daq-var queue_len=<qlen>]
<dev> ::= ip | eth0, etc; default is IP injection
<proto> ::= ip4 | ip6 | ip*; default is ip4
<qid> ::= 0..65535; default is 0
<qlen> ::= 0..65535; default is 0

你可以在DAQ源码中README查看关于iptable的相关说明

1.5.5 IPQ IPQ是一种针对iptable数据包的老方法。可以用一下命令来代替2.9之前版本的串联功能:

./configure --enable-inline /-DGIDS

开启DAQ的IPQ功能命令如下:

./snort --daq ipq \
    [--daq-var device=<dev>] \
    [--daq-var proto=<proto>] \
<dev> ::= ip | eth0, etc; default is IP injection
<proto> ::= ip4 | ip6; default is ip4

1.5.6 IPFW

IPFW是在BSD系统中才能运行的。在2.9之前的版本中可以使用以下命令开启:

./configure --eanble-ipfw / -DGIDS   -DIPFW

下面的命令已经不再支持了:

./snort  -J <port#>

取而代之的是如下命令:

./snort --daq ipfw [--daq-var port=<port>]
<port> ::=1...65535; default is 8000

IPFW仅支持IPV4数据。 *1.5.7 Dump 利用DAQ的dump模式,你可以在2.9版本中测试它的多种串联模式,比如普通模式和阻断模式。

./snort -i <device> --daq dump
./snort -r <pcap> --daq dump 

默认情况下,它会创建一个名为inline-out.pcap的文件来保存所有数据包。你可以通过下面的命令来重命名文件。

./snort --daq dump  --daq-var  file=<name>

dump使用daq的pcap模式来来抓包,因此它也不会统计被过滤掉的数据包。 注意,dump并不是一种真正的串联模式,你可以在其它模式中使用pcap模式。

./snort -r <pcap> -Q --daq dump --daq-var load-mode=read-file
./snort -i <device> -Q --daq dump --daq-var load-mode=passive

1.5.8 数据统计

Snort的输出信息中,数据包统计和运行状态统计包括下面字段:

  • Filtered 统计过滤掉的没有被Snort分析的数据包
  • Injected 统计由Snort产生的数据包,比如TCP resets包
  • Allow 统计通过Snort分析后,不做任何处理的数据包
  • Block 被Snort丢弃的数据包
  • Rplace 被Snrot修改的数据包
  • Whitelist 由Snort无条件放行的数据包
  • Blacklist 由Snort阻断的数据流程
  • Ignore 当前被Snort忽略的数据包

状态统计中,blocked 替代了dropped字段,以免引起混淆。