本文主要是介绍Linux (RHEL Apache、vsftpd、Samba服务)、,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
九、使用Apache服务部署静态网站
本章讲解 Web 服务程序以及 Web 服务程序的用处,然后通过对比当前主流的 Web 服务程序来使读者更好地理解其各自的优势及特点,最后通过对 httpd 服务程序中“全局配置参数”“区域配置参数”及“注释信息”的理论讲解和实战部署 。 以及SELinux 服务的作用、 3 种工作模式以及策略管理方法,SELinux 域和 SELinux 安全上下文的配置方法,完成多个基于 httpd 服务程序的实用功能的部署实验,其中包括 httpd 服务程序的基本部署、个人用户主页功能和密码加密认证方式的实现,以及分别基于 IP 地址、主机名(域名)、端口号部署虚拟主机网站功能。
1.网站服务程序
Web 网络服务,一般是指允许用户通过浏览器访问互联网中各种资源的服务,Web 网络服务是一种被动访问的服务程序,即只有接收到互联网中其他主机发出的请求后才会响应,最终用于提供服务程序的 Web 服务器会通过 HTTP (超文本传输协议)或 HTTPS(安全超文本传输协议)把请求的内容传送给用户。
目前能够提供 Web 网络服务的程序有 IIS 、 Nginx 和 Apache 等。其中, IIS (Internet Information Service ,互联网信息服务)是 Windows 系统中默认的 Web 服务程序,这是一款图形化的网站管理工具,不仅可以提供 Web 网站服务,还可以提供 FTP 、 NMTP 、 SMTP 等服务。

2004 年 10 月 4 日,为俄罗斯知名门户站点而开发的 Web 服务程序 Nginx 横空出世。Nginx程序作为一款轻量级的网站服务软件,因其稳定性和丰富的功能而快速占领服务器市场,但Nginx 最被认可的还是其系统资源消耗低且并发能力强的特性,因此得到了国内诸如新浪、网易、腾讯等门户网站的青睐。
Apache 程序是目前拥有很高市场占有率的 Web 服务程序之一,其跨平台和安全性广泛被 认可且拥有快速、可靠、简单的 API 扩展。 它的名字取自美国印第安人的土著语,寓意为“拥有高超的作战策略和无穷的耐性”。Apache 服务程序可以运行在 Linux 系统、 UNIX 系统甚至是 Windows 系统中,它支持基于 IP、域名及端口号的虚拟主机功能,支持多种认证方式,集成有代理服务器模块、安全 Socket 层( SSL),能够实时监视服务状态与定制日志消息,并支持各类丰富的模块。

第1步:动手安装 Apache 服务程序,在使用 dnf 命令进行安装时,跟在命令后面的 Apache 服务的软件包名称为 httpd:

第2步:启用 httpd 服务程序并将其加入到开机启动项中,使其能够随系统开机而运行,从而持续为用户提供 Web 服务。

在浏览器(这里以 Firefox 浏览器为例)的地址栏中输入 http://127.0.0.1 并按回车键,就可以看到用于提供 Web 服务的默认页面了:


2.配置服务文件参数
在 Linux 系统中配置服务,其实就是修改服务的配置文件。因此,还需要知道这些配置文件的所在位置以及用途。
Linux 系统中的配置文件:

主配置文件中保存的是最重要的服务参数,一般会被保存到 /etc 目录中以软件名称命名的一个文件夹之中,名字为“服务名称 .conf ”,例如这里的“ /etc/httpd/conf/httpd.conf ”。
在 httpd 服务程序的主配置文件中,存在 3 种类型的信息:注释行信息、全局配置、区域配置:

全局配置参数就是一种全局性的配置参数,可作用于所有的子站点,既保证了子站点的正常访问,也有效降低了频繁写入重复参数的工作量。区域配置参数则是单独针对每个独立的子站点进行设置的。就像在大学食堂里面打饭,食堂负责打饭的阿姨先给每位同学来一碗标准大小的米饭(全局配置),然后再根据每位同学的具体要求盛放他们想吃的菜(区域配置)
配置 httpd 服务程序时最常用的参数以及用途描述:


DocumentRoot 参数用于定义网站数据的保存路径,其参数的默认值是 /var/www/html(即把网站数据存放到这个目录中);而当前网站普遍的首页面名称是index.html ,因此可以向 /var/www/html/index.html 文件中写入一段内容,替换掉 httpd 服务程序的默认首页面。该操作会立即生效。

在 Firefox 浏览器中刷新 httpd 服务程序,可以看到该程序的首页面内容已经发生了改变:

在默认情况下,网站数据保存在/var/www/html 目录中,如果想把保存网站数据的目录修改为 /home/wwwroot 目录需要如下操作:
第一步:建立网站数据的保存目录,并创建首页文件:

第二步:打开 httpd 服务程序的主配置文件,将约第 122 行用于定义网站数据保存路径的参数 DocumentRoot 修改为/home/wwwroot,同时还需要将约第 127 行与第 134 行用于定义目录权限的参数 Directory 后面的路径也修改为/home/wwwroot。配置文件修改完毕后即可保存并退出:


第三步: 重新启动 httpd 服务程序并验证效果,浏览器刷新页面后,提示权限不足:


3.SELinux安全子系统
SELinux ( Security-Enhanced Linux )是美国国家安全局在 Linux 开源社区的帮助下开发的一个强制访问控制( MAC , Mandatory Access Control )的安全子系统。 Linux 系统使用SELinux技术的目的是为了让各个服务进程都受到约束,使其仅获取到本应获取的资源。
例如,您在自己的电脑上下载了一个美图软件,正全神贯注地使用它给照片进行美颜的时候,它却在后台默默监听着浏览器中输入的密码信息,而这显然不应该是它应做的事情(哪怕是访问电脑中的图片资源,都情有可原)。 SELinux 安全子系统就是为了杜绝此类情况而设计的,它能够从多方面监控违法行为:对服务程序的功能进行限制( SELinux 域限制可以确保服务程序做不了出格的事情);对文件资源的访问进行限制( SELinux 安全上下文确保文件资源只能被其所属的服务程序进行访问)。
SELinux 域和 SELinux 安全上下文称为 Linux 系统中的双保险,系统内的服务程序只能规规矩矩地拿到自己所应该获取的资源,这样即便黑客入侵了系统,也无法利用系统内的服务程序进行越权操作。
SELinux 服务有 3 种配置模式,具体如下:
enforcing: 强制启用安全策略模式,将拦截服务的不合法请求。
permissive: 遇到服务越权访问时,只发出警告而不强制拦截。
disabled: 对于越权的行为不警告也不拦截。
本书中所有的实验都是在强制启用安全策略模式下进行的,虽然在禁用 SELinux 服务后确实能够减少报错几率,但这在生产环境中相当不推荐。查看 SELinux 服务主配置文件中定义的默认状态。如果是 permissive 或 disabled,建议赶紧修改为 enforcing 。


SELinux 服务的主配置文件中,定义的是 SELinux 的默认运行状态,可以将其理解为系统重启后的状态,因此它不会在更改后立即生效。可以使用 getenforce 命令获得当前 SELinux服务的运行模式:

为了确认浏览器 的结果是因为 SELinux 而导致的,可以用 setenforce [0|1]命令修改SELinux 当前的运行模式( 0 为禁用, 1 为启用)。注意,这种修改只是临时的,在系统重启后就会失效:

再次刷新网页,就会看到正常的网页内容了 。可见,问题是出在了 SELinux服务上。

httpd 服务程序的功能是允许用户访问网站内容,因此 SELinux 肯定会默认放行用户对网站的请求操作。但是,我们将网站数据的默认保存目录修改为 /home/wwwroot,这就产生问题了。 /home 目录是用来存放普通用户的家目录数据的,而现在,httpd 提供的网站服务却要去获取普通用户家目录中的数据,这显然违反了 SELinux 的监管原则。
现在,把 SELinux 服务恢复到强制启用安全策略模式,然后分别查看原始网站数据的保存目录与当前网站数据的保存目录是否拥有不同的 SELinux 安全上下文值。
在 ls 命令中, -Z 参数用于查看文件的安全上下文值, -d 参数代表对象是个文件夹。

