如何在香港服务器的 Linux 系统中,部署设置 Samba 与 AD 域控,支撑跨境企业文件共享与权限管理

凌晨 2:07,我在香港葵涌的机房值班,客户打来电话:内地分支访问总部 NAS 卡顿,权限管控混乱;总部在香港、研发在深圳、销售在上海,大家在同一份项目目录里“你拖我拽”,黑夜里还要抢救一个被误删的 CAD 文件。CIO 的要求很直接:一个统一域、清晰的权限、跨境可用且不拖慢业务。预算有限、时间紧,且必须在现有 CentOS 7 的基础上落地。
目标与架构(先讲结论)
- 统一身份认证:在香港部署 Samba AD 域控(DC),集中管理用户/组、计算机和 GPO。
- 文件服务分离:域控只做域控;文件共享由域成员文件服务器承担(避免把鸡蛋放在一个篮子里,也更安全)。
- 跨境可用:通过 WireGuard/IPSec 将内地分支与香港数据中心打通;对 SMB 传输进行 TCP/BBR 与 签名/加密权衡优化。
- 命名建议:corp.example.com(示例域;生产请用你的企业域名),林与域一体。
逻辑拓扑
[ HK-DC01 ] Samba AD DC (DNS/Kerberos) —— 10GbE —— [ HK-FS01 ] Samba 文件服务器(域成员)
│
└── WireGuard/IPSec ── [ CN-Branch ] Windows 客户端/小型边缘缓存
现场硬件与网络参数
| 角色 | 型号/形态 | CPU | 内存 | 系统盘 | 数据盘 | 网卡 | 机房链路 |
|---|---|---|---|---|---|---|---|
| HK-DC01 | 1U 服务器 | Xeon Silver 4210R ×1 | 32GB ECC | 240GB SATA SSD | — | 2×10GbE | BGP 多线,CN2 优先 |
| HK-FS01 | 2U 服务器 | Xeon Silver 4210R ×2 | 128GB ECC | 480GB SATA SSD | 4×3.84TB NVMe(RAID10) | 2×10GbE | 同上 |
| CN-Branch | 小型边缘缓存/客户端 | i5/锐龙随便 | 16GB | 256GB SSD | — | 1GbE | 电信/联通/BGP 出口 |
系统版本:客户环境为 CentOS 7.9(已 EOL,但项目限定),如无遗留限制更推荐 AlmaLinux/Rocky 9。本文以 CentOS 7 为主线,同时标注关键差异点。
关键设计取舍(经验之谈)
- 域控不兼做文件服务器:Samba AD DC 与 smbd/winbindd 在同机共存是可行但复杂且有安全风险;实战中强烈建议分离。
- DNS 内建 vs BIND9:中小规模优先用 Samba 内建 DNS,配置简单;需要复杂记录/视图时再上 BIND9 DLZ。
- SMB 安全 vs 性能:跨境链路上开启 签名(signing)与加密(SMB3 encryption)会牺牲吞吐;我的做法是对敏感共享强制加密,对大文件工位共享使用签名+VPN,并通过 BBR、窗口与 rmem/wmem 做补偿。
- DFS Namespace:用 Samba DFS Referral 做统一入口(\\files.corp.example.com\Projects),后端可指向不同服务器或区域;DFS-R 复制不在 Samba 中实现,我用 lsyncd+rsync 做异地近实时镜像。
- ID 映射方案:统一使用 idmap_rid 或 idmap_ad,避免 UID/GID 飘忽(会导致 NFS/备份/ACL 乱套)。
域控(HK-DC01)部署步骤
以 CentOS 7 为例。CentOS 7 自带的 Samba 版本偏老,若要稳定 AD DC 能力,推荐使用 SerNet 仓库或自行编译较新版本(≥4.17 更佳)。下文给出两套路径:
方案 A:使用 SerNet(推荐给追求省时的人)
# 1) 启用 SerNet 仓库(根据订阅/授权获取 repo 文件)
# 文件通常名为 /etc/yum.repos.d/sernet-samba.repo
# 2) 安装 AD DC 相关组件
yum install -y sernet-samba sernet-samba-ad sernet-samba-client sernet-samba-winbind sernet-samba-common-tools chrony policycoreutils-python firewalld bind-utils
systemctl enable chronyd firewalld
systemctl start chronyd firewalld
# 时间同步(DC 必须时间准确,误差 >5min 就会出 Kerberos 错误)
chronyc sources -v
方案 B:使用发行版自带(若你清楚版本局限)
yum install -y samba samba-dc samba-client samba-winbind krb5-workstation chrony firewalld bind-utils policycoreutils-python
systemctl enable chronyd firewalld && systemctl start chronyd firewalld
注意:部分 CentOS 7 源并不提供 samba-dc 包;此时只能走方案 A 或源码编译。
规划主机名与 DNS
hostnamectl set-hostname hk-dc01.corp.example.com
cat >/etc/hosts <<'EOF'
10.10.10.10 hk-dc01.corp.example.com hk-dc01
EOF
域初始化(Provision)
# 停掉可能的旧服务
systemctl stop smb nmb winbind 2>/dev/null || true
# 使用 samba-tool 初始化域
samba-tool domain provision \
--use-rfc2307 \
--realm=CORP.EXAMPLE.COM \
--domain=CORP \
--server-role=dc \
--dns-backend=SAMBA_INTERNAL \
--function-level=2008_R2 \
--adminpass='Str0ng!Passw0rd-ChangeMe'
成功后会生成 /etc/samba/smb.conf 与 Kerberos 配置参考。将 Krb5 写入系统:
cp /var/lib/samba/private/krb5.conf /etc/krb5.conf
启动域控服务
# 域控使用单体进程 `samba`(非 smbd/nmbd/winbindd 组合)
systemctl enable samba && systemctl start samba
# 开防火墙端口(最小集)
firewall-cmd --permanent --add-service={dns,kerberos,ldap,ldaps,samba,ntp}
firewall-cmd --permanent --add-port=135/tcp
firewall-cmd --permanent --add-port=137-138/udp
firewall-cmd --permanent --add-port=139/tcp
firewall-cmd --permanent --add-port=389/tcp
firewall-cmd --permanent --add-port=445/tcp
firewall-cmd --permanent --add-port=464/tcp
firewall-cmd --permanent --add-port=3268-3269/tcp
firewall-cmd --reload
基本验证
# DNS 检查
host -t SRV _ldap._tcp.corp.example.com 127.0.0.1
host -t SRV _kerberos._tcp.corp.example.com 127.0.0.1
# Kerberos 票据
kinit administrator@CORP.EXAMPLE.COM
klist
# 域对象
samba-tool domain level show
samba-tool user list | head
典型的 smb.conf(DC 侧)
# /etc/samba/smb.conf(samba-tool 已生成,以下为关键项参考)
[global]
workgroup = CORP
realm = CORP.EXAMPLE.COM
server role = active directory domain controller
dns forwarder = 8.8.8.8
idmap_ldb:use rfc2307 = yes
# 安全基线
server min protocol = SMB2
client min protocol = SMB2
server signing = auto
map to guest = Bad Password
# DC 侧可少量共享,但不建议承载主数据
[NETLOGON]
path = /var/lib/samba/sysvol/corp.example.com/scripts
read only = No
[SYSVOL]
path = /var/lib/samba/sysvol
read only = No
文件服务器(HK-FS01)加入域并配置共享
安装与基础配置
hostnamectl set-hostname hk-fs01.corp.example.com
cat >/etc/hosts <<'EOF'
10.10.10.10 hk-dc01.corp.example.com hk-dc01
10.10.10.20 hk-fs01.corp.example.com hk-fs01
EOF
yum install -y samba samba-client samba-winbind krb5-workstation acl attr policycoreutils-python firewalld
systemctl enable firewalld && systemctl start firewalld
# 指向域控 DNS(关键!不要用外部 DNS)
cat >/etc/resolv.conf <<'EOF'
search corp.example.com
nameserver 10.10.10.10
EOF
# 同步 DC 的 krb5 设置(建议从 DC 拷贝 krb5.conf)
scp root@hk-dc01:/etc/krb5.conf /etc/krb5.conf
smb.conf(域成员)
# /etc/samba/smb.conf
[global]
workgroup = CORP
realm = CORP.EXAMPLE.COM
security = ADS
kerberos method = secrets and keytab
# ID 映射:两选一(按团队习惯统一)
idmap config * : backend = tdb
idmap config CORP:backend = rid
idmap config CORP:range = 100000-299999
# 若已在 AD 中维护 UNIX 属性,可用 idmap_ad
# idmap config CORP:backend = ad
# idmap config CORP:schema_mode = rfc2307
# idmap config CORP:range = 10000-999999
winbind use default domain = yes
winbind enum users = yes
winbind enum groups = yes
# 安全与协议
server min protocol = SMB2
client min protocol = SMB2
server signing = auto
# ACL 与回收站、影子副本
vfs objects = acl_xattr, recycle, shadow_copy2
map acl inherit = yes
store dos attributes = yes
# 性能(谨慎)
aio read size = 1
aio write size = 1
read raw = yes
write raw = yes
# 业务共享示例
[Projects]
path = /data/projects
browsable = yes
read only = no
inherit permissions = yes
inherit acls = yes
# 敏感度一般,仅签名
smb encrypt = off
[Finance]
path = /data/finance
browsable = yes
read only = no
valid users = @CORP\\FINANCE_RW
force group = CORP\\FINANCE_RW
create mask = 0660
directory mask = 0770
# 敏感共享:强制加密
smb encrypt = required
[Archive]
path = /data/archive
read only = yes
guest ok = no
加入域
kinit administrator@CORP.EXAMPLE.COM
net ads join -k -U administrator
systemctl enable smb winbind && systemctl start smb winbind
# 验证域对象解析
wbinfo -u | head
wbinfo -g | head
getent passwd 'CORP\\someuser'
存储与文件系统
数据盘建议做 RAID10(NVMe),文件系统选 XFS 或 ext4(对海量小文件更偏好 XFS)。
目录权限:
mkdir -p /data/{projects,finance,archive}
chown -R "CORP\\Domain Admins":"CORP\\Domain Admins" /data
setfacl -R -m g:"CORP\\FINANCE_RW":rwx /data/finance
# SELinux(不要一上来就关)
semanage fcontext -a -t samba_share_t "/data(/.*)?"
restorecon -Rv /data
firewall-cmd --permanent --add-service=samba && firewall-cmd --reload
WireGuard 打通分支(跨境链路)
跨境访问 SMB 最怕高延迟与丢包。我的经验是:先保通,再谈快。先用 WireGuard 建立站点到站点隧道,确保域加入、Kerberos 和 DFS 引用都能走内网。
HK-FS01(作为隧道一端)
yum install -y epel-release elrepo-release
yum install -y kmod-wireguard wireguard-tools
wg genkey | tee /etc/wireguard/privatekey | wg pubkey > /etc/wireguard/publickey
cat >/etc/wireguard/wg0.conf <<'EOF'
[Interface]
Address = 172.30.0.1/24
PrivateKey = <HK_PRIVATE_KEY>
ListenPort = 51820
[Peer]
PublicKey = <CN_PUBLIC_KEY>
AllowedIPs = 172.30.0.2/32,10.20.0.0/16 # CN 分支网段
Endpoint = cn-branch.example.com:51820
PersistentKeepalive = 25
EOF
systemctl enable wg-quick@wg0 && systemctl start wg-quick@wg0
TCP/BBR 优化(HK 与 CN 两端一起)
cat >>/etc/sysctl.conf <<'EOF'
net.core.default_qdisc=fq
net.ipv4.tcp_congestion_control=bbr
net.core.rmem_max=268435456
net.core.wmem_max=268435456
net.ipv4.tcp_rmem=4096 87380 268435456
net.ipv4.tcp_wmem=4096 65536 268435456
net.ipv4.tcp_mtu_probing=1
EOF
sysctl -p
提示:SMB 的 socket options 旧参数现在不推荐使用,统一在 内核层 做网络缓冲与拥塞算法调优更可靠。
DFS 命名空间与“单一入口”
在 hk-fs01 上提供 DFS 根共享,统一入口 \\files.corp.example.com\Projects,后端可指向多台文件服务器:
# 在 [global] 下启用 DFS
host msdfs = yes
[DFS-Root]
path = /srv/dfsroot
msdfs root = yes
browsable = yes
创建 DFS 引用(Windows 管理机上,也可以在 Linux 用符号链接+特殊语法):
mkdir -p /srv/dfsroot/Projects
# 链接到后端路径(SAMBA 的 msdfs 语法)
ln -s "msdfs:hk-fs01.corp.example.com\\Projects" /srv/dfsroot/Projects
注意:Samba 不实现 DFS-R 复制。异地只读镜像可用 lsyncd + rsync:
yum install -y lsyncd rsync
cat >/etc/lsyncd.conf.lua <<'EOF'
settings {
logfile = "/var/log/lsyncd.log",
statusFile = "/var/log/lsyncd.status",
inotifyMode = "CloseWrite",
}
sync {
default.rsync,
source = "/data/projects",
target = "rsync://mirror@cn-edge/Projects",
rsync = {
archive = true, compress = true, verbose = true, _extra = {"--delete"}
}
}
EOF
systemctl enable lsyncd && systemctl start lsyncd
组策略(GPO)最小闭环
登录脚本、驱动映射、桌面策略在 Samba AD 同样可用。
在 Windows 管理机上安装 RSAT 工具,连上 hk-dc01,创建如下策略:
| 策略 | 作用对象 | 关键设置 |
| CN-Branch SMB Baseline | CN-Branch OU | 启用 SMB 签名、禁用 SMB1;登录脚本映射 Z: 到 \\files\Projects |
| Finance Encryption Required | Finance 组 | 强制访问 Finance 共享必须 SMB3 加密 |
| ScreenLock | 全域 | 屏幕 15 分钟自动锁定 |
Samba 4 的 GPO 支持度已能覆盖大部分常见办公策略;极个别 ADMX 项需要导入模板。
权限模型与 ID 映射(避免 UID 漂移)
| 资源 | 访问组 | 权限 |
/data/projects |
CORP\RND_RW、CORP\ALL_RD |
R&D 读写、全员只读 |
/data/finance |
CORP\FINANCE_RW、CORP\FINANCE_RD |
财务读写/只读 |
/data/archive |
CORP\ARCHIVE_RD |
只读归档 |
要点:
- 统一采用 基于组 的授权;不要直接给用户赋 NTFS/ACL。
- 在 smb.conf 中锁定 idmap 策略;全体域成员服务器保持一致。
影子副本(Windows 的“以前的版本”)
在 XFS/ext4 上通过 shadow_copy2 暴露快照;快照由 LVM 或 ZFS 提供。示例:ext4 + LVM 快照(简化版流程):
# 假设 /data 在 VG=data_vg 的 LV=data_lv 上
# 每晚 23:00 做一个只读快照,保存 14 天
cat >/usr/local/bin/snap_data.sh <<'EOF'
#!/bin/bash
set -e
DATE=$(date +%Y-%m-%d_%H-%M)
SNAP=/snapshots/$DATE
# 创建 LVM 快照(20% 空间,按需调整)
lvcreate -L 200G -s -n data_lv_$DATE /dev/data_vg/data_lv
mkdir -p $SNAP
echo "/dev/data_vg/data_lv_$DATE $SNAP ext4 ro,defaults 0 0" >>/etc/fstab
mount $SNAP
EOF
chmod +x /usr/local/bin/snap_data.sh
echo "0 23 * * * root /usr/local/bin/snap_data.sh" >/etc/cron.d/snap_data
smb.conf 中对应:
[global]
vfs objects = acl_xattr, recycle, shadow_copy2
[Projects]
path = /data/projects
shadow: snapdir = /snapshots
shadow: sort = desc
shadow: format = %Y-%m-%d_%H-%M
shadow: localtime = yes
Windows 端在共享属性里即可看到“以前的版本”。
备份与恢复(DC/文件两套)
DC 备份
# 在线备份(Samba 4.8+)
samba-tool domain backup online \
--targetdir=/var/backups/samba \
--server=127.0.0.1 \
--username=administrator --password='***'
文件备份
- borgbackup/restic 任选其一,挂载到对象存储或离线磁带。
- 备份中包含 ACL 与 xattr:rsync -XAHS、tar --xattrs --acls。
监控与日常巡检
# 配置检查
testparm -s
# 会话与锁
smbstatus
# 域复制(如未来增加第二台 DC)
samba-tool drs showrepl
# 数据库健康
samba-tool dbcheck --cross-ncs
# Winbind 解析
getent group "CORP\\Domain Admins"
性能与安全基线(可直接落地)
协议与加密:
- server min protocol = SMB2,禁用 SMB1。
- 对 Finance 等敏感共享 smb encrypt = required;其它共享走 server signing = auto。
系统网络栈:启用 BBR、增大缓冲、适度 MTU 探测(见前文 sysctl)。
磁盘调度:NVMe 上使用 none/mq-deadline;RAID 控制器开启写缓存+BBU。
审计:启用 full_audit(如需合规留痕):
vfs objects = full_audit, acl_xattr, recycle, shadow_copy2
full_audit:prefix = %u|%I|%S
full_audit:success = mkdir rmdir read pread write pwrite rename unlink
full_audit:failure = none
full_audit:facility = local7
full_audit:priority = notice
常见坑与现场处置记录
| 现象 | 根因 | 解决 |
net ads join 报错:Clock skew too great |
双端时间差 >5 分钟,Kerberos 拒绝 | 立刻检查 NTP/Chrony,同步后重试;DC 作为上游时间源 |
| Windows 10 加域失败(找不到 DC) | 客户端 DNS 没指向 DC | DHCP/静态 DNS 改为 DC IP,ipconfig /flushdns |
| 权限显示混乱、UID 变化 | 多台文件服 idmap 不一致 | 统一 idmap_rid 或 idmap_ad 配置区间,并写入 CMDB |
| 访问慢、间歇掉线 | 跨境链路抖动 + SMB3 加密开销 | 先确保 VPN 稳定;敏感共享强制加密,普通共享仅签名;开启 BBR 调优 |
| DC 上 smbd 端口被占、服务乱 | 混用 samba 与 smbd/nmbd |
DC 只跑 samba 单体;文件服只跑 smbd+winbindd,两边不要混装 |
| SELinux 拦截访问 | 目录没标记 samba_share_t |
用 semanage fcontext + restorecon 正确标注 |
| GPO 未生效 | 复制路径/权限错误 | 检查 SYSVOL 权限与复制(单 DC 时也要核对 ACL) |
收尾:清晨 6:40 的那封邮件
天微亮,机房里只剩空调声。我把最后一条 samba-tool domain backup 的输出贴到变更单里,写好回滚方案,关上机柜门。6:40 的时候,深圳研发发来邮件:“Z 盘不再断了,权限也清楚了。昨晚辛苦。”
其实这些年,我最大的感触是:技术不是炫技,是把复杂的东西变成团队日常可依赖的能力。希望这篇手记,能让你少踩些坑,哪怕只是少熬一个通宵。
附:快速参数总表
| 类别 | 关键参数 | 建议值 |
| AD 域 | Realm/Domain | CORP.EXAMPLE.COM / CORP |
| DNS | Backend/Forwarder | 内建 DNS / 8.8.8.8(示例) |
| 协议 | SMB 最低版本 | SMB2 |
| 安全 | 签名/加密 | 普通共享 auto/off,敏感共享 required |
| IDMAP | 方案/范围 | rid or ad / 100000-299999 |
| 网络 | 拥塞控制 | bbr + fq |
| 存储 | RAID/FS | RAID10 + XFS/ext4 |
| 快照 | 影子副本 | shadow_copy2 + LVM/ZFS |
| 备份 | DC/数据 | samba-tool backup / rsync -XAHS/restic |
如果你准备在更高版本的发行版上做同样的架构,流程几乎一致,只需把安装包换成相应的包名即可。