
前阵子帮一位学生梳理 Linux 课程作业要求在一台服务器上把网络、VNC、Samba、vsFTP、Apache、DNS、firewalld 和 SELinux 全部配置到位。刚开始觉得这就是八个独立任务装软件、写配置、开端口。真正动手后才发现最耗时间的不是安装而是它们之间的交叉问题——Samba 目录被 SELinux 挡住、FTP 被动模式端口没放行、Web 用域名访问时 DNS 却解析不了、VNC 客户端一直报 Connection refused 10061。这篇文章把我亲手跑通的这套流程从头整理了一遍按配置顺序讲每步都说明为什么这样做最后再给一份能直接套用的联调排错清单。无论你是要交课程作业还是想搭一台内网服务器照着这套思路走基本不会翻车。1. 开局规划先把网络、主机名和系统仓库定下来1.1 地址规划决定了后面一半的排错工作量在开始装服务之前先把这台机器的身份定下来。我见过太多人上来就dnf install一堆服务装完才发现 IP 是 DHCP 分配的、主机名是 localhost、各服务用的还是默认配置后面所有客户端访问都对着错乱的 IP 和主机名去试错白白浪费一晚上。以 RHEL 系系统为例CentOS 7/Stream、Rocky、Alma 都适用包管理器 yum/dnf 二选一。规划一个典型的实验环境内网网段192.168.10.0/24服务器静态 IP192.168.10.10网关192.168.10.1主机名server.techlab.local。后续要装的 DNS 服务负责解析techlab.local这个域所以 Web 服务用www.techlab.local访问就非常自然。服务的端口规划也建议先列成一张表后面配防火墙时照着填就行。我把这次涉及的端口先列在这里后面会逐一用到。服务软件包监听端口说明SSHopenssh-server22/tcp管理通道VNCtigervnc-server5901/tcp第一个虚拟桌面Sambasamba139/tcp, 445/tcp文件共享Samba NetBIOSsamba137-138/udp旧版主机发现vsFTPvsftpd21/tcpFTP控制连接vsFTP passivevsftpd30000-31000/tcpFTP被动数据连接Apachehttpd80/tcpWeb服务DNSbind53/tcp, 53/udp域名解析1.2 用 nmcli 配置静态 IP别去手改 ifcfg 文件很多教程还在教人直接改/etc/sysconfig/network-scripts/ifcfg-ens33在 RHEL7 之后这个做法容易和 NetworkManager 的管辖区产生冲突改完network restart可能又变回去。最省事的做法是用nmclinmcli con show nmcli con mod ens33 ipv4.addresses 192.168.10.10/24 nmcli con mod ens33 ipv4.gateway 192.168.10.1 nmcli con mod ens33 ipv4.dns 192.168.10.10 nmcli con mod ens33 ipv4.method manual nmcli con up ens33这里有个细节ipv4.dns我直接写成了192.168.10.10也就是后面这台服务器的 DNS 服务 IP。如果你现在还没把 DNS 搭起来装软件时可能需要外网解析那暂时可以用网关或公共 DNS等 DNS 服务建好后再把/etc/resolv.conf改成自己。实验环境下不必纠结这一点关键是 IP 和主机名必须固定。接着设置主机名和 hosts 映射hostnamectl set-hostname server.techlab.local echo 192.168.10.10 server.techlab.local server /etc/hosts不要小看这一步。Samba 的 NetBIOS 名、Apache 的 ServerName、DNS 的 SOA 记录都要以主机名为基础。/etc/hosts里加一行自己也能避免本机在 DNS 服务启动之前无法解析自己。1.3 仓库和基础工具静态网络搞定后先把软件源和基础工具装齐dnf install -y epel-release dnf update -y dnf install -y vim net-tools wget lftp nc如果系统是最小化安装vim、nc、wget这些都不一定在后面排错会很不方便。epel-release提供很多额外软件包虽然本环节用到的服务都来自 base 源但我建议直接装上后面想补工具就不用再折腾。到这里系统的地基已经稳了。接下来的顺序我建议是 VNC、Samba、vsFTP、Apache、DNS最后统一处理 firewalld 和 SELinux 的收口策略。你当然可以按任意顺序装服务但我这个顺序有一个好处越往后越接近客户端视角每配好一个就能立刻验证一个不会到最后面对一堆坏掉的组件无从下手。2. VNC远程桌面先解决 Connection refused 100612.1 安装 TigerVNC 并创建专用用户VNC 服务端我用的是tigervnc-server这也是 RHEL 系最常用的实现。先安装再建一个专门用于远程桌面的用户dnf install -y tigervnc-server useradd vncuser passwd vncuser su - vncuser vncpasswdvncpasswd是在该用户家目录下生成 VNC 登录密码这个密码与系统口令是独立的之后用 VNC Viewer 连接时输入的是它不是系统登录密码。密码会保存在/home/vncuser/.vnc/passwd权限必须是 600否则 VNC 会拒绝启动。2.2 用 systemd 管理 VNC 实例而不是前台跑 vncserver很多人直接vncserver :1起服务一关终端就没了而且重启后还得手动启动。正确做法是把 VNC 交给 systemd 管理。TigerVNC 安装完后会带一个模板服务/usr/lib/systemd/system/vncserver.service复制一份对应显示编号:1的实例cp /usr/lib/systemd/system/vncserver.service /etc/systemd/system/vncserver:1.service vim /etc/systemd/system/vncserver:1.service不同版本模板内容有差异但核心是把 ExecStart 中的登录用户改成vncuser。比如模板里如果是USER占位符就全部替换成vncuser。改完执行systemctl daemon-reload systemctl enable --now vncserver:1 ss -lntp | grep 5901vncserver:1的:1不是参数而是显示编号对应的端口就是 5901。同理:2对应 5902。如果你一直连不上先检查是不是显示编号和端口对不上。我还会让用户在~/.vnc/config里写一些默认参数mkdir /home/vncuser/.vnc chown vncuser:vncuser /home/vncuser/.vnc echo -e geometry1280x800\ndepth24\nlocalhostno /home/vncuser/.vnc/config chown vncuser:vncuser /home/vncuser/.vnc/configlocalhostno表示 VNC 监听在 0.0.0.0允许从局域网内其他机器连接。如果要更严格可以只监听某个 IP但那样反而容易让初学者把问题搞复杂不如在防火墙层面对来源地址做限制。2.3 防火墙放行和工具连接firewall-cmd --add-port5901/tcp --permanent firewall-cmd --reload客户端我用 RealVNC Viewer 或 TigerVNC Viewer 连192.168.10.10:5901。这里填的是IP:端口写法不要只填192.168.10.10然后不加端口默认端口 5900 会直接连错地方。关于连接被拒绝的问题最经典的就是报错Unable to connect to socket: Connection refused (10061)。这个 10061 表示目标机器上的端口没有接受连接原因一般是这几种服务没启动systemctl status vncserver:1看状态。端口不对确认是 5901 而不是 5900。服务启动失败journalctl -u vncserver:1 --since today看日志多半是密码文件权限问题、配置文件语法错误、或者用户家目录权限不对。监听地址是 127.0.0.1ss -lntp | grep 5901确认是0.0.0.0:5901或*:5901。防火墙没有放行服务端firewall-cmd --list-all检查。另外补充一个很多人问过的情况VNC 连上后桌面是黑的或者启动 rviz 这类图形程序时报 OpenGL 相关的错。这通常不是 VNC 配置问题而是服务器上缺少 X 组件或显卡驱动不支持 GL 渲染。课程作业里如果只是要一个可用桌面装好默认 GNOME 桌面后 VNC 一般能正常显示要跑 3D 程序那得另配 Xvfb 或虚拟 GPU这属于更高阶的话题了。3. Samba文件共享用户、路径和SELinux上下文三者缺一不可3.1 安装软件并创建一个有意义的共享目录Samba 可以用来自建一个类似内网云盘的共享目录Windows 上映射网络驱动器就能直接访问。安装dnf install -y samba samba-client cifs-utils mkdir -p /srv/share chown root:shared /srv/share chmod 2775 /srv/share我建了shared组准备让vncuser和另一个测试用户加入这个组。目录权限里的2是 setgid 位含义是在这目录下新建的文件自动继承所属组这样团队协作时不会出现 A 建的文件 B 没法改的问题。3.2 配置 smb.conf 的核心选项编辑/etc/samba/smb.conf一个最简但能跑的配置如下[global] workgroup WORKGROUP server string Tech Lab Samba Server security user map to guest never [share] path /srv/share valid users shared browseable yes writable yes create mask 0664 directory mask 2775几个关键点解释一下。security user表示必须用 Samba 用户身份验证map to guest never是禁止匿名映射成 guest除非你确实要开公共匿名共享否则别开 guest这是安全服务器的底线。valid users shared只允许 shared 组的成员访问这个共享。3.3 Samba 用户和系统用户的关系Samba 的账号本质上挂靠在系统用户上但密码是独立的。也就是说你想让用户vncuser能访问共享必须执行smbpasswd -a vncuser pdbedit -Lsmbpasswd -a会要求设置一个 Samba 专用密码这个密码可以和系统密码相同也可以是不同的。很多用户名、密码和路径都设置好了还是连不上的案例问题都出在这一步没做。你觉得自己在 Windows 里输入的账号密码肯定对但实际上系统用户vncuser可能存在Samba 数据库里却没有这个条目自然认证失败。另外要特别注意客户端访问时填的路径是\\192.168.10.10\share里的share也就是 smb.conf 中[share]这个共享名不是服务器本地的/srv/share绝对路径。新手最容易在这里混淆Windows 的地址栏里填/srv/share或者share$都是不存在的。如果后续觉得某用户不需要访问共享了用pdbedit -x vncuser删除该 Samba 账号不需要动系统用户。3.4 SELinux上下文不是摆设samba_share_t共享目录选在/srv/share而不是默认的/home有一个明显原因SELinux 对/srv下内容的类型标记更可控不会和用户家目录耦合。如果你在 SELinux Enforcing 模式下启动 smbd然后 Windows 客户端一直报没有权限但目录权限明明是对的十有八九是上下文问题。执行一次chcon -R -t samba_share_t /srv/share这样目录就被标记为 Samba 可访问的类型。更持久、更规范的做法是用semanage定义默认规则dnf install -y policycoreutils-python-utils semanage fcontext -a -t samba_share_t /srv/share(/.*)? restorecon -Rv /srv/sharesemanage fcontext写的是持久化规则即使restorecon恢复所有默认上下文也不会丢。chcon只是临时改一次重启或 restorecon 后会还原所以我建议直接用 semanage 方案。还有两个相关的 SELinux 布尔值samba_export_all_rw和samba_export_all_ro。这俩是把任意目录的读写权限放开给 Samba 的开关默认是关闭的。如果你想偷懒一条setsebool -P samba_export_all_rw 1就省去了上下文配置但作为安全服务器我不推荐这样做因为它把所有目录都暴露给了 Samba 的读写策略属于典型的图省事挖大坑。把目录正确标记为samba_share_t才是正经解法。3.5 防火墙、客户端访问与常见故障Samba 服务在 firewalld 中是一个整体服务包含 137-138/udp、139/tcp、445/tcp 几个端口firewall-cmd --add-servicesamba --permanent firewall-cmd --reloadLinux 客户端测共享用smbclient -L //192.168.10.10 -U vncuser smbclient //192.168.10.10/share -U vncuserWindows 上更简单资源管理器地址栏输入\\192.168.10.10\share然后输入 vncuser 和 Samba 密码。如果提示要使用凭据管理器中的旧凭据可以在 Windows 的凭据管理器里删掉旧记录再重试。另一个少见但真实存在的情况是某些 Windows 版本禁用了 SMB1 协议而你的 Samba 配置里没启用 SMB2/3。RHEL 系的 Samba 默认支持 SMB2/3所以一般不涉及这个坑但如果客户端非常老才需要关注。4. vsFTP文件传输匿名与本地用户模式的安全取舍4.1 安装 vsftpd 并选择运行模式FTP 服务我用vsftpd配置简单、性能和安全性在传统 FTP 服务里算不错的。安装dnf install -y vsftpdvsftpd 的配置全在/etc/vsftpd/vsftpd.conf。我建议在动手前先想清楚你打算允许匿名访问还是只允许本地用户很多课程作业会把两种都写上要求但生产服务器上匿名 FTP 基本等于敞开大门我强烈建议至少把匿名写权限关掉或者直接禁用。下面是一份适合作业也适合内网使用的配置anonymous_enableNO local_enableYES write_enableYES local_umask022 chroot_local_userYES allow_writeable_chrootYES pasv_min_port30000 pasv_max_port31000chroot_local_userYES会把本地用户锁定在自己的家目录里避免登录后能看到/etc、/var等系统目录。这个选项对安全很重要但它有一个配套的坑如果用户家目录本身可写vsftpd 在 chroot 后会拒绝启动报错500 OOPS: vsftpd: refusing to run with writable root inside chroot()。解决办法就是allow_writeable_chrootYES。当然更严谨的方案是单独建一个不可写的子目录然后让用户上传到这个子目录但作业场景用这个开关就够。4.2 FTP 用户的认证方式FTP 的本地用户认证直接走系统/etc/shadow不需要像 Samba 一样额外维护一套密码库。前提是这些用户必须能登录系统。如果你想限制某些用户只能 FTP 不能 SSH可以在/etc/vsftpd/user_list里配置这里先不多展开原理就是在配置里开启userlist_enableYES和userlist_denyYES/NO来控制黑白名单。4.3 SELinux 和 firewalld 的联合放行FTP 是控制连接和数据连接分离的协议这点让它比 SSH、HTTP 更容易出现连上了但列不出目录的怪问题。先处理 SELinux。vsftpd 相关的布尔值主要有ftp_home_dir和ftpd_full_access。如果你希望本地用户能访问和写入家目录一般这条够用setsebool -P ftp_home_dir on如果还碰到其他被拒的情况可以先看/var/log/audit/audit.log里 AVC 记录的布尔值名称再决定要不要开ftpd_full_access。ftpd_full_access相当于对 FTP 的 SELinux 策略整体放开能用但不优雅。安全服务器的思路应该是缺哪个布尔值就开哪个。防火墙这边要放两个东西firewall-cmd --add-serviceftp --permanent firewall-cmd --add-port30000-31000/tcp --permanent firewall-cmd --reloadftp服务放行的是 21/tcp被动模式数据端口必须单独放行30000-31000/tcp。如果你忘了放行数据端口表现就是客户端能输入账号密码也能进入目录但一执行ls就卡住最后超时。这个现象几乎可以立刻判断是被动端口没放行。另外如果客户端使用主动模式需要内核模块nf_conntrack_ftp来跟踪 FTP 连接否则数据连接可能被防火墙拦掉。可以手动加载并写入启动模块列表modprobe nf_conntrack_ftp echo nf_conntrack_ftp /etc/modules-load.d/vsftpd.conf实际上对大部分局域网的被动模式场景上面两步不是必须的但如果你用主动模式或客户端在 NAT 后面这个模块就是救命稻草。4.4 客户端验证安装 lftp 后既能测匿名也能测本地用户lftp 192.168.10.10 -u vncuser登录后输入ls能正常列出文件就说明控制连接、数据连接、SELinux、防火墙全部通畅。客户端也可以直接用 FileZilla注意连接时选择被动模式端口范围和服务端配置保持一致。5. Apache与DNS让Web服务有一个名字而不是只有IP5.1 两个服务一起装的联动思路这一步开始有意思了。Apache 和 DNS 单独看没什么联系但实际使用中你想用http://www.techlab.local访问 Web而不是记一个192.168.10.10就必须让 DNS 把域名解析到这台服务器。课程作业里如果只要求装好 Apache 和 DNS很多人会各装各的结果 DNS 能解析 A 记录Apache 也能打开首页但用域名访问却失败——因为 DNS 服务和 Web 服务没组合起来。先安装两者dnf install -y bind bind-utils httpd5.2 DNS 区域配置和区域文件BIND 的配置核心是/etc/named.conf。我建议把区域定义写到/etc/named.rfc1912.zones这是默认引入的文件修改主配置的风险最小。在文件末尾追加zone techlab.local IN { type master; file forward.techlab.local; allow-update { none; }; };然后在/var/named/下新建区域文件forward.techlab.local$TTL 86400 IN SOA server.techlab.local. admin.techlab.local. ( 2025010101 ; serial 3600 ; refresh 1800 ; retry 604800 ; expire 86400 ; minimum ) IN NS server.techlab.local. server IN A 192.168.10.10 www IN A 192.168.10.10区域文件的属主和权限有严格要求。BIND 默认以named用户运行区域文件放在/var/named下时要保证 named 用户能读取chown root:named /var/named/forward.techlab.local restorecon -v /var/named/forward.techlab.local chmod 640 /var/named/forward.techlab.localrestorecon不是多余的SELinux 对/var/named目录下的文件有特定类型要求直接 vim 新建的文件上下文可能不对named 启动后报权限错误。如果还需要 named 动态更新主区域文件要开布尔值named_write_master_zone但静态区域文件不需要。启动和服务状态systemctl enable --now named systemctl status named named-checkzone techlab.local /var/named/forward.techlab.localnamed-checkzone是语法检查工具强烈建议改完区域文件都跑一遍能就地拦截很多手误。5.3 Apache 虚拟主机配置Apache 在/etc/httpd/conf.d/下新建一个虚拟主机配置文件比如www.techlab.local.confVirtualHost *:80 ServerName www.techlab.local DocumentRoot /var/www/html Directory /var/www/html AllowOverride None Require all granted /Directory /VirtualHost默认的首页文件/var/www/html/index.html如果不存在访问时会出现测试页或 403。所以我通常直接建一个echo h1Tech Lab Web Server/h1 /var/www/html/index.html5.4 SELinux对Apache目录的约束/var/www/html默认就带有httpd_sys_content_t上下文所以放在默认目录下基本不用管 SELinux。如果你把网站目录改到/data/web那就必须手动标记semanage fcontext -a -t httpd_sys_content_t /data/web(/.*)? restorecon -Rv /data/web记不住上下文名称没关系SELinux 的 AVC 日志会直接告诉你目录的类型是default_t需要httpd_sys_content_t或httpd_sys_rw_content_t。照着提示改就行。另一个常见需求是 Apache 反向代理或调用后端接口这需要httpd_can_network_connect布尔值默认关闭。如果你的 Web 程序要访问外部 API记得提前开setsebool -P httpd_can_network_connect on5.5 放行防火墙并完成端到端验证firewall-cmd --add-servicehttp --add-servicedns --permanent firewall-cmd --reload验证顺序是先看 DNS 再看 Webdig www.techlab.local 192.168.10.10 curl http://www.techlab.local/注意dig命令后面的192.168.10.10明确指定查询服务器。如果本机还没把 DNS 改到自己这不影响dig IP的显式查询。如果dig能解析出192.168.10.10curl却报Could not resolve host检查客户端的/etc/resolv.conf是否把 nameserver 配成了服务器 IP。如果是 Windows 客户端在网卡 IPv4 属性里手动指定 DNS 地址为192.168.10.10即可。这里还要提一个很隐蔽的坑Apache 的ServerName和 DNS 记录不一致时访问www.techlab.local可能会跳到Apache 默认虚拟主机或者显示错误。所以虚拟主机文件里的ServerName必须和 DNS 里的 A 记录严格对应包括www前缀少一个都不行。6. firewalld与SELinux收口防火墙放行不等于一切畅通6.1 先看当前放行状态到了这里所有服务都跑起来了但还不能算完成。一个安全服务器的基本素养是明确知道哪些端口对谁开放、开放了为什么开放。在最终收口前先看一眼现在的放行清单firewall-cmd --list-all --zonepublic如果前几节你按步骤走清单里应该有 ssh、vnc 的 5901/tcp、samba、ftp、30000-31000/tcp、http、dns 这几项。多出来的东西如果说不清用途建议删掉。防火墙的核心原则是最小放行不是能用就行。6.2 用富规则对来源地址进行限制firewall-cmd --add-port是对所有人放行这在实验网里问题不大但如果你想体现安全服务器的含金量可以对 VNC 这类远程桌面服务加来源限制。比如只允许192.168.10.0/24网段访问 5901firewall-cmd --permanent --zonepublic --add-rich-rulerule familyipv4 source address192.168.10.0/24 port port5901 protocoltcp accept firewall-cmd --reload如果之前已经用--add-port5901/tcp放行过富规则加不加其实都不会更严格。理想做法是只保留富规则不放行全局端口这样别的网段想连 VNC 就完全被拒之门外。SSH、FTP 管理端口也可以照此办理。6.3 SELinux保持 Enforcing 的意义课程作业里最常见的偷懒动作是setenforce 0或者把/etc/selinux/config改成disabled理由是SELinux 太麻烦。这其实是个非常可惜的决定因为 SELinux 在 RHEL 系里不是用来添乱的它会把服务越权访问的举动直接拦截并写进审计日志。你只需要学会三件事getenforce确认当前是 Enforcing。ausearch -m avc -ts recent查看最近被拦截的记录。journalctl -t setroubleshoot --since today看更友好的解释。举个例子。你配置了 Apache首页正常打开但某天想给 Web 目录加一个上传功能发现 PHP 写不了文件。ausearch -m avc -ts recent很可能会输出httpd_t被拒绝写入httpd_sys_content_t或var_t类型的目录这时候你要么把目录上下文改成httpd_sys_rw_content_t要么调整httpd_unified这个布尔值。SELinux 会告诉你该动哪个开关而不是让你盲目改权限。6.4 常用布尔值速查下面是我在这套配置里实际会碰到的布尔值整理成表方便对照布尔值作用何时开启ftpd_full_access放开 vsftpd 的 SELinux 限制FTP 目录写入被拒但确定安全时ftp_home_dir允许 FTP 用户读写家目录本地用户通过 FTP 访问家目录named_write_master_zone允许 named 写入主区域文件使用动态 DNS 更新时httpd_can_network_connect允许 Apache 主动向外发起网络连接反向代理或调用后端 APIsamba_export_all_rw让 Samba 可读写任意目录不想做上下文标记时的临时方案这里的布尔值名称在部分发行版上可能略有差异但 RHEL/CentOS/Rocky/Alma 系基本一致。getsebool -a | grep ftp可以列出当前所有 FTP 相关布尔值省得记名字。7. 全套服务联合验证与排查从能Ping通到能访问7.1 一个验证清单照着打勾服务全部配完后我会按下面这张表逐项验证缺一项都不算完成服务服务端验证命令客户端验证方式关键配置SSHsystemctl status sshdssh user192.168.10.10/etc/ssh/sshd_configVNCss -lntp | grep 5901VNC Viewer 连192.168.10.10:5901/home/vncuser/.vnc/configSambasmbclient -L //localhost -U vncuserWindows 打开\\192.168.10.10\share/etc/samba/smb.confFTPlftp 192.168.10.10 -u vncuserFileZilla 连192.168.10.10/etc/vsftpd/vsftpd.confApachecurl http://localhost/浏览器访问http://www.techlab.local//etc/httpd/conf.d/DNSdig server.techlab.local 192.168.10.10客户端nslookup www.techlab.local/etc/named.conf建议每配完一个服务就立刻做对应验证不要攒到最后一起测。这样某个环节出了问题范围一定很小排错时间几乎是线性的如果全部装完再联调六个服务的日志一起刷新手很容易崩溃。7.2 四层排查法端口、防火墙、SELinux、日志当客户端说连不上时我有一套固定的排查顺序按这个顺序走基本不会漏第一层确认网络可达。直接ping目标 IP以及用telnet IP 端口探测目标端口。如果telnet失败说明要么 IP 不通要么端口没有监听。第二层确认服务在监听。服务器上执行ss -lntp看对应端口是否存在监听地址是不是0.0.0.0。如果服务没起来看服务的 systemd 状态和日志。第三层确认防火墙放行。firewall-cmd --list-all对照端口和服务清单。这里有个常见误区在服务器本机访问服务能通但从局域网其他机器连不通基本就是防火墙问题本机访问都不通就是服务或 SELinux 问题。第四层确认 SELinux 是否拦截。getenforce如果是 Enforcing再用ausearch -m avc -ts recent查最近的 AVC 拒绝记录。如果看到denied和具体布尔值名称那就知道该开哪个开关或改哪个上下文了。最后一层才是看服务日志。journalctl -u 服务名 --since today比如journalctl -u smb、journalctl -u named。把前面几项都排除后日志里通常会有非常明确的报错。7.3 一个真实场景的完整排查链路我拿最经典的Samba 能 ping 通、用户名密码路径都对但 Windows 就是访问不了来演示一次完整排查。第一步客户端telnet 192.168.10.10 445结果显示端口可达说明网络连通Samba 端口在监听。第二步服务端ss -lntp | grep 445确认smbd确实监听在0.0.0.0:445。第三步firewall-cmd --list-all确认 samba 服务在放行列表里。第四步getenforce返回Enforcingausearch -m avc -ts recent刷出几条与smbd_t相关的 denied目标目录是/srv/share类型是default_t或unlabeled_t。到这里问题就已经定位了目录上下文不是samba_share_t。第五步执行semanage fcontext -a -t samba_share_t /srv/share(/.*)?和restorecon -Rv /srv/share再回 Windows 刷新问题解决。整个过程不到五分钟。如果你不做第四步就直接去看 smb.conf、重启服务、改权限大概率会浪费大量时间而且最后还得回来查 SELinux。7.4 别忘了启动项和配置备份最后还有两件小事。第一确保所有服务都设置了开机自启systemctl enable --now或者之后补systemctl enable否则服务器重启后全部回到点手工启动的状态。第二配置每次都先备份cp /etc/samba/smb.conf /etc/samba/smb.conf.bak.$(date %F) cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak.$(date %F) cp /etc/named.conf /etc/named.conf.bak.$(date %F)这个习惯能让你在改坏配置后一分钟还原而不是在多个空白配置里重新敲一遍。整套流程走完我个人最大的体会是标题里那八个词拆开看每个都不难真正的难度在于它们之间通过端口、目录权限和安全策略形成的耦合关系。SELinux 第一次拦你的时候你可能会觉得它在找麻烦但当你学会读 AVC 日志后会发现它其实是这套系统里最诚实的保镖——它从来不猜它直接用规则告诉你缺了什么。如果你愿意在每次排错时先从端口、防火墙、SELinux、日志四层往下走而不是凭感觉乱试那么不管是这份作业还是真实的服务器运维你都会顺畅很多。