在互联网的早期,文件共享就是最核心的需求。直到今天,无论是网站部署、数据存储,还是远程运维,都离不开各种文件服务。
本文将系统讲解 Linux 中三大核心文件服务:
- FTP:互联网上最经典的文件传输协议,用于文件上传下载
- NFS:Linux 系统之间的网络文件系统,用于集群共享存储
- SSH:安全外壳协议,用于远程管理和免密登录
学完本章,你将能够搭建并管理这些服务,为你的服务器提供文件共享和远程管理能力。
FTP Server(文件传输协议服务)
简介
FTP(File Transfer Protocol):文件传输协议,是 TCP/IP 协议组中应用层的协议之一。
FTP 的作用
- 提供文件共享服务——让多台计算机之间可以方便地传输文件
- 互联网上的媒体资源和软件资源,绝大部分都是通过 FTP 服务器传递的
┌─────────────┐ ┌─────────────┐
│ 客户端 │◄────────►│ FTP 服务器 │
│ (下载/上传) │ │ /var/ftp/ │
└─────────────┘ └─────────────┘
↑ ↑
浏览器/lftp/wget 存储共享文件

软件包
Linux 中最常用的 FTP 服务器软件是 vsftpd(Very Secure FTP Daemon)。
FTP 基础
端口说明
| 端口 | 类型 | 说明 |
|---|---|---|
| 21/tcp | 控制端口(Command) | 用于传输 FTP 命令(登录、切换目录、上传/下载指令等) |
| 20/tcp | 数据端口(Data) | 用于实际传输文件数据(仅在主动模式下使用) |
FTP 使用两个端口——21 端口负责”说”(命令),20 端口负责”搬”(数据)。
FTP Server 默认配置
步骤 1:安装 vsftpd
logo:
[root@localhost ~]# yum -y install vsftpd
前提:请提前配置好 YUM 源(本地源或阿里云源)。
步骤 2:准备分发的文件
[root@localhost ~]# touch /var/ftp/abc.txt /var/ftp/123.mp4
FTP 服务器的主目录:
/var/ftp/是 FTP 程序分享内容的基本机目录。客户端访问时看到的就是这个目录下的文件。
步骤 3:启动服务
# 启动服务
[root@localhost ~]# systemctl start vsftpd
# 设置开机自启
[root@localhost ~]# systemctl enable vsftpd
# 查看服务状态和端口
[root@localhost ~]# ss -ltnp | grep vsftpd
LISTEN 0 32 :::21 :::* users:(("vsftpd",pid=12775,fd=4))
看到 21 端口 处于 LISTEN 状态,说明 FTP 服务已正常启动。
步骤 4:关闭防火墙(测试环境)
# 停止防火墙
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
# 关闭 SELinux
[root@localhost ~]# setenforce 0
[root@localhost ~]# vim /etc/selinux/config
SELINUX=disabled
生产环境提醒:在生产环境中不建议完全关闭防火墙,应该配置允许 21 和 20 端口的规则。
FTP Client(客户端访问)
方式一:浏览器或文件系统访问(任何系统)
步骤:
- 打开浏览器(Firefox、Chrome、IE 等)或真机的文件管理器
- 输入地址:
ftp://服务器IP地址 - 默认仅能下载文件(匿名用户只读)
示例:ftp://192.168.100.114
浏览器访问是最简单的方式,适合快速下载文件,但不支持上传。
我这里使用真机的浏览器访问不成功,所以开了一台带有图形化虚拟机的浏览器访问,和真机的文件管理器访问都是成功的
方式二:Linux FTP 客户端程序 — lftp
这里我换了另一个虚拟机来测试
步骤 1:安装 lftp
[root@localhost ~]# yum -y install lftp
步骤 2:访问服务器
[root@zhangsan66 ~]# lftp 192.168.100.114
lftp 192.168.100.114:~>
步骤 3:查看并下载
# 查看服务器上的文件
lftp 192.168.100.114:~> ls
-rw-r--r-- 1 0 0 0 May 28 08:59 123.mp4
-rw-r--r-- 1 0 0 0 May 28 08:59 abc.txt
drwxr-xr-x 2 0 0 6 Jun 09 2021 pub
# 下载文件
lftp 192.168.100.114:/> get 123.mp4
# 下载整个目录
lftp 192.168.100.114:/> mirror pub
lftp 192.168.100.114:/> quit
# 查看是否下载成功
[root@zhangsan66 ~]# ls
123.mp4 pub
lftp 常用命令:
| 命令 | 说明 |
|---|---|
ls | 查看服务器文件列表 |
get 文件名 | 下载单个文件 |
mget *.txt | 批量下载多个文件 |
mirror 目录名 | 下载整个目录 |
put 文件名 | 上传文件 |
mirror -R 目录名 | 上传整个目录 |
cd 目录 | 切换服务器目录 |
lcd 目录 | 切换本地目录 |
bye / exit/quit | 退出 lftp |
方式三:Linux FTP 客户端程序 — wget
在FTP服务器上准备新文件:
[root@localhost ~]# touch /var/ftp/123abc.mp3
下载单个文件:
[root@zhangsan66 ~]# wget ftp://192.168.100.114/123abc.mp3
--2026-05-28 17:20:14-- ftp://192.168.100.114/123abc.mp3
=> “123abc.mp3”
正在连接 192.168.100.114:21... 已连接。
正在以 anonymous 登录 ... 登录成功!
==> SYST ... 完成。 ==> PWD ... 完成。
==> TYPE I ... 完成。 ==> 不需要 CWD。
==> SIZE 123abc.mp3 ... 完成。
==> PASV ... 完成。 ==> RETR 123abc.mp3 ... 完成。
[ <=> ] 0 --.-K/s 用时 0s
2026-05-28 17:20:14 (0.00 B/s) - “123abc.mp3” 已保存 [0]
[root@zhangsan66 ~]# ls
123abc.mp3 123.mp4 pub
指定下载路径和文件名:
[root@localhost ~]# wget ftp://192.168.100.114/123abc.mp3 -O /tmp/321.PNG
-O参数:指定保存的文件名和路径。
wget 不仅可以下载 FTP 文件,还可以下载 HTTP 文件:
例如去QQ获取下载链接后:
[root@zhangsan66 ~]# wget https://qqdl.gtimg.cn/qqfile/QQNT/9.9.31/release/092069d7/QQ_9.9.31_260528_x64_01.exe
--2026-05-28 17:26:45-- https://qqdl.gtimg.cn/qqfile/QQNT/9.9.31/release/092069d7/QQ_9.9.31_260528_x64_01.exe
正在解析主机 qqdl.gtimg.cn (qqdl.gtimg.cn)... 113.125.209.140, 175.12.75.68, 119.86.222.74, ...
正在连接 qqdl.gtimg.cn (qqdl.gtimg.cn)|113.125.209.140|:443... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:310074032 (296M) [application/octet-stream]
正在保存至: “QQ_9.9.31_260528_x64_01.exe”
100%[===========================================================================>] 310,074,032 2.69MB/s 用时 98s
2026-05-28 17:28:23 (3.02 MB/s) - 已保存 “QQ_9.9.31_260528_x64_01.exe” [310074032/310074032])
[root@zhangsan66 ~]# ls
123abc.mp3 123.mp4 pub QQ_9.9.31_260528_x64_01.exe
wget 是最常用的命令行下载工具,支持 FTP 和 HTTP 两种协议。
启动 FTP 上传功能
默认情况下,FTP 服务器只允许匿名用户下载文件。如果需要上传功能,需要进行额外配置。
步骤 1:了解配置文件
# FTP 配置文件
/etc/vsftpd/vsftpd.conf
用于设定 FTP 服务器的功能开启或关闭的文件。
# 修改前先备份
[root@localhost ~]# cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak
步骤 2:检查匿名账户登录设置
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
# 找到以下配置项:
anonymous_enable=YES
| 配置值 | 说明 |
|---|---|
anonymous_enable=YES | 允许匿名用户登录(默认,方便但安全性低) |
anonymous_enable=NO | 禁用匿名用户登录(需要用户名和密码) |
anonymous_enable=YES 表示”匿名 = 是”,即允许匿名用户访问。
步骤 3:配置上传指令
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
# 添加或取消以下行的注释:
anon_upload_enable=YES # 启动上传文件的能力
anon_mkdir_write_enable=YES # 启动创建目录的能力
重启 FTP 服务:
[root@localhost ~]# systemctl restart vsftpd
步骤 4:创建上传目录
# 创建专门用于上传的目录
[root@localhost ~]# mkdir /var/ftp/upload
# 赋予写入权限(匿名用户需要)
[root@localhost ~]# chmod 777 /var/ftp/upload
重要:上传文件时,客户端一定要进入这个
upload目录,才能上传文件。
步骤 5:客户端测试
准备测试文件:
# 在客户机上创建一个测试文件
[root@zhangsan66 ~]# echo 222 > 2.txt
上传文件:
# 登录 FTP 服务器
[root@zhangsan66 ~]# lftp 192.168.100.114
# 进入上传目录
lftp 192.168.100.114:~> cd upload/
# 上传文件
lftp 192.168.100.114:/upload> put 2.txt
lftp 192.168.100.114:/upload> ls
-rw------- 1 14 50 4 May 29 07:15 2.txt
创建目录:
lftp 192.168.100.114:/upload> mkdir file
mkdir 成功, 建立 `file'
lftp 192.168.100.114:/upload> ls
-rw------- 1 14 50 4 May 29 07:15 2.txt
drwx------ 2 14 50 6 May 29 07:24 file
上传整个目录:
# 前提是客户机上有一个名为 aaa 的文件夹等着上传
lftp 192.168.100.114:/upload> mirror -R youxi
Total: 1 directory, 0 files, 0 symlinks
lftp 192.168.100.114:/upload> ls
-rw------- 1 14 50 4 May 29 07:15 2.txt
drwx------ 2 14 50 6 May 29 07:24 file
drwx------ 2 14 50 6 May 29 07:26 youxi
mirror -R表示反向镜像,即将本地目录上传到服务器。
FTP 配置文件常用选项
| 配置项 | 说明 | 默认值 |
|---|---|---|
anonymous_enable=YES | 允许匿名登录 | YES |
anon_upload_enable=YES | 允许匿名用户上传 | NO |
anon_mkdir_write_enable=YES | 允许匿名用户创建目录 | NO |
anon_other_write_enable=YES | 允许匿名用户删除/重命名 | NO |
local_enable=YES | 允许本地用户登录 | YES |
write_enable=YES | 允许写入操作 | YES |
local_umask=022 | 本地用户上传文件的权限掩码 | 022 |
dirmessage_enable=YES | 进入目录时显示欢迎信息 | YES |
xferlog_enable=YES | 启用传输日志 | YES |
connect_from_port_20=YES | 使用 20 端口传输数据 | YES |
listen=YES | 以独立模式监听 | YES |
NFS Server(网络文件系统)
简介
NFS(Network File System):网络文件系统,是 Linux/Unix 系统之间共享文件的一种协议。
NFS 的特点
| 特点 | 说明 |
|---|---|
| 客户端主要为 Linux | NFS 是 Linux/Unix 原生协议,Windows 需要额外安装 NFS 客户端 |
| 支持多节点同时挂载 | 多台客户端可以同时挂载同一个 NFS 共享目录 |
| 支持并发写入 | 多个客户端可以同时读写共享目录 |
NFS 的作用
- 提供文件共享服务——让多台 Linux 服务器共享同一份数据
- 为 Web Server 集群配置后端存储——多台 Web 服务器共享同一份网站代码
┌──────────┐ ┌──────────┐ ┌──────────┐
│ Web1 │ │ Web2 │ │ Web3 │
│ 192.168. │ │ 192.168. │ │ 192.168. │
│ 100.114 │ │ 1100.115 │ │ 100.116 │
└────┬─────┘ └────┬─────┘ └────┬─────┘
│ │ │
└──────────────┼──────────────┘
│
┌─────┴─────┐
│ NAS │
│ 192.168. │
│ 100.113 │
│ /webdata │
└───────────┘
实战:NFS 服务器搭建
实验环境
| 角色 | IP 地址 | 说明 |
|---|---|---|
| NAS(存储端) | 192.168.100.113 | NFS 服务器,提供共享存储 |
| Web1 | 192.168.100.114 | NFS 客户端,挂载共享目录 |
| Web2 | 192.168.100.115 | NFS 客户端,挂载共享目录 |
| Web3 | 192.168.100.116 | NFS 客户端,挂载共享目录 |
准备工作:关闭防火墙(所有机器)
# 关闭 SELinux
[root@localhost ~]# vim /etc/selinux/config
SELINUX=disabled
[root@localhost ~]# setenforce 0
# 关闭防火墙
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
NAS(存储端)配置
安装 NFS 服务器
[root@nas ~]# yum -y install nfs-utils
NAS(Network Attached Storage):网络附属存储。NFS 是 NAS 的一种实现方式。
创建共享目录并放置内容
# 创建共享目录(存储网站代码)
[root@nas ~]# mkdir /webdata
# 放置测试页面
[root@nas ~]# echo "nfs test66666666" > /webdata/index.html
配置 NFS 共享
[root@nas ~]# vim /etc/exports
# 添加以下内容:
/webdata 192.168.100.0/24(rw)
配置说明:
| 部分 | 说明 |
|---|---|
/webdata | 发布资源的目录(共享目录) |
192.168.100.0/24 | 允许访问 NFS 的客户端网段 |
(rw) | 读写权限(read-write) |
更多权限选项:
| 选项 | 说明 |
|---|---|
rw | 读写权限 |
ro | 只读权限 |
sync | 数据同步写入磁盘(安全但较慢) |
async | 数据先写入内存再写入磁盘(快但不安全) |
root_squash | 将 root 用户映射为匿名用户(安全) |
no_root_squash | 保留 root 用户权限(方便但不安全) |
no_all_squash | 保留用户 UID/GID 映射 |
启动 NFS 服务
# 启动服务
[root@nas ~]# systemctl start nfs-server
# 设置开机自启
[root@nas ~]# systemctl enable nfs-server
检查 NFS 输出
[root@nas ~]# exportfs -v
/webdata 192.168.100.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
-v参数:详细显示输出的目录和权限信息。
Web 客户端配置(Web1/Web2/Web3 相同)
安装 NFS 客户端和 Web 服务器
[root@web1 ~]# yum -y install nfs-utils httpd
[root@web1 ~]# systemctl start httpd
[root@web1 ~]# systemctl enable httpd
查看存储端共享
[root@web1 ~]# showmount -e 192.168.100.113
Export list for 192.168.100.113:
/webdata 192.168.100.0/24
showmount -e:查询 NFS 服务器可用的共享目录。
手动挂载 NFS
[root@web1 ~]# mount -t nfs 192.168.100.113:/webdata /var/www/html/
命令拆解:
mount -t nfs 192.168.100.113:/webdata /var/www/html/
│ │ │ │ │
│ │ │ │ └── 本地挂载点
│ │ │ └── NFS 服务器地址:共享目录
│ │ └── 文件系统类型(NFS)
│ └── 指定类型
└── 挂载命令
查看挂载状态
[root@web1 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
192.168.100.113:/webdata 17G 5.3G 12G 31% /var/www/html
[root@web1 ~]# ls /var/www/html/
index.html
[root@web1 ~]# cat /var/www/html/index.html
nfs test66666666
可以看到 NFS 共享目录已经成功挂载到本地的
/var/www/html/,并且能看到index.html文件内容与NFS内容一致。
测试网站访问
打开浏览器,访问 Web 服务器的 IP 地址:
http://192.168.100.114/
http://192.168.100.115/
http://192.168.100.116/

三台 Web 服务器显示的都是同一个页面——因为它们共享了同一个 NFS 存储目录
/webdata。
验证共享写入
在 NAS 上修改文件:
[root@nas ~]# echo "Hello from NAS" > /webdata/index.html
在任意 Web 上查看:
[root@web1 ~]# cat /var/www/html/index.html
Hello from NAS

所有 Web 服务器看到的内容都是一样的!这就是共享存储的威力。
设置永久挂载(开机自动挂载)
[root@web1 ~]# vim /etc/fstab
# 添加以下内容:
192.168.100.113:/webdata /var/www/html nfs defaults 0 0
/etc/fstab 格式说明:
设备/共享 挂载点 类型 选项 转储 检查
192.168.100.113:/webdata /var/www/html nfs defaults 0 0
设置永久挂载后,即使服务器重启,NFS 共享也会自动挂载。
NFS vs FTP 对比
| 对比维度 | NFS | FTP |
|---|---|---|
| 协议类型 | 网络文件系统 | 文件传输协议 |
| 使用场景 | Linux 系统间共享文件(如集群存储) | 文件上传下载(如软件发布) |
| 挂载方式 | 挂载为本地目录,透明访问 | 需要客户端程序连接 |
| 用户体验 | 像操作本地文件一样 | 需要 FTP 客户端 |
| 适用系统 | 主要 Linux/Unix | 跨平台(Windows/Linux/Mac) |
| 并发写入 | 支持 | 不支持(需要锁机制) |
SSH Server(安全外壳协议)
简介
SSH(Secure Shell):安全外壳协议。在服务器的字符界面,进行选取、复制、粘贴、翻页很不方便。借助 SSH 远程操作和管理系统,不仅方便而且安全可靠。
SSH 的作用
- 远程登录——从一台机器远程连接到另一台机器
- 远程执行命令——在不登录的情况下执行命令
- 安全文件传输——通过 SCP/SFTP 安全地传输文件
- 端口转发/隧道——建立安全的加密通道
SSH 服务器实战
步骤 1:查询 SSH 是否安装
[root@localhost ~]# rpm -qa | grep ssh
openssh-server-7.4p1-16.el7.x86_64
openssh-clients-7.4p1-16.el7.x86_64
openssh-7.4p1-16.el7.x86_64
如果没有安装,执行:
[root@localhost ~]# yum -y install openssh-server
步骤 2:SSH 服务管理
# 启动服务(默认已启动)
[root@localhost ~]# systemctl start sshd
# 查看端口
[root@localhost ~]# netstat -antp | grep sshd
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1234/sshd
# 开机自启(默认已启用)
[root@localhost ~]# systemctl enable sshd
22 端口 是 SSH 服务的默认端口。
步骤 3:使用 SSH 远程管理
# SSH 远程登录
[root@localhost ~]# ssh username@IP地址
# 示例:
[root@localhost ~]# ssh root@192.168.142.134
The authenticity of host '192.168.142.134 (192.168.142.134)' can't be established.
ECDSA key fingerprint is SHA256:...
Are you sure you want to continue connecting (yes/no)? yes
root@192.168.142.134's password:
[root@remote ~]#
第一次登录时的提示:
| 提示 | 说明 |
|---|---|
The authenticity of host... | 这是你第一次连接该主机,系统显示对方的指纹 |
Are you sure you want to continue... | 确认后会将指纹保存到 ~/.ssh/known_hosts |
password: | 输入远程主机的用户密码 |
SSH 免密登录
当需要管理大量服务器时,每次输入密码非常低效。SSH 免密登录通过公钥认证机制,实现无需密码的自动登录。
应用场景
┌─────────────┐ ┌──────────────────────┐
│ 跳板机 │ │ 业务服务器群 │
│ 192.168. │ ──────► │ 192.168.100.114 │
│ 100.110 │ SSH │ 192.168.100.116 │
│ │ 免密 │ 192.168.100.232 │
└─────────────┘ │ ... (数量非常大) │
└──────────────────────┘
跳板机(Bastion Host):一台专门用于远程连接其他服务器的中转服务器,是进入内部网络的唯一入口。
配置免密登录的完整流程
环境
| 角色 | IP 地址 | 说明 |
|---|---|---|
| 跳板机 | 192.168.100.110 | 发起连接,持有私钥 |
| 业务服务器 | 192.168.100.114 | 被连接,持有公钥 |
步骤 1:使用密码远程登录(测试连通性)
[root@110 ~]# ssh root@192.168.100.114
root@192.168.100.114's password:
[root@114 ~]# exit
logout
Connection to 192.168.100.114 closed.
[root@110 ~]#
需要输入密码,说明 SSH 服务正常,但还没配置免密。
步骤 2:在跳板机(110)上生成密钥对
[root@110 ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase): ← 直接回车(不设密码)
Enter same passphrase again: ← 直接回车
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:WDpz7zjjBkkk4E5CUhduilLQGHdvvMTEh18IUcb2B8g root@110
The key's randomart image is:
+---[RSA 2048]----+
|+*+.+o+Boo |
|++.+.=+.E o |
|. + oo*+.o . |
| * o o.=. . . |
|o o .*.S . |
|. o+ . |
| . . |
| +o |
| ooo. |
+----[SHA256]-----+
[root@110 ~]#
-t rsa:指定加密算法为 RSA。一路回车即可,不要设置 passphrase(否则每次使用私钥时都要输入密码,失去了免密的意义)。
查看生成的密钥:
[root@110 ~]# ll ~/.ssh/
total 12
-rw------- 1 root root 1679 Jun 1 10:02 id_rsa ← 私钥(自己保管,不能泄露)
-rw-r--r-- 1 root root 390 Jun 1 10:02 id_rsa.pub ← 公钥(分发给目标服务器)
步骤 3:将公钥传递给目标服务器
[root@110 ~]# ssh-copy-id root@192.168.100.114
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '192.168.100.114 (192.168.100.114)' can't be established.
ECDSA key fingerprint is SHA256:3fjgqAxLwRbNDXSOUh1+/JrI4KpzyrHgkzmymB4vUUM.
ECDSA key fingerprint is MD5:3e:f6:f6:dc:fa:ef:26:47:9e:70:2f:4d:39:38:0b:0c.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.100.114's password: ← 输入一次密码
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'root@192.168.100.114'"
and check to make sure that only the key(s) you wanted were added.
[root@110 ~]#
ssh-copy-id会自动将公钥追加到目标服务器的~/.ssh/authorized_keys文件中。
手动方式(如果 ssh-copy-id 不可用):
# 查看公钥内容
[root@110 ~]# cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ... root@110
# 手动复制到目标服务器
[root@110 ~]# cat ~/.ssh/id_rsa.pub | ssh root@192.168.100.114 "cat >> ~/.ssh/authorized_keys"
步骤 4:测试免密登录
[root@110 ~]# ssh root@192.168.100.114
Last login: Mon Jun 1 09:52:47 2026 from 192.168.100.1
[root@114 ~]#
直接登录成功,不需要输入密码!🎉
免密登录原理
┌─────────────────────────────────────────────────────────────┐
│ 免密登录流程 │
│ │
│ 跳板机 (110) 业务服务器 (114) │
│ ┌───────────┐ ┌───────────────────┐ │
│ │ id_rsa │ │ authorized_keys │ │
│ │ (私钥) │ ──────► │ (公钥列表) │ │
│ │ 自己保管 │ 签名验证 │ 存放所有允许的公钥 │ │
│ └───────────┘ └───────────────────┘ │
│ │
│ 1. 跳板机发起连接,发送连接请求 │
│ 2. 服务器用公钥加密一段随机数据发送给跳板机 │
│ 3. 跳板机用私钥解密后发回服务器 │
│ 4. 服务器验证解密结果,匹配则允许登录 │
└─────────────────────────────────────────────────────────────┘
核心理解:私钥像钥匙,公钥像锁孔。跳板机有钥匙(私钥),服务器有锁孔(公钥)。只有匹配的钥匙才能开锁。
SSH 常用命令
| 命令 | 说明 | 示例 |
|---|---|---|
ssh user@host | 远程登录 | ssh root@192.168.1.100 |
ssh user@host command | 远程执行命令 | ssh root@192.168.1.100 ls /tmp |
ssh-copy-id user@host | 复制公钥到目标 | ssh-copy-id root@192.168.1.100 |
scp file user@host:path | 上传文件 | scp local.txt root@192.168.1.100:/tmp/ |
scp user@host:path local | 下载文件 | scp root@192.168.1.100:/tmp/remote.txt . |
scp -r dir user@host:path | 上传目录 | scp -r mydir root@192.168.1.100:/opt/ |
SSH 安全加固
修改默认端口
[root@localhost ~]# vim /etc/ssh/sshd_config
# 修改端口(默认 22)
Port 2222
[root@localhost ~]# systemctl restart sshd
修改端口可以减少自动化攻击(脚本扫描通常只扫 22 端口)。
禁止 root 直接登录
[root@localhost ~]# vim /etc/ssh/sshd_config
# 禁止 root 登录
PermitRootLogin no
建议创建普通用户,登录后再
su -切换到 root。
禁止密码登录(仅允许密钥)
[root@localhost ~]# vim /etc/ssh/sshd_config
# 仅允许公钥认证
PasswordAuthentication no
PubkeyAuthentication yes
这是最安全的 SSH 配置——完全禁用密码登录,只有持有私钥的人才能登录。
常见问题
FTP 相关
Q1:FTP 上传失败,提示 “550 Permission denied”
- 检查
/var/ftp/upload目录权限:chmod 777 /var/ftp/upload - 检查 SELinux 是否关闭:
getenforce - 检查 vsftpd.conf 中是否开启
anon_upload_enable=YES
Q2:FTP 登录后看不到文件
确保文件放在 /var/ftp/ 目录下,这是 FTP 的共享根目录。
NFS 相关
Q1:showmount 提示 “clnt_create: RPC: Port mapper failure”
- 确认 NFS 服务已启动:
systemctl status nfs-server - 确认 rpcbind 服务已启动:
systemctl status rpcbind - 确认防火墙已关闭
Q2:NFS 挂载后无法写入
检查 /etc/exports 中的权限是否为 rw,并确认 no_root_squash 已设置。
Q3:如何卸载 NFS 挂载?
[root@web1 ~]# umount /var/www/html/
SSH 相关
Q1:SSH 连接超时断开怎么办?
# 在 sshd_config 中设置心跳间隔
[root@localhost ~]# vim /etc/ssh/sshd_config
ClientAliveInterval 60 # 每 60 秒发送一次心跳
ClientAliveCountMax 3 # 最多 3 次无响应则断开
Q2:SSH 连接很慢
# 在 sshd_config 中关闭 DNS 反向解析
[root@localhost ~]# vim /etc/ssh/sshd_config
UseDNS no
Q3:如何快速配置多台服务器的免密登录?
# 在跳板机上批量分发公钥
for ip in 134 135 136; do
ssh-copy-id root@192.168.142.$ip
done
服务管理建议
FTP 安全
- 生产环境尽量使用 SFTP(基于 SSH 的文件传输)替代 FTP
- FTP 传输的密码和文件都是明文的
NFS 权限
- 使用
ro(只读)权限共享不需要写入的数据 - 限制允许挂载的客户端 IP 范围
- 使用
SSH 安全
- 修改默认端口
- 禁止 root 直接登录
- 使用密钥认证替代密码认证
- 定期更新 SSH 版本
服务管理
- 所有服务都应该设置开机自启:
systemctl enable service - 修改配置后重启服务:
systemctl restart service - 定期检查服务日志:
journalctl -u service
- 所有服务都应该设置开机自启:
总结
通过本章节的学习,你应该掌握了:
- 理解 FTP 协议的作用和端口(21 控制端口、20 数据端口)
- 掌握 vsftpd 的安装、启动和基本配置
- 使用浏览器、lftp、wget 三种方式访问 FTP 服务器
- 配置 FTP 上传功能(匿名上传、创建目录)
- 理解 NFS 网络文件系统的作用和特点
- 掌握 NFS 服务器的搭建(安装、配置 /etc/exports、启动)
- 掌握 NFS 客户端的挂载(手动挂载、永久挂载)
- 使用
showmount查看共享、exportfs检查输出 - 理解 SSH 协议的作用和 22 端口
- 掌握 SSH 远程登录和远程执行命令
- 理解 SSH 免密登录的原理和配置流程
- 使用
ssh-keygen生成密钥对 - 使用
ssh-copy-id分发公钥 - 掌握 SCP 命令进行安全文件传输
- 了解 SSH 安全加固方法(修改端口、禁止 root 登录、禁用密码认证)
学习建议:文件服务是运维的核心技能。建议在自己的虚拟机环境中搭建完整的 FTP + NFS + SSH 实验环境,特别是 NFS 的 Web 集群共享存储场景和 SSH 免密登录的跳板机场景。实际操作一遍,胜过阅读十遍文档!