上一篇 下一篇 分享链接 返回 返回顶部

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

发布人:Minchunlin 发布时间:2025-09-11 09:40 阅读量:1094


凌晨 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 为主线,同时标注关键差异点。

关键设计取舍(经验之谈)

  1. 域控不兼做文件服务器:Samba AD DC 与 smbd/winbindd 在同机共存是可行但复杂且有安全风险;实战中强烈建议分离。
  2. DNS 内建 vs BIND9:中小规模优先用 Samba 内建 DNS,配置简单;需要复杂记录/视图时再上 BIND9 DLZ。
  3. SMB 安全 vs 性能:跨境链路上开启 签名(signing)与加密(SMB3 encryption)会牺牲吞吐;我的做法是对敏感共享强制加密,对大文件工位共享使用签名+VPN,并通过 BBR、窗口与 rmem/wmem 做补偿。
  4. DFS Namespace:用 Samba DFS Referral 做统一入口(\\files.corp.example.com\Projects),后端可指向不同服务器或区域;DFS-R 复制不在 Samba 中实现,我用 lsyncd+rsync 做异地近实时镜像。
  5. 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_RWCORP\ALL_RD R&D 读写、全员只读
/data/finance CORP\FINANCE_RWCORP\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_rididmap_ad 配置区间,并写入 CMDB
访问慢、间歇掉线 跨境链路抖动 + SMB3 加密开销 先确保 VPN 稳定;敏感共享强制加密,普通共享仅签名;开启 BBR 调优
DC 上 smbd 端口被占、服务乱 混用 sambasmbd/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

如果你准备在更高版本的发行版上做同样的架构,流程几乎一致,只需把安装包换成相应的包名即可。

目录结构
全文