[实验] Samba 远程共享服务的搭建

纪念:站主于 2020 年 7 月完成了此开源实验,并将过程中的所有命令经过整理和注释以后,形成以下教程

步骤目录:

步骤一:规划拓扑
1.1 服务器列表
1.2 服务器列表简介

步骤二:系统环境要求

步骤三:在服务端上安装 Samba 服务

步骤四:在服务端上配置 Samba 服务
4.1 在服务端上配置 Samba 服务文件
4.2 在服务端上生成 Samba 服务共享用户
4.2.1 在服务端上生成 Samba 服务共享用户
4.2.2 在服务端上给 Samba 服务共享用户设置系统密码
4.2.3 在服务端上给 Samba 服务共享用户设置 Samba 共享密码
4.2.4 显示 Samba 服务共享用户是否可用
4.3 在服务端上生成 Samba 服务共享目录
4.3.1 在服务端上生成 Samba 服务共享目录
4.3.2 在服务端上给 Samba 服务共享目录设置权限
4.3.3 在服务端上给 Samba 服务共享目录设置所属主和所属组
4.3.4 在服务端上给 Samba 服务共享目录设置 selinux 标签
4.3.5 在服务端上让 Samba 服务共享目录上的 selinux 标签立刻生效

步骤五:启动 Samba 服务并设置为开机自动启动

步骤六:客户端使用服务端 Samba 服务
6.1 在客户端上安装 Samba 客户端软件
6.2 在客户端上测试服务端的 Samba 服务
6.3 在客户端上挂载服务端的 Samba 目录
6.3.1 手动挂载的方法
6.3.2 自动挂载的方法

具体的操作步骤:

步骤一:规划拓扑
1.1 服务器列表

服务端 192.168.101.41
客户端 192.168.101.42

1.2 服务器列表简介

1) 服务器提供 Samba 服务将自己的目录分享
2) 客户端挂载和使用 Samba 服务将服务端分享的目录挂载在自己的目录上

步骤二:系统环境要求

1) 所有服务器的系统都需要是 CentOS 8 版本
2) 所有服务器都要关闭防火墙
3) 所有服务器都要打开 SELinux
4) 所有服务器系统都要配置好可用的软件源
5) 需要按照拓扑图给对应的服务器配置好 IP 地址和主机名
6) 所有服务器都要可以相互 ping 通自己和对方的 IP 地址和主机名

步骤三:在服务端上安装 Samba 服务

(只在服务端上执行以下步骤)

# yum -y install samba

步骤四:在服务端上配置 Samba 服务
4.1 在服务端上配置 Samba 服务文件

(只在服务端上执行以下步骤)

# vim /etc/samba/smb.conf

将全部内容修改如下:

# See smb.conf.example for a more detailed config file or
# read the smb.conf manpage.
# Run 'testparm' to verify the config is correct after
# you modified it.

[global]
workgroup = WORKGROUP
realm = zhumingyu
netbios name = zhumingyu
#encrypt passwords = yes
map to guest = NEVER
security = user
password server = *
name resolve order = bcast host
restrict anonymous = 2
#null passwords = no
#guest account = smb_nobody
#use spnego = yes
client use spnego = yes
server string = ""
host msdfs = no
msdfs root = no
domain master = no
preferred master = no
local master = no
os level = 0
browse list = no
browseable = no
dns proxy = no
wide links = no
public= no
guest ok = no
hosts deny = ALL EXCEPT 192.168.101.42

[sharetest]
valid users = zhumingyu
write list = zhumingyu
read list = zhumingyu
path = /share
guest ok = no
read only = no
browseable = no
writable = yes
public = no
create mask = 0755
directory mask = 0755


补充:
1) 这里的 workgroup = WORKGROUP 是让 Samba 服务属于 WORKGROUP
2) 这里的 hosts deny = ALL EXCEPT 192.168.101.42 是只让客户端 192.168.101.42 能够访问服务端的 Samba
3) 这里的 sharetest 是这个 Samba 挂载点的名称,挂载这个挂载点的格式就是://192.168.101.41/sharetest
4) 这里的 valid users = zhumingyu 是 Samba 服务共享用户需要手动生成,如果换成让所有的服务共享用户都可以使用则可以写成 valid users = @users
5) 这里的 path = /share 是 Samba 服务共享目录需要手动生成

4.2 在服务端上生成 Samba 服务共享用户
4.2.1 在服务端上生成 Samba 服务共享用户

