AIMaLinux系统上通过KVM创建了windows10系统,在windows10系统中通过NFS分享文件夹到内网上可以挂载

AIMaLinux系统上通过KVM创建了windows10系统,在windows10系统中通过NFS分享文件夹到内网上可以挂载

下面我们把AIMaLinux统称为宿主机,把windows10称为虚拟机,把内网上的其他设备称为外部设备。

一、查看虚拟机的网络模式

bash 复制代码
 virsh dumpxml <虚拟机名称> | grep -A 10 "<interface"

通过上面命令查看当前虚拟机的网络模式:如果是桥接,那就只要在虚拟机中通过NSA服务器或者第三方NAS服务器(haneWIN NAS Service)中设置好分享的文件夹目录,然后防火墙打开对应的端口111、2049、还有个动态端口(后面说怎么查)。
网络模式判断

模式 外部访问 推荐场景
NAT ❌ 无法直接访问 仅虚拟机上网
桥接 (bridge) ✅ 可直接访问 NFS 共享推荐
host-only ❌ 仅宿主机访问 隔离测试

下面我们主要介绍NAT网络模式下怎么分享文件夹(如果网络可以改成桥接更方便)

二、NAT网络模式下,需要配置端口转发(在宿主机linux中执行命令)

bash 复制代码
# 1.查看默认网络配置
virsh net-dumpxml default

输出<forward mode='nat'>表示是NAT网络
# 2. 编辑默认网络配置
virsh net-edit default

#原配置是:
<forward mode='nat'>
  <nat>
    <port start='1024' end='65535'/>
  </nat>
</forward>

# 修改为下面的:
<forward mode='nat'>
  <nat>
    <!-- 保留原有高位端口范围 -->
    <port start='1024' end='65535'/>
    
    <!-- 新增:RPC 端口映射器 (TCP/UDP) -->
    <port start='111' end='111' to='111' proto='tcp'/>
    <port start='111' end='111' to='111' proto='udp'/>
    
    <!-- 新增:NFS 主服务端口 (TCP/UDP) -->
    <port start='2049' end='2049' to='2049' proto='tcp'/>
    <port start='2049' end='2049' to='2049' proto='udp'/>
  </nat>
</forward>

# 3. 重启默认网络
# 销毁默认网络
virsh net-destroy default
# 重新启动默认网络
virsh net-start default

# 验证配置是否加载
sudo virsh net-dumpxml default | grep -A 10 "<nat>"

# 4. 重启虚拟机
virsh destroy <虚拟机名称>
virsh start <虚拟机名称>

操作上面修改网络配置时,如果报错:

XML error: Only one element is allowed in in in network default

说明使用的 libvirt 版本较新(通常是 QEMU/KVM 6.0+ 或 libvirt 7.0+)
在新版本中,nat 标签下不再支持写多个port 标签来逐个定义端口

三、最佳解决方案:改用 iptables 手动转发(最稳定、通用)

使用 Linux 底层的 iptables 来做端口映射。这是最底层、最可靠的方法,不受 libvirt 版本限制。
我们将把 宿主机 (AlmaLinux) 的 端口流量,强制转发给 Windows 虚拟机。

bash 复制代码
# 查看虚拟机 IP
virsh domifaddr <虚拟机名称>
# 或者在 Windows 里运行 ipconfig 确认
1、执行 iptables 转发规则(临时生效,重启失效)

创建一个脚本例如:vi nas.sh,填写完后保存,最后执行脚本 :sh nas.sh

bash 复制代码
VM_IP="192.168.122.14" # <--- 替换为您的 IP
# --- 1. 转发 TCP 端口 ---

# 转发 TCP 2049 (NFS 数据传输)

sudo iptables -t nat -A PREROUTING -p tcp --dport 2049 -j DNAT --to-destination $VM_IP:2049

sudo iptables -t nat -A PREROUTING -p tcp --dport 111 -j DNAT --to-destination $VM_IP:111

# 转发 TCP 1058 (Mountd - haneWIN 专用)

sudo iptables -t nat -A PREROUTING -p tcp --dport 1058 -j DNAT --to-destination $VM_IP:1058

# --- 2. 转发 UDP 端口 ---

# 转发 UDP 2049 (NFS 数据传输)
sudo iptables -t nat -A PREROUTING -p udp --dport 2049 -j DNAT --to-destination $VM_IP:2049

# 转发 UDP 1058 (Mountd - haneWIN 专用)
sudo iptables -t nat -A PREROUTING -p udp --dport 111 -j DNAT --to-destination $VM_IP:111
sudo iptables -t nat -A PREROUTING -p udp --dport 1058 -j DNAT --to-destination $VM_IP:1058

# --- 3. 开放 INPUT 链 (宿主机自身访问) ---
sudo iptables -I INPUT -p tcp --dport 2049 -j ACCEPT
sudo iptables -I INPUT -p tcp --dport 111 -j ACCEPT
sudo iptables -I INPUT -p tcp --dport 1058 -j ACCEPT

sudo iptables -I INPUT -p udp --dport 2049 -j ACCEPT
sudo iptables -I INPUT -p udp --dport 111 -j ACCEPT
sudo iptables -I INPUT -p udp --dport 1058 -j ACCEPT

