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

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

步骤一:规划拓扑

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

(补充:这里以创建用户 zhumingyu 为例)

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

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

# passwd zhumingyu

(补充:这里以给 zhumingyu 设置密码为例)

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

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

# smbpasswd -a zhumingyu

(补充:这里以给 zhumingyu 用户设置 Samba 共享密码为例)

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

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

# pdbedit -L

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

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

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

# mkdir /share

(补充:这里以创建目录 /share 为例)

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

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

# chmod 755 /share

(补充:这里以给 /share 目录设置 755 权限为例)

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

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

如果是 CentOS Linux & RHEL:

# chown zhumingyu:zhumingyu /share

如果是 openSUSE & SLE:

# chown zhumingyu:users /share

(补充:这里以将 /share 目录的所属主设置成 zhumingyu 为例)

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

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

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

(补充:这里以给 /share 目录打上 samba_share_t SELinux 标签为例)

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

(补充:这里以通过用户 zhumingyu 测试 IP 地址 192.168.101.41 的 /sharetest Samba 共享目录为例)

6.3 在客户端上挂载服务端的 Samba 目录

6.3.1 手动挂载的方法

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

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

(补充:这里以通过用户 zhumingyu 密码为 1,目录权限为 0755,文件权限为 0755,挂载 IP 地址 192.168.101.41 的 /sharetest Samba 共享目录到本地的 /tmp 目录为例)

(注意:用户和密码不能一样,否则会报错)

6.3.2 自动挂载的方法

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

# vim /etc/fstable

添加以下内容:

......
//192.168.101.41/sharetest /tmp cifs defaults,rw,dir_mode=0755,file_mode=0755,username=zhumingyu,password=1 0 0

(补充:这里以通过用户 zhumingyu 密码为 1,目录权限为 0755,文件权限为 0755,挂载 IP 地址 192.168.101.41 的 /sharetest Samba 共享目录到本地的 /tmp 目录为例)

(注意:用户和密码不能一样,否则会报错)

[命令] 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 域名为例)

[实验] Chrony 客户端的设置 (时间同步)

注意:

从 CentOS 7.2&RHEL 7.0 开始实现时间同步的程序默认从 NTP 换成了 Chrony 。 NTP 也可以继续使用,但是需要单独安装 NTP 的安装包

正文:

步骤一:系统环境要求

1) 服务器的系统是 CentOS 8 版本
2) 服务器系统配置好可用的软件源

步骤二:确保 Chrony 已经安装


# yum -y install chrony

步骤三:确保系统会使用 Chrony 或 NTP 的时间同步

# timedatectl set-ntp true
# timedatectl
               Local time: Fri 2020-06-12 09:52:30 EDT
           Universal time: Fri 2020-06-12 13:52:30 UTC
                 RTC time: Fri 2020-06-12 13:51:52
                Time zone: America/New_York (EDT, -0400)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

(补充:此时 NTP service 的状态可能还不是 active 状态)

步骤四:修改配置文件

# vim /etc/chrony.conf

将部分内容修改如下:

......
pool 2.centos.pool.ntp.org iburst

(说明:在配置文件的开头添加要进行时间同步的服务器)

步骤五:重启客户端的 Chrony 服务

# systemctl restart chronyd
# systemctl status chronyd

步骤六:显示客户端时间同步的状态

6.1 通过 Chrony 命令显示

# chronyc sources -v
210 Number of sources = 4

  .-- Source mode  '^' = server, '=' = peer, '#' = local clock.
 / .- Source state '*' = current synced, '+' = combined , '-' = not combined,
| /   '?' = unreachable, 'x' = time may be in error, '~' = time too variable.
||                                                 .- xxxx [ yyyy ] +/- zzzz
||      Reachability register (octal) -.           |  xxxx = adjusted offset,
||      Log2(Polling interval) --.      |          |  yyyy = measured offset,
||                                \     |          |  zzzz = estimated error.
||                                 |    |           \
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^* time.rdg.uk.as44574.net       3   8   373   153    +73ms[  +68ms] +/-  233ms

(补充:当出现 ^* 时则代表时间同步成功)

或者:

# chronyc tracking

6.2 通过 timedatectl 命令显示

# timedatectl
               Local time: Fri 2020-06-12 09:52:30 EDT
           Universal time: Fri 2020-06-12 13:52:30 UTC
                 RTC time: Fri 2020-06-12 13:51:52
                Time zone: America/New_York (EDT, -0400)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

(补充:如果 Chrony 时间同步正常,则此时 Chrony service 的状态肯定是 active 状态)