FTP(文件传输协议)

简介

  • FTP协议:文件传输协议(File Transfer Protocol)

    • 协议定义了在远程计算机系统和本地计算机系统之间传输文件的标准
    • FTP运行在OSI的应用层,利用TCP传输协议在不同主机之间提供可靠传输。
    • FTP在文件传输中还支持断点续传,大幅减少CPU网络带宽的开销。

      FTP模型

      GKX{FC~JD((D9UREZQ`I)7O.png
      用户接口:提供给用户使用客户端协议解释器的服务
      客户端协议解释器: 向远程服务器发送命令
      服务器协议解释器:响应客户端的命令,并驱动服务器数据传输
      客户端数据传输协议:负责服务器数据进程和客户端本地文件系统的通信
      服务器数据传输协议:负责科幻段数据进程和服务器文件系统的通信
  • 控制连接(端口号21)

作用:主要用来传送通信过程中需要执行的FTP命令、命令的响应(只需要很小的网络带宽)
过程:

  • FTP服务端监听21号端口等待控制连接的建立
  • 建立控制连接后,需要验证客户身份,决定是否建立数据连接
  • 当需要目录列表,传输文件时,才建立数据连接,并且每次客户端都是用不同的端口号来建立数据连接。数据传输完毕,就中断这条临时的数据连接
  • 在FTP连接期间,控制连接始终保持通常的连接状态。在数据连接存在期间,控制连接必须存在;一旦控制连接断开,数据连接会自动关闭。
  • 数据连接(端口号20)

FTP服务端监听20号端口等待数据连接的建立
建立方式:

  • 主动模式
    • 通过三次握手,建立控制连接;客户端的源端口是高位随机端口,目标端口是21端口
    • 控制连接建立后,客户端进行身份验证,协商数据连接采用主动模式;随后客户端会向FTP服务器发送Port报文,表明自己监听的IP+端口,并等待FTP服务器(20端口)向自己监听的IP+端口发起数据连接请求。
    • 服务端发起数据连接请求,建立数据连接
  • 被动模式
    • 通过三次握手,建立控制连接;客户端的源端口是高位随机端口,目标端口是21端口
    • 控制连接建立后,客户端进行身份验证,协商数据连接采用主动模式;随后客户端会向FTP服务器发送PASV报文,表明自己用的是被动模式
    • 服务端收到PASV报文,于是向客户端发送Port报文,表明自己监听的IP+端口
    • 客户端发起数据连接请求,建立数据连接

软件包:vsftpd、tftp(了解)

vsftpd服务介绍

  • 服务包:vsftpd
  • 服务类型:由Systemd启动的守护进程
  • 配置单元: /usr/lib/systemd/system/vsftpd.service
  • 守护进程: /usr/sbin/vsftpd
  • 端口: 21(ftp) , 20(ftp-data)
  • 主配置文件: /etc/vsftpd/vsftpd.conf
  • 用户访问控制配置文件: /etc/vsftpd/ftpusers /etc/vsftpd/user_list
  • 日志文件: /etc/logrotate.d/vsftpd

配置文件参数

参数 作用
listen=NO 是否以独立运行的方式监听服务
listen_address=ip地址 设置要监听的IP地址
listen_port=21 设置FTP服务的监听端口
download_enable=YES 是否允许下载文件
userlist_enable=YES 设置用户列表为允许(白名单)
userlist_deny=YES 设置用户列表为”禁止”(黑名单)
max_clients=0 最大客户端连接数,0为不限制
max_per_ip=0 同一IP地址最大连接数,0为不限制
anonymous_enable=YES 是否允许匿名用户访问
anon_upload_enable=YES 是否允许匿名用户上传文件
anon_umask 匿名用户上传文件的umask
anon_root=/var/ftp 匿名用户的ftp根目录
anon_mkdir_write_enable=YES 是否允许匿名用户创建目录
anon_other_write_enable=YES 是否开放匿名用户的其他写入权限(如重命名、删除)
anon_max_rate=0 匿名用户的最大传输速率,0为不限制
local_enable=yes 是否允许本地用户登录
local_umask=022 本地用户上传文件的umask
local_root=/var/ftp 本地用户的ftp根目录
chroot_local_user=YES 是否将用户权限禁锢在ftp目录,以确保安全
local_max_rate=0 本地用户最大传输速率,0为不限制

基础配置

  • 安装vsftpd

    1. [root@server1 ~]# yum install vsftpd -y
  • 启动服务

    1. [root@server1 ~]# systemctl start vsftpd
    2. [root@server1 ~]# systemctl enable vsftpd
    3. Created symlink from /etc/systemd/system/multi-user.target.wants/vsftpd.service to /usr/lib/systemd/system/vsftpd.service.
  • 关闭防火墙和selinux

    1. [root@server1 ~]# systemctl stop firewalld
    2. [root@server1 ~]# setenforce 0

    客户端工具

    Linux中

  • ftp ```bash [root@server1 ~]# touch /var/ftp/abc.txt #准备分发文件

[root@server2 ~]#yum install ftp -y [root@server2 ~]# ftp 192.168.80.132 Connected to 192.168.80.132 (192.168.80.132). 220 (vsFTPd 3.0.2) Name (192.168.80.132:root): anonymous #输入用户名,anonymous指匿名用户 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> pwd #这里pwd查看到在根目录,但这个根目录指的是匿名用户登录ftp的根目录/var/ftp 257 “/“ ftp> ls -a #查看文件发现之前准备好的abc.txt 227 Entering Passive Mode (192,168,80,132,117,138). 150 Here comes the directory listing. drwxr-xr-x 3 0 0 32 Feb 24 07:39 . drwxr-xr-x 3 0 0 32 Feb 24 07:39 .. -rw-r—r— 1 0 0 0 Feb 24 07:39 abc.txt drwxr-xr-x 2 0 0 6 Oct 13 16:10 pub 226 Directory send OK. ftp> get abc.txt #下载abc.txt local: abc.txt remote: abc.txt 227 Entering Passive Mode (192,168,80,132,183,174). 150 Opening BINARY mode data connection for abc.txt (0 bytes). 226 Transfer complete.

  1. 退出ftp,查看下载到的文件<br />![9R{K{D$7K@_FV{3MM`K$3UY.png](https://cdn.nlark.com/yuque/0/2021/png/614741/1614152873608-4bfe20a8-3448-444d-9a3e-2988ebe7b63b.png#align=left&display=inline&height=63&margin=%5Bobject%20Object%5D&name=9R%7BK%7BD%247K%40_FV%7B3MM%60K%243UY.png&originHeight=63&originWidth=369&size=3808&status=done&style=none&width=369)
  2. - lftp
  3. ```bash
  4. [root@server2 ~]# yum install lftp
  5. [root@server2 ~]# lftp 192.168.80.132
  6. lftp 192.168.80.132:~> pwd
  7. ftp://192.168.80.132
  8. lftp 192.168.80.132:~> ls
  9. -rw-r--r-- 1 0 0 0 Feb 24 07:39 abc.txt
  10. drwxr-xr-x 2 0 0 6 Oct 13 16:10 pub
  • 区别

ftp工具是一定要输入用户名称和密码的,登录成功或者失败会给出提示。
lftp不会直接给出登录成功或者失败的提示,需要输入ls工具才可以发现是否连接成功,优点在于连接更加方便

Windows

  • 第一种

可以在浏览器、运行窗口或者资源管理器中输入 ftp://IP地址/ ,这样访问的是ftp的根位置,如果需要访问相关目录可以输入ftp://IP地址/目录/文件名
`@@]O_HE~]XM830J0D~IYSY.png

  • 第二种

在DOS窗口中,输入命令 ftp 即可访问

注意:需要注意的是直接访问ftp服务器的IP地址时访问的根位置目录是 /var/ftp

案例一,匿名用户访问(默认开启)

尝试以匿名用户登录ftp上传文件,权限不足

  1. [root@server2 ~]# ftp 192.168.80.132
  2. Connected to 192.168.80.132 (192.168.80.132).
  3. 220 (vsFTPd 3.0.2)
  4. Name (192.168.80.132:root): anonymous
  5. 331 Please specify the password.
  6. Password:
  7. 230 Login successful.
  8. Remote system type is UNIX.
  9. Using binary mode to transfer files.
  10. ftp> put anaconda-ks.cfg
  11. local: anaconda-ks.cfg remote: anaconda-ks.cfg
  12. 227 Entering Passive Mode (192,168,80,132,93,187).
  13. 550 Permission denied.

查看FTP服务器配置文件

  1. #由于配置文件里注释很多,先去注释
  2. [root@server1 ~]# cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak
  3. [root@server1 ~]# grep -Ev "^#|^$" /etc/vsftpd/vsftpd.conf.bak > /etc/vsftpd/vsftpd.conf
  4. [root@server1 ~]# vim /etc/vsftpd/vsftpd.conf
  5. anonymous_enable=YES
  6. local_enable=YES
  7. write_enable=YES
  8. local_umask=022
  9. dirmessage_enable=YES
  10. xferlog_enable=YES
  11. connect_from_port_20=YES
  12. xferlog_std_format=YES
  13. listen=NO
  14. listen_ipv6=YES
  15. pam_service_name=vsftpd
  16. userlist_enable=YES
  17. tcp_wrappers=YES

可以在配置文件里添加以下配置

  1. anon_umask=022 #匿名用户上传文件的umask
  2. anon_upload_enable=Yes #允许匿名用户上传文件
  3. anon_mkdir_write_enable=Yes #允许匿名用户创建目录
  4. anon_other_write_enable=Yes #允许匿名用户执行其他写操作

配置完后重启vsftpd服务,尝试以匿名用户登录ftp,上传文件,发现提示无法创建文件,这是因为匿名用户的根目录没有写权限。

  1. [root@server1 ~]# systemctl restart vsftpd
  2. [root@server2 ~]# ftp 192.168.80.132
  3. Connected to 192.168.80.132 (192.168.80.132).
  4. 220 (vsFTPd 3.0.2)
  5. Name (192.168.80.132:root): anonymous
  6. 331 Please specify the password.
  7. Password:
  8. 230 Login successful.
  9. Remote system type is UNIX.
  10. Using binary mode to transfer files.
  11. ftp> put anaconda-ks.cfg
  12. local: anaconda-ks.cfg remote: anaconda-ks.cfg
  13. 227 Entering Passive Mode (192,168,80,132,32,137).
  14. 553 Could not create file.

QXB79UUE%7GS)6_DEQA)T8G.png
我们给与这个文件夹权限,再尝试一次,上传成功了。

  1. [root@server1 ~]# chmod 777 -R /var/ftp
  2. server2
  3. ftp> put anaconda-ks.cfg
  4. local: anaconda-ks.cfg remote: anaconda-ks.cfg
  5. 227 Entering Passive Mode (192,168,80,132,113,181).
  6. 150 Ok to send data.
  7. 226 Transfer complete.
  8. 1255 bytes sent in 0.000998 secs (1257.52 Kbytes/sec)

![)3505H[(%AVRB134@I3T.png

案例二,本地用户访问

使用FTP服务器本地用户登录,登录后的位置在用户家目录

  1. [root@server1 ~]# vim /etc/vsftpd/vsftpd.conf
  2. anonymous_enable=NO
  3. local_enable=YES
  4. write_enable=YES
  5. local_umask=022
  6. dirmessage_enable=YES
  7. xferlog_enable=YES
  8. connect_from_port_20=YES
  9. xferlog_std_format=YES
  10. listen=NO
  11. listen_ipv6=YES
  12. pam_service_name=vsftpd
  13. userlist_enable=YES
  14. tcp_wrappers=YES
  15. [root@server1 ~]# systemctl restart vsftpd
  16. [root@server1 ~]# useradd lisi
  17. [root@server1 ~]# passwd lisi
  18. [root@server2 ~]# ftp 192.168.80.132
  19. Connected to 192.168.80.132 (192.168.80.132).
  20. 220 (vsFTPd 3.0.2)
  21. Name (192.168.80.132:root): lisi
  22. 331 Please specify the password.
  23. Password:
  24. 230 Login successful.
  25. Remote system type is UNIX.
  26. Using binary mode to transfer files.
  27. ftp> pwd
  28. 257 "/home/lisi"
  29. ftp> put abc.txt
  30. local: abc.txt remote: abc.txt
  31. 227 Entering Passive Mode (192,168,80,132,36,213).
  32. 150 Ok to send data.
  33. 226 Transfer complete.
  34. ftp> ls
  35. 227 Entering Passive Mode (192,168,80,132,64,233).
  36. 150 Here comes the directory listing.
  37. -rw-rw-r-- 1 1004 1004 0 Feb 24 09:31 abc.txt
  38. 226 Directory send OK.
  • 注意:出现在/etc/vsftpd/ftpuser /etc/vsftpd/user_list这两个文件中的内容将会被定义为黑名单

![GV]5%[N_IXPR_IGFS09QEP.png
![CADLMG79JMOM5R~9~E(UXJ.png
把两个文件里的root用户注释掉,重启服务 systemctl restart vsftpd,然后在客户端用root用户登录

  1. [root@server2 ~]# ftp 192.168.80.132
  2. Connected to 192.168.80.132 (192.168.80.132).
  3. 220 (vsFTPd 3.0.2)
  4. Name (192.168.80.132:root): root
  5. 331 Please specify the password.
  6. Password:
  7. 230 Login successful.
  8. Remote system type is UNIX.
  9. Using binary mode to transfer files.
  10. ftp> pwd
  11. 257 "/root"
  12. ftp>

案例三,虚拟用户访问

  1. 创建FTP用于认证的用户数据库文件,其中奇数行为用户名,偶数行为密码。

    1. [root@server1 ~]# vim /etc/vsftpd/vuser.list
    2. eagle
    3. centos
    4. cisco
    5. centos
    6. huawei
    7. centos
  2. 使用db_load命令,用hash算法将原本的明文信息文件转化为数据库文件。

  3. 降低数据库文件权限,防止其他人查看
  4. 删除原始明文文件

    1. [root@server1 ~]# db_load -T -t hash -f /etc/vsftpd/vuser.list /etc/vsftpd/vuser.db
    2. [root@server1 ~]# chmod 600 /etc/vsftpd/vuser.db
    3. [root@server1 ~]# rm -f /etc/vsftpd/vuser.list
    4. [root@server1 ~]# file /etc/vsftpd/vuser.db
    5. /etc/vsftpd/vuser.db: Berkeley DB (Hash, version 9, native byte-order)
  5. 创建一个本地用户作为虚拟用户的代理,为了安全,禁止这个本地用户登录

    1. [root@server1 ~]# useradd -d /var/ftpuser -s /sbin/nologin virtual
    2. [root@server1 ~]# ls -ld /var/ftpuser
    3. drwx------. 2 virtual virtual 62 2 24 18:03 /var/ftpuser
    4. [root@server1 ~]# chmod -Rf 755 /var/ftpuser/
  6. 新建一个用于虚拟用户认证的PAM文件

    1. [root@server1 ~]# vim /etc/pam.d/vsftpd.vu
    2. auth required pam_userdb.so db=/etc/vsftpd/vuser
    3. account required pam_userdb.so db=/etc/vsftpd/vuser
  7. 配置文件

    1. [root@server1 ~]# vim /etc/vsftpd/vsftpd.conf
    2. anonymous_enable=NO
    3. local_enable=YES
    4. guest_enable=YES
    5. guest_username=virtual
    6. allow_writeable_chroot=YES
    7. write_enable=YES
    8. local_umask=022
    9. dirmessage_enable=YES
    10. xferlog_enable=YES
    11. connect_from_port_20=YES
    12. xferlog_std_format=YES
    13. listen=NO
    14. listen_ipv6=YES
    15. pam_service_name=vsftpd.vu
    16. userlist_enable=YES
    17. tcp_wrappers=YES
  8. 如果想要针对用户设置不同的权限

    1. [root@server1 ~]# mkdir /etc/vsftpd/vusers_dir/
    2. [root@server1 ~]# cd /etc/vsftpd/vusers_dir/
    3. [root@server1 vusers_dir]# touch huawei
    4. [root@server1 vusers_dir]# vim cisco
    5. anon_upload_enable=YES
    6. anon_mkdir_write_enable=YES
    7. anon_other_write_enable=YES
    8. [root@server1 vusers_dir]# vim /etc/vsftpd/vsftpd.conf
    9. anonymous_enable=NO
    10. local_enable=YES
    11. guest_enable=YES
    12. guest_username=virtual
    13. allow_writeable_chroot=YES
    14. write_enable=YES
    15. local_umask=022
    16. dirmessage_enable=YES
    17. xferlog_enable=YES
    18. connect_from_port_20=YES
    19. xferlog_std_format=YES
    20. listen=NO
    21. listen_ipv6=YES
    22. pam_service_name=vsftpd.vu
    23. userlist_enable=YES
    24. tcp_wrappers=YES
    25. user_config_dir=/etc/vsftpd/vusers_dir
    26. [root@server1 vusers_dir]# systemctl restart vsftpd

    ![XPRB%N~__LRGJ8XSCY)EAP.png
    ![V8`K2I_JJRVS07KNSM$~4L.png

    NFS(网络文件系统)

    简介

  • Linux/Unix系统之间共享文件系统的一种协议,通过网络让不同主机之间共享文件和目录
  • NFS的客户端主要为Linux
  • 特点:

    • 支持多节点同时挂载、并发写入
    • 提供文件共享
    • 为集群中的web server 提供后端存储

      NFS协议模型

      NXB5QR6ZBT)O93~M1LVH00X.png

      RPC远程过程调度

      NFS协议本身并没有网络传输功能,而是基于远程过程调用协议实现的
      简单的说,RPC就是从一台机器(客户端)上通过参数传递的方式调用另一台机器(服务器)上的一个函数或方法(可以统称为服务)并得到返回的结果。
  • 特点

可以通过网络从远程主机程序上请求服务,而不需要了解底层网络技术的协议。
工作在OSI模型的会话层。
RPC使用网络端口111来监听客户端的请求

RPC协议模型

![[O]2(5BO%2R0(WO)8@(E.png
以NFS为例来解释一下:

  1. NFS服务在启动时向Portmapper注册端口号
  2. 客户端联系服务端Portmapper询问NFS服务的端口号是多少
  3. Portmapper告诉客户端NFS服务的端口号
  4. 客户端访问得到的端口号
  5. NFS服务端收到请求后响应客户端

若是要形象的形容一下,NFS服务就像是房源,有一个叫Portmapper中介买房的人客户端
1405152-20180811151545145-1715454096.jpg

案例,基于NFS搭建web后端NAS存储

用户访问负载均衡器节点(负载均衡的知识暂时不用关心),负载均衡器会将请求负载均衡得分发给web服务器,比如请求index.html界面,每一台服务器都会去NAS存储服务器上寻找想要被读取的数据。这可以大大降低服务器成本、运维成本(修改数据会牵一发而动全身)
]~OQTY(LQ4SOL67)WLE@@BB.png

  • 实验准备
    • web服务器:server1(192.168.80.132)、server2(192.168.80.129)
    • nas存储端:server3(192.168.80.134)
  1. 关闭防火墙和selinux,每台机器操作都一样

    1. [root@server1 ~]# systemctl stop firewalld
    2. [root@server1 ~]# setenforce 0
  2. 准备web服务

    1. [root@server1 ~]# yum install httpd -y
    2. [root@server1 ~]# systemctl start httpd
    3. [root@server2 ~]# yum install httpd -y
    4. [root@server2 ~]# systemctl start httpd
  3. 准备nas端

    1. # 安装nfs服务
    2. [root@server3 ~]# yum install -y nfs-utils
    3. # 准备共享目录
    4. [root@server3 ~]# mkdir /webdata
    5. # 准备共享文件
    6. [root@server3 ~]# echo "<h1>today i study but you sleep i good you bad</h1>" >
    7. /webdata/index.html
    8. # 配置nfs服务
    9. [root@server3 webdata]# cat /etc/exports
    10. /webdata 192.168.80.0/24(rw)
    11. # 启动nfs服务器
    12. [root@server3 ~]# systemctl start nfs-server.service
    13. [root@server3 ~]# systemctl enable nfs-server.service
  4. 在web端查看共享 ```bash [root@server1 ~]# yum install -y nfs-utils [root@server1 ~]# showmount -e 192.168.80.134 Export list for 192.168.80.134: /webdata 192.168.80.0/24

[root@server2 ~]# yum install -y nfs-utils [root@server2 ~]# showmount -e 192.168.80.134 Export list for 192.168.80.134: /webdata 192.168.80.0/24

  1. 5. 挂载后端nas存储
  2. ```bash
  3. [root@server1 ~]# mount -t nfs 192.168.80.134:/webdata /var/www/html/
  4. [root@server1 ~]# df
  5. 文件系统 1K-块 已用 可用 已用% 挂载点
  6. /dev/mapper/centos-root 17811456 1455376 16356080 9% /
  7. devtmpfs 919456 0 919456 0% /dev
  8. tmpfs 931624 0 931624 0% /dev/shm
  9. tmpfs 931624 9768 921856 2% /run
  10. tmpfs 931624 0 931624 0% /sys/fs/cgroup
  11. /dev/sda1 1038336 148728 889608 15% /boot
  12. tmpfs 186328 0 186328 0% /run/user/0
  13. 192.168.80.134:/webdata 17811456 1293824 16517632 8% /var/www/html
  14. [root@server2 ~]# mount -t nfs 192.168.80.134:/webdata /var/www/html
  15. [root@server2 ~]# df
  16. 文件系统 1K-块 已用 可用 已用% 挂载点
  17. /dev/mapper/centos-root 17811456 1204224 16607232 7% /
  18. devtmpfs 485792 0 485792 0% /dev
  19. tmpfs 497960 0 497960 0% /dev/shm
  20. tmpfs 497960 7800 490160 2% /run
  21. tmpfs 497960 0 497960 0% /sys/fs/cgroup
  22. /dev/sda1 1038336 135376 902960 14% /boot
  23. tmpfs 99596 0 99596 0% /run/user/0
  24. 192.168.80.134:/webdata 17811456 1294336 16517120 8% /var/www/html
  1. 最后在浏览器访问即可

QWW41LIQ)[(KF3B[9A@TY@M.png](https://cdn.nlark.com/yuque/0/2021/png/614741/1614391948725-803828cf-3e35-4f65-b7f4-5ef2b4f44060.png#align=left&display=inline&height=200&margin=%5Bobject%20Object%5D&name=QWW41LIQ%29%5B%28KF3B%5B9A%40TY%40M.png&originHeight=249&originWidth=383&size=14375&status=done&style=none&width=308)![`6R03MGUU2YMH1O]5]NW`NN.png

NFS配置参数

SAMBA

简介

  • 历史
    • 1987年,微软公司和英特尔公司共同制定了SMB(Server Messages Block,服务器消息块)协议,旨在解决局域网内的文件或打印机等资源的共享问题,这也使得在多个主机之间共享文件变得越来越简单。到了1991年, 当时还在读大学的Tridgwell为了解决Linux系统与Windows系统之间的文件共享问题,基于SMB协议开发出了 SMBServer服务程序。这是一款开源的文件共享软件,经过简单配置就能够实现Linux系统与Windows系统之间的 文件共享工作。当时,Tridgwell想把这款软件的名字SMBServer注册成为商标,但却被商标局以SMB是没有意义的 字符而拒绝了申请。后来Tridgwell不断翻看词典,突然看到一个拉丁舞蹈的名字—Samba,而且这个热情洋溢的 舞蹈名字中又恰好包含了“SMB”,于是Samba服务程序的名字由此诞生。Samba服务程序现在已经成为在Linux系 统与Windows系统之间共享文件的最佳选择。
  • SMB协议
    • SMB(服务信息模块)协议是一个高层协议、它提供了在网络上的不同计算机之间共享文件,打印机和不同通信资料的手段
    • SMB使用NetBIOS API实现面向连接的协议,该协议为Window是客户程序和服务提供了一个通过虚链路按照 请求——响应方式进行通信的机制
    • SMB的工作原理就是让NetBIOS与SMB协议运行在TCP/IP上,并且使用NetBIOS的名字解释器让Linux机器可 以在Windows的网络邻居中被看到,从而和Windows9x/NT/200X进 行相互沟通,共享文件和打印机
  • CIFS协议
    • 通用网际文件系统是微软服务器消息块协议(SMB)的增强版 提供计算机用户在企业内部网和因特网上共享文件的标准方法
    • CIFS在TCP/IP运行,利用英特网上的全球域名服务系统(DNS)增强其可扩展性,同时为因特网上普遍存在 的慢速拨号连接优化
  • NetBIOS协议
    • NetBIOS是Network Basic Input/Output System的简称,网络基本输入输出协议。协议,一般指能用于局域网通信的一套API,是由IBM公司开发的。主要作用,通过NetBIOS协议获得计算机名称,然后把计算机名称解析为对应的IP地址
  • 基于C/S模式
  • 应用场景
    • 文件和打印机共享:文件和打印机共享是samba的主要功能,SMB进程实现资源共享,将文件和打印机发布到网络之中,以供用户可以访问
    • 身份验证和权限设置:samba服务支持user mode和domain mode 等身份验证和权限设置模式,通过加密方式可以保护共享的文件和打印机
    • 名称解析:samba通过NMB服务可以搭建NBNS服务器,提供域名解析,将计算机的NetBIOS名称解析为ip地址
    • 浏览服务,局域网中,samba可以成为本地主浏览服务器,保存可用资源列表,当使用客户端访问windows网上邻居时,会提供浏览列表,显示共享目录、打印机资源等
  • 端口号:139和445

    • 在早期,SMB运行于NBT协议上,使用udp协议的137和138以及TCP协议的139端口
      1. cat /etc/services
      2. netbios-ns 137/tcp # NETBIOS Name Service
      3. netbios-ns 137/udp
      4. netbios-dgm 138/tcp # NETBIOS Datagram Service
      5. netbios-dgm 138/udp
      6. netbios-ssn 139/tcp # NETBIOS session service
      7. netbios-ssn 139/udp

      相关配置

  • 安装

    1. [root@server1 ~]# yum install samba -y
  • 相关配置文件

    1. /etc/sysconfig/samba:用于设置守护进程的启动参数。
    2. /etc/samba/smb.conf:主配置文件。
    3. /etc/samba/smbusers:用于映射Linux用户和Windows用户。
    4. /etc/samba/lmhosts:用于设置NetBIOS名字与IP地址的对应关系表。
    5. /etc/pam.d/sambaSambaPAM配置文件
    6. /etc/rc.d/init.d/smbSambaINIT启动脚本
  • 相关工具

    1. 服务端工具:
    2. /usr/bin/smbpasswd:用于设置Samba用户账号及口令
    3. /usr/bin/testparm:用于检测配置文件的正确性
    4. /usr/bin/smbstatus:列出目前Samba的联机状况
    5. 客户端工具:
    6. /usr/bin/findsmb:用于查找网络中的Samba服务器
    7. /usr/bin/smbclientLinux下的Samba客户端
    8. /usr/bin/smbget:基于SMB/CIFS的类似于wget的下载工具
    9. /usr/bin/smbtar:类似于tar的归档工具,用于将SMB/CIFS的共享打包备份到Linux主机
  • 主配置文件

    1. [root@server1 ~]# cat /etc/samba/smb.conf
    2. # 默认主配置文件:
    3. [global] #全局参数。
    4. workgroup = MYGROUP #工作组名称
    5. server string = Samba Server Version %v #服务器介绍信息,参数%v为显示SMB版本号
    6. log file = /var/log/samba/log.%m #定义日志文件的存放位置与名称,参数%m为来访的主机名
    7. max log size = 50 #定义日志文件的最大容量为50KB
    8. security = user #安全验证的方式,总共有4种
    9. #share:来访主机无需验证口令;比较方便,但安全性很差
    10. #user:需验证来访主机提供的口令后才可以访问;提升了安全性
    11. #server:使用独立的远程主机验证来访主机提供的口令(集中管理账户)
    12. #domain:使用域控制器进行身份验证
    13. passdb backend = tdbsam #定义用户后台的类型,共有3种
    14. #smbpasswd:使用smbpasswd命令为系统用户设置Samba服务程序的密码
    15. #tdbsam:创建数据库文件并使用pdbedit命令建立Samba服务程序的用户
    16. #ldapsam:基于LDAP服务进行账户验证
    17. load printers = yes #设置在Samba服务启动时是否共享打印机设备
    18. cups options = raw #打印机的选项
    19. [homes] #共享参数
    20. comment = Home Directories #描述信息
    21. browseable = no #指定共享信息是否在“网上邻居”中可见
    22. writable = yes #定义是否可以执行写入操作,与“read only”相反
    23. [printers] #打印机共享参数
    24. comment = All Printers
    25. path = /var/spool/samba #共享文件的实际路径(重要)。
    26. browseable = no
    27. guest ok = no #是否所有人可见,等同于"public"参数。
    28. writable = no
    29. printable = yes
  • 安全等级

    1. Samba安全等级:
    2. User:由本地Samba服务器负责账户验证
    3. 使用smbpasswd 设置账号(默认的安全等级)
    4. Domain:账户验证账户及口令的工作由其他的Windows Samba域控制器负责
    5. 需要使用“password server”指令指定验证服务器
    6. Ads:验证账户及口令的工作由支持Kerberos验证的Windows活动目录服务器负责。
    7. 需要使用“realm”指令指定Kerberos领域
    8. Share:匿名共享
    9. Samba账户及口令数据库
    10. 1.Samba使用的账户文件/数据库是与系统账户文件分离的
    11. 2.当设置了user的安全等级后(默认),将由本地系统对问Samba共享资源的用户进行认证
    12. 3.用.tdb格式的口令数据库,初始情况下口令数据库文件并不存在
    13. 4.为了创建Samba的口令数据库文件,管理员可以在添加Samba账户的同时创建它
    14. 5.管理员可以使用smbpasswd命令配置Samba账号并设置其口令

    案例,配置一个共享资源(具体步骤)

  1. 设置共享名称
    1. 共享资源发布后,必须为每个共享目录或打印机设置不同的共享名称,给网络用户访问时使用,并且共享名可以与原目录名不同。例如,samba服务器上有个目录为/share,需要发布该目录为共享目录,定义共享名为public。
  2. 共享资源描述
    1. 格式:comment = 备注信息
    2. 备注信息通常是用来解释说明的
  3. 共享资源路径
    1. 格式:path = 绝对路径
    2. 共享资源的绝对路径
  4. 设置匿名访问
    1. 格式:public = yes | no(yes表示允许匿名访问,no表示不允许)
    2. 共享资源如果要设置匿名访问,可以更改public字段
  5. 设置访问用户
    1. 格式:valid users = 用户valid users = @组名
  6. 设置目录只读
    1. 格式:readonly = yes | no(yes表示只读,no表示读写)
    2. 共享目录如果限制用户写操作,可以通过设置readonly实现
  7. 设置目录可写
    1. 格式:
      1. writeable = yes 读写
      2. writeable = no 只读
      3. write list = 用户名
      4. wirte list = @组名
    2. 如果目录允许用户进行写操作,可以通过设置writeable和write list进行设置

案例,通过用户名共享文件

共享销售部/xsb这个目录,只有同时知道用户名和mi’ma才可以看到这个目录。在/xsb目录存放有重要数据,需要将安全级别security设置为user,这样可以启用samba身份验证机制,然后再共享目录/xsb下设置valid user字段,配置为只有销售部的员工可以访问这个目录。

  • 环境准备
    • 192.168.80.132(server1):samba服务端
    • 192.168.80.129(server2):Linux客户端
  1. 修改主配置文件的安全相关设置

    1. [root@server1 ~]# vim /etc/samba/smb.conf
    2. [global]
    3. workgroup = SAMBA
    4. security = user
    5. # passdb backend = tdbsam
    6. passdb backend = smbpasswd
    7. smb passwd file = /etc/samba/smbpasswd
    8. printing = cups
    9. printcap name = cups
    10. load printers = yes
    11. cups options = raw
    12. # 重启smb服务之后,会自动生成/etc/samba/smbpasswd该文件
    13. [root@server1 ~]# systemctl restart smb.service
    14. [root@server1 ~]# systemctl restart nmb.service
  2. 添加销售部用户和组

    1. [root@server1 ~]# groupadd xsb
    2. [root@server1 ~]# useradd -g xsb -M -s /sbin/nologin xsb01
    3. [root@server1 ~]# useradd -g xsb -M -s /sbin/nologin xsb02
    4. [root@server1 ~]# useradd jsb01
  3. 添加相应的samba用户(注意加-a参数)

    1. [root@server1 ~]# smbpasswd -a xsb01
    2. New SMB password:
    3. Retype new SMB password:
    4. Added user xsb01.
    5. [root@server1 ~]# smbpasswd -a xsb02
    6. New SMB password:
    7. Retype new SMB password:
    8. Added user xsb02.
  4. 指定共享目录/xsb,在其中放随便一个文件,设置共享资源(名称xsb,描述,路径,访问用户)

    1. [root@server1 ~]# mkdir /xsb
    2. [root@server1 ~]# cp /etc/hosts /xsb
    3. [root@server1 ~]# vim /etc/samba/smb.conf
    4. [xsb]
    5. comment = xsb data
    6. path = /xsb
    7. valid user = xsb01,xsb02
  5. 重启服务(每次配置完主配置文件都要重启生效,到此步samba服务端配置完成)

    1. [root@server1 ~]# systemctl restart smb.service
    2. [root@server1 ~]# systemctl restart nmb.service
  6. 检查139和445端口号 ```bash [root@server1 ~]# ss -tanl State Recv-Q Send-Q Local Address:Port Peer Address:Port

LISTEN 0 50 :139 :*

LISTEN 0 50 :445 :*

LISTEN 0 50 :::139 :::*

LISTEN 0 50 :::445 :::*

  1. ![AT{LP[8ZTSS]F2V4~1CP6WN.png](https://cdn.nlark.com/yuque/0/2021/png/614741/1614418161329-c64e5b5f-ab71-43dd-82a4-bda82057533d.png#align=left&display=inline&height=145&margin=%5Bobject%20Object%5D&name=AT%7BLP%5B8ZTSS%5DF2V4~1CP6WN.png&originHeight=145&originWidth=789&size=22022&status=done&style=none&width=789)
  2. 7. 客户端验证
  3. Linux端验证
  4. ```basic
  5. [root@server2 ~]# yum install samba-client -y
  6. [root@server2 ~]# smbclient -L //192.168.80.132/xsb -U xsb01
  7. Enter SAMBA\xsb01's password:
  8. Sharename Type Comment
  9. --------- ---- -------
  10. print$ Disk Printer Drivers
  11. xsb Disk xsb data
  12. IPC$ IPC IPC Service (Samba 4.10.16)
  13. xsb01 Disk Home Directories
  14. Reconnecting with SMB1 for workgroup listing.
  15. Server Comment
  16. --------- -------
  17. Workgroup Master
  18. --------- -------
  19. SAMBA SERVER1

在windows上进行验证
windows验证:
在Window运行输入地址:\192.168.10.10
用户名:**
密码:**
可以在DOS窗口中使用命令net use * /delete 清空用户缓存信息
`S(6VAS{CYBSCWF8P$270}J.png
S6WNZJW5@~6XVO%UB@C{}QB.png
![_VH9I~GPS2PO$92ZFWTKIB.png

  1. 在客户端挂载
    1. [root@server2 ~]# mkdir /xsbdata
    2. [root@server2 ~]# yum install cifs-utils -y # 挂载CIFS文件系统,需要安装LinuxCIFS utils工具
    3. [root@server2 ~]# vim auth.smb # 准备一个认证文件
    4. username=xsb01
    5. password=1
    6. [root@server2 ~]# vim /etc/fstab
    7. //192.168.80.151/xsb /xsbdata cifs defaults,credentials=/root/auth.smb
    8. 0 0
    9. [root@server2 ~]# mount -a
    10. [root@server2 ~]# df
    11. 文件系统 1K-块 已用 可用 已用% 挂载点
    12. /dev/mapper/centos-root 17811456 1231016 16580440 7% /
    13. devtmpfs 485792 0 485792 0% /dev
    14. tmpfs 497960 0 497960 0% /dev/shm
    15. tmpfs 497960 7800 490160 2% /run
    16. tmpfs 497960 0 497960 0% /sys/fs/cgroup
    17. /dev/sda1 1038336 135376 902960 14% /boot
    18. tmpfs 99596 0 99596 0% /run/user/0
    19. 192.168.80.134:/webdata 17811456 1293824 16517632 8% /var/www/html
    20. //192.168.80.132/xsb 17811456 1491788 16319668 9% /xsbdata
    21. [root@server2 ~]# ls /xsbdata
    22. hosts
    server2成功挂载server1共享文件夹

扩展 隐藏目录 隐藏共享目录,访问时必须输入绝对的URL进行访问

格式:browseable = no

控制访问源

  1. 使用hosts allow hosts deny进行控制访问源

hosts allow = 192.168.1. 允许192.168.1.0/24网段进行访问

hosts deny = 192.168.1.3 禁止192.168.1.3主机进行访问

当allow和deny同时设置时allow优先,但上述情况无法拒绝192.168.1.3,这种情况可以使用except

字段

hosts allow = 192.168.1. EXCEPT 192.168.1.3

写入控制

  1. writable = yes
  2. write list =xsb01 开启samba服务的写入权限

chmod 777 /xsb 给共享目录赋予写入权限

用户账号映射(为了防止系统账号被黑客破解)

username map = /etc/samba/smbusers 全局添加username map字段

useradd rm

passwd rm

vim /etc/samba/smbusers

  1. rm = testuser

重启smb服务