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