本地网络中如何从机器A访问机器B上KVM虚拟机的openmediavault服务?
本地网络中如何从机器A访问机器B上KVM虚拟机的openmediavault服务?
首先得搞清楚问题出在哪:你的openmediavault虚拟机用的是KVM默认的NAT网络模式(对应B上的virbr0网桥,子网是192.168.122.0/24)。这种模式下,这个子网是机器B本地的私有网络,只有B本身能直接访问,机器A的路由表里没有指向这个子网的路径,所以自然打不开那个地址。
下面给你三种可行的解决方案,你可以根据自己的需求选:
方案一:改成桥接模式(最省心,推荐)
这个方法能让虚拟机直接加入你本地的192.168.177.0/24网络,和其他设备一样获取同网段IP,之后访问起来就和访问B一样简单:
- 打开B上的KVM管理工具(比如virt-manager),找到你的openmediavault虚拟机
- 进入虚拟机的硬件设置,找到网络适配器,把当前的“NAT”选项改成“桥接模式”,然后选择B的物理网卡
enp1s0 - 重启虚拟机,它会自动从路由器获取192.168.177.x的IP(或者你手动给它设个静态IP更稳定)
- 之后直接在A的浏览器里输入
http://[虚拟机的192.168.177.x地址]:3670就能访问了
方案二:在B上做端口转发(不用改虚拟机网络)
如果不想动虚拟机的网络设置,可以把B的某个端口映射到虚拟机的3670端口,相当于让B作为“中转站”:
- 先在B的终端里执行下面的iptables命令(临时生效,重启后会消失,要持久化的话可以用
iptables-save保存规则):
sudo iptables -t nat -A PREROUTING -p tcp -d 192.168.177.70 --dport 3670 -j DNAT --to-destination 192.168.122.153:3670 sudo iptables -A FORWARD -p tcp -d 192.168.122.153 --dport 3670 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
- 开启B的IP转发功能(临时生效):
sudo sysctl -w net.ipv4.ip_forward=1
要永久生效的话,编辑/etc/sysctl.conf,把net.ipv4.ip_forward=1这行的注释去掉,然后执行sudo sysctl -p刷新配置。
3. 现在在A的浏览器里访问http://192.168.177.70:3670,就能转到虚拟机的服务了
方案三:在A上添加静态路由(让A知道走B去虚拟机子网)
这个方法是给A加一条路由规则,告诉它去192.168.122.0/24子网的流量要通过B转发:
- 在A的终端里执行:
sudo ip route add 192.168.122.0/24 via 192.168.177.70 dev wlan0
(这是临时生效的,要永久保存的话,Ubuntu可以编辑/etc/netplan/下的配置文件,或者用rc.local,具体看你的Ubuntu版本)
2. 同样要确保B已经开启了IP转发(参考方案二的第二步)
3. 之后A就能直接访问http://192.168.122.153:3670了
额外注意事项
- 因为A的ufw是开启状态,别忘了允许对应的流量:
- 如果用方案一或三,执行:
sudo ufw allow from 192.168.177.0/24 to 192.168.122.153 port 3670 proto tcp - 如果用方案二,执行:
sudo ufw allow from 192.168.177.0/24 to 192.168.177.70 port 3670 proto tcp
- 如果用方案一或三,执行:
- 方案二和三依赖B的IP转发功能,如果B重启后没自动开启,记得重新设置或者配置永久生效
备注:内容来源于stack exchange,提问作者user7468395
相关产品推荐
相关产品推荐

