You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CentOS 7下正确控制virsh网络过滤器(nwfilters)的方法咨询

CentOS 7下正确控制virsh网络过滤器(nwfilters)的方法咨询

嘿,太懂你这种手动改iptables重启就失效的糟心感了!其实virsh自带的nwfilter就是专门用来持久化管理虚拟机/容器网络规则的官方方案,完全不用靠临时脚本或者手动补规则。下面我给你一步步捋清楚怎么用它来开放ICMP、SSH和HTTP:

一、先搞懂nwfilter的基础用法

先看看系统里现有的默认过滤器,用这两个命令快速了解:

  • 列出所有过滤器:virsh nwfilter-list
  • 查看某个过滤器的具体规则:virsh nwfilter-dump allow-ipv4(比如这个是默认允许IPv4的基础过滤器)

默认过滤器已经包含了virbr0需要的DHCP、DNS基础规则,我们可以直接基于它扩展,或者从零新建自定义过滤器。

二、创建自定义过滤器(开放ICMP、SSH、HTTP)

我们新建一个叫custom-virbr0-access的过滤器,直接用编辑命令创建:

virsh nwfilter-edit custom-virbr0-access

如果这个过滤器不存在,virsh会自动打开空的XML编辑界面,把下面的内容粘贴进去(可根据自己需求调整):

<filter name='custom-virbr0-access' chain='root'>
  <!-- 继承默认的allow-ipv4过滤器,省得重复写基础规则 -->
  <filterref filter='allow-ipv4'/>
  
  <!-- 允许ICMP(ping)流量 -->
  <rule action='accept' direction='in'>
    <ip protocol='icmp'/>
  </rule>
  
  <!-- 允许SSH(22端口)入站 -->
  <rule action='accept' direction='in'>
    <ip protocol='tcp' dstportstart='22' dstportend='22'/>
  </rule>
  
  <!-- 允许HTTP(80端口)入站 -->
  <rule action='accept' direction='in'>
    <ip protocol='tcp' dstportstart='80' dstportend='80'/>
  </rule>
  
  <!-- 允许已建立/关联的连接返回流量(保证出站请求能收到响应) -->
  <rule action='accept' direction='in'>
    <tcp state='ESTABLISHED'/>
  </rule>
  <rule action='accept' direction='out'>
    <tcp state='ESTABLISHED,RELATED'/>
  </rule>
</filter>

保存退出后,这个自定义过滤器就生效了。

三、把过滤器关联到你的虚拟机/容器

接下来要把这个过滤器绑定到使用virbr0的网络接口上:

  1. 编辑虚拟机/容器的XML配置:
    # 虚拟机用这个
    virsh edit <你的虚拟机名>
    # LXC容器用这个(如果是用libvirt管理的LXC)
    virsh edit <你的容器名>
    
  2. 找到<interface>标签部分,添加一行<filterref filter='custom-virbr0-access'/>,比如:
    <interface type='bridge'>
      <mac address='52:54:00:ab:cd:ef'/>
      <source bridge='virbr0'/>
      <model type='virtio'/>
      <!-- 就是加这一行 -->
      <filterref filter='custom-virbr0-access'/>
    </interface>
    
  3. 保存退出后,重启虚拟机/容器让配置生效:
    virsh destroy <虚拟机/容器名> && virsh start <虚拟机/容器名>
    

四、验证规则是否生效

现在你再用iptables-save | grep virbr0查看规则,会发现libvirt已经自动根据nwfilter生成了对应的iptables规则,而且这些规则会在系统重启、libvirt服务重启后自动恢复。

同时可以做几个测试:

  • 从外部ping虚拟机/容器的IP,应该能正常通
  • 用SSH连接22端口,应该能正常登录
  • 访问80端口的HTTP服务,应该能正常打开

一些额外小提示

  • 别手动修改virbr0的iptables规则!因为libvirt会定期同步nwfilter的规则,手动改的会被覆盖,用nwfilter才是官方认可的持久化方式。
  • 如果需要调整规则,直接重新编辑自定义过滤器:virsh nwfilter-edit custom-virbr0-access,然后重启虚拟机/容器或者用virsh nwfilter-refresh custom-virbr0-access就能生效。
  • 要是需要更精细的规则(比如限制特定IP访问),可以在XML的rule标签里添加<source ip='192.168.1.0/24'/>这类条件。

备注:内容来源于stack exchange,提问作者Alex Povolotsky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 16:02:32