惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

aimingoo的专栏
aimingoo的专栏
G
Google Developers Blog
B
Blog RSS Feed
A
About on SuperTechFans
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
V
V2EX
Stack Overflow Blog
Stack Overflow Blog
C
Check Point Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Engineering at Meta
Engineering at Meta
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
博客园 - 司徒正美
D
Docker
F
Fortinet All Blogs
Hugging Face - Blog
Hugging Face - Blog
Last Week in AI
Last Week in AI
H
Help Net Security
WordPress大学
WordPress大学
MyScale Blog
MyScale Blog
博客园 - Franky
人人都是产品经理
人人都是产品经理
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Blog — PlanetScale
Blog — PlanetScale
L
LangChain Blog

又见苍岚

COLMAP PatchMatch Stereo 算法详解 事件驱动的状态机框架:从理论到工程实践 Git 在国内网络环境下无法 Push 的排查与修复 —— 配置 Clash 代理 分段五次多项式插值原理详解 路径插值方法深度对比研究 Claude Code 使用指南 OpenClaw 记忆管理与技能创建指南 CBS(Conflict-Based Search)算法详解 A* 算法及其变种详解 OpenClaw 配置多 Agents Windows Powershell 无法加载文件,因为在此系统上禁止运行脚本问题的解决方案 MaxClaw 安装流程 大模型 AI 名词介绍 AList 网盘聚合工具简介 Protobuf 简介与测试 Claude Code 简介以及 GLM 4.7 模型接入 Github 歌词下载工具 163MusicLyrics Python __getattr__ 懒加载 Python TypedDict 机器人仿真平台 Gazebo 安装记录 机器人仿真平台 Gazebo 简介 多机器人路径规划问题(Multi-Agent Path Finding, MAPF)简介 Python exifread 读取修改过的 jpeg 信息错误问题修复 3D 坐标系变换的理解 3D 旋转矩阵基本概念 MongoDB Compass 介绍 Python 环境管理工具 uv Flutter 开发指南 Snipaste 安装下载与黑屏问题解决方案 全局路径规划算法记录
Linux kvm 虚拟机网络不通的问题解决方法
Yiwei Zhang · 2025-06-24 · via 又见苍岚

有一天,突然从外部无法访问 KVM 虚拟机了,本文记录解决方案。

问题描述

宿主机上以桥接模式安装kvm虚拟机,宿主机网络正常,但是虚拟机内部ping除宿主机以外的机器都ping不通,也只有宿主机能ssh到该虚拟机。

解决方案

排查宿主机网络

查看宿主机网桥状态

1
2
3
4
5
[root@localhost ~]# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.1213d36366e1 no eth0
virbr0 8000.5254003ad74c yes
[root@localhost ~]#

宿主机上网桥br0,可以看到主机网卡eth0接口已经添加到br0上了。

如果br0上的interfas中没有kvm虚拟机对应的vnet(vnet0,vnet1,vnet2等),则需要执行命令添加到br0上:

vnet相关接口可以通过 ip a 命令查看有哪些

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master bridge0 state UP group default qlen 1000
link/ether 70:85:c2:80:45:d8 brd ff:ff:ff:ff:ff:ff
3: bridge0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default

5: vnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master bridge0 state UNKNOWN group default qlen 1000
link/ether fe:54:00:d3:66:7d brd ff:ff:ff:ff:ff:ff
inet6 fe80::fc54:ff:fed3:667d/64 scope link
valid_lft forever preferred_lft forever
6: vnet1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master bridge0 state UNKNOWN group default qlen 1000
link/ether fe:54:00:5d:f7:bb brd ff:ff:ff:ff:ff:ff
inet6 fe80::fc54:ff:fe5d:f7bb/64 scope link
valid_lft forever preferred_lft forever

把未添加到br1的vnet添加上来:

1
2
[root@localhost ~]# brctl addif br1 vnet0
[root@localhost ~]# brctl addif br1 vnet1

之后再查看网桥状态是否添加成功:

1
2
3
4
5
6
7
[root@localhost ~]# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.1213d36366e1 no eth0
vnet0
vnet1
virbr0 8000.5254003ad74c yes
[root@localhost ~]#

查看kvm虚拟机内部路由

1
2
3
4
5
6
7
8
9
[root@kvm-test ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.10.254 0.0.0.0 UG 0 0 0 enp0s3
169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 enp0s3
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
192.168.61.0 0.0.0.0 255.255.255.0 U 0 0 0 enp0s3
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
[root@kvm-test ~]#

如果路由没配置的话,需要配置下,/etc/sysconfig/network-scripts/ifcfg-enp0s3中添加GATEWAY=192.168.10.254,之后执行service network restart重启网络。

或者使用route命令添加路由:

1
route add default gw 192.168.10.254

查看宿主机防火墙

查看防火墙状态:

1
2
3
4
5
6
7
8
9
10
11
[root@localhost ~]# systemctl status iptables.service 
● iptables.service - IPv4 firewall with iptables
Loaded: loaded (/usr/lib/systemd/system/iptables.service; disabled; vendor preset: disabled)
Active: inactive (dead)
[root@localhost ~]#
[root@localhost ~]# systemctl status firewalld.service
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: man:firewalld(1)
[root@localhost ~]#

我这里直接防火墙都关了,当然最简单的方法就是关闭防火墙:

1
2
3
[root@localhost ~]# systemctl stop iptables.service 
Failed to stop iptables.service: Unit iptables.service not loaded.
[root@localhost ~]# systemctl stop firewalld.service

修改内核参数

最后上面都设置了,但是虚拟机网络跟外部还是不通,就是说虚拟机只跟宿主机能通信(ping ssh),跟其它机器都访问不了,这时需要查看下宿主机网桥配置相关内核参数:

  1. ip_forward参数,若为0,则需改为1
1
2
3
4
[root@localhost ~]# cat /proc/sys/net/ipv4/ip_forward
1
[root@localhost ~]# sysctl -b net.ipv4.ip_forward
1
  1. 对应网桥(注意:我这里是br1)的nf_call_iptables参数,若为1,bridge-nf-call-iptables=1 表示桥接流量经过宿主机 iptables 规则过滤,会错误拦截 KVM 虚拟机的 NAT 或桥接流量,需改为0, 使宿主机iptables等防火墙不对bridge的数据进行过滤处理。

    我的虚拟机就是靠这个修好的。

1
2
# cat /proc/sys/net/bridge/bridge-nf-call-iptables 
1
1
2
# cat /sys/devices/virtual/net/br1/bridge/nf_call_iptables
1

su root 登陆后使用echo修改即可:

最好把该网桥下的bridge-nf-call-arptables、bridge-nf-call-ip6tables参数也设置为0。

1
2
3
echo 0 > /proc/sys/net/bridge/bridge-nf-call-iptables
echo 0 > /proc/sys/net/bridge/bridge-nf-call-arptables
echo 0 > /proc/sys/net/bridge/bridge-nf-call-ip6tables

如果修改了这几个值解决了问题,说明问题确实出在这里,这不是一句废话,因为该参数位于内存临时文件系统(/proc/sys),重启后自动重置为内核默认值 1,永久解决方案:

添加

1
2
3
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0
net.bridge.bridge-nf-call-ip6tables = 0

/etc/sysctl.conf 文件中。

重启后讲道理应该默认就是 0 了。

参考资料

文章链接:
https://www.zywvvd.com/notes/system/linux/kvm/kvm-net-error-fix/kvm-net-error-fix/