nwfilter目的是让管理员在host上控制vm的每块网卡。同一个nwfilter规则可以被不同vm重复使用,也可以每个VM创建不同的filter规则。

它的默认路径在/etc/libvirt/nwfilter/

默认libvirt安装好后会加载一些规则,用户也可以自定义规则。

自定义的规则编写好后使用下面命令加载

virsh nwfilter-define 规则文件路径

取消规则(有虚拟机使用时无法取消)

virsh nwfilter-undefine 规则名

查看已经加载的nwfilter规则

virsh nwfilter-list

编译规则:

virsh nwfilter-edit windows (编辑保存后就立刻生效)

也可以vi 直接编辑规则的xml的文件,编辑完成后nwfilter-define后生效

 

 

规则链:
nwfilter支持的网卡模式bridge和network

所有规则链都入口都为顶部的root在xml中这样写
<filter name='clean-traffic' chain='root'>

规则链支持的协议:root,stp,mac,vlan,ipv4,ipv6,arp,rarp

链名前缀以协议开头,xml示例如:

<filter name='' chain='arp' priority=''>
<uuid></uuid>
<rule action='' direction='' priority=''>
<mac match='' srcmacaddr="/>
</rule>
<rule action='' direction='' priority=''>
<arp match='' arpsrcmacaddr=''/>
</rule>
</filter>

优先级priority的值越小优先级越高,优先级范围-1000 到 1000,优先级越小(越高)的就越靠前。
默认优先级:
stp -810
mac -800
vlan -750
ipv4 -700
ipv6 -600
arp -500
rarp -400

规则变量
目前保留两个变量MAC和IP,可以指定规则匹配具体的MAC和IP,同一个规则可以有多个IP
  <devices>
    <interface type='bridge'>
      <mac address='00:16:3e:5d:c7:9e'/>
      <filterref filter='clean-traffic'>
        <parameter name='IP' value='10.0.0.1'/>
        <parameter name='IP' value='10.0.0.2'/>
        <parameter name='IP' value='10.0.0.3'/>
      </filterref>
    </interface>
  </devices>

如果没有指定IP,libvirt会自动侦测IP,建议明确指定,会少一些开销。
value可以接收的值有具体的IP,any,dhcp,none

 

规则匹配处理
规则指定匹配到相关数据包后东站使用action来制定,每条规则都必须由action,action的动作如下:
drop 丢弃数据包
reject 返回ICMP包并拒绝
accept 允许
return 返回规则链上级继续下一项检查
continue 直接继续下一条规则的检测

规则的数据包走向,关键字direction,该关键字必须
下面的in和out是针对vm来说,in是进入vm的数据包,out是从VM里面出来的数据包
in 进入
out 流出
inout 进和出

每条规则可以指定优先级priority关键字,如果不指定默认为500
规则可以定义匹配的state关键字match
可选项statematch可以选的值0或者false