在文件上设置的 SELinux 安全上下文是由用户段、角色段以及类型段等多个信息项共同组成的。其中,用户段 system _ u 代表系统进程的身份,角色段 object _ r 代表文件目录的角色,类型段 httpd _ sys _ content _ t 代表网站服务的系统文件。
针对当前这种情况,我们只需要使用 semanage 命令,将当前网站目录 /home/wwwroot 的
SELinux 安全上下文修改为跟原始网站目录的一样就行了。
semanage命令
semanage 命令用于管理 SELinux 的策略,英文全称为“ SELinux manage”,语法格式为 “ semanage [ 参数 ] [ 文件 ] ”。
SELinux 服务极大地提升了 Linux 系统的安全性,将用户权限牢牢地锁在笼子里。semanage 命令不仅能够像传统的 chcon 命令那样设置文件、目录的策略,还能够管理网络端口、消息接口(这些新特性将在本章后文中涵盖)。
semanage 命令中的常用参数以及作:


例如,向新的网站数据目录中新添加一条 SELinux 安全上下文,让这个目录以及里面的所有文件能够被 httpd 服务程序访问到:

在执行上述设置之后,还无法立即访问网站,还需要使用 restorecon 命令将设置好的 SELinux 安全上下文立即生效。在使用 restorecon 命令时,可以加上 -Rv 参数对指定的目录进行递归操作,以及显示 SELinux 安全上下文的修改过程。最后,再次刷新页面,就可以正常看到网页内容了


