KVM 创建虚拟机,使用内网IP时,让虚拟机通过宿主机访问外网

宿主机操作

1. 开启 IP 转发

sysctl -w net.ipv4.ip_forward=1

永久生效:

echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p

2. 配置 NAT (SNAT/MASQUERADE)

假设公网出口就是 br0

iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o br0 -j MASQUERADE

检查是否生效:

iptables -t nat -vnL POSTROUTING

如果用 nftables:

nft add rule ip nat POSTROUTING oif "br0" ip saddr 192.168.100.0/24 masquerade

3. 保存规则(防止重启丢失)

Debian/Ubuntu:

apt install -y iptables-persistent
netfilter-persistent save

RHEL/CentOS/AlmaLinux:

service iptables save

虚拟机操作

1. 配置网卡

确保网卡是 /24 掩码,不是 /32

ip addr add 192.168.100.2/24 dev eth0
ip route add default via 192.168.100.1

2. 配置 DNS

写入 /etc/resolv.conf

nameserver 8.8.8.8
nameserver 114.114.114.114

验证

在虚拟机内依次测试:

  1. 通宿主机
ping 192.168.100.1
  1. 通公网 IP
ping 114.114.114.114
  1. 通域名
ping archive.ubuntu.com
  1. 更新软件源
apt update

这样虚拟机就能正常走宿主机公网访问外网了。