实验环境:
httpd服务器:rhel8,ip:192.168.0.41
客户端:rhel7,ip:192.168.0.40
在我们私用互联网访问地址的时候,通常是以http://的方式访问,
http://为超文本传输协议
商家或者企业将资源通过超文本传输的方式将资源进行共享。
而提供超文本传输协议的软件也有很多:
可以使用命令curl -I
打印HTTP头部信息,例如:
百度使用的超文本传输软件为Apache:
qq使用的为stgw:
京东使用的为jfe:
淘宝使用的为Tengine
网易使用的为nginx
可以看到有很多类似的软件,但是目前主流的为Apache和nginx。
Apache的服务名称:httpd
默认是关闭状态:
使用命令:systemctl enable --now httpd
开启httpd并使其开机启动。
httpd启动成功
在客户主机中使用超文本传输协议访问httpd服务器:
此时还不能访问。这是因为服务器主机的firewalld服务是开启状态,要对其进行设定:
rhel8中的火墙是开启状态。
查看火墙策略:
在火墙策略里是没有我们要使用的httpd服务。
在火墙中永久开启http访问 及永久开启https访问 :
[root@rhel8_node1 ~]# firewall-cmd --permanent --add-service=http
success
[root@rhel8_node1 ~]# firewall-cmd --permanent --add-service=https
success
添加成功后,刷新火墙使设定生效:
[root@rhel8_node1 ~]# firewall-cmd --reload
success
再次查看火墙策略,成功添加http和https:
返回客户主机进行测试:
成功访问Apache测试页。
Apache | |
---|---|
服务名称 | httpd |
配置文件 | /etc/httpd/conf/httpd.conf (主配置文件) |
/etc/httpd/conf.d/*.conf (子配置文件) | |
默认发布目录 | /var/www/html |
默认发布文件 | index.html |
默认端口 | 80(http) |
443(https) | |
用户 | apache |
日志 | /etc/httpd/logs |
使用命令:
[root@rhel8_node1 ~]# ss -antlupe | grep httpd
可以看到http使用的端口:80
通过修改主配置文件来修改端口:
[root@rhel8_node1 ~]# vim /etc/httpd/conf/httpd.conf
修改完成后,保存退出,重启http:
[root@rhel8_node1 ~]# systemctl restart httpd
重启服务后,使用命令:[root@rhel8_node1 ~]# ss -antlupe | grep httpd
再次查看httpd的端口:
将端口修改后,客户主机就不能通过原来的端口进行访问:
且使用8080端口还是无法访问:
这是因为火墙没有开放8080端口的访问,将8080端口添加进火墙策略:
[root@rhel8_node1 ~]# firewall-cmd --permanent --add-port=8080/tcp
success
再刷新火墙是设定生效:
[root@rhel8_node1 ~]# firewall-cmd --reload
success
再次列出火墙策略:
可以看到,8080端口被成功添加进火墙策略。
再次返回客户主机进行访问:
这个时候,客户主机就可以通过8080端口访问http服务器。
若将端口设定为6666:
发现,此时重启http服务是重启不了的:
查看日志:
可以看到,日志里的说明为端口不能指定为6666,且与selinux有关。
这是因为selinux对端口进行了限制:
服务器主机的selinux当前为打开状态,更改selinux为警告模式:
再次重启httpd:
使用命令[root@rhel8_node1 ~]# ss -antlupe | grep httpd
查看httpd端口:
端口被成功更改为6666.
设定selinux的默认使用方式,使apache允许使用6666端口:
使用命令:semanage port -l | grep http 查看允许httpd使用的端口:
可以看到,允许使用的端口中没有6666这个端口,所以需要将端口6666添加进去:
使用命令:semanage port -a -t http_port_t -p tcp 6666
-a为指定添加,-t为添加位置,-p为添加端口号
可以看到,端口6666被成功添加:
将selinux更改为强制模式,并重启httpd:
默认发布文件为/var/www/html/index.html
若此文件存在,则客户主机访问次文件信息。
若此文件不存在,则客户主机访问的为Apache的默认测试页面。
当前默认发布文件不存在:
客户主机访问的为
Apache的默认测试页面:
新建index.html:
编辑完成后保存退出。
在客户主机进行访问测试:
成功访问到服务器主机的index.html文件内容!
此时,我们重新写一个自己的发布文件:test.html:
编辑完成后保存退出,回到客户主机进行测试:
默认访问的内容还是index.html:
要想访问我们添加的发布文件,必须添加目录:
若想客户主机默认访问的为我们自己建立的发布文件,则需要修改配置文件:
编辑完成后,保存退出。重启httpd。
此时,默认发布文件为test.html和index.html,且有顺序,当test.html不存在时,index.html为默认发布文件,返回客户主机进行测试:
默认访问:
当删除test.html后,默认发布文件则为index.html:
客户主机访问效果:
可以看到,此时默认发布文件变为index.html
默认发布目录为/var/www/html
首先创建一个新的发布目录,并在其创建发布文件:
发布文件内容:
编辑完成后保存退出。
通过修改http的主配置文件来修改http的默认发布目录:
将其默认发布目录注释,添加新的默认发布目录。注意:添加完成后要对目录进行授权,否则客户主机访问使会被拒绝。
修改完成后,保存退出,重启httpd。在客户主机进行测试:
发现还是无法访问。推测导致不能访问的原因为selinux,将服务器主机selinux更改为警告模式:
再次返回客户主机进行访问测试:
成功访问/testdir/html/indx.html文件!
导致这一现象的原因为新建的默认发布目录的安全上下文与系统默认的安全上下文不同所导致:
所以将新建的默认发布目录的安全上下文改为系统默认发布目录的安全上下文:
安全上下文的更改:
[root@rhel8_node1 html]# semanage fcontext -a -t httpd_sys_content_t '/testdir(/.*)?'
刷新/testdir:
[root@rhel8_node1 html]# restorecon -RvvF /testdir/
将selinux还原为强制模式:
再次返回客户主机进行访问测试:
成功访问!
在此实验中,实验环境如下:
服务器主机为rhel8,ip:192.168.0.41
客户主机:rhel7,ip:1972168.0.40
服务器充当客户主机rhel8,ip:192.168.0.41
首先将默认发布目录还原,在/var/www/html新建目录test
在新建的目录下新建发布文件:
发布文件内容:
使用两台客户主机进行访问测试:
rhel7:
可以访问。
rhel8:
rhel8可以访问。
基于客户端ip的访问控制,修改http主配置文件:
次设定为先读取allow内容,后读取deny内容。(范围小的在后)
效果为除了192.168.0.41主机不能访问,其他主机都可以访问。
编辑完成后,保存退出,重启httpd。再次使用两台客户主机进行访问测试:
rhel7正常访问
方法同黑名单:
(范围小的在后)效果为除了192.168.0.41主机能访问,其他主机都不可以访问,编辑完成后,保存退出,重启httpd。再次使用两台客户主机进行访问测试:
rhel8:
rhel8成功访问。
rhel7:
rhel7访问被拒绝。
基于ip的访问控制存在的最大问题为用户可以随意更改自己的id,会造成设定失效。
在http主配置文件中添加用户认证信息,如下图:
接下来,生成用户认证文件:
使用命令:htpasswd -cm /etc/httpd/htpasswdfile admin
生成admin用户的认证信息:
其中-c为新建(当htpasswd文件不存在在时),-m为使用md5的加密方式
若再添加新用户时,使用命令:htpasswd -m /etc/httpd/htpasswdfile user
添加user用户认证文件。
注意:此处htpasswd -cm /etc/httpd/htpasswdfile admin
不能加-p参数,若添加-p参数,就会将原htpasswd文件覆盖,原数据就丢失!
完成后,重启httpd。返回客户主机进行访问测试:
输入用户和密码,再次进入:
客户主机成功访问!
若输入错误的认证信息,则会一直让你认证:
可以看到,只要是认证通过的用户就可以成功访问。
若想要对用户认证进行访问控制,则修改http主配置文件:
只允许admin用户通过:
编辑完成后,保存退出,重启httpd。再次使用两台客户主机进行访问测试:
用户admin认证完成后成功访问,user用户不能通过认证!
若想要访问同一ip下的不同的站点,则需要使用apache的虚拟主机
思路:新建子站点目录/var/www/xng.com/test{1…3}为三个子站点的发布目录,在各自发布目录中新建发布文件index.html。
当访问test1.xng.com时---------->/var/www/xng.com/test1/index.html
当访问test2.xng.com时---------->/var/www/xng.com/test2/index.html
当访问test3.xng.com时---------->/var/www/xng.com/test3/index.html
当访问www.xng.com时---------->/var/www/html/index.html
http的子配置文件:/etc/httpd/conf.d/VirtualHost.conf ,编辑子配置文件,指定虚拟主机信息:
编辑完成后,保存退出。重启httpd。
此时我们在客户主机不能直接以域名访问的方式访问站点,在客户主机做地址解析:
编辑本地解析文件:
vim /etc/hosts
编辑完成后,保存退出。
回到客户主机访问测试:
访问默认站点:
访问test1/xng.com:
访问test2/xng.com:
访问test3/xng.com:
成功实现同一ip下不同站点的访问!
默认支持html语言。
首先在服务器主机安装php语言:
下载完成后,重启httpd使apache识别php。
新建/var/www/html/php目录并在次目录下建立php语言发布文件:index.php:
按照如下的格式编写,发布php的默认测试页。
编辑完成后保存退出,返回客户主机进行访问测试:
访问成功!
perl语言的主要功能是让系统支持cgi
关于cgi: CGI:通用网关接口(Common Gateway Interface)是一个Web服务器主机提供信息服务的标准接口。通过CGI接口,Web服务器就能够获取客户端提交的信息,转交给服务器端的CGI程序进行处理,最后返回结果给客户端。
首先给cgi创建目录:/var/www/html/cgi
建立cgi的发布文件:index.cgi
可以在apache的用户手册上查看cgi的书写格式:
为了使其动态效果明显,我们这里使用cgi输出 date:
编辑index.cgi:
编辑完成后保存退出。 注意:因index.cgi里面包含命令,所以必须给index.cgi添加执行权限。
在http的子配置目录里添加该cgi,告诉系统此文件须执行:
vim /etv/http/conf.d/VirtualHost.conf
若没有进行此步骤,则index.cgi文件内的命令或程序不能被执行,效果如图:
编辑配置文件完成后保存退出,重启httpd。返回客户主机访问测试效果:
刷新:
可以看到,每刷新一次执行的结果变化一次,这也说明了perl语言的动态性。
在计算机网络上,OpenSSL是一个开放源代码的软件库包,应用程序可以使用这个包来进行安全通信,避免窃听,同时确认另一端连接者的身份。这个包广泛被应用在互联网的网页服务器上。
所以首先在服务器上安装mod_ssl:
安装完成后,重启httpd。此时,就可以使用https://的方式进行访问。
此时的证书为系统所生成的证书,并不是我自己的证书:
将系统生成的证书删除:
接下来 需要生成自己的证书:
思路:生成key文件–>生成签名文件–>生成证书–>将key文件和证书文件添加到ssl的配置文件
使用命令openssl genrsa 1024/2048
使用rsa加密方式生成1024位或者2048位的加密字符(默认为2048位):
现将生成的加密字符导入到/etc/kpi/tls/private/www.xng.com.key 2048 生成key文件:
生成key文件后,对key文件进行签名,将自己的信息提交给ca机构,进行证书请求:
使用命令:[root@rhel8_node1 private]# openssl req -new -key /etc/pki/tls/private/www.xng.com.key -out /etc/pki/tls/cers/www.xng.com.csr
将认证信息生成证书签证请求文件,并将文件存放在/etc/pki/tls/cers/下,体检建立cers目录,并给写权限:
接下来填写信息:
获取证书:
使用命令:[root@rhel8_node1 cers]# openssl x509 -req -days 365 -in /etc/pki/tls/cers/www.xng.com.csr -signkey /etc/pki/tls/private/www.xng.com.key -out /etc/pki/tls/cers/www.xng.com.crt
将证书生成,为/etc/pki/tls/cers/下的www.xng.com.crt。
到此我们呢该有的三个文件就都有了:
下来将www.xng.com.crt和www.xng.com.key添加进ssl的配置文件中
ssl的配置文件为:/etc/httpd/conf.d/ssl.conf
编辑完成后,保存退出。重启httpd,返回客户主机进行访问测试:
可以看到,访问成功。我们继续查看证书信息:
到此,我们自己的key的证书就成功生成了。
注意:https://的方式虽然安全,但是缺点是传输速率会比http://方式访问要慢。
在本章的虚拟主机实验中,我们分别有test1.xng.com test2.xng.com test3.xng.com 三个子站点,这里若将test3用于加密访问,我们可以修改配置文件:/etc/httpd/conf.d/VirtualHost.conf
编辑完成后,保存退出。重启httpd,并返回客户主机进行访问测试:
访问test3.xng.com时,并没有出现test3的内容,内容为默认发布文件的内容:
手动https://test3.xng.com:
可以发现,在访问test3.xng.com时,默认还是以http://方式访问,必须手动https才行。
那么test3.xng.com能不能像其他的企业网站一样,直接自动使用https的方式吗?
答案是肯定的! 我们可以在访问test3.xng.com时访问的端口由80端口变为443端口。此功能为网页重写功能。
首先,安装httpd-manual:
安装完毕,重启httpd,打开apache的手册查看网页重写:
将网页重写功能添加进配置文件:/etc/httpd/conf.d/VirtualHost.conf
其中:^(/.*)$ 代表客户地址栏中输入的地址 ,%{HTTP_HOST} 为客户主机,$1 为RewriteRule后面跟的第一串字符的值 。
编辑完成后,保存退出。重启httpd,这样就完成了网页重写功能:当访问test3.xng.com的80端口时,会自动跳转到443端口,完成自动使用https://访问的功能。返回客户主机进行访问测试:
Squid是一种用来缓冲Internet数据的软件。它是这样实现其功能的,接受来自人们需要下载的目标(object)的请求并适当地处理这些请求。也就是说,如果一个人想下载一web页面,他请求Squid为他取得这个页面。Squid随之连接到远程服务器(比如:http://squid.nlanr.net/)并向这个页面发出请求。
客户主机因为某些原因不能与目标主机建立连接,可以与squid主机建立连接,squid主机可以与目标主机建立连接,此时,客户主机可以与squid建立连接,将squid主机作为代理服务器,代理服务器会将客户主机想要建立通讯的目标主机的信息缓存到本机,客户主机就能完成对目标主机的访问。
VPN:客户主机和代理服务器squid主机之间用互联网建立的专用隧道叫做。
实验环境:
单网卡主机设定ip不能上网 双网卡主机设定ip1可以连接单网卡主机,设定ip2可以上网。
实验效果:
让单网卡主机不能上网但浏览器可以访问互联网页
实验:
安装apache的主机配备双网卡,一块网卡可以正常上网(192网段),另一块网卡不能正常上网(172网段),但是能与单网卡主机(172网段)进行通讯。
单网卡主机:
双网卡主机:
双网卡主机安装squid:
修改squid配置文件:/etc/squid/squid.conf
默认不允许任何人访问:
将其修改为允许所有人访问:
将squid的缓存目录打开:
这将在/var/spool/squid 下建立16个一级目录和256个二级目录,缓存大小不能超过100M。
编辑完成后保存退出,并重启squid。
缓存目录自动建立:
在单网卡主机(12网段,不能上网)上的firefox进行访问测试:
对浏览器进行配置:
在squid主机里将3128端口添加进火墙,并重启火墙:
返回单网卡主机进行访问:
单网卡主机成功访问www.baidu.com
squid反向代理也就是cdn加速。
我们以腾讯公司为例子:腾讯公司的服务器位置在深圳市,我作为用户位置在西安市,两地相距很远,直接访问深圳市的服务器会经过很多路由,因此访问速度相对来说慢。且每个省份的用户都去访问腾讯的服务器会导致腾讯服务器的负载变得特别大,所以腾讯公司会在各个省市租用服务器。
所以,我去访问西安的被租用的服务器访问深圳的服务器的时间是快于直接访问深圳的服务器。当我去访问深圳服务器时,我访问西安本地的服务器,此服务器又去访问深圳的服务器,最终实现访问的加速。也就是cdn加速。
实验:安装过apache的资源主机ip:192.168.0.41
squid主机ip:192.168.0.42
客户主机ip:192.168.0.40
目标效果:客户主机访问squid主机,可以获得资源主机的资源。
为保证实验效果,这里将资源主机的http默认发布文件改为其ip:
首先,squid主机安装squid:
对squid进行配置,编辑squid配置文件:/etc/squid/squid.conf
vhost 支持虚拟域名 vport 支持虚拟端口
可以查看/usr/share/doc/squid/squid.conf.document (squid的帮助文档)查看其缓存路径书写格式:
当192.168.0.42的80端口被访问会从192.168.0.41的80端口缓存数据
编辑完成后保存退出,并重启squid。使用客户主机进行当问测试:
访问成功!