如何将Fedora宿主机的所有网络流量通过QEMU/KVM上的Ubuntu虚拟机VPN进行路由
如何将Fedora宿主机的所有网络流量通过QEMU/KVM上的Ubuntu虚拟机VPN进行路由
我刚好折腾过类似的需求,给你一步步拆解操作,确保能顺利搞定:
第一步:开启Ubuntu虚拟机的IP转发功能
要让Ubuntu能充当网关转发流量,首先得开启IP转发权限:
- 编辑sysctl配置文件:
sudo nano /etc/sysctl.conf - 找到
net.ipv4.ip_forward=1这一行,把前面的注释符号#去掉;如果需要支持IPv6流量转发,也可以把net.ipv6.conf.all.forwarding=1的注释去掉。 - 让配置立即生效:
sudo sysctl -p
第二步:配置Ubuntu的防火墙,允许流量转发并做NAT
这一步是让虚拟机把来自Fedora的流量通过VPN接口发出去,同时完成地址转换:
如果你用ufw防火墙:
- 先修改ufw的默认转发策略,编辑配置文件:
把sudo nano /etc/default/ufwDEFAULT_FORWARD_POLICY="DROP"改成DEFAULT_FORWARD_POLICY="ACCEPT" - 添加转发规则(假设你的VPN接口是
tun0,虚拟机的虚拟网卡接口是virbr0,不确定的话可以用ip a命令查看):sudo ufw allow in on virbr0 out on tun0 sudo ufw route allow in on virbr0 out on tun0 - 重启ufw使规则生效:
sudo ufw disable && sudo ufw enable
如果你用iptables(不用ufw的情况):
直接添加NAT和转发规则:
sudo iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE sudo iptables -A FORWARD -i virbr0 -o tun0 -m state --state RELATED,ESTABLISHED -j ACCEPT sudo iptables -A FORWARD -i tun0 -o virbr0 -j ACCEPT
如果要让iptables规则重启后不丢失,可以用iptables-save > /etc/iptables/rules.v4保存规则。
第三步:修改Fedora宿主机的路由,指向Ubuntu虚拟机
首先得知道Ubuntu虚拟机在虚拟网络里的IP地址,比如在Ubuntu里执行ip a,找到virbr0对应的IP(比如192.168.122.100)。
临时生效(重启后失效):
- 先备份当前的默认路由,方便后续恢复:
记下来类似ip route show defaultdefault via 192.168.0.1 dev eth0的内容。 - 添加新的默认路由,指向Ubuntu虚拟机:
sudo ip route add default via 192.168.122.100
永久生效:
用NetworkManager来配置更稳妥:
- 先查看当前的网络连接名称:
nmcli connection show - 修改对应连接的网关为Ubuntu虚拟机的IP,同时设置VPN提供的内网DNS(不然可能解析不了内网域名):
sudo nmcli connection modify "你的连接名称" ipv4.gateway 192.168.122.100 sudo nmcli connection modify "你的连接名称" ipv4.dns "VPN提供的DNS地址" sudo nmcli connection up "你的连接名称"
第四步:验证配置
在Fedora宿主机上做几个测试:
- 访问一个内网地址,看能不能正常打开
- 执行
curl ifconfig.me,查看出口IP是不是VPN的IP(而不是你Fedora宿主机的公网IP) - 如果有问题,先检查Ubuntu的IP转发是否开启(
sysctl net.ipv4.ip_forward看返回值是不是1),再检查防火墙规则,最后确认路由是否正确。
备注:内容来源于stack exchange,提问作者Jame Loolp
相关产品推荐
相关产品推荐