(只在服务端上执行以下步骤)

# useradd zhumingyu

4.2.2 在服务端上给 Samba 服务共享用户设置系统密码

(只在服务端上执行以下步骤)
# passwd zhumingyu

4.2.3 在服务端上给 Samba 服务共享用户设置 Samba 共享密码

(只在服务端上执行以下步骤)

# smbpasswd -a zhumingyu

4.2.4 显示Samba 服务共享用户是否可用

(只在服务端上执行以下步骤)

# pdbedit -L

4.3 在服务端上生成 Samba 服务共享目录
4.3.1 在服务端上生成 Samba 服务共享目录

(只在服务端上执行以下步骤)

# mkdir /share

4.3.2 在服务端上给 Samba 服务共享目录设置权限

(只在服务端上执行以下步骤)

# chmod 755 /share/

4.3.3 在服务端上给 Samba 服务共享目录设置所属主和所属组

(只在服务端上执行以下步骤)

# chown zhumingyu:zhumingyu /share/

4.3.4 在服务端上给 Samba 服务共享目录设置 SELinux 标签

(只在服务端上执行以下步骤)

# semanage fcontext -a -t samba_share_t '/share(/.*)?'

4.3.5 在服务端上让 Samba 服务共享目录上的 SELinux 标签立刻生效

(只在服务端上执行以下步骤)

# restorecon -RFvv /share/

步骤五:启动 Samba 服务并设置为开机自动启动

(只在服务端上执行以下步骤)

# systemctl enable --now smb

步骤六:客户端使用服务端 Samba 服务
6.1 在客户端上安装 Samba 客户端软件

(只在客户端上执行以下步骤)

# yum -y install samba-client cifs-utils

6.2 在客户端上测试服务端的 Samba 服务

(只在客户端上执行以下步骤)

# smbclient --user=zhumingyu -L //192.168.101.41

或者:

# smbclient //192.168.101.41/sharetest -U zhumingyu
smb: \> ls
smb: \> exit

6.3 在客户端上挂载服务端的 Samba 目录
6.3.1 手动挂载的方法

(只在客户端上执行以下步骤)

# mount -t cifs -o username=zhumingyu,password=1,sec=ntlmssp //192.168.101.41/sharetest /tmp

6.3.2 自动挂载的方法

(只在客户端上执行以下步骤)

# vim /etc/fstable

添加以下内容:

......
# //192.168.101.41/sharetest /tmp cifs defaults,rw,username=zhumingyu,password=1 0 0

[命令] Linux 命令 mail (发送邮件)

内容一:mail 命令选项
1.1 输入 mail 命令后的选项

1) h 或者 headers 显示处于激活状态的邮件开头
2) f 或者 from 显示编号为 的邮件的标题
2) t 或者 type 显示编号为 的邮件
3) top 显示当前指针所指向的邮件头
4) n 或者 next 显示下一条邮件信息
5) e 编辑编号为 的邮件
6) d 或者 delete 删除编号为 的邮件
7) u 或者 undelete 取消删除编号为 的邮件
8) s 或者 save 追加信息到编号为 的邮件信息到 目录中并标记和保存
9) c 或者 copy 追加信息到编号为 的邮件信息到 目录中但不保存
10) w 或者 write 追加信息到编号为 的邮件信息到 文件中并保存附件
11) R 或者 Reply 回复编号为 的邮件的发件人
12) r 或者 reply 回复编号为 的邮件的发件人和所有收件人
13) m 或者 mail 回复编号为 的邮件,并回复多个联系人,多个收件人用空格分开 (需要 sendmail 软件支持此功能)
14) q 或者 quit 退出并保存新编辑的内容,q 会把邮件放在 ~/mbox 中,执行 pre 后就不取回
15) pre 将编号为 的邮件保留在 /usr/spool/mail,q 会把邮件放在 ~/mbox 中,执行 pre 后就不取回
16) x 或者 xit 只退出不保存新编辑的内容
17) file 显示邮件总数和在系统中所在的目录等信息
18) ! 执行 shell 的命令,例如 !ls
19) list 列出所有可用的命令

1.2 在 mail 命令后添加选项

