1. 部署目标

将 Windows Server 上的共享目录挂载到 Ubuntu Server:

项目配置
Windows Server 主机名DOMAINNAME
Windows Server 公网 IP18.18.18.18
Windows 本地目录D:\dbshare
Windows 共享名dbshare$
Windows UNC 路径\\DOMAINNAME\dbshare$
Ubuntu Server 公网 IP18.18.18.17
Ubuntu 挂载目录/mnt/dbshare
Ubuntu 使用用户UbuntuName

Ubuntu 中对应的 SMB 地址为:

//18.18.18.18/dbshare$

2. 重要安全要求

SMB 使用 TCP 445 端口。该端口不应向整个互联网开放。本方案必须同时满足:

  1. Windows Server 或上游防火墙只允许来源 IP 18.18.18.17 访问 18.18.18.18:445
  2. 检查并收窄其他允许任意公网地址访问 TCP 445 的规则。
  3. 只使用 SMB 3.1.1,并强制启用 SMB 加密。
  4. 使用专用 Windows 账户访问共享,不建议直接使用 Administrator。
  5. Windows 账户必须设置强密码,Windows Hello PIN 不能代替网络账户密码。
  6. 长期使用时,建议改为 WireGuard、Tailscale 或站点到站点 VPN,并关闭公网 TCP 445。

微软官方也建议在互联网边界阻止入站 SMB 445:
https://learn.microsoft.com/zh-cn/windows-server/storage/file-server/smb-secure-traffic

3. Windows Server 配置

3.1 检查共享是否存在

使用管理员身份打开 PowerShell:

Get-SmbShare -Name 'dbshare$' | Select-Object Name,Path,EncryptData

预期路径应为:

D:\dbshare

如果共享尚未创建,可通过“文件夹属性 → 共享 → 高级共享”创建共享名 dbshare$

3.2 配置共享权限和 NTFS 权限

必须同时配置两层权限:

  • “共享权限”:给专用 Windows 用户授予读取或更改权限。
  • D:\dbshare 的“安全”选项卡:给同一用户授予对应的 NTFS 权限。

3.3 强制共享使用 SMB 加密

在管理员 PowerShell 中执行:

Set-SmbShare -Name 'dbshare$' -EncryptData $true -Force
Get-SmbShare -Name 'dbshare$' | Select-Object Name,Path,EncryptData

预期结果类似:

Name       Path         EncryptData
----       ----         -----------
dbshare$  D:\dbshare  True

3.4 限制 Windows 防火墙来源地址

打开“Windows Defender 防火墙(高级安全)→ 入站规则”,检查所有允许 TCP 445 的规则,将其作用域限制为:

远程 IP 地址:18.18.18.17
本地协议和端口:TCP 445

如果服务器位于路由器、硬件防火墙或云安全组之后,还必须在对应设备上设置同样的源地址限制:

允许:18.18.18.17 → 18.18.18.18 TCP 445
拒绝:其他公网地址 → 18.18.18.18 TCP 445

不要为本部署开放 TCP 139 或 UDP 137、138。

4. Ubuntu Server 配置

4.1 安装 CIFS 工具

sudo apt update
sudo apt install -y cifs-utils
sudo mkdir -p /mnt/dbshare

4.2 创建 SMB 凭据文件

sudo nano /root/.smb-dbshare

填写以下内容:

username=Windows专用用户名
password=Windows账户密码
domain=DOMAINNAME

如果使用 Active Directory 域账户,将 domain 改为实际 AD 域;如果使用普通工作组且认证正常,也可以不填写 domain

保存后限制文件权限:

sudo chmod 600 /root/.smb-dbshare
sudo ls -l /root/.smb-dbshare

预期权限为:

-rw-------

不要把用户名和密码直接写进挂载命令或 /etc/fstab

4.3 手动测试挂载

共享名包含 $,在 Shell 命令中必须用单引号包住完整 SMB 地址:

sudo mount -t cifs '//18.18.18.18/dbshare$' /mnt/dbshare \
  -o credentials=/root/.smb-dbshare,vers=3.1.1,seal,uid=UbuntuName,gid=UbuntuName,file_mode=0660,dir_mode=0770

参数说明:

参数作用
vers=3.1.1强制使用 SMB 3.1.1
seal强制 SMB 数据加密
uid=UbuntuName,gid=UbuntuName将文件映射给 Ubuntu 用户 UbuntuName
file_mode=0660文件默认权限
dir_mode=0770目录默认权限