4.个人用户主页功能
如果想在系统中为每位用户建立一个独立的网站,通常的方法是基于虚拟网站主机功能来部署多个网站。但这个工作会让管理员苦不堪言(尤其是用户数量很庞大时),而且在用户自行管理网站时,还会碰到各种权限限制,需要为此做很多额外的工作。其实,httpd 服务程序提供的个人用户主页功能完全可以胜任这个工作。该功能可以让系统内所有的用户在自己的家目录中管理个人的网站,而且访问起来也非常容易。
第1步: 在 httpd 服务程序中,默认没有开启个人用户主页功能。为此,我们需要编辑下面的配置文件,然后在第 17 行的 UserDir disabled 参数前面加上井号(#),表示让 httpd 服务程序开启个人用户主页功能;同时再把第 24 行的 UserDir public_html 参数前面的井号(#)去掉(UserDir 参数表示网站数据在用户家目录中的保存目录名称,即 public_html 目录)。最后,在修改完毕后记得保存:/etc/httpd/conf.d/userdir.conf

第2步:在用户家目录中建立用于保存网站数据的目录及首页面文件。另外,还需要把家目录的权限修改为 755,保证其他人也有权限读取里面的内容。

第3步: 重新启动 httpd 服务程序,在浏览器的地址栏中输入网址,其格式为“网址 /~用户名”(其中的波浪号是必需的,而且网址、波浪号、用户名之间没有空格)。从理论上来讲,现在就可以看到用户的个人网站了。出乎意料的是,系统显示报错页面


第4步:httpd 服务程序在提供个人用户主页功能时,该用户的网站数据目录本身就应该是存放到与这位用户对应的家目录中的,所以应该不需要修改家目录的 SELinux 安全上下文。但是,前文还讲到了 SELinux 域的概念。SELinux 域确保服务程序不能执行违规的操作,只能本本分分地为用户提供服务。
接下来使用 getsebool 命令查询并过滤出所有与 HTTP 协议相关的安全策略。其中,off 为禁止状态, on 为允许状态。

想要开启 httpd 服务的个人用户主页功能,那么用到的 SELinux 域安全策略应该是 httpd _ enable _ homedirs 吧?大致确定后就可以用setsebool 命令来修改 SELinux 策略中各条规则的布尔值了。大家一定要记得在 setsebool 命令后面加上 -P 参数,让修改后的 SELinux 策略规则永久生效且立即生效。随后刷新网页


有时,网站的拥有者并不希望直接将网页内容显示出来,而只想让通过身份验证的用户看到里面的内容,这时就可以在网站中添加密码功能了。
第一步:先使用 htpasswd 命令生成密码数据库。-c 参数表示第一次生成;后面再分别添加密码数据库的存放文件,以及验证要用到的用户名称(该用户不必是系统中已有的本地账户)。

第二步: 继续编辑个人用户主页功能的配置文件。把第 31 ~ 37 行的参数信息修改成下列内容,其中以井号(#)开头的内容为添加的注释信息,可将其忽略。随后保存并退出配置文件,重启 httpd 服务程序即可生效。


此后,当用户再想访问某个用户的个人网站时,就必须输入账户和密码才能正常访问了。另外,验证时使用的账户和密码是用 htpasswd 命令生成的专门用于网站登录的账户和密码,而不是系统中的账户和密码


5.虚拟主机功能
在虚拟专用服务器( Virtual Private Server , VPS )与云计算技术诞生以前, IDC 服务供应商为了能够更充分地利用服务器资源,同时也为了降低购买门槛,纷纷启用了虚拟主机功能。
利用虚拟主机功能,可以把一台处于运行状态的物理服务器分割成多个“虚拟的服务器”。但是,该技术无法实现目前云主机技术的硬件资源隔离,而只能让这些虚拟的服务器共同使用物理服务器的硬件资源,供应商只能限制硬盘的使用空间大小。
Apache 的虚拟主机功能是服务器基于用户请求的不同 IP 地址、主机域名或端口号,提供多个网站同时为外部提供访问服务的技术。 用户请求的资源不同,最终获取到的网页内容也各不相同

1.基于IP地址
如果一台服务器有多个 IP 地址,而且每个 IP 地址与服务器上部署的每个网站一一对应,这样当用户请求访问不同的 IP 地址时,会访问到不同网站的页面资源。而且,每个网站都有一个独立的 IP 地址,这对搜索引擎优化也大有裨益。
需要配置的 IP 地址, 在配置完毕并重启网络服务之后,记得检查网络的连通性,确保 3 个 IP 地址均可正常访问



第一步:分别在/home/wwwroot 中创建用于保存不同网站数据的 3 个目录,并向其中分别写入网站的首页文件。每个首页文件中应有明确区分不同网站内容的信息,方便稍后能更直观地检查效果。

第二步:从 httpd 服务的配置文件中大约第 132 行处开始,分别追加写入 3 个基于 IP 地址的虚拟主机网站参数,然后保存并退出。需要重启 httpd 服务


第三步:由于当前的/home/wwwroot 目录及里面的网站数据目录的 SELinux 安全上下文与网站服务不吻合,因此 httpd 服务程序无法获取到这些网站数据目录。我们需要手动把新的网站数据目录的 SELinux 安全上下文设置正确(见前文的实验),并使用 restorecon 命令让新设置的 SELinux 安全上下文立即生效,这样就可以立即看到网站的访问效果了


2.基于主机域名
当服务器无法为每个网站都分配一个独立 IP 地址的时候,可以尝试让 Apache 自动识别用户请求的域名,从而根据不同的域名请求来传输不同的内容。在这种情况下的配置更加简单,只需要保证位于生产环境中的服务器上有一个可用的 IP 地址(这里以 192.168.10.10 为例)就可以了。 需要手动定义 IP 地址与域名之间的对应关系。 /etc/hosts 是 Linux 系统中用于强制把某个主机域名解析到指定 IP 地址的配置文件。简单来说,只要这个文件配置正确,即使网络参数中没有 DNS 信息也依然能够将域名解析为某个 IP 地址。
第1步:手动定义 IP 地址与域名之间对应关系的配置文件,保存并退出后会立即生效。可以通过分别 ping 这些域名来验证域名是否已经成功解析为 IP 地址。



第2步:分别在/home/wwwroot 中创建用于保存不同网站数据的 3 个目录,并向其中分别写入网站的首页文件。每个首页文件中应有明确区分不同网站内容的信息,方便稍后能更直观地检查效果。

第3步:从 httpd 服务的配置文件中大约第 132 行处开始,分别追加写入 3 个基于主机名的虚拟主机网站参数,然后保存并退出。记得需要重启 httpd 服务,这些配置才生效。


第4步:因为当前的网站数据目录还是在/home/wwwroot 目录中,因此还是必须要正确设置网站数据目录文件的 SELinux 安全上下文,使其与网站服务功能相吻合。最后记得用restorecon 命令让新配置的 SELinux 安全上下文立即生效,这样就可以立即访问到虚拟主机网站了


3.基于端口号
基于端口号的虚拟主机功能可以让用户通过指定的端口号来访问服务器上的网站资源。在使用 Apache 配置虚拟网站主机功能时,基于端口号的配置方式是最复杂的。因此我们不仅要考虑 httpd 服务程序的配置因素,还需要考虑到 SELinux 服务对新开设端口的监控。一般来说,使用 80 、 443 、 8080 等端口号来提供网站访问服务是比较合理的,如果使用其他端口号则会受到 SELinux 服务的限制。
第一步:分别在/home/wwwroot 中创建用于保存不同网站数据的 3 个目录,并向其中分别写入网站的首页文件。每个首页文件中应有明确区分不同网站内容的信息,方便稍后能更直观地检查效果。

第二步:在 httpd 服务配置文件的第 46 行~48 行分别添加用于监听 6111、6222 和 6333端口的参数。

第三步:从 httpd 服务的配置文件中大约第 134 行处开始,分别追加写入 3 个基于端口号的虚拟主机网站参数,然后保存并退出。记得需要重启 httpd 服务,这些配置才生效。

第四步:因为我们把网站数据目录存放在/home/wwwroot 目录中,因此还是必须要正确设置网站数据目录文件的 SELinux 安全上下文,使其与网站服务功能相吻合。最后记得用restorecon 命令让新配置的 SELinux 安全上下文立即生效。

第五步:因为 SELinux 服务检测到 6111、6222 和 6333 端口原本不属于 Apache 服务应该需要的资源,但现在却以 httpd 服务程序的名义监听使用了,所以 SELinux 会拒绝使用Apache 服务使用这 3 个端口。可以使用 semanage 命令查询并过滤出所有与 HTTP 协议相关且SELinux 服务允许的端口列表。

SELinux 允许的与 HTTP 协议相关的端口号中默认没有包含 6111 、 6222 和 6333,因此需要将这 3 个端口号手动添加进去。该操作会立即生效,而且在系统重启过后依然有效。设置好后再重启 httpd 服务程序,然后就可以看到网页内容了


6.Apache的访问控制
Apache 可以基于源主机名、源 IP 地址或源主机上的浏览器特征等信息对网站上的资源进行访问控制。它通过 Allow 指令允许某个主机访问服务器上的网站资源,通过 Deny 指令实现禁止访问。在允许或禁止访问网站资源时,还会用到 Order 指令,这个指令用来定义 Allow或 Deny 指令起作用的顺序,其匹配原则是按照顺序进行匹配,若匹配成功则执行后面的默认指令。比如“ Order Allow, Deny”表示先将源主机与允许规则进行匹配,若匹配成功则允许访问请求,反之则拒绝访问请求。
第一步:先在服务器上的网站数据目录中新建一个子目录,并在这个子目录中创建一个包含 Successful 单词的首页文件。

第二步:打开 httpd 服务的配置文件,在第 161 行后面添加下述规则来限制源主机的访问。这段规则的含义是允许使用 Firefox 浏览器的主机访问服务器上的首页文件,除此之外的所有请求都将被拒绝。使用 Firefox 浏览器的访问效果



除了匹配源主机的浏览器特征之外,还可以通过匹配源主机的 IP 地址进行访问控制。例如,我们只允许 IP 地址为 192.168.10.20 的主机访问网站资源,那么就可以在 httpd 服务配置文件的第 161 行后面添加下述规则。这样在重启 httpd 服务程序后再用本机(即服务器,其 IP 地址为 192.168.10.10 )来访问网站的首页面时就会提示访问被拒绝了

十、使用vsftpd服务传输文件
文件传输协议( File Transfer Protocol , FTP ),以及如何部署 vsftpd 服务程序,然后深度剖析了 vsftpd 主配置文件中最常用的参数及其作用,并完整演示了 vsftpd 服务程序 3 种认证模式(匿名开放模式、本地用户模式、虚拟用户模式)的配置方法。本章还涵盖了可插拔认证模块 Pluggable Authentication Module , PAM )的原理、作用以及实用的配置方法。
1.文件传输协议
文件传输是一种非常重要的获取资料的方式。 为了能够在如此复杂多样的设备之间解决文件传输的问题,文件传输协议( FTP )应运而生。
FTP 是一种在互联网中进行文件传输的协议,基于客户端 / 服务器模式,默认使用 20 、 21 号端 口,其中端口 20 用于进行数据传输,端口 21 用于接受客户端发出的相关 FTP 命令与参数。 FTP 服 务器普遍部署于内网中,具有容易搭建、方便管理的特点。而且有些 FTP 客户端工具还可以支持
件的多点下载以及断点续传技术,因此得到了广大用户的青睐

FTP 服务器是按照 FTP 协议在互联网上提供文件存储和访问服务的主机, FTP 客户端则是向服务器发送连接请求,以建立数据传输链路的主机。
主动模式: FTP 服务器主动向客户端发起连接请求。
被动模式: FTP 服务器等待客户端发起连接请求(默认工作模式)。
防火墙一般是用于过滤从外网进入内网的流量,因此有些时候需要将 FTP 的工作模式设置为主动模式,才可以传输数据。
由于 FTP 、 HTTP 、 Telnet 等协议的数据都是使用明文进行传输的,因此从设计上就是不可靠的。人们为了满足以密文方式传输文件的需求,发明了 vsftpd 服务程序。 vsftpd (very secureftp daemon ,非常安全的 FTP 守护进程)是一款运行在 Linux 操作系统上的 FTP 服务程序,不仅完全开源而且免费。此外,它还具有很高的安全性、传输速度,以及支持虚拟用户验证等其他 FTP 服务程序不具备的特点。在不影响使用的前提下,管理者可以自行决定客户端是采用匿名开放、本地用户还是虚拟用户的验证方式来登录 vsftpd 服务器。这样即便黑客拿到了虚拟用户的账号密码,也不见得能成功登录 vsftpd 服务器。
在配置妥当软件仓库之后,就可以安装 vsftpd 服务程序了。无论是使用 yum 还是 dnf 命令都可以安装

tables 防火墙管理工具默认禁止了 FTP 协议的端口号,因此在正式配置 vsftpd 服务程序之前,为了避免这些默认的防火墙策略“捣乱”,还需要清空 iptables 防火墙的默认策略,并把当前已经被清理的防火墙策略状态保存下来:

然后再把 FTP 协议添加到 firewalld 服务的允许列表中(前期准备工作一定要做充足):

vsftpd 服务程序的主配置文件( /etc/vsftpd/vsftpd.conf )内容总长度有 127 行之多,但其 中大多数参数在开头都添加了井号( #),从而成为注释信息,大家没有必要在注释信息上花费太多的时间。我们可以在 grep 命令后面添加 -v 参数,过滤并反选出没有包含井号(#)的参数行(即过滤掉所有的注释信息),然后将过滤后的参数行通过输出重定向符写回原始的主配置文件中。



vsftpd 服务程序主配置文件中常用的参数以及作用



2.vsftpd服务程序
vsftpd 作为更加安全的文件传输协议服务程序,允许用户以 3 种认证模式登录 FTP 服务器。
匿名开放模式:是最不安全的一种认证模式,任何人都可以无须密码验证而直接登录到 FTP 服务器。
本地用户模式:是通过 Linux 系统本地的账户密码信息进行认证的模式,相较于匿名开放模式更安全,而且配置起来也很简单。但是如果黑客破解了账户的信息,就可以畅通无阻地登录 FTP 服务器,从而完全控制整台服务器。
虚拟用户模式:更安全的一种认证模式,它需要为 FTP 服务单独建立用户数据库文件,虚拟出用来进行密码验证的账户信息,而这些账户信息在服务器系统中实际上是不存在的,仅供 FTP 服务程序进行认证使用。这样,即使黑客破解了账户信息也无法登录服务器,从而有效降低了破坏范围和影响。
ftp 是 Linux 系统中以命令行界面的方式来管理 FTP 传输服务的客户端工具。我们首先手动安装这个 ftp 客户端工具,以便在后续实验中查看结果。

1.匿名访问模式
在 vsftpd 服务程序中,匿名开放模式是最不安全的一种认证模式。任何人都可以无须密码验证而直接登录 FTP 服务器。这种模式一般用来访问不重要的公开文件(在生产环境中尽量不要存放重要文件)。
vsftpd 服务程序默认关闭了匿名开放模式,我 们需要做的就是开放匿名用户的上传、下载文件的权限,以及让匿名用户创建、删除、更名文件的权限。需要注意的是,针对匿名用户放开这些权限会带来潜在危险,我们只是为了在 Linux 系统中练习配置 vsftpd 服务程序而放开了这些权限,不建议在生产环境中如此行事。
向匿名用户开放的权限参数以及作用


在 vsftpd 服务程序的主配置文件中正确填写参数,然后保存并退出。还需要重启 vsftpd服务程序,让新的配置参数生效

现在就可以在客户端执行 ftp 命令连接到远程的 FTP 服务器了。在 vsftpd 服务程序的匿名开放认证模式下,其账户统一为 anonymous ,密码为空。而且在连接 FTP 服务器后,默认访问的是 /var/ftp 目录。可以切换到该目录下的 pub 目录中,然后尝试创建一个新的目录文件,以检验是否拥有写入权限:

在 vsftpd 服务程序的匿名开放认证模式下,默认访问的是 /var/ftp 目录。查看该目录的权限得知,只有 root 管理员才有写入权限。怪不得系统会拒绝操作呢!下面将目录的所有者身份改成系统账户 ftp 即可

尽管在使用 ftp 命令登入 FTP 服务器后,在创建目录时系统依然提示操作失败,但是报错信息却发生了变化。在没有写入权限时,系统提示“权限拒绝”(Permissiondenied ),所以怀疑是权限的问题。但现在系统提示“创建目录的操作失败”(Createdirectory operation failed ),想必各位读者也应该意识到是 SELinux 服务在“捣乱”了吧。
下面使用 getsebool 命令查看与 FTP 相关的 SELinux 域策略都有哪些:

我们可以根据经验(需要长期培养,别无它法)和策略的名称判断出是 ftpd _ full _access--> off 策略规则导致了操作失败。接下来修改该策略规则,并且在设置时使用 -P 参数让修改过的策略永久生效,确保在服务器重启后依然能够顺利写入文件。
等 SELinux 域策略修改完毕后,就能够顺利执行文件的创建、修改及删除等操作了:

在上面的操作中,由于权限不足,所以我们将 /var/ftp/pub 目录的所有者设置成 ftp 用户本身。除了这种方法,也可以通过设置权限的方法让其他用户获取到写入权限(例如 777 这样的权限)。但是,由于 vsftpd 服务自身带有安全保护机制,因此不要直接修改 /var/ftp 的权限,这有可能导致服务被“安全锁定”而不能登录。
2.本地用户模式
相较于匿名开放模式,本地用户模式要更安全,而且配置起来也很简单。如果大家之前用的是匿名开放模式,现在就可以将它关了,然后开启本地用户模式。
本地用户模式使用的权限参数以及作用


默认情况下本地用户所需的参数都已经存在,不需要修改 unmask 一般被称为“权限掩码”或“权限补码”,能够直接影响到新建文件的权限值。例如在 Linux 系统中,新建的普通文件的权限是 644,新建的目录的权限是 755。
其实,普通文件的默认权限是 666 ,目录的默认权限是 777,这都是写在系统配置文件中的。但默认值不等于最终权限值。 umask 参数的默认值是 022 ,根据公式“默认权限−umask=实际权限”,所以普通文件的默认权限到手后就剩下 644 ,而目录文件就剩下 755 了。
来配置本地用户的参数:

需要重启 vsftpd 服务程序,让新的配置参数生效。在执行完上一个实验并还原虚拟机之后,还需要将配置好 的服务添加到开机启动项中,以便在系统重启自后依然可以正常使用 vsftpd 服务。

在使用 root 管理员的身份登录后,系统提示如下的错误信息:

,在我们输入 root 管理员的密码之前,就已经被系统拒绝访问了。这是因为 vsftpd服务程序所在的目录中默认存放着两个名为“用户名单”的文件( ftpusers 和 user _list)。 vsftpd 服务程序目录中的这两个文件只要里面写有某位用户的名字,就不再允许这位用户登录到 FTP 服务器上。

vsftpd 服务程序为了保证服务器的安全性而默认禁止了 root 管理员和大多数系统用户的登录行为,这样可以有效地避免黑客通过 FTP 服务对 root 管理员密码进行暴力破解。如果您确认在生产环境中使用 root 管理员不会对系统安全产生影响,只需按照上面的提示删除掉 root 用户名即可。也可以选择 ftpusers 和 user _ list 文件中不存在的一个普通用户尝试登录 FTP 服务器:

在采用本地用户模式登录 FTP 服务器后,默认访问的是该用户的家目录,而且该目录的默认所有者、所属组都是该用户自己,因此不存在写入权限不足的情况。但是当前的操作仍然被拒绝,这是0因为我们刚才将虚拟机系统还原到最初的状态了。为此,需要再次开启 SELinux 域中对 FTP 服务的允许策略:
在配置妥当后再使用本地用户尝试登录 FTP 服务器,分别执行文件的创建、重命名及删除等命令。操作均成功!

3.虚拟用户模式
专门创建出一个账 号来登录 FTP 传输服务的,而且这个账号不能用于以 SSH 方式登录服务器。当然,因为它的安全性较之于前面两种模式有了提升,所以配置流程也会稍微复杂一些。
第一步:重新安装 vsftpd 服务。创建用于进行 FTP 认证的用户数据库文件,其中奇数行为账户名,偶数行为密码。例如,分别创建 zhangsan 和 lisi 两个用户,密码均为 redhat:


由于明文信息既不安全,也不符合让 vsftpd 服务程序直接加载的格式,因此需要使用db _ load 命令用哈希( hash)算法将原始的明文信息文件转换成数据库文件,并且降低数据库文件的权限(避免其他人看到数据库文件的内容),然后再把原始的明文信息文件删除。

第二步:创建 vsftpd 服务程序用于存储文件的根目录以及用于虚拟用户映射的系统本地用户。vsftpd 服务用于存储文件的根目录指的是,当虚拟用户登录后所访问的默认位置。
由于 Linux 系统中的每一个文件都有所有者、所属组属性,例如使用虚拟账户“张三” 新建了一个文件,但是系统中找不到账户“张三”,就会导致这个文件的权限出现错误。为此,需要再创建一个可以映射到虚拟用户的 系统本地用户。简单来说,就是让虚拟用户默认登录到与之有映射关系的这个系统本地用户的家目录中。虚拟用户创建的文件的属性也都归属于这个系统本地用户,从而避免 Linux 系统无法处理虚拟用户所创建文件的属性权限。
为了方便管理 FTP 服务器上的数据,可以把这个系统本地用户的家目录设置为/var 目录(该目录用来存放经常发生改变的数据)。并且为了安全起见,将这个系统本地用户设置为不允许登录 FTP 服务器,这不会影响虚拟用户登录,而且还能够避免黑客通过这个系统本地用户进行登录。


第三步: 建立用于支持虚拟用户的 PAM 文件。
PAM (可插拔认证模块)是一种认证机制,通过一些动态链接库和统一的 API 把系统提供的服务与认证方式分开,使得系统管理员可以根据需求灵活调整服务程序的不同认证方式。
通俗来讲,PAM 是一组安全机制的模块,系统管理员可以用来轻易地调整服务程序的认 证方式,而不必对应用程序进行任何修改。 PAM 采取了分层设计(应用程序层、应用接口层、 鉴别模块层)的思想

新建一个用于虚拟用户认证的 PAM 文件 vsftpd.vu ,其中 PAM 文件内的“ db=”参数为使用db _ load 命令生成的账户密码数据库文件的路径,但不用写数据库文件的后缀:


第四步:在 vsftpd 服务程序的主配置文件中通过 pam_service_name 参数将 PAM 认证文件的名称修改为 vsftpd.vu。PAM 作为应用程序层与鉴别模块层的连接纽带,可以让应用程序根据需求灵活地在自身插入所需的鉴别功能模块。当应用程序需要 PAM 认证时,则需要在应用程序中定义负责认证的 PAM 配置文件,实现所需的认证功能。
在 vsftpd 服务程序的主配置文件中默认就带有参数 pam _ service _ name=vsftpd,表示登录 FTP 服务器时是根据/etc/pam.d/vsftpd 文件进行安全认证的。现在我们要做的就是把vsftpd 主配置文件中原有的 PAM 认证文件 vsftpd 修改为新建的 vsftpd.vu 文件即可。
利用 PAM 文件进行认证时使用的参数以及作用


第五步:为虚拟用户设置不同的权限。虽然账户 zhangsan 和 lisi 都是用于 vsftpd 服务程序认证的虚拟账户,但是我们依然想对这两人进行区别对待。比如,允许张三上传、创建、修改、查看、删除文件,只允许李四查看文件。这可以通过 vsftpd 服务程序来实现。只需新建一个目录,在里面分别创建两个以 zhangsan 和 lisi 命名的文件,其中在名为 zhangsan 的文件中写入允许的相关权限(使用匿名用户的参数):



然后再次修改 vsftpd 主配置文件,通过添加 user _ config _ dir 参数来定义这两个虚拟用户不同权限的配置文件所存放的路径。为了让修改后的参数立即生效,需要重启 vsftpd 服务程序并将该服务添加到开机启动项中:


第六步:设置 SELinux 域允许策略,然后使用虚拟用户模式登录 FTP 服务器。先按照前面实验中的步骤开启 SELinux 域的允许策略,以免再次出现操作失败的情况:

可以使用虚拟用户模式成功登录到 FTP 服务器,还可以分别使用账户 zhangsan和 lisi 来检验他们的权限。李四只能登录,没有其他权限:

张三不仅可以登录,还可以创建、改名和删除文件,因此张三的权限是满的。当然,大家在生产环境中一定要根据真实需求来灵活配置参数,不要照搬这里的实验操作。

使用不同方式登录后的所在的位置:

3.TFTP(简单文件传输协议)
简单文件传输协议( Trivial File Transfer Protocol , TFTP )是一种基于 UDP 协议在客户端和服务器之间进行简单文件传输的协议。顾名思义,它提供不复杂、开销不大的文件传输服务,可将其当作 FTP 协议的简化版本。
TFTP 的命令功能不如 FTP 服务强大,甚至不能遍历目录,在安全性方面也弱于 FTP 服务。而且,由于 TFTP 在传输文件时采用的是 UDP 协议,占用的端口号为 69,因此文件的传输过程也不像 FTP 协议那样可靠。但是,因为 TFTP 不需要客户端的权限认证,也就减少了无谓的系统和网络带宽消耗,因此在传输琐碎( trivial )不大的文件时,效率更高。
接下来在系统上安装相关的软件包,进行体验。其中, tftp-server 是服务程序, tftp 是用于连接测试的客户端工具, xinetd 是管理服务

在 Linux 系统中, TFTP 服务是使用 xinetd 服务程序来管理的。xinetd 服务可以用来管理多种轻量级的网络服务,而且具有强大的日志功能。它专门用于控制那些比较小的应用程序的开启与关闭,有点类似于带有独立开关的插线板(见图 11-3),想开启那个服务,就编辑对应的 xinetd 配置文件的开关参数。
简单来说,在安装 TFTP 软件包后,还需要在 xinetd 服务程序中将其开启。在 RHEL 8 系统中, tftp 所对应的配置文件默认不存在,需要用户根据示例文件( /usr/share/doc/xinetd/sample.conf)自行创建。可以直接将下面的内容复制到文件中,就可以使用了:

重启 xinetd 服务并将它添加到系统的开机启动项中,以确保 TFTP 服务在系统重启后依然处于运行状态。考虑到有些系统的防火墙默认没有允许 UDP 协议的 69 端口,因此需要手动将该端口号加入到防火墙的允许策略中:

TFTP 的根目录为 /var/lib/tftpboot 。可以使用刚才安装好的 tftp 命令尝试访问其中的文件,亲身体验 TFTP 服务的文件传输过程。
tftp 命令中可用的参数以及作用


十一、使用Samba或NFS实现文件共享
介绍 SMB 协议与 Samba 服务程序的起源和发展过程,然后通过实验的方式部署文件共享服务来深入了解 Samba 服务中相关参数的作用,并在实验最后分别使用 Windows 系统和Linux 系统访问共享的文件资源
配置网络文件系统( Network File System , NFS )服务来简化 Linux 系统之间的文件共享工作,以及通过部署 NFS 服务在多台 Linux 系统之间挂载并使用资源。在管理设备挂载信息时,使用 autofs 服务不仅可以正常满足设备挂载的使用需求,还能进一步提高服务器硬件资源和网络带宽的利用率。
1.Samba文件共享服务
1987 年,微软公司和英特尔公司共同制定了 SMB (Server Messages Block,服务器消息块)协议,旨在解决局域网内的文件或打印机等资源的共享问题,这也使得在多个主机之间共享文件变得越来越简单。到了 1991 年,当时还在读大学的 Tridgwell 为了解决 Linux 系统与 Windows 系统之间的文件共享问题,基于 SMB 协议开发出了 SMBServer 服务程序。这是一款开源的文件共享软件,经过简单配置就能够实现 Linux 系统与 Windows 系统之间的文件共享工作。当时, Tridgwell 想把这款软件的名字 SMBServer 注册成为商标,但却被商标局以“ SMB 是没有意义的字符”为由而拒绝了申请。后来 Tridgwell 不断翻看词典,突然看到一个拉丁舞蹈的名字 — Samba ,而且这个热情洋溢的舞蹈名字中又恰好包含了“ SMB”,于是Samba 服务程序的名字由此诞生。Samba 服务程序现在已经成为在 Linux 系统与Windows 系统之间共享文件的最佳选择。

Samba 服务程序的配置方法与之前讲解的很多服务的配置方法类似,首先需要先通过软件仓库来安装 Samba 服务程序( Samba 服务程序的名字也恰巧是软件包的名字)。顺带再安装一个 samba-client 软件包,这是一会儿用于测试共享目录的客户端程序:

安装完毕后打开 Samba 服务程序的主配置文件,只有 37 行。其中第 17~ 22 行代表共享每位登录用户的家目录内容。虽然在某些情况下这可以更方便地共享文件,但这个默认操作着实有些危险,建议不要共享,将其删除掉。第 24 ~ 29 行是用 SMB 协议共享本地的打印机设备,方便局域网内的用户远程使用打印机设备。当前我们没有打印机设备,因此建议也将其删除掉,不共享。最后的第 31 ~ 37 行依然为共享打印机设备的参数,同样建议予以删除。

。所剩不多的参数中,还能继续删除不需要的参数。例如,第 5 ~ 8 行参数中所提到的 cups的全称为 Common UNIX Printing System (通用 UNIX 打印系统),依然是用于打印机或打印服务器的,继续予以删除。
Samba 服务程序中的参数以及作用


security 参数代表用户登录 Samba 服务时采用的验证方式。总共有 4种可用参数。
share :代表主机无须验证密码。这相当于 vsftpd 服务的匿名公开访问模式,比较方便,但安全性很差。
user :代表登录 Samba 服务时需要使用账号密码进行验证,通过后才能获取到文件。这是默认的验证方式,最为常用。
domain :代表通过域控制器进行身份验证,用来限制用户的来源域。
server:代表使用独立主机验证来访用户提供的密码。这相当于集中管理账号,并不常用。
1.配置共享资源
Samba 服务程序的主配置文件与Apache 服务很相似,包括全局配置参数和区域配置参数。全局配置参数用于设置整体的资源共享环境,对里面的每一个独立的共享资源都有效。区域配置参数则用于设置单独的共享资源,且仅对该资源有效。
用于设置 Samba 服务程序的参数以及作用 :

第一步:创建用于访问共享资源的账户信息。在 RHEL 8 系统中,Samba 服务程序默认使用的是用户密码认证模式(user)。这种认证模式可以确保仅让有密码且受信任的用户访问共享资源,而且认证过程也十分简单。不过,只有建立账户信息数据库之后,才能使用用户密码认证模式。另外,Samba 服务程序的数据库要求账户必须在当前系统中已经存在,否则日后创建文件时将导致文件的权限属性混乱不堪,由此引发错误。
pdbedit 命令用于管理 Samba 服务程序的账户信息数据库,格式为“ pdbedit [ 选项] 账户”。在第一次把账户信息写入到数据库时需要使用 -a 参数,以后在执行修改密码、删除账户等操作时就不再需要该参数了。
pdbedit 命令中使用的参数以及作用


第二步:创建用于共享资源的文件目录。在创建时,不仅要考虑到文件读写权限的问题,而且由于/home 目录是系统中普通用户的家目录,因此还需要考虑应用于该目录的 SELinux 安全上下文所带来的限制。在 Samba 的帮助手册中显示,正确的文件上下文值应该是 samba_share_t,所以只需要修改完毕后执行restorecon 命令,就能让应用于目录的新SELinux 安全上下文立即生效。

第三步:设置 SELinux 服务与策略,使其允许通过 Samba 服务程序访问普通用户家目录。执行 getsebool 命令,筛选出所有与 Samba 服务程序相关的 SELinux 域策略,根据策略的名称(和经验)选择出正确的策略条目进行开启即可:

第四步: 在 Samba 服务程序的主配置文件中,根据 所提到的格式写入共享信息。

第五步:Samba 服务程序的配置工作基本完毕。Samba 服务程序在 Linux 系统中的名字为smb,所以重启 smb 服务并加入到启动项中,保证在重启服务器后依然能够为用户持续提供服务。

为了避免防火墙限制用户访问,这里将 iptables 防火墙清空,再把 Samba 服务添加到firewalld 防火墙中,确保万无一失。



第六步:可以使用“systemctl status smb”命令查看服务器是否启动了 Samba 服务。如果想进一步查看 Samba 服务都共享了哪些目录,则可以使用 smbclient 命令来查看共享详情;-U参数指定了用户名称(用哪位用户挂载了 Samba 服务,就用哪位用户的身份进行查看);-L参数列出了共享清单。

2.Windows挂载共享
无论 Samba 共享服务是部署 Windows 系统上还是部署在 Linux 系统上,通过 Windows系统进行访问时,其步骤和方法都是一样的。下面假设 Samba 共享服务部署在 Linux 系统上,并通过 Windows 系统来访问 Samba 服务。
要在 Windows 系统中访问共享资源,只需要单击 Windows 系统的“开始”按钮后输入两个反斜杠,然后再添加服务器的 IP 地址即可
需要在虚拟机上设置NAT模式


现在应该就能看到 Samba 共享服务的登录界面了。刘遄老师在这里先使用 linuxprobe 账户的系统本地密码尝试登录,结果出现了 报错信息。由此可以验证,在 RHEL8 系统中, Samba 服务程序使用的是独立的账户信息数据库。所以,即便在 Linux 系统中有一个 linuxprobe 账户, Samba 服务程序使用的账户信息数据库中也有一个同名的 linuxprobe 账户,大家一定要弄清楚它们各自所对应的密码,它们仅仅是名称相同而已。
在正确输入 Samba 服务数据库中的 linuxprobe 账户名以及使用 pdbedit 命令设置的密码后,就可以登录到 Samba 服务程序的共享界面中了,如图 12-4 所示。此时,可以尝试执行查看、写入、更名、删除文件等操作。

3.Linux挂载共享
Samba 服务程序还可以实现 Linux 系统之间的文件共享。
在客户端安装支持文件共享服务的软件包( cifs-utils )。

安装好软件包后,在 Linux 客户端创建一个用于挂载 Samba 服务共享资源的目录。这个目录可以与服务器上的共享名称同名,以便于日后查找。 mount 命令中的 -t 参数用于指定协议类型, -o 参数用于指定用户名和密码,最后追加上服务器 IP 地址、共享名称和本地挂载目录即可。服务器 IP 地址后面的共享名称指的是配置文件中 [database]的值,而不是服务器本地挂载的目录名称。虽然这两个值可能一样,但大家应该认出它们的区别。


如果在每次重启电脑后都需要使用 mount 命令手动挂载远程共享目录,是不是觉得很麻烦呢?其实可以按照 Samba 服务的用户名、密码、共享域的顺序将相关信息写入一个认证文件中,然后让 /etc/fstab 文件和系统自动加载它。为了保证不被其他人随意看到,最后把这个认证文件的权限修改为仅 root 管理员才能够读写:


将挂载信息写入 /etc/fstab 文件中,以确保共享挂载信息在服务器重启后依然生效:

Linux 客户端成功地挂载了 Samba 服务的共享资源。进入到挂载目录 /database 后就可以看到 Windows 系统访问 Samba 服务程序时留下来的文件了(即文件 Memo.txt)。当然,也可以对该文件进行读写操作并保存。

2.NFS(网络文件系统)
如果大家觉得 Samba 服务程序的配置太麻烦,而且恰巧需要共享文件的主机都是 Linux系统,此时非常推荐大家在客户端部署 NFS (网络文件系统)服务来共享文件。 NFS 服务可以将远程 Linux 系统上的文件共享资源挂载到本地主机的目录上,从而使得本地主机( Linux 客户端)基于 TCP/IP 协议,像使用本地主机上的资源那样读写远程 Linux 系统上的共享文件。
由于 RHEL 8 系统中默认已经安装了 NFS 服务,外加 NFS 服务的配置步骤也很简单, 首先请使用软件仓库检查自己的 RHEL 8 系统中是否已经安装了 NFS 软件包:

第一步:为了检验 NFS 服务配置的效果,我们需要使用两台 Linux 主机(一台充当 NFS服务器,一台充当 NFS 客户端),
配置好防火墙,以免默认的防火墙策略禁止正常的 NFS 共享服务。


第二步:在 NFS 服务器上建立用于 NFS 文件共享的目录,并设置足够的权限确保其他人也有写入权限。

第三步:NFS 服务程序的配置文件为/etc/exports,默认情况下里面没有任何内容。我们可以按照“共享目录的路径 允许访问的 NFS 客户端(共享权限参数)”的格式,定义要共享的目录与相应的权限。
如果想要把 /nfsfile 目录共享给 192.168.10.0/24 网段内的所有主机,让这些主机都拥有读写权限,在将数据写入到 NFS 服务器的硬盘中后才会结束操作,最大限度保证数据不丢失,以及把来访客户端 root 管理员映射为本地的匿名用户等,则可以按照下面命令中的格式,将表 12-7 中的参数写到 NFS 服务程序的配置文件中。



第四步:启动和启用 NFS 服务程序。由于在使用 NFS 服务进行文件共享之前,需要使用 RPC(Remote Procedure Call,远程过程调用)服务将 NFS 服务器的 IP 地址和端口号等信息发送给客户端。因此,在启动 NFS 服务之前,还需要顺带重启并启用 rpcbind 服务程序,并将这两个服务一并加入开机启动项中。

使用 showmount 命令查询 NFS 服务器的远程共享信息,其输出格式为“共享的目录名称 允许使用客户端地址”。


然后在 NFS 客户端创建一个挂载目录。使用 mount 命令并结合 -t 参数,指定要挂载的文件系统的类型,并在命令后面写上服务器的 IP 地址、服务器上的共享目录以及要挂载到本地系统(即客户端)的目录。

挂载成功后就应该能够顺利地看到在执行前面的操作时写入的文件内容了。如果希望
NFS 文件共享服务能一直有效,则需要将其写入到 fstab 文件中:


3.autofs自动挂载服务
无论是 Samba 服务还是 NFS 服务,都要把挂载信息写入到/etc/fstab 中,这样远程共享资源就会自动随服务器开机而进行挂载。虽然这很方便,但是如果挂载的远程资源太多,则会给网络带宽和服务器的硬件资源带来很大负载。如果在资源挂载后长期不使用,也会造成服务器硬件资源的浪费。
autofs 自动挂载服务可以帮我们解决这一问题。与 mount 命令不同, autofs 服务程序是一种 Linux 系统守护进程,当检测到用户试图访问一个尚未挂载的文件系统时,将自动挂载该文件系统。换句话说,将挂载信息填入 /etc/fstab 文件后,系统在每次开机时都自动将其挂载,而 autofs 服务程序则是在用户需要使用该文件系统时才去动态挂载,从而节约了网络资源和服务器的硬件资源。
首先需要自行安装 autofs 服务程序:

在autofs服务程序的主配置文件中需要按照“挂载目录子配置文件”的格式进行填写。挂载目录是设备挂载位置的上一级目录。例如,光盘设备一般挂载到 /media/cdrom 目录中,那么挂载目录写成/media即可。对应的子配置文件则是对这个挂载目录内的挂载设备信息作进一步的说明。子配置文件需要用户自行定义,文件名字没有严格要求,但后缀建议以 .misc 结束。


在子配置文件中,应按照“挂载目录挂载文件类型及权限 :设备名称”的格式进行填写。例如,要把光盘设备挂载到 /media/iso 目录中,可将挂载目录写为 iso ,而 -fstype为文件系统格式参数, iso9660 为光盘设备格式, ro 、 nosuid 及 nodev 为光盘设备具体的权限参数,/dev/cdrom则是定义要挂载的设备名称。配置完成后再顺手将 autofs 服务程序启动并加入到系统启动项中:



先查看当前的光盘设备挂载情况,确认光盘设备没有被挂载上,而且 /media 目录中根本就没有 iso 子目录:



我们却可以使用 cd 命令切换到这个 iso 子目录中,而且光盘设备会被立即自动挂载上,然后也就能顺利查看光盘内的内容了。

首先把 NFS 共享目录卸载掉。在 autofs 服务程序的主配置文件中会有一个“/misc/etc/auto.misc ”参数,这个 auto.misc 相当于自动挂载的参考文件,它默认就已经存在,所以这里不需要进行任何操作:
十二、使用BIND提供域名解析服务
DNS 域名解析服务的原理以及作用,介绍了域名查询功能中正向解析与反向解析的作用,并通过实验的方式演示了如何在 DNS 主服务器上部署正、反解析工作模式,以便让大家深刻体会到 DNS 域名查询的便利以及强大。
如何部署 DNS 从服务器以及 DNS 缓存服务器来提升用户的域名查询体验,以及如何使用 chroot 牢笼机制插件来保障 bind 服务程序的可靠性,并向大家演示如何在主服务器与从服务器之间部署 TSIG 密钥加密功能,来进一步保障迭代查询中数据的安全性。最后,本章还从实战层面讲解了 DNS 分离解析技术,让来自不同国家、不同地区的用户都能获得最优的网站访问体验。
1.DNS域名解析服务
为了降低用户访问网络资源的门槛,域名系统( Domain Name System , DNS)技术应运而生。这是一项用于管理和解析域名与 IP 地址对应关系的技术。简单来说,就是能够接受用户输入的域名或 IP 地址,然后自动查找与之匹配(或者说具有映射关系)的 IP 地址或域名,即将域名解析为 IP 地址(正向解析),或将 IP 地址解析为域名(反向解析)。这样一来,只需要在浏览器中输入域名就能打开想要访问的网站了。DNS 域名解析技术的正向解析也是我们最常使用的一种工作模式。
鉴于互联网中的域名和 IP 地址对应关系数据库太过庞大, DNS 域名解析服务采用了类似目录树的层次结构来记录域名与 IP 地址之间的对应关系,从而形成了一个分布式的数据库系统,

域名后缀一般分为国际域名和国内域名。原则上来讲,域名后缀都有严格的定义,但在实际使用时可以不必严格遵守。目前最常见的域名后缀有 .com (商业组织)、 .org(非营利组织)、 .gov (政府部门)、 .net (网络服务商)、 .edu (教育机构)、 .pub (公共大众)、 .cn(中国国家顶级域名)等。
DNS 技术作为互联网基础设施中重要的一环,为了为网民提供不间断、稳定且快速的域名查询服务,保证互联网的正常运转,提供了下面 3 种类型的服务器。
主服务器:在特定区域内具有唯一性,负责维护该区域内的域名与 IP 地址之间的对应关系。
从服务器:从主服务器中获得域名与 IP 地址的对应关系并进行维护,以防主服务器宕机等情况。
缓存服务器:通过向其他域名解析服务器查询获得域名与 IP 地址的对应关系,并将经常查询的域名信息保存到服务器本地,以此来提高重复查询时的效率。
简单来说,主服务器是用于管理域名和 IP 地址对应关系的真正服务器,从服务器帮助主服务器“打下手”,分散部署在各个国家、省市或地区,以便让用户就近查询域名,从而减轻主服务器的负载压力。缓存服务器不太常用,一般部署在企业内网的网关位置,用于加速用户的域名查询请求。
DNS 域名解析服务采用分布式的数据结构来存放海量的“区域数据”信息,在执行用户发起的域名查询请求时,具有递归查询和迭代查询两种方式。所谓递归查询,是指 DNS 服务器在收到用户发起的请求时,必须向用户返回一个准确的查询结果。如果 DNS 服务器本地没有存储与之对应的信息,则该服务器需要询问其他服务器,并将返回的查询结果提交给用户。而迭代查询则是指, DNS 服务器在收到用户发起的请求时,并不直接回复查询结果,而是告诉另一台DNS 服务器的地址,用户再向这台 DNS 服务器提交请求,这样依次反复,直到返回查询结果。
当用户向就近的一台 DNS 服务器发起对某个域名的查询请求之后(这里以www.linuxprobe.com 为例)

当用户向网络指定的 DNS 服务器发起一个域名请求时,通常情况下会有本地 DNS 服务器向上级的 DNS 服务器发送迭代查询请求;如果该 DNS 服务器没有要查询的信息,则会进一步向上级 DNS 服务器发送迭代查询请求,直到获得准确的查询结果为止。其中最高级、最权威的根 DNS 服务器总共有 13 台,分布在世界各地,其管理单位、具体的地理位置,以及IP 地址

2.安装bind服务程序
BIND ( Berkeley Internet Name Domain,伯克利因特网名称域)服务是全球范围内使用最广泛、最安全可靠且高效的域名解析服务程序。 DNS 域名解析服务作为互联网基础设施服务,其责任之重可想而知,因此建议大家在生产环境中安装部署 bind 服务程序时加上 chroot(俗称牢笼机制)扩展包,以便有效地限制 bind 服务程序仅能对自身的配置文件进行操作,以确保整个服务器的安全。

bind 服务程序的配置并不简单,因为要想为用户提供健全的 DNS 查询服务,要在本地保存相关的域名数据库,而如果把所有域名和 IP 地址的对应关系都写入到某个配置文件中,估计要有上千万条的参数,这样既不利于程序的执行效率,也不方便日后的修改和维护。因此在 bind 服务程序中有下面这 3 个比较关键的文件。
主配置文件(/etc/named.conf):只有 59 行,而且在去除注释信息和空行之后,实际有效的参数仅有 30 行左右,这些参数用来定义 bind 服务程序的运行。
区域配置文件(/etc/named.rfc1912.zones):用来保存域名和 IP 地址对应关系的所在位置。类似于图书的目录,对应着每个域和相应 IP 地址所在的具体位置,当需要查看或修改时,可根据这个位置找到相关文件。
数据配置文件目录(/var/named):该目录用来保存域名和 IP 地址真实对应关系的数据配置文件。
在 Linux 系统中, bind 服务程序的名称为 named 。首先需要在 /etc 目录中找到该服务程序的主配置文件,然后把第 11 行和第 19 行的地址均修改为 any ,分别表示服务器上的所有 IP地址均可提供 DNS 域名解析服务,以及允许所有人对本服务器发送 DNS 查询请求。


ind 服务程序的区域配置文件( /etc/named.rfc1912.zones )用来保存域名和 IP地址对应关系的所在位置。在这个文件中,定义了域名与 IP 地址解析规则保存的文件位置以及服务类型等内容,而没有包含具体的域名、 IP 地址对应关系等信息。服务类型有 3 种,分别为 hint (根区域)、 master (主区域)、 slave (辅助区域),其中常用的 master 和 slave 指的就是主服务器和从服务器。将域名解析为 IP 地址的正向解析参数和将 IP 地址解析为域名的反向解析参数


下面的实验中会分别修改 bind 服务程序的主配置文件、区域配置文件与数据配置文件。如果在实验中遇到了 bind 服务程序启动失败的情况,而您认为这是由于参数写错而导致的,则可以执行 named-checkconf 命令和 named-checkzone 命令,分别检查主配置文件与数据配置文件中语法或参数的错误。
1.正向解析实验
在 DNS 域名解析服务中,正向解析是指根据域名(主机名)查找到对应的 IP 地址。也就是说,当用户输入了一个域名后, bind 服务程序会自动进行查找,并将匹配到的 IP 地址返给用户

第一步:编辑区域配置文件。该文件中默认已经有了一些无关紧要的解析参数,旨在让用户有一个参考。可以将下面的参数添加到区域配置文件的最下面。当然,也可以将该文件中的原有信息全部清空,而只保留自己的域名解析信息。


第二步:编辑数据配置文件。可以从/var/named 目录中复制一份正向解析的模板文件(named.localhost),然后把域名和 IP 地址的对应数据填写数据配置文件中并保存。在复制时记得加上-a 参数,这可以保留原始文件的所有者、所属组、权限属性等信息,以便让 bind 服务程序顺利读取文件内容。

在保存并退出后文件后记得重启 named 服务程序,让新的解析数据生效。考虑到正向解析文件中的参数较多,而且相对都比较重要,刘遄老师在每个参数后面都作了简要的说明。



第三步:检验解析结果。为了检验解析结果,一定要先把 Linux 系统网卡中的 DNS 地址参数修改成本机 IP 地址,这样就可以使用由本机提供的 DNS 查询服务了。nslookup命令用于检测能否从 DNS 服务器中查询到域名与 IP 地址的解析记录,进而更准确地检验 DNS服务器是否已经能够为用户提供服务。


2.反向解析实验
在 DNS 域名解析服务中,反向解析的作用是将用户提交的 IP 地址解析为对应的域名信息,它一般用于对某个 IP 地址上绑定的所有域名进行整体屏蔽,屏蔽由某些域名发送的垃圾邮件。它也可以针对某个 IP 地址进行反向解析,大致判断出有多少个网站运行在上面。当购买虚拟主机时,可以使用这一功能验证虚拟主机提供商是否有严重的超售问题。

第一步:编辑区域配置文件。在编辑该文件时,除了不要写错格式之外,还需要记住此处定义的数据配置文件名称,因为一会儿还需要在/var/named 目录中建立与其对应的同名文件。反向解析是把 IP 地址解析成域名格式,因此在定义 zone(区域)时应该要把 IP 地址反写,比如原来是 192.168.10.0,反写后应该就是 10.168.192,而且只需写出 IP 地址的网络位即可。


第二步:编辑数据配置文件。首先从/var/named 目录中复制一份反向解析的模板文件(named.loopback),然后把下面的参数填写到文件中。其中,IP 地址仅需要写主机位



第三步:检验解析结果。在前面的正向解析实验中,已经把系统网卡中的 DNS 地址参数修改成了本机 IP 地址,因此可以直接使用 nslookup 命令来检验解析结果,仅需输入 IP 地址即可查询到对应的域名信息。

3.部署从服务器
作为重要的互联网基础设施服务,保证 DNS 域名解析服务的正常运转至关重要,只有这样才能提供稳定、快速且不间断的域名查询服务。在 DNS 域名解析服务中,从服务器可以从主服务器上获取指定的区域数据文件,从而起到备份解析记录与负载均衡的作用。因此,通过部署从服务器不仅可以减轻主服务器的负载压力,还可以提升用户的查询效率。
主服务器:

从服务器:

第一步:在主服务器的区域配置文件中允许该从服务器的更新请求,即修改 allow-update{允许更新区域信息的主机地址;};参数,然后重启主服务器的 DNS 服务程序。


第二步: 在主服务器上配置防火墙放行规则,让 DNS 协议流量可以被顺利传递。


第三步:在从服务器上安装 bind-chroot 软件包。修改配置文件,让从服务器也能够对外提供 DNS 服务,并且测试其与主服务器的网络连通性。



第四步:在从服务器中填写主服务器的 IP 地址与要抓取的区域信息,然后重启服务。注意此时的服务类型应该是 slave(从),而不再是 master(主)。masters 参数后面应该为主服务器的 IP 地址,而且 file 参数后面定义的是同步数据配置文件后要保存到的位置,稍后可以在该目录内看到同步的文件。


第五步: 检验解析结果。当从服务器的 DNS 服务程序在重启后,一般就已经自动从主服务器上同步了数据配置文件,而且该文件默认会放置在区域配置文件中所定义的目录位置中。随后修改从服务器的网络参数,把 DNS 地址参数修改成 192.168.10.20,这样即可使用从服务器自身提供的 DNS 域名解析服务。最后就可以使用 nslookup 命令顺利看到解析结果了。


4.安全的加密传输
互联网中的绝大多数 DNS 服务器(超过 95% )都是基于 BIND 域名解析服务搭建的,而bind 服务程序为了提供安全的解析服务,已经对 TSIG (见 RFC 2845)加密机制提供了支持。TSIG 主要是利用了密码编码的方式来保护区域信息的传输( Zone Transfer ),即 TSIG 加密机制保证了 DNS 服务器之间传输域名区域信息的安全性。
第一步:在主服务器中生成密钥。dnssec-keygen 命令用于生成安全的 DNS 服务密钥,其格式为“dnssec-keygen [参数]”

使用下述命令生成一个主机名称为 master-slave 的 128 位 HMAC-MD5 算法的密钥文件。在执行该命令后默认会在当前目录中生成公钥和私钥文件,我们需要把私钥文件中 Key 参数后面的值记录下来,一会儿要将其写入传输配置文件中。


第二步:在主服务器中创建密钥验证文件。进入 bind 服务程序用于保存配置文件的目录,把刚刚生成的密钥名称、加密算法和私钥加密字符串按照下面的格式写入 tansfer.key 传输配置文件中。为了安全起见,需要将文件的所属组修改成 named,并将文件权限设置得要小一点,然后设置该文件的一个硬链接,并指向/etc 目录。


第三步:开启并加载 bind 服务的密钥验证功能。首先需要在主服务器的主配置文件中加载密钥验证文件,然后进行设置,使得只允许带有 master-slave 密钥认证的 DNS 服务器同步数据配置文件

DNS 主服务器的 TSIG 密钥加密传输功能就已经配置完成。然后清空 DNS 从服务器同步目录中所有的数据配置文件,再次重启 bind 服务程序。这时就已经不能像刚才那样自动获取到数据配置文件了。

第四步:配置从服务器,使其支持密钥验证。配置 DNS 从服务器和主服务器的方法大致相同,都需要在 bind 服务程序的配置文件目录中创建密钥认证文件,并设置相应的权限,然后设置该文件的一个硬链接,并指向/etc 目录。



第五步:开启并加载从服务器的密钥验证功能。这一步的操作步骤也同样是在主配置文件中加载密钥认证文件,然后按照指定的格式写上主服务器的 IP 地址和密钥名称。注意,密钥名称等参数位置不要太靠前,大约在第 51 行比较合适,否则 bind 服务程序会因为没有加 载完预设参数而报错:



第六步:DNS 从服务器同步域名区域数据。现在,两台服务器的 bind 服务程序都已经配置妥当,并匹配到了相同的密钥认证文件。接下来在从服务器上重启 bind 服务程序,可以发现又能顺利地同步到数据配置文件了。

第七步:再次进行解析验证。功能正常。请大家注意观察,是由 192.168.10.20 从服务器进行解析的。

5.部署缓存服务器
DNS 缓存服务器是一种不负责域名数据维护的 DNS 服务器。简单来说,缓存服务器就是把用户经常使用到的域名与 IP 地址的解析记录保存在主机本地,从而提升下次解析的效率。DNS 缓存服务器一般用于经常访问某些固定站点而且对这些网站的访问速度有较高要求的企业内网中,但实际的应用并不广泛。而且,缓存服务器是否可以成功解析还与指定的上级 DNS服务器的允许策略有关,因此当前仅需了解
第一步:配置系统的双网卡参数。前面讲到,缓存服务器一般用于企业内网,旨在降低内网用户查询 DNS 的时间消耗。因此,为了更加贴近真实的网络环境,实现外网查询功能,我们需要在缓存服务器中再添加一块网卡,并配置出两台 Linux 虚拟机系统

第二步:还需要在虚拟机软件中将新添加的网卡设置为“桥接模式”,如图 13-10 所示。然后设置成与物理设备相同的网络参数(此处需要大家按照物理设备真实的网络参数来配置)。


新添加的网卡设备默认没有配置文件,需要自行输入网卡名称和类型。另外,记得让新的网卡参数生效:


第三步:在 bind 服务程序的主配置文件中添加缓存转发参数。在大约第 20 行处添加一行参数“forwarders { 上级 DNS 服务器地址; };”,上级 DNS 服务器地址指的是获取数据配置文件的服务器。考虑到查询速度、稳定性、安全性等因素, 北京市公共 DNS 服务器的地址 210.73.64.1。如果大家也使用该地址,请先测试是否可以 ping 通,以免导致 DNS 域名解析失败。


如果将虚拟机系统还原到了最初始的状态,记得把防火墙的放行规则一并设置完成:


第四步:重启 DNS 服务,验证成果。把客户端主机的 DNS 服务器地址参数修改为 DNS缓存服务器的 IP 地址 192.168.10.10。这样即可让客户端使用本地 DNS 缓存服务器提供的域名查询解析服务。

在将客户端主机的网络参数设置妥当后重启网络服务,即可使用 nslookup 命令来验证实验结果(如果解析失败,请读者留意是否是上级 DNS 服务器选择的问题)。其中,Server 参数为域名解析记录提供的服务器地址,因此可见是由本地 DNS 缓存服务器提供的解析内容。

6.分离解析技术
这篇关于Linux (RHEL Apache、vsftpd、Samba服务)、的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!