网络过滤(Network filtering)
官方链接是:http://libvirt.org/formatnwfilter.html
文章目录
什么是网络过滤
#第一:通过ebtable引擎来实现 (解释:eb表示以太网网桥)
#第二:是一种网络流量的过滤规则,管理对虚拟机网络流量的接受和转发
#第三:由于虚拟机不能控制过滤规则,所以对虚拟机的访问控制具有强制性(因为其规则实在kvm物理机的内存里生效的)
#第四:通过xml文件存储配置,libvirt动态调整ebtable配置
#第五:可以针对特定虚拟机进行配置,也可以对多个虚拟机进行共享配置
通俗的将就是:Network filtering 子系统允许每一个虚拟机的网络过滤表可以被单独配置。我们可以在启动时配置虚拟机的访问控制过滤表,也可以在虚拟器运行时对虚拟机的规则进行修改。后者可以通过修改network filter XML的方式进行。
Libvirt 允许多台虚拟机共用一个。当filter被修改时,所有运行的虚拟机都会自动更新filter的过滤规则。
Network filtering XML部署在KVM Server上可以实现:虚拟网络隔离、入侵防护、批量管理等功能。OpenStack的网络控制就是基于Networkl filter。
应用场景
比如,一台kvm物理机上面跑了很多虚拟机,有个一客户在虚拟机上做了一些操作,比如练习dhcp,或则做网络嗅探等,都是服务商不愿看到的,得制止
如何实现过滤
#chain类型
所有过滤规则都被组织到一个过滤链中
数据包经过这些过滤链,被选择进入虚拟机或是DROP掉
链都有不同的优先级,root链的优先级最高
所有的数据包必须先经过root链后,才可能继续到其他过滤规则中匹配
目前已经存在的链有:root,mac,stp,vlan,arp,rarp,ipv4,ipv6
#priority优先级的设定:
所有链都被连接到root链中
优先级的值越小,优先级越高
用户可以定义自己的优先级数值,取值范围(100,1000)
查看自带的过滤规则
virsh nwfilter-list
UUID 名称
------------------------------------------------------------------
c4ce79c6-6018-44ca-833c-16da8788dc57 allow-arp
de3b6b53-86d0-4586-9cae-8abcd1dcbf9c allow-dhcp
b578e058-3feb-4c6b-a747-dcbc6f7df52f allow-dhcp-server
ee283d0d-d7fb-4044-b706-45930c8f34f3 allow-incoming-ipv4
645ba047-37e8-4c52-8880-e66006525560 allow-ipv4
453bb2f3-a2b5-4e03-b0ef-7eb951e3f783 clean-traffic
912acef6-f5e5-47ef-8b74-2c26e1f8c81a no-arp-ip-spoofing
fc485155-6326-412e-b398-7dd6980fcb9a no-arp-mac-spoofing
3e1476e5-8891-4e5c-a3c0-5946ce3b6e89 no-arp-spoofing
d02b8fd5-cda4-4f1a-bc2d-d14d706ed192 no-ip-multicast
728482c6-94e8-4189-b042-32eb966f19af no-ip-spoofing
ef10054f-90c9-406f-ab94-7da081dd6b9a no-mac-broadcast
212916b8-90e2-4178-a263-14943816b4d7 no-mac-spoofing
eceffde5-81cb-4577-88a8-55f8c0838fb2 no-other-l2-traffic
639281e2-c9f1-4d12-8d8e-0cccd8ccafe9 no-other-rarp-traffic
c9c0fd0d-0a97-4d66-872b-70291b9384a8 qemu-announce-self
6b4126f6-0c7f-4fea-bf15-4cb7ce88a45b qemu-announce-self-rarp
查看具体规则下的内容
virsh nwfilter-dumpxml allow-dhcp #后面接的是规则名
查看系统有没有生效的规则
ebtables -t nat -L
#此时应是没有规则的
创建并编辑一个规则(实现二层拦截)
mkdir /kvm-netrules
vim /kvm-netrules/l2-traffic.xml
<interface type='network'>
<mac address='52:54:00:18:f4:28'/>
<source network='default'/>
<model type='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
<filterref filter='no-other-l2-traffic'/>
</interface>
#这段的内容取自要定义的虚拟机的xml文件的网络配置,指定加上了“filterref”这句网络过滤规则
在虚拟机kvm-web01上ping网关
#是通的
在运行的kvm-web01上应用此规则(下面是在 内存中立即生效,关闭后再启动就会失效)
virsh update-device kvm-web01 /kvm-netrules/l2-traffic.xml
#可以查看virsh update-device --help的用法
#virsh update-device kvm-web01 /kvm-netrules/l2-traffic.xml --persistent 这是永久生效
再次检查kvm-web01是否可以ping通网关
#不通
再次查看系统有没有生效的规则
ebtables -t nat -L
#此时就有规则了
网络流量过滤Network filtering基本用法
#首先是libvirt定义网络过滤规则的相关命令:(从一个XML文件中定义或者更新一个网络过滤规则。)
virsh nwfilter-define ***.xml
#查看一个网络规则的XML详细信息
virsh nwfilter-dumpxml ***.xml
#编辑一个网络规则
virsh nwfilter-edit ***.xml
#列出所有定义成功的网络过滤规则
virsh nwfilter-list
#若是创建了一个规则/root/nftest.xml,立即为虚拟机kvm-web01应用此规则
virsh update-device kvm-web01 /root/nftest.xml
#取消该网络过滤规则
virsh nwfilter-undefine
网络流量过滤Network filtering高级用法
自己写一个xml过滤规则,然后定义然后调用
#第一:创建一个存放过滤规则的目录
mkdir /kvm-net-rules
#第二:创建规则文件
vim /kvm-net-rules/limit-internet.xml #此规则用来做限制
<filter name='limit-internet' chain='ipv4'>
<uuid>fce8ae34-e69e-83bf-262e-30786c1f8073</uuid>
<rule action='accept' direction='out' priority='100'>
<ip protocol='udp' srcportstart='67' srcportend='68' dstportstart='67' dstportend='68'/>
</rule>
<rule action='accept' direction='in' priority='100'>
<ip protocol='udp' srcportstart='67' srcportend='68' dstportstart='67' dstportend='68'/>
</rule>
<rule action='drop' direction='out' priority='200'>
<ip match='no' dstipaddr='$GATEWAYIP' dstipmask='255.255.255.0'/>
</rule>
</filter>
-----------------------分割线------------------------------
vim /kvm-net-rules/limit-internet-no.xml #此规则用来解除限制
<filter name='limit-internet' chain='ipv4'>
<uuid>fce8ae34-e69e-83bf-262e-30786c1f8073</uuid>
<rule action='accept' direction='out' priority='100'>
</rule>
</filter>
#第三:在虚拟机kvm-web01的xml文件中加上过滤规则
virsh edit kvm-web01
<interface type='network'>
<mac address='52:54:00:18:f4:28'/>
<source network='default'/>
<model type='virtio'/>
<alias name='net0'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
<filterref filter='limit-internet'/> #加上的是这句话
</interface>
#第四:定义limit-internet规则
virsh nwfilter-define limit-internet.xml
#第五:启动kvm-web01虚拟机
virsh start kvm-web01
#第六:通过vnc端口进入虚拟机查看网络联通情况
发现网络不通
#第七:重新定义limit-internet规则(你会发现第四与第七都在定义同一规则,但是其文件名不一样,内容不一样,但是规则名却一样)
virsh nwfilter-define limit-internet-no.xml
#第八:检查kvm-web01的网络联通情况
发现网络正常
思考:如需多个主机都使用同一规则只需将其写入xml中,并进行定义,应用即可
如果文章对你有帮助,欢迎点击上方按钮打赏作者
暂无评论