4.4 验证挂载和读写

findmnt /mnt/dbshare
df -hT | grep dbshare
ls -la /mnt/dbshare
touch /mnt/dbshare/ubuntu-test.txt
ls -l /mnt/dbshare/ubuntu-test.txt

同时在 Windows 的 D:\dbshare 中确认可以看到 ubuntu-test.txt

验证完成后可删除测试文件:

rm /mnt/dbshare/ubuntu-test.txt

5. 配置开机自动挂载

5.1 备份原始 fstab

sudo cp /etc/fstab /etc/fstab.bak-$(date +%F-%H%M%S)

5.2 添加自动挂载配置

sudo nano /etc/fstab

在文件末尾增加一行:

//18.18.18.18/dbshare$ /mnt/dbshare cifs credentials=/root/.smb-dbshare,vers=3.1.1,seal,uid=UbuntuName,gid=UbuntuName,file_mode=0660,dir_mode=0770,_netdev,nofail,x-systemd.automount 0 0

说明:/etc/fstab 中的 $ 是普通字符,不需要额外转义。

关键启动参数:

参数作用
_netdev等待网络就绪后再处理网络文件系统
nofailWindows 服务器不可达时,不阻塞 Ubuntu 启动
x-systemd.automount访问目录时由 systemd 自动发起挂载

5.3 测试 fstab

sudo umount /mnt/dbshare
sudo systemctl daemon-reload
sudo mount -a
ls -la /mnt/dbshare
findmnt /mnt/dbshare

只有上述命令没有报错,才算自动挂载配置完成。

5.4 重启验证

在维护窗口内重启 Ubuntu Server:

sudo reboot

重新登录后验证:

ls -la /mnt/dbshare
findmnt /mnt/dbshare

6. 常见故障排查

6.1 mount error(13): Permission denied

重点检查:

  • /root/.smb-dbshare 中的用户名、密码和 domain
  • 使用的是 Windows 账户密码,而不是 Windows Hello PIN。
  • Windows 共享权限是否允许该用户。
  • D:\dbshare 的 NTFS 安全权限是否允许该用户。
  • Windows 账户是否被锁定、禁用或要求首次登录修改密码。

6.2 连接超时或端口不可达

重点检查:

  • Windows Server 防火墙是否允许来源 18.18.18.17 访问 TCP 445。
  • 上游路由器、硬件防火墙或云安全组是否放行。
  • 运营商是否阻断公网 TCP 445。
  • Windows 的 Server 服务是否正在运行。

6.3 No such file or directory

检查:

  • Ubuntu 挂载目录 /mnt/dbshare 是否存在。
  • 共享名是否准确为 dbshare$
  • Windows 本地目录路径与共享路径是否匹配。

6.4 不支持协议或加密

Windows Server 正常支持 SMB 3.1.1 和加密。出现此类错误时,检查 Windows 共享加密状态和 Ubuntu 的 cifs-utils/内核日志:

sudo dmesg | tail -n 50
journalctl -b --no-pager | grep -i cifs

不要为了临时连接而降级到 SMB 1.0。

7. 运维注意事项

  • Windows Server 关机、重启或公网线路中断时,Ubuntu 挂载目录会暂时不可用。
  • 公网 IP 发生变化后,必须同步修改防火墙白名单和 /etc/fstab
  • 建议定期检查 Windows 登录失败记录和防火墙日志。
  • 该挂载适合备份文件、安装包和普通数据文件。
  • 不建议把 MySQL、PostgreSQL 等数据库的实时数据目录直接放在 CIFS/SMB 挂载中,以免出现锁、延迟和一致性问题。
  • 后续切换 VPN 后,应将挂载地址改成 Windows 的 VPN/内网 IP,并关闭公网 TCP 445。

8. 完成标准

满足以下全部条件后,部署完成:

  • Windows 共享 dbshare$ 指向 D:\dbshare
  • 共享权限和 NTFS 权限均已配置。
  • EncryptData 显示为 True
  • TCP 445 只允许来源公网 IP 18.18.18.17
  • Ubuntu 可以成功挂载 /mnt/dbshare
  • Ubuntu 可以在共享目录中创建和读取测试文件。
  • /etc/fstab 测试无错误。
  • Ubuntu 重启后能够按需自动挂载。