admin-guide/cifsfilesystems/smb安装用户态工具:
apt-get install samba -y # debian
dnf install samba -y # fedora用户操作(优先用pdbedit而不是smbpasswd):
pdbedit -L # 查看cifs用户
pdbedit -Lw # -w: 使用旧版的 smbpasswd 格式显示
pdbedit -a -u root # -a: 新增,这里的用户名必须是系统用户名(在/etc/passwd中有)
smbpasswd -a root # 添加用户,这里的用户名必须是系统用户名(在/etc/passwd中有)
# 如果 smbpasswd -a 添加用户test失败,就要先创建系统用户test
useradd -s /bin/bash -d /home/test -m test
pdbedit -x -u root # 删除用户
smbpasswd -x root # 删除用户
smbpasswd -s root # 修改密码,显示密码
smbpasswd root # 修改密码,不显示密码
smbpasswd -n root # 设置成没密码, 但挂载时好像还是需要密码,以后再看为什么吧编辑/etc/samba/smb.conf配置文件(不区分大小写),具体参数用法查看man 5 smb.conf:
[global]
# 注意注释要单独一行,不能加在配置内容后面
# 通过 man smb.conf 查看
server min protocol = NT1
# 以下3行表示用smbpasswd修改密码时也会修改/etc/shadow密码
unix password sync = yes
passwd program = /usr/bin/passwd %u
pam password change = yes
[TEST]
# browseable = yes
# 如果无法访问,create mask可以设置为0770或0777(但不建议)
# create mask = 0700
# 如果无法访问,directory mask设置为0770或0777(但不建议)
# directory mask = 0700
# valid users = sonvhi
# available = yes
# guest ok = no
comment = xfstests test dir
path = /tmp/s_test
public = yes
read only = no
writeable = yes执行脚本samba-svr-setup.sh启动用户态的samba server。
nmbd用于管理工作组和NetBIOS
name,通过UDP开启端口137和138解析名称。smbd权限管理,
用于管理SAMBA主机共享的目录、文件和打印机等,通过TCP来传输数据,端口为139和445,ksmbd监听的端口是445。tdbdump,tdbtool: TDB (Trivial DataBase)数据库,
tdb-tools软件包。smbstatus: 联机状况。smbpasswd,pdbedit:
账号密码,早期smbpasswd,使用TDB后用pdbedit。testparm: 检查/etc/samba/smb.conf。smbstatus: 观察状态。文档查看/usr/share/doc/samba*。
如果windows和macOS客户端无法访问Linux的文件夹,Linux可能需要再进行以下步骤:
sudo firewall-cmd --permanent --add-service=samba #(允许samba服务)
sudo firewall-cmd --permanent --add-service=samba-dc #(允许samba-dc服务,可能不需要操作)
sudo setsebool -P samba_enable_home_dirs on #(把用户目录的samba功能使能,可读写)
sudo firewall-cmd --reload #(防火墙重新加载配置)
sudo systemctl stop firewalld.service #(关闭防火墙)
sudo systemctl disable firewalld.service #(开机不启动防火墙)
sudo firewall-cmd --get-services # 查看所有的service
sudo firewall-cmd --list-services # 查看已添加的service
sudo systemctl restart smb.service #(重启samba服务)参考文档: Build Samba from Source。
git clone https://gitlab.com/samba-team/devel/samba.git
cd samba/bootstrap/generated-dists/fedora41/ # fedora41可替换你使用的发行版
./bootstrap.sh # 安装依赖软件,时间可能比较久
cd ../../../
./configure --with-systemd --with-libunwind --with-static-modules=vfs_delay_inject
make -j`nproc`
make install -j`nproc`
export PATH=/usr/local/samba/bin/:/usr/local/samba/sbin/:$PATH
# 只编译安装 smbd
make -j`nproc` bin/smbd && rm -rf /usr/local/samba/sbin/smbd; cp bin/smbd /usr/local/samba/sbin/smbd注意NT_STATUS_WAIT_0等宏定义是在编译过程中用脚本source4/scripting/bin/gen_ntstatus.py自动生成的,生成的文件是bin/default/include/public/core/ntstatus_gen.h和bin/default/libcli/util/ntstatus_gen.h。
复制/usr/lib/systemd/system/smb.service(具体位置可以用systemctl status smb查看):
cp ./bin/default/packaging/systemd/smb.service /usr/lib/systemd/system/smb.service创建配置文件:
ln -s /etc/samba/smb.conf /usr/local/samba/etc/smb.conf需要特别注意的是要重新创建用户:
pdbedit -a -u root启动服务:
systemctl daemon-reload
systemctl restart smb.service参考how to mount from linux to windows 11。
设置 -> 网络与Internet -> 高级网络设置,打开公用网络的网络发现和xxx共享(也可以尝试把几个网络都打开)。
在文件夹上点击鼠标右键,属性 -> 共享 -> 共享(S)...,这时所有者权限已经默认添加,也可以尝试再添加Everyone。这时目录还没导出,还需要再点击高级共享(D)...,勾选共享此文件夹(S),再点击Permissions,勾选Allow。
注意如果Windows11是以微软账户邮箱登录,则用户名是邮箱或C:\Users目录下的用户名缩写,密码是微软账户邮箱的密码(不是PIN码)。
Linux挂载命令:
mount -t cifs -o username=chenx,password=微软账户邮箱密码,uid=$(id -u),gid=$(id -g) //192.168.122.106/win-test /mnt/安装所需工具:
apt install cifs-utils -y # 安装 cifs 客户端, 否则无法挂载
dnf install cifs-utils -y # fedora
apt install smbclient -y # 查询服务器共享了哪些目录测试:
smbclient -L //127.0.0.1 -U root
smbclient //127.0.0.1/TEST -U root # 然后用help查看帮助,ftp的语法
nmblookup -U 192.168.53.209 netbios_name
nmblookup -S netbios_name挂载命令:
getsebool -a | grep samba
setsebool -P samba_enable_home_dirs=1
# 挂载Windows导出的目录
mount -t cifs -o username=chenx,password=微软账户邮箱密码,uid=$(id -u),gid=$(id -g) //192.168.122.106/win-test /mnt/
# 选项: password=密码,iocharset=本机编码(如big5、utf8、cp950),codepage=远程主机编码
# 指定挂载后文件的所有者: uid=1000,gid=1000,当前用户的id用 id $USER 查看
# 建议用username而不是user
mount -t cifs -o username=root,vers=1.0 //localhost/TEST /mnt
mount -t cifs -o username=root,vers=2.0 //localhost/TEST /mnt
mount -t cifs -o username=root,vers=2.1 //localhost/TEST /mnt
mount -t cifs -o username=root,vers=3.0 //localhost/TEST /mntmount.cifs: 挂载命令。smbclient: 查询服务器共享了哪些目录。nmblookup: 查NetBIOS name。smbtree: 查树状目录分布图。错误日志请查看/var/log/samba/log*。
apt-get update -y
apt install -y autoconf build-essential libtalloc-dev
git clone https://git.samba.org/cifs-utils.git
cd cifs-utils
autoreconf -i
./configure
make -j`nproc`
make -j`nproc` installWindows系统下,在Windows资源管理器中输入
\\192.168.122.1\TEST就可访问Linux系统的文件。
macOS系统下,在Finder中按快捷键cmd+k,跳出Connect to
Server窗口,输入smb://192.168.122.1/TEST就可访问Linux系统的文件。
/etc/hosts:
192.168.53.209 client.test
192.168.53.210 ksmbd.test
192.168.53.211 kdc.test分别设置主机名:
sudo hostnamectl set-hostname client.test
sudo hostnamectl set-hostname ksmbd.test
sudo hostnamectl set-hostname kdc.test三台机器都确认解析:
getent hosts client.test
getent hosts ksmbd.test
getent hosts kdc.test三台机器统一配置/etc/krb5.conf:
[libdefaults]
default_realm = KSMBD.TEST
dns_lookup_realm = false
dns_lookup_kdc = false
rdns = false
[realms]
KSMBD.TEST = {
kdc = kdc.test
admin_server = kdc.test
}
[domain_realm]
.test = KSMBD.TEST
kdc.test = KSMBD.TEST
ksmbd.test = KSMBD.TEST
client.test = KSMBD.TEST三台机器同步时间:
dnf install -y chrony
systemctl enable --now chronyd
date
chronyc tracking安装 KDC:
dnf install -y \
krb5-server \
krb5-workstation \
krb5-libs
kdb5_util create -s -r KSMBD.TEST # 密码: 123
systemctl enable --now krb5kdc
systemctl status krb5kdc
firewall-cmd --permanent --add-port=88/tcp
firewall-cmd --permanent --add-port=88/udp
firewall-cmd --reload创建 Kerberos 用户:
kadmin.local
kadmin.local: addprinc chenxiaosong@KSMBD.TEST # 密码: 123
kadmin.local: getprinc chenxiaosong@KSMBD.TEST创建 SMB Service Principal:
kadmin.local: addprinc -randkey cifs/ksmbd.test@KSMBD.TEST
kadmin.local: getprinc cifs/ksmbd.test@KSMBD.TEST # ksmbd.test 是真正提供 SMB 服务的 192.168.53.210生成 ksmbd keytab:
mkdir -p /root/ksmbd-keytab
kadmin.local: ktadd -norandkey -k /root/ksmbd-keytab/ksmbd.keytab cifs/ksmbd.test@KSMBD.TEST
klist -kte /root/ksmbd-keytab/ksmbd.keytab将 keytab 复制到 ksmbd 服务端:
scp /root/ksmbd-keytab/ksmbd.keytab root@ksmbd.test:/tmp/ksmbd.keytab安装 keytab:
mkdir -p /etc/ksmbd
mv /tmp/ksmbd.keytab \
/etc/ksmbd/ksmbd.keytab
chown root:root /etc/ksmbd/ksmbd.keytab
chmod 600 /etc/ksmbd/ksmbd.keytab
klist -kte /etc/ksmbd/ksmbd.keytab # 必须存在: cifs/ksmbd.test@KSMBD.TEST在 ksmbd 服务端独立验证 keytab:
kdestroy
kinit -V \
-k \
-t /etc/ksmbd/ksmbd.keytab \
cifs/ksmbd.test@KSMBD.TEST # 正常应看到: Authenticated to Kerberos v5
klist
kdestroy
配置 Linux 用户:
id chenxiaosong
useradd -M -s /sbin/nologin chenxiaosong
id chenxiaosong配置 ksmbd 用户:
cat /usr/local/etc/ksmbd/ksmbdpwd.db
/usr/local/sbin/ksmbd.adduser --add chenxiaosong # 密码: 123配置 /usr/local/etc/ksmbd/ksmbd.conf:
[global]
workgroup = KSMBD
kerberos support = yes
kerberos keytab file = /etc/ksmbd/ksmbd.keytab
kerberos service name = cifs/ksmbd.test@KSMBD.TEST
server signing = auto
smb3 encryption = auto
[test3]
path = /tmp/s_test
read only = no安装 Kerberos 客户端工具:
dnf install -y krb5-workstation krb5-libs
nc -vz kdc.test 88
nc -vz ksmbd.test 445客户端独立验证 Kerberos:
kdestroy
kinit chenxiaosong@KSMBD.TEST # 密码: 123
klist -e # 应看到: krbtgt/KSMBD.TEST@KSMBD.TEST
kvno cifs/ksmbd.test@KSMBD.TEST # 请求 SMB Service Ticket, 正常类似: cifs/ksmbd.test@KSMBD.TEST: kvno = 1
klist -e # 应该同时存在: krbtgt/KSMBD.TEST@KSMBD.TEST 和 cifs/ksmbd.test@KSMBD.TEST检查 KVNO 是否一致:
# 客户端:
kvno cifs/ksmbd.test@KSMBD.TEST
# 服务端:
klist -kte /etc/ksmbd/ksmbd.keytab
# KDC 中 Service Principal 的 KVNO = ksmbd Server keytab 中的 KVNO, 如果不一致,需要从 KDC 重新导出正确 keytab先测试普通 Kerberos SMB:
smbclient \
//ksmbd.test/test3 \
-U'chenxiaosong@KSMBD.TEST%123' \
--use-kerberos=required \
-c 'ls'smbtorture \
//ksmbd.test/test3 \
-U'chenxiaosong@KSMBD.TEST%123' \
--use-kerberos=required \
smb2.session.expire2s
# smb2.session.expire2e
# smb2.session.expire1s
# smb2.session.expire1e