1) -s 设置邮件的标题
2) -a 添加附件
3) -c …… 给多个邮件地址抄送邮件,不同邮件的邮件地址用空格隔开
4) -b …… 给多个邮件地址悄悄抄送邮件,不同邮件的邮件地址用空格隔开
5) -e 检查系统邮件中是否有邮件
6) -f 显示邮箱里的邮件
7) -f + 显示 folder 目录邮箱中的邮件
8) -i 忽略 tty 信号中断
9) -v 显示发送邮件过程的详细信息
10) -h 显示帮助信息
11) uuencode 发送文件,第一个附件是要发送的附件,第二个是设置的名称 (此选项需要安装 sharutils 软件)

内容二:mail 命令的使用案例
2.1 交互式发送邮件

# mail -s test mingyu.zhu@eternalcenter.com

(补充:这里以向邮箱 mingyu.zhu@eternalcenter.com 发送标题为 test 的邮件为例)

(注意:键入此命令后进入交互式编辑内容的模式,内容编辑完了以后可以按下 “ctrl” 键之后再按下 “D” 键退出)

2.2 非交互式发送邮件

# echo 'test content' | mail -s 'test header' mingyu.zhu@eternalcenter.com

(补充:这里以向 mingyu.zhu@eternalcenter.com 邮箱发送标题为 test header 内容为 test content 的邮件为例)

2.3 非交互式将文件里的内容作为内容发送邮件

# mail -s “test.txt” mingyu.zhu@eternalcenter.com < test.txt

(补充:这里以向 mingyu.zhu@eternalcenter.com 邮箱发送标题为 test header 将 test.txt 文件里的内容作为邮件内容的邮件为例)

2.4 非交互式将文件作为附件发送邮件

# uuencode /tmp/test.txt test.txt | mail -s 'test' mingyu.zhu@eternalcenter.com

(补充:这里以向 mingyu.zhu@eternalcenter.com 邮箱发送标题为 test 将 test.txt 文件作为名为 test.txt 的附件的邮件为例)

2.5 非交互式打包将文件作为附件发送邮件

# tar -czf test.txt.tar /tmp/test.txt | uuencode test.txt.tar | mail -s 'test' mingyu.zhu@eternalcenter.com

(补充:这里以向 mingyu.zhu@eternalcenter.com 邮箱发送标题为 test 将 test.txt.tar 文件作为名为 test.txt.tar 的附件的邮件为例)

2.6 非交互式将给多个用户抄送邮件

# mail -s “test.txt” -c "mingyu.zhu2@eternalcenter.com mingyu.zhu1@eternalcenter.com" mingyu.zhu@eternalcenter.com < test.txt

(补充:这里以向 mingyu.zhu@eternalcenter.com 邮箱发送标题为 test header 将 test.txt 文件里的内容作为邮件内容的邮件,并抄送给 mingyu.zhu2@eternalcenter.com 邮箱和 mingyu.zhu1@eternalcenter.com 邮箱为例)

[内容] Postfix 数据的加密 (通过 TLS 实现)

内容一:Postfix 不使用 TLS 加密数据传输的后果

1) 收发的邮件数据会被他人截取
2) 给 Gmail 等电子邮箱发送邮件时,会提示类似 “ *** 未对此邮件进行加密” 的信息

内容二:给 Postfix 设置 TLS 加密数据传输的方法
2.1 给 Postfix 的配置文件设置 TLS 机密数据传输的参数

# vim /etc/postfix/main.cf

添加以下内容:

......
smtpd_tls_security_level = may
smtp_tls_security_level = may
......


补充:
smtpd_tls_security_level 代表接收邮件的 TLS 安全等级
smtp_tls_security_level 代表发送邮件的 TLS 安全等级
TLS 的常用安全等级有 none、may 和 encrypt :
1) none 表示禁止使用 TLS 加密
2) may 表示可以接收不使用 TLS 加密的邮件,但是会提出支持 TLS 加密的通告。发送邮件时优先发送支持 TLS 加密的邮件
3) encrypt 表示强制使用 TLS 加密

2.2 重启 Postfix 服务

# systemctl restart postfix

[内容] DNS 客户端的设置 (Linux 版)

内容一:设置 DNS 客户端
1.1 直接在本地指定域名
1.1.1 直接在本地指定域名的方法

# vim /etc/hosts

添加以下内容:

......
<IP address> <domain name>

(注意:/etc/hosts 里记录的 DNS 优先级要比 /etc/resolv.conf 里的高)

1.1.2 直接在本地指定域名的案例

# vim /etc/hosts

添加以下内容:

......
192.154.240.64 eternalcenter.com

(补充:这里以将 192.154.240.64 解析为 eternalcenter.com 为例)

(注意:/etc/hosts 里记录的 DNS 优先级要比 /etc/resolv.conf 里的高)