# --- 4. 开放 FORWARD 链 (外部访问虚拟机) ---

sudo iptables -I FORWARD -d $VM_IP -p tcp --dport 2049 -j ACCEPT
sudo iptables -I FORWARD -d $VM_IP -p tcp --dport 111 -j ACCEPT
sudo iptables -I FORWARD -d $VM_IP -p tcp --dport 1058 -j ACCEPT

sudo iptables -I FORWARD -d $VM_IP -p udp --dport 2049 -j ACCEPT
sudo iptables -I FORWARD -d $VM_IP -p udp --dport 111 -j ACCEPT
sudo iptables -I FORWARD -d $VM_IP -p udp --dport 1059 -j ACCEPT

执行完输入命令

bash 复制代码
sudo iptables -t nat -L PREROUTING -n -v

查看输出内容是否是自己配置的111,2049,1058

2、如何让规则永久生效?(重启后不丢失)

通过 firewalld 配置端口转发 (更兼容 AlmaLinux 默认设置)

创建一个脚本例如:vi nasfirewalld.sh,填写完后保存,最后执行脚本 :sh nasfirewalld.sh

bash 复制代码
WIN_VM_IP="192.168.122.105" # <--- 替换为您的 IP

# 1. 开启伪装 (Masquerading)
sudo firewall-cmd --permanent --add-masquerade

# 2. 添加 TCP 端口转发
sudo firewall-cmd --permanent --add-forward-port=port=111:proto=tcp:toaddr=$WIN_VM_IP:toport=111
sudo firewall-cmd --permanent --add-forward-port=port=2049:proto=tcp:toaddr=$WIN_VM_IP:toport=2049
sudo firewall-cmd --permanent --add-forward-port=port=2049:proto=tcp:toaddr=$WIN_VM_IP:toport=1058

# 3. 添加 UDP 端口转发
sudo firewall-cmd --permanent --add-forward-port=port=111:proto=udp:toaddr=$WIN_VM_IP:toport=111
sudo firewall-cmd --permanent --add-forward-port=port=2049:proto=udp:toaddr=$WIN_VM_IP:toport=2049
sudo firewall-cmd --permanent --add-forward-port=port=2049:proto=udp:toaddr=$WIN_VM_IP:toport=1058

# 4. 重载防火墙
sudo firewall-cmd --reload

# 5. 验证规则
sudo firewall-cmd --list-all | grep forward
宿主机和虚拟机间的网络转发设置好后,记得看下虚拟机中的防火墙设置是否拦截了这几个端口,不行就关掉防火墙,或者设置规则。

三、在 外部设备上测试

bash 复制代码
# cmd中输入
rpcinfo -p <宿主机IP>

#输出内容是个列表
#其中有mountd   1058
#   还有111,2049的tcp和udp ,这三个都显示了就正常了,可以直接通过命令挂载了。
 

下一步立即尝试挂载

bash 复制代码
# 10.30.30.2是宿主机IP
# test是虚拟机上的NSA服务器设置好的分享文件夹的name
# F: 表示要挂载到本机的哪个目录或者盘符
mount -o anon 10.30.30.2:/test F:
网络没问题这样操作后就会提示挂载成功。如下:
下面是在客户端怎么查询共享目录(前提是网络通了)
bash 复制代码
# 在客户端查看nfs服务器上有哪些共享目录
showmount -e 宿主机IP

# 在客户端查看nfs服务器上有哪些共享目录被挂载了
showmount -a 宿主机IP

# 在客户端,查看客户端连接的所有共享目录
showmount -d  宿主机IP

#在nfs端(我们的虚拟机上),直接输入命令即可
showmount -e
showmount -a
showmount -d

最后说明。我使用的是:haneWIN NFS服务器

相关推荐
黑蛋同志12 小时前
KVM虚拟化热迁移
运维·虚拟化·kvm
计算机网恋2 天前
VMware网络配置焚诀【100%解决】理论+实操+拓扑图
教程·vmware·虚拟机
白毛大侠2 天前
Docker vs 虚拟机 vs Go 用户态/内核态:这三组概念
运维·docker·golang·kvm
@hdd5 天前
KubeVirt 核心架构解析:3 层组件如何协同运转虚拟机
云原生·kubernetes·虚拟机
计算机网恋7 天前
【无标题】
ubuntu·vmware·虚拟机
闻道且行之8 天前
虚拟机三种网络模式全解析(桥接 / NAT / 仅主机)
网络·智能路由器·vmware·虚拟机
小小ken9 天前
hyper-v 创建虚拟机时报错:无法访问配置存储: 找不到指定文件的虚拟磁盘支持提供程序。
hyper-v·虚拟机
小小ken10 天前
鸿蒙模拟器提示:未开启hyper-v。运行模拟器需要开启hyper-v虚拟化支持。
华为·harmonyos·hyper-v·虚拟机
木下~learning10 天前
零基础Git入门:Linux+Gitee实战指南
linux·git·gitee·github·虚拟机·版本控制·ubunt
wuhui210014 天前
宿主机与虚拟机网络配置打通
网络·kali·虚拟机