1.2 使用远程的 DNS 服务器解析域名
1.2.1 使用远程的 DNS 服务器解析域名
1.2.1.1 使用远程的 DNS 服务器解析域名的方法
1.2.1.1.1 直接修改 /etc/resolv.conf 文件

# vim /etc/resolv.conf

添加以下内容:

......
nameserver <IP address of DNS server>

(注意:/etc/hosts 里记录的 DNS 优先级要比 /etc/resolv.conf 里的高)

1.2.1.1.2 使用 nmcli 命令
1.2.1.1.2.1 使用 nmcli 命令配置一个 DNS 服务器的 IP 地址

# nmcli connection modify <network card name> ipv4.dns <IP address of DNS server>

(补充:不将 /etc/NetworkManager/NetworkManager.conf 里的 [main] dns=none 参数修改为 none 的话,此参数会覆盖 /etc/resolv.conf 里的设置)


注意:
1) 此方法只对 CentOS8&RHEL8 适用
2) /etc/hosts 里记录的 DNS 优先级要比使用 nmcli 命令的高

1.2.1.1.2.2 使用 nmcli 命令配置多个 DNS 服务器的 IP 地址

# nmcli connection modify <network card name> ipv4.dns "<first IP address of DNS server>,<second IP address of DNS server>,<third IP address of DNS server>......"

(补充:不将 /etc/NetworkManager/NetworkManager.conf 里的 [main] dns=none 参数修改为 none 的话,此参数会覆盖 /etc/resolv.conf 里的设置)


注意:
1) 此方法只对 CentOS8&RHEL8 适用
2) /etc/hosts 里记录的 DNS 优先级要比使用 nmcli 命令的高

1.2.1.2 使用远程的 DNS 服务器解析域名的案例
1.2.1.2.1 直接修改 /etc/resolv.conf 文件

# vim /etc/resolv.conf

添加以下内容:

......
nameserver 8.8.8.8

(补充:这里以使用 8.8.8.8 DNS 服务器为例)

(注意:/etc/hosts 里记录的 DNS 优先级要比 /etc/resolv.conf 里的高)

1.2.1.2.2 使用 nmcli 命令

# nmcli connection modify eth0 ipv4.dns 8.8.8.8


补充:
1) 这里以给 eth0 网卡添加 8.8.8.8 DNS 服务器为例
2) 不将 /etc/NetworkManager/NetworkManager.conf 里的 [main] dns=none 参数修改为 none 的话,此参数会覆盖 /etc/resolv.conf 里的设置

(注意:/etc/hosts 里记录的 DNS 优先级要比使用 nmcli 命令的高)

1.2.2 显示正在使用远程的 DNS 服务器解析的域名

# nmcli connection show | grep -i ipv4.dns

内容二:检查 DNS 域名解析
2.1 使用 ping 命令解析域名
2.1.1 使用 ping 命令解析域名的格式

# ping <domain name>

2.1.2 使用 ping 命令解析域名的案例

# ping eternalcenter.com
PING eternalcenter.com (192.154.240.64) 56(84) bytes of data.
64 bytes from v144-48-142.ap-east.sugarhosts.net (192.154.240.64): icmp_seq=1 ttl=50 time=144 ms
64 bytes from v144-48-142.ap-east.sugarhosts.net (192.154.240.64): icmp_seq=3 ttl=50 time=70.8 ms
64 bytes from v144-48-142.ap-east.sugarhosts.net (192.154.240.64): icmp_seq=4 ttl=50 time=81.3 ms
64 bytes from v144-48-142.ap-east.sugarhosts.net (192.154.240.64): icmp_seq=5 ttl=50 time=103 ms
......

2.2 使用 host 命令解析域名
2.2.1 使用 host 命令解析域名的格式

# host <domain name>

2.2.2 使用 host 命令解析域名的案例

# host eternalcenter.com
eternalcenter.com has address 192.154.240.64

(补充:这里以解析 etenalcenter.com 域名为例)

2.3 使用 nslookup 命令解析域名
2.3.1 使用 nslookup 命令解析域名的格式

# nslookup <domain name>

2.3.2 使用 nslookup 命令解析域名的案例

# nslookup eternalcenter.com
Server:		8.8.8.8
Address:	8.8.8.8#53

Non-authoritative answer:
Name:	eternalcenter.com
Address: 192.154.240.64

(补充:这里以解析 etenalcenter.com 域名为例)