运维基础

软件包管理

课程目标1

  • 了解Linux下常见的软件包分类

  • 掌握rpm如何获取

  • 掌握rpm包的安装

思考:

  • Linux软件包有哪些类型?

  • 如何获取rpm包?

  • 如何选择rpm包?

一、软件包的类型

  • 二进制包:已编译好,直接安装 xlockmore-5.31-2.el6.x86_64.rpm

  • 二进制源码包(半成品) : xxx.src.rpm --> rpm|tarball--->再安装

  • 源码包(tarball): xxx.tar.gz xxx.tar.xz xxx.tar.bz2

1. 常见二进制包
系统平台包类型工具在线安装
RedHat/Centos/Fedora/SUSE rpm rpm,rpmbuild yum
Ubuntu/Debian deb dpkg apt

注意:不管是源码包,还是二进制包,安装时都可能会有依赖关系!

2. 二进制包获取方式

2.1 RedHat/Centos光盘或官方网站 ftp://ftp.redhat.com

2.2 推荐网站

2.3 相应软件官方网站

3. 二进制包如何选择

3.1选择适合当前系统的版本号:

  • 找不到适合的,才去尝试别的系统版本号

  • el6兼容el5;el5无法安装 el6

3.2 选择适合cpu的架构:

  • x86_64包,只能安装在64位的系统上

  • i386,i586,i686的软件包可以安装在32和64位系统上

  • noarch表示这个软件包与硬件构架无关,可以通用

  • 32位系统不能安装64位包

建议: 建议不要跨大版本号去安装软件包,尽量使用当前版本自带软件包安装

4. 认识源码包
  • 优点:

  1. 可以在任意平台上编译安装,编译出来的软件包非常适应所在机器。

  2. 可以在编译的时候,通过配置,对某些功能进行定义,开启或关闭相应的功能。

  • 缺点:

    1. 安装麻烦

    2. 卸载麻烦

    3. 升级麻烦

  • 源码安装三部曲:

    • 根据需求配置:

      --prefix=... Directories to put files in /usr/local 软件家目录
      --bindir=... $prefix/bin 命令的目录
      --etcdir=... $prefix/etc 配置文件的目录
      --mandir=... $prefix/share/man man文档路径
      --locale=... $prefix/share/locale 语言编码

       

    • 编译:

      make (使用gcc编译器进行编译)
    • 安装:

    make install 类似 rpm -ivh

总结:

./configure
\
Makefile---make(gcc) ------ make install (rpm -ivh)

二、rpm包安装—rpm工具

前期环境准备:

1、windows共享文件夹给虚拟机

[root@MissHou Desktop]# df -h
Filesystem                      Size  Used Avail Use% Mounted on
/dev/mapper/vg_misshou-lv_root   18G  4.2G   13G  26% /
tmpfs                           491M  228K  491M   1% /dev/shm
/dev/sda1                       485M   35M  426M   8% /boot
.host:/                         489G   26G  464G   6% /mnt/hgfs//共享成功
/dev/sr0                        4.2G  4.2G     0 100% /media/CentOS_6.5_Final

2、拷贝相应的软件到指定路径

[root@MissHou ~]# mkdir /soft
[root@MissHou ~]# ls /mnt/hgfs/
linux-soft
[root@MissHou ~]# cd /mnt/hgfs/linux-soft/
[root@MissHou linux-soft]# ls
audiofile-0.2.6-11.1.el6.x86_64.rpm                  tigervnc-1.1.0-5.el6_4.1.x86_64.rpm
axel-1.0a.tar.gz                                     vsftpd-2.2.2-11.el6_4.1.x86_64.rpm
esound-libs-0.2.41-3.1.el6.x86_64.rpm                vsftpd-2.3.5-26.el6.x86_64.rpm
rsync                                                xlockmore-5.31-2.el6.x86_64.rpm
tigervnc-1.0.90-0.17.20110314svn4359.el6.x86_64.rpm
[root@MissHou linux-soft]# cp *.rpm /soft/
[root@MissHou linux-soft]# ls /soft/
audiofile-0.2.6-11.1.el6.x86_64.rpm                  vsftpd-2.2.2-11.el6_4.1.x86_64.rpm
esound-libs-0.2.41-3.1.el6.x86_64.rpm                vsftpd-2.3.5-26.el6.x86_64.rpm
tigervnc-1.0.90-0.17.20110314svn4359.el6.x86_64.rpm  xlockmore-5.31-2.el6.x86_64.rpm
tigervnc-1.1.0-5.el6_4.1.x86_64.rpm

 

1. 语法格式:

rpm 参数 软件包名或文件名

2. 常见参数:

  • -ivh 安装

  • -e 卸载

  • -Uvh 升级 如果已安装老版本,则升级;如果没安装,则直接安装

  • -Fvh 升级 如果已安装老版本,则升级;如果没安装,则安装

  • -ivh --force 强制安装

  • --nodeps 忽略依赖关系

  • -ql 查看已经安装的软件的文件列表

  • -qlp package.rpm 查看未安装的rpm包里的文件列表

  • -qa 查看已经安装的所有rpm包

  • -qd 查看软件的文档列表

  • -qc 查看软件的配置文件

  • -qi 查看软件的详细信息

  • -qf filename 查看文件来自哪个rpm包

  • --import key_file 导入公钥用于检查rpm文件的签名

  • -checksig package.rpm 检查rpm包的签名

3. 红帽软件包特征:

一个软件可能有多个相关包组成

  • samba-3.5.10-125.el6.x86_64.rpm 服务端

  • samba-client-3.5.10-125.el6.x86_64.rpm 客户端

  • samba-common-3.5.10-125.el6.i686.rpm 32位公共包<工具|库文件>

  • samba-common-3.5.10-125.el6.x86_64.rpm 64位公共包<工具|库文件>

4. 案例:

示例1: 安装vnc客户端软件

[root@MissHou soft]# ls
audiofile-0.2.6-11.1.el6.x86_64.rpm                  vsftpd-2.3.5-26.el6.x86_64.rpm
esound-libs-0.2.41-3.1.el6.x86_64.rpm                xlockmore-5.29.1.tar.bz2
tigervnc-1.0.90-0.17.20110314svn4359.el6.x86_64.rpm  xlockmore-5.31-2.el6.x86_64.rpm
tigervnc-1.1.0-5.el6_4.1.x86_64.rpm

检查软件包的签名:

[root@MissHou soft]# rpm --checksig tigervnc-1.0.90-0.17.20110314svn4359.el6.x86_64.rpm
tigervnc-1.0.90-0.17.20110314svn4359.el6.x86_64.rpm: RSA sha1 ((MD5) PGP) md5 NOT OK (MISSING KEYS: (MD5) PGP#fd431d51)          
//tigervnc-1.0版本是高仿的
[root@MissHou soft]# rpm --checksig tigervnc-1.1.0-5.el6_4.1.x86_64.rpm
tigervnc-1.1.0-5.el6_4.1.x86_64.rpm: rsa sha1 (md5) pgp md5 OK  
//tigervnc-1.1版本是正版的

安装和卸载软件:

[root@MissHou soft]# rpm -q tigervnc //查看软件是否安装
package tigervnc is not installed
[root@MissHou soft]# rpm -ivh tigervnc-1.0.90-0.17.20110314svn4359.el6.x86_64.rpm       //安装软件
warning: tigervnc-1.0.90-0.17.20110314svn4359.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID fd431d51: NOKEY
Preparing...                ########################################### [100%]
  1:tigervnc               ########################################### [100%]
[root@MissHou soft]# rpm -q tigervnc
tigervnc-1.0.90-0.17.20110314svn4359.el6.x86_64
[root@MissHou soft]# rpm -e tigervnc //卸载

软件升级-Fvh和-Uvh区别:

[root@MissHou soft]# rpm -Fvh tigervnc-1.1.0-5.el6_4.1.x86_64.rpm  
//升级失败,原因是当前系统没有安装tigervnc
[root@MissHou soft]# rpm -q tigervnc
package tigervnc is not installed
[root@MissHou soft]# rpm -Uvh tigervnc-1.1.0-5.el6_4.1.x86_64.rpm    
//升级成功
Preparing...                ########################################### [100%]
  1:tigervnc               ########################################### [100%]  
[root@MissHou soft]# rpm -q tigervnc
tigervnc-1.1.0-5.el6_4.1.x86_64

查看软件文件列表: 说明:一般情况下软件包的文件列表大致分为几个部分:

  • 配置文件存放在/etc目录里

  • 二进制命令存放在/usr/bin和/usr/sbin目录里

  • 软件的文档手册存放在/usr/share/doc和/usr/share/man

  • 软件的数据目录存放在/var目录里

  • 其他

[root@MissHou ~]# rpm -ql cronie
/etc/cron.d
/etc/cron.d/0hourly
/etc/cron.deny
/etc/pam.d/crond
/etc/rc.d/init.d/crond
/etc/sysconfig/crond
/usr/bin/crontab
/usr/sbin/crond
/usr/share/doc/cronie-1.4.4
/usr/share/doc/cronie-1.4.4/AUTHORS
/usr/share/doc/cronie-1.4.4/COPYING
/usr/share/doc/cronie-1.4.4/ChangeLog
/usr/share/doc/cronie-1.4.4/INSTALL
/usr/share/doc/cronie-1.4.4/README
/usr/share/man/man1/crontab.1.gz
/usr/share/man/man5/crontab.5.gz
/usr/share/man/man8/cron.8.gz
/usr/share/man/man8/crond.8.gz
/var/spool/cron

示例2:

安装锁屏软件

[root@MissHou soft]# rpm -ivh xlockmore-5.31-2.el6.x86_64.rpm
warning: xlockmore-5.31-2.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 0608b895: NOKEY
error: Failed dependencies:
libaudiofile.so.0()(64bit) is needed by xlockmore-5.31-2.el6.x86_64
libesd.so.0()(64bit) is needed by xlockmore-5.31-2.el6.x86_64

错误原因:软件包有依赖 解决办法:找到锁屏软件所依赖的软件包,安装上即可 思考: 如何根据报错信息libaudiofile.so.0()(64bit)和libesd.so.0()(64bit)知道缺少哪个软件包?

  1. 如果有配置yum的话可以使用yum工具

  2. 可以在网上搜索,如:http://rpm.pbone.net 使用yum工具:

[root@MissHou ~]# yum provides "libaudiofile.so.0()(64bit)"
Loaded plugins: fastestmirror, refresh-packagekit, security
Loading mirror speeds from cached hostfile
1:audiofile-0.2.6-11.1.el6.x86_64 : A library for accessing various audio file formats
Repo        : local
Matched from:
Other       : libaudiofile.so.0()(64bit)



[root@MissHou ~]# yum provides "libesd.so.0()(64bit)"
Loaded plugins: fastestmirror, refresh-packagekit, security
Loading mirror speeds from cached hostfile
1:esound-libs-0.2.41-3.1.el6.x86_64 : Library to talk to the EsounD daemon
Repo        : local
Matched from:
Other       : libesd.so.0()(64bit)

网上搜索: http://rpm.pbone.net 软件包搜索

三、yum配置及使用

课程目标2

  • 理解yum源如何解决依赖关系

  • 掌握本地和网络yum源的配置

  • 熟练使用yum工具安装软件包

1. yum源的介绍

  • 作用:软件包管理器,类似360软件管家

  • 示意图

    yum

  • 常见的软件源(yum源)

    • 红帽源 收费 • centos源 免费 • 阿里云源,163源,sohu源 • epel(Extra Packages for Enterprise Linux)是基于Fedora的一个项目,为“红帽系”的操作系统提供额外的软件包,适用于RHEL、CentOS和Scientific Linux.

  • yum源的分类

    • 本地yum源(重点掌握)

    • 网络yum源(掌握)

    • 自建yum源(了解)

2. yum源的配置

思路:

1.需要有个软件仓库并且里面存放了所有软件包的依赖关系

2.告诉yum工具去哪个仓库里找相关软件

2.1 本地yum源配置

步骤:

  1. 本地需要有一个镜像文件(xxx.iso)

  2. 通过挂载的方式将镜像文件挂载到本地一个的目录里

    [root@MissHou soft]# df -h
    Filesystem                      Size  Used Avail Use% Mounted on
    /dev/mapper/vg_misshou-lv_root   18G  4.2G   13G  26% /
    tmpfs                           491M  228K  491M   1% /dev/shm
    /dev/sda1                       485M   35M  426M   8% /boot
    .host:/                         489G   26G  463G   6% /mnt/hgfs
    /dev/sr0                        4.2G  4.2G     0 100% /media/CentOS_6.5_Final //挂载成功

     

  3. 告诉yum工具去哪个仓库里找相应的软件包(配置yum相关文件)

默认环境:
[root@MissHou soft]# ls /etc/yum.repos.d/
CentOS-Base.repo  CentOS-Debuginfo.repo  CentOS-Media.repo  CentOS-Vault.repo
清空环境:
[root@MissHou soft]# cd /etc/yum.repos.d/
[root@MissHou yum.repos.d]# ls
CentOS-Base.repo  CentOS-Debuginfo.repo  CentOS-Media.repo  CentOS-Vault.repo
[root@MissHou yum.repos.d]# mkdir bakup
[root@MissHou yum.repos.d]# mv *.repo bakup/
[root@MissHou yum.repos.d]# ls
bakup

创建配置文件:
[root@MissHou yum.repos.d]# cat demo.repo
[local-yum]//仓库名(不要有特殊符号)
name=local yum//仓库描述
baseurl=file:///media/CentOS_6.5_Final//指定仓库的路径
enabled=1//启用仓库  1代表启用 0代表关闭
gpgcheck=0//不要检验软件包的数字签名

  1. 测试安装

[root@MissHou yum.repos.d]# yum clean all//清空yum缓存
Loaded plugins: fastestmirror, refresh-packagekit, security
Cleaning repos: local-yum
Cleaning up Everything
Cleaning up list of fastest mirrors
[root@MissHou yum.repos.d]# yum makecache//创建yum缓存
Loaded plugins: fastestmirror, refresh-packagekit, security
Determining fastest mirrors
local-yum                                                                                         | 4.0 kB     00:00 ...
local-yum/group_gz                                                                               | 220 kB     00:00 ...
local-yum/filelists_db                                                                           | 5.8 MB     00:00 ...
local-yum/primary_db                                                                             | 4.4 MB     00:00 ...
local-yum/other_db                                                                               | 2.7 MB     00:00 ...
Metadata Cache Created

作业

  1. swap分区的大小如何确定?(参考redhat官当)

  2. bg和fg的用法

  3. 安装xlockmore锁屏软件(思路和解决的方法)

  4. 配置本地yum源

 

2.2 网络yum配置

http://mirrors.163.com/centos/6/os/x86_64/

https://mirrors.aliyun.com/centos/6/os/x86_64/

http://mirrors.sohu.com/centos/6/os/x86_64/

 

2.3 自建yum源

3. yum源配置实战

3.1 需求1:

系统使用最小化安装,现需要安装一些基础软件包,请根据系统镜像配置本地yum源

  • 步骤

    • ...

    •  

3.2 需求2:

Centos默认使用自带的国外源,由于网络问题请将其替换为国内的阿里云源,163源,sohu源其中之一

  • 步骤

    • ...

    •  

3.3 需求3:

通过两种方式搭建EPEL源

3.4 需求4:

搭建能够提供指定软件包的安装,如Nginx和MySQL的yum源

Nginx:
[root@MissHou ~]# vim /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/6/x86_64/
gpgcheck=0
enabled=1

MySQL:
http://repo.mysql.com/mysql-community-release-el6-5.noarch.rpm
http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm

 

 

四、总结

 

补充扩展

  • wget命令:Linux下用来从下载文件的工具

  • 常用参数:

    -O, --output-document=file 将文档写入文件 (文件重命名保存)

    -o, --output-file=logfile 将下载日志信息保存到日志文件 -a, --append-output=logfile 将下载日志信息追加到指定日志文件(如果不存在就创建) -q, --quiet Turn off Wget’s output. 不输出下载过程 -c, --continue 断点续传, 重新启动下载中断的文件 -P, --directory-prefix=prefix 指定下载文件保存路径 -4, --inet4-only 仅连接至 IPv4 地址 -6, --inet6-only 仅连接至 IPv6 地址 --user=user 指定用户 --password=password 指定密码 -b, --background 后台运行,有日志输出wget-log -r, 递归下载 -nc, 文件存在时,下载文件不覆盖原有文件

    --mirror 镜像整个网站

     

  • 示例:

    • 使用wget下载单个文件

      wget http://repo.mysql.com/mysql-community-release-el6-5.noarch.rpm

    • 使用wget -O下载并以不同的文件名保存

      wget -O test.repo http://mirrors.aliyun.com/repo/Centos-7.repo

    • 指定下载文件保存位置

      wget -P /etc/yum.repos.d/ http://mirrors.aliyun.com/repo/Centos-7.repo

    • 下载整个网站到本地

      wget –mirror -p –convert-links -P ./本地路径 URL

      -p:下载所有为了html页面显示正常的文件

      –convert-links:下载后,转换成本地的链接

    •  

 

 数字签名扩展

 

 

扩展

图解公钥私钥签名

  1. 鲍勃有两把钥匙,一把是公钥,另一把是私钥

 

  1. 鲍勃把公钥送给他的朋友们——>帕蒂、道格、苏珊(每人一把)

 

 

  1. 苏珊要给鲍勃写一封保密的信,她写完后用鲍勃的公钥加密,就可以达到保密的效果

 

  1. 鲍勃收信后,用私钥解密,就看到了信件内容。这里要强调的是,只要鲍勃的私钥不泄露,这封信就是安全的,即使落在别人手里,也无法解密。

 

  1. 鲍勃给苏珊回信,决定采用"数字签名"。他写完后先用Hash函数,生成信件的摘要(digest)

 

  1. 然后,鲍勃使用私钥,对这个摘要加密,生成"数字签名"(signature)

 

  1. 最后鲍勃将这个签名,附在信件下面,一起发给苏珊

 

  1. 苏珊收信后,取下数字签名,用鲍勃的公钥解密,得到信件的摘要。由此证明,这封信确实是鲍勃发出的

 

  1. 苏珊再对信件本身使用Hash函数,将得到的结果,与上一步得到的摘要进行对比。如果两者一致,就证明这封信未被修改过

 

 

问题:

  1. 复杂的情况出现了。道格想欺骗苏珊,他偷偷使用了苏珊的电脑,用自己的公钥换走了鲍勃的公钥。此时,苏珊实际拥有的是道格的公钥,但是还以为这是鲍勃的公钥。因此,道格就可以冒充鲍勃,用自己的私钥做成"数字签名",写信给苏珊,让苏珊用假的鲍勃公钥进行解密。

 

 

  1. 后来,苏珊感觉不对劲,发现自己无法确定公钥是否真的属于鲍勃。她想到了一个办法,要求鲍勃去找"证书中心"(certificate authority,简称CA),为公钥做认证。证书中心用自己的私钥,对鲍勃的公钥和一些相关信息一起加密,生成"数字证书"(Digital Certificate)。

 

  1. 鲍勃拿到数字证书以后,就可以放心了。以后再给苏珊写信,只要在签名的同时,再附上数字证书就行了。

 

  1. 苏珊收信后,用CA的公钥解开数字证书,就可以拿到鲍勃真实的公钥了,然后就能证明"数字签名"是否真的是鲍勃签的

 服务之SSH和DHCP

 

 

服务概述

课程目标1

  • 理解服务器B/S和C/S架构

  • 了解常见的网络服务

  • 理解独立服务和依赖服务

一、服务概述

• 运行在操作系统后台的一个或者多个程序,为系统或者用户提供特定的服务 • 可靠的,并发的,连续的不间断的运行,随时接受请求 • 通过交互式提供服务

二、服务器架构

  • B/S(browser/server) 浏览器/服务器 概念:这种结构用户界面是完全通过浏览器来实现,使用http协议 优势:节约开发成本

  • C/S(client/server)客户端/服务器

      概念:指的是客户端和服务端之间的通信方式,客户端提供用户请求接口,服务端响应请求进行对应的处理,并返回给客户端

      优势:安全性较高,一般面向具体的应用

 

两者区别:

B/S: 1、广域网,只需要有浏览器即可 2、一般面向整个互联网用户,安全性低 3、维护升级简单

C/S: 1、专用网络、小型局域网,需要具体安装对应的软件 2、一般面向固定用户,安全性较高

思考1:

我们通过网络是如何找到我们想要访问的服务的?

IP(提供服务的服务器)+Port(找到相应的服务)

 

三、端口号设定

说明:端口号只有整数,范围是从0 到65535

• 1~255:一般是知名端口号,如:ftp 21号、web 80、ssh 22、telnet 23号等

• 256~1023:通常都是由Unix系统占用来提供特定的服务

• 1024~5000:客户端的临时端口,随机产生

• 大于5000:为互联网上的其他服务预留

 

思考2:

如何查看系统默认的注册端口?

/etc/serivces

 

四、常见的网络服务

  • 文件共享服务:FTP、SMB、NFS、HTTP

  • 域名管理服务:DNS

  • 网站服务:Apache、Nginx、Lighttpd、IIS

  • 邮件服务: Mail

  • 远程管理服务:SSH、telnet

  • 动态地址管理服务:DHCP

五、Linux下两大服务

1. 独立服务

  • 独立的进程和独立的启动脚本

  • 启动方式

/etc/init.d/xxx start 或者 /etc/rc.d/init.d/xxx start 或者 service xxx start

2. 依赖服务

注意:RHEL7/Centos7服务的管理方式不一样.

  • 没有独立的启动脚本,依赖于xinetd服务(xinetd服务本身是一个独立服务)

  • 启动方式

必须启动xinetd服务
2.1 什么是xinetd服务?
  • Extended internet daemon(扩展的网络守护进程),又叫超级Internet服务,常用来管理多种轻量级Internet服务;

  • 作用:唤醒在睡觉的服务,由xinetd管理的服务只有在用到的时候才被唤醒,平时不占用系统资源;支持Tcp_Wrappers一种安全策略机制。

    TCP_Wrappers简介:

    TCP_Wrappers是一个工作在应用层的安全工具,它只能针对某些具体的应用或者服务起到一定的防护作用。比如说ssh、FTP等服务的请求,都会先受到TCP_Wrappers的拦截。

    TCP_Wrappers工作原理(了解):

    TCP_Wrappers有一个守护进程叫作tcpd。以ssh为例,每当有ssh的连接请求时,tcpd即会截获请求,先读取系统管理员所设置的访问控制文件/etc/hosts.allow和/etc/hosts.deny;合乎要求,则会把这次连接原封不动的转给真正的sshd进程,sshd完成后续工作;如果这次连接发起的ip不符合访问控制文件中的设置,则会中断连接请求,拒绝提供ssh服务。

 

SSH服务

课程目标2

  • 理解ssh服务的两种认证方式

  • 掌握ssh服务的基本配置

  • 掌握ssh服务客户端工具的使用

一、SSH介绍

  • SSH是Linux下远程管理的工具,相比Telnet安全,运维人员必备的神器!

  • SSH的全称Secure Shell,安全的shell,是Client/Server架构,默认端口号为22,TCP/IP协议

  • SSH其实用于商业,而OpenSSH即为开源的,在Linux中默认安装

  • SSH有v1和v2版本

    • ssh v1:有漏洞,容易受到攻击

    • ssh v2:通过公钥加密(数字签名和密钥交换)的方式进行,确保服务器端的身份识别

二、SSH加密算法

  • des 对称的公钥加密算法,安全低,数据传输速度快;使用同一个秘钥进行加密或解密

  • rsa 非对称的公钥加密算法,安全,数据传输速度慢 ,SSH默认的加密算法

补充了解:

DSA数字签名,非对称加密的另一种实现。

DSA-Digital Signature Algorithm 是Schnorr和ElGamal签名算法的变种。简单的说,这是一种更高级的验证方式,用作数字签名。不单单只有公钥、私钥,还有数字签名。私钥加密生成数字签名,公钥验证数据及签名。如果数据和签名不匹配则认为验证失败!数字签名的作用就是校验数据在传输过程中不被修改。

 思考1: 用户信息加密了,但如何安全的保存密钥呢?

 1、远程Server收到Client端用户的登录请求后,Server端把自己的公钥发给用户

2、Client端使用这个公钥,将密码进行加密

3、Client将加密的密码发送给Server端

4、远程Server用自己的私钥,解密登录密码,然后验证其合法性

5、根据验证结果,给Client相应的响应。

 

思考2: 非对称加密就绝对安全吗?

 

 

问题: SSH中是如何解决这个问题的呢?

三、SSH服务的认证方式

  • 基于用户密码的认证

[root@MissHou ~]# ssh 192.168.10.171
The authenticity of host '192.168.10.171 (192.168.10.171)' can't be established.
RSA key fingerprint is 9f:71:de:3c:86:25:dd:f0:06:78:ab:ba:96:5a:e4:95.
Are you sure you want to continue connecting (yes/no)?

提示信息:无法确认主机192.168.10.171的真实性,指纹是9f:71:de:3c:86:25:dd:f0:06:78:ab:ba:96:5a:e4:95.,你确定想要继续吗?

说明: 理论上应该是对公钥的确认,由于公钥通过RSA算法加密,太长,不好直接比较,所以给公钥生成一个hash的指纹,方便比较。

[root@MissHou ~]# ssh 192.168.10.171
The authenticity of host '192.168.10.171 (192.168.10.171)' can't be established.
RSA key fingerprint is 9f:71:de:3c:86:25:dd:f0:06:78:ab:ba:96:5a:e4:95.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.10.171' (RSA) to the list of known hosts.
root@192.168.10.171's password: 

说明:

当客户端输入yes确认对方的公钥指纹后,server端的公钥就会被存放到客户机的用户家目录里~/.ssh/known_hosts文件中,下次再访问就直接通过密码登录,不需要再确认公钥。

[root@client ~]# su - stu1
[stu1@client ~]$ ssh 10.1.1.2
The authenticity of host '10.1.1.2 (10.1.1.2)' can't be established.
RSA key fingerprint is 9f:71:de:3c:86:25:dd:f0:06:78:ab:ba:96:5a:e4:95.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.1.1.2' (RSA) to the list of known hosts.
stu1@10.1.1.2's password: 

//ssh工具指定用户名访问
[stu1@client ~]$ ssh root@10.1.1.2
root@10.1.1.2's password: 
Last login: Mon Apr 16 15:12:45 2018 from 10.1.1.3
[root@MissHou ~]# exit
logout
Connection to 10.1.1.2 closed.
[stu1@client ~]$ ssh -l root 10.1.1.2
root@10.1.1.2's password: 
Last login: Mon Apr 16 15:18:59 2018 from 10.1.1.3
[root@MissHou ~]# exit
logout
Connection to 10.1.1.2 closed.
[stu1@client ~]$ ssh -lstu2 10.1.1.2
stu2@10.1.1.2's password: 
  • 基于秘钥对的认证(免密码登录)

需求:A主机免密码登录B主机

 

  • 相关文件解读:

  1. id_rsa:保存私钥

  2. id_rsa.pub:保存公钥

  3. authorized_keys:保存已授权的客户端公钥

  4. known_hosts:保存已认证的远程主机公钥

四、SSH服务基本配置

  • 基于秘钥对认证(免密码登录)——>重点掌握

需求:client端有一个用户user01,该用户使用root用户免密码登录server端

环境:

client:10.1.1.3

server:10.1.1.2

思路:

  • client端生成一对秘钥

  • 将生成的公钥远程拷贝到server端

步骤:

  1. client端的user01用户生成一对秘钥对

[root@client ~]# useradd user01
[root@client ~]# su - user01
[user01@client ~]$ ls -a
.  ..  .bash_logout  .bash_profile  .bashrc  .emacs  .gnome2  .mozilla
[user01@client ~]$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user01/.ssh/id_rsa): 
Created directory '/home/user01/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/user01/.ssh/id_rsa.
Your public key has been saved in /home/user01/.ssh/id_rsa.pub.
The key fingerprint is:
df:5b:4f:f8:26:38:0f:5f:f0:df:4c:78:54:bd:94:9e user01@client
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|                o|
|               oo|
|              o +|
|        S     .E.|
|         . .   * |
|          . o.+ *|
|            o=.O+|
|            .ooo*|
+-----------------+
[user01@client ~]$ 
[user01@client ~]$ ls .ssh/
id_rsa(私钥)  id_rsa.pub(公钥)

2.将刚刚生成的公钥远程拷贝到server端的root家目录里指定位置

[user01@client ~]$ scp .ssh/id_rsa.pub root@10.1.1.2:/root/.ssh/authorized_keys
或者
[user01@client ~]$ ssh-copy-id -i .ssh/id_rsa.pub root@10.1.1.2    (推荐)
The authenticity of host '10.1.1.2 (10.1.1.2)' can't be established.
RSA key fingerprint is 9f:71:de:3c:86:25:dd:f0:06:78:ab:ba:96:5a:e4:95.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.1.1.2' (RSA) to the list of known hosts.
root@10.1.1.2's password: 
Now try logging into the machine, with "ssh 'root@10.1.1.2'", and check in:

  .ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.

补充:如果拷贝出错可以关闭selinux
[root@server ~]# getenforce 
Enforcing    //强制模式
[root@server ~]# setenforce 0
[root@server ~]# getenforce 
Permissive    //警告模式

server端查看:
[root@server .ssh]# ls
authorized_keys
[root@server .ssh]# cat authorized_keys 
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAssRLeKnKiLRZ2NbGi/uIZD1IpTnvMqFdKXEUlLH+Eli2PkxamDAszQVf7dsn2FHxCptzL04tDEdqWJ1Nr3zTDyjha9gfHWu6AuXAzaX9gWVIt8qza+yJSxpuoam3OwC6y88HMxvTuYy3jkL/6aCk6b5wzhKUYXwvTKwRctb/dO/9GC22CsmPvLHyFH+CpzmdcG2BzlOkg05CVshDIJSJ2Xmaj7G6m+N2cN4m/NV61rXPHn93wwdFcdNQLlRjDvZ6s7UIgmD04497PKUxJ/hTgkm6p3kAGxESEc0JxYHTGnhVE5D6byfRd0Aa/ydBiSov1x5a6vniGQeUh2+NP6omUQ== user01@client

3.测试验证

[user01@client ~]$ ssh root@10.1.1.2
Last login: Mon Apr 16 16:00:55 2018 from 10.1.1.1
[root@server ~]# 

 

课堂练习:

client端有stu1和stu2两个用户,希望通过test1用户免密码登录server端

client:

stu1$ ssh test1@10.1.1.2

stu2$ ssh test1@10.1.1.2

 
  • 禁止root用户远程登录

  了解软件相关知识

[root@server ~]# rpm -ql openssh-server
/etc/rc.d/init.d/sshd        //启动脚本
/etc/ssh/sshd_config        //配置文件
/usr/sbin/sshd                //二进制命令

[root@server ~]# rpm -ql openssh-clients
/etc/ssh/ssh_config
/usr/bin/scp
/usr/bin/sftp
/usr/bin/slogin
/usr/bin/ssh
/usr/bin/ssh-add
/usr/bin/ssh-agent
/usr/bin/ssh-copy-id
/usr/bin/ssh-keyscan

[root@server ~]# rpm -qf /usr/bin/ssh-keygen 
openssh-5.3p1-94.el6.x86_64

步骤:

[root@server ~]# vim /etc/ssh/sshd_config
。。。
PermitRootLogin no

重启服务:
[root@server ~]# service sshd restart
Stopping sshd:                                             [  OK  ]
Starting sshd:                                             [  OK  ]

测试验证:

[root@client ~]# ssh 10.1.1.2

root@10.1.1.2's password:

Permission denied, please try again.

root@10.1.1.2's password:

  • 修改默认端口号

[root@server ~]# vim /etc/ssh/sshd_config
。。。
Port 10022

测试验证:
[root@client Desktop]# ssh -p10022 stu1@10.1.1.2
ssh: connect to host 10.1.1.2 port 10022: No route to host        //路由无法到达
原因:
1、 网络问题
2、 防火墙
解决:
关闭防火墙
  • ssh服务的访问控制
    • 可以使用tcp_wrappers工具做网络控制

      /etc/hosts.allow和/etc/hosts.deny

    • 如何判断一个服务支持TCP_wrappers功能

      rpm包安装的服务:

      [root@server ~]# ldd /usr/sbin/sshd |grep libwrap

libwrap.so.0 => /lib64/libwrap.so.0 (0x00007fbb65b57000)
//有以上模块说明支持

源码包:

./configuer --enable-libxxxx //配置的时候开启功能

需求:

不允许10.1.1.3服务器来远程访问

vim /etc/hosts.deny

sshd:10.1.1.3

//该文件写法如下:更多参考man文档
sshd:10.1.1.0/255.255.255.0 EXCEPT 10.1.1.3

sshd,vsftpd:.itcast.cc EXCEPT MissHou.itcast.cc

 

测试验证:
[root@client ~]# ssh stu1@10.1.1.2 -p 10022
ssh_exchange_identification: Connection closed by remote host

 

五、ssh服务客户端工具使用

  • Linux下

ssh
-l
-p
-h
。。。
  • Windows下
。。。

总结:

 

DHCP服务

课程目标3

  • 了解DHCP服务的工作原理

  • 能够配置简单的dhcp服务器

一、DHCP服务介绍

  • DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是一个局域网的网络协议,UDP协议,67号端口

  • 主要用于动态管理分配IP地址

二、DHCP服务的工作原理

 

过程分析:

  • dhcpdiscover(发现):该过程中客户端开始建立请求,以0.0.0.0作为自己的ip地址而以255.255.255.255(广播地址)作为服务器的地址,等待DHCP服务器响应。

  • dhcpoffer(提供):当网络中的dhcp服务器收到dhcpdiscover信息后,对自身进行检查,并发送相应的地址。服务器发送给请求客户机的信息中主要包含了ip地址、子网掩码、租约和提供dhcp服务的服务器的ip。

  • dhcprequset(请求):当dhcp客户收到服务器的返回信息后,就以广播的方式发送一个dhcp请求信息给本网络中的存在或不存在的其他的dhcp服务器,该信息中包含了已选择的dhcp服务器的ip地址。

  • dhcpack(确认):一旦被选中的dhcp收到客户端的请求信息后,就将以保留的这个ip标识为以租用,然后广播的方式发送一个dhcpack信息给dhcp客户端,当客户端收到了确认信息后就完成了整个的获取ip的过程。

 

三、DHCP服务器配置

  • 环境准备:

 

  • 步骤:

  1. 安装dhcp软件包

[root@server ~]# yum -y install dhcp
[root@server ~]# rpm -ql dhcp
/etc/dhcp
/etc/dhcp/dhcpd.conf    //主配置文件
/etc/rc.d/init.d/dhcpd    //启动脚本
/usr/sbin/dhcpd            //二进制命令

  2.修改配置文件

vim /etc/dhcp/dhcpd.conf
option domain-name "itcast.cc";               //域名
option domain-name-servers 192.168.1.110, 8.8.8.8;  //DNS(可以写多个)
default-lease-time 3600;          //缺省租约
max-lease-time 7200;              //客户端最大租约
log-facility local7;              //定义日志设备载体 (/var/log/boot.log输出)

subnet 192.168.2.0 netmask 255.255.255.0 {   //子网<网段>
  range 192.168.2.1 192.168.2.50;              //地址范围<地址池>
  option routers 192.168.1.110;                //网关
  option broadcast-address 192.168.2.255      //广播地址
}

vim /etc/dhcp/dhcpd.conf
option domain-name "itcast.cc"; 
option domain-name-servers 8.8.8.8;
default-lease-time 3600;
max-lease-time 7200;
log-facility local7;

subnet 10.1.1.0 netmask 255.255.255.0 { 
  range 10.1.1.100 10.1.1.150; 
  option routers 10.1.1.1;
  option broadcast-address 10.1.1.255
}
[root@MissHou ~]# service dhcpd start
Starting dhcpd:                                            [FAILED]
//启动失败

原因分析:
当我们排除了所有可能的情况下还找不出原因的话,就需要通过日志去分析

  3.日志错误信息

[root@server ~]# tail -f /var/log/messages
Apr 16 17:54:22 MissHou dhcpd: /etc/dhcp/dhcpd.conf line 16: semicolon expected.
Apr 16 17:54:22 MissHou dhcpd: }
Apr 16 17:54:22 MissHou dhcpd:  ^
Apr 16 17:54:22 MissHou dhcpd: /etc/dhcp/dhcpd.conf line 16: unexpected end of file
Apr 16 17:54:22 MissHou dhcpd: }
Apr 16 17:54:22 MissHou dhcpd:  ^
Apr 16 17:54:22 MissHou dhcpd: Configuration file errors encountered -- exiting
Apr 16 17:54:22 MissHou dhcpd: 

通过查看日志发现,在}附近有报错,再次查看配置文件,发现少了一个分号;

更改如下:
option domain-name "itcast.cc"; 
option domain-name-servers 8.8.8.8;
default-lease-time 3600;
max-lease-time 7200;
log-facility local7;

subnet 10.1.1.0 netmask 255.255.255.0 { 
  range 10.1.1.100 10.1.1.150; 
  option routers 10.1.1.1;
  option broadcast-address 10.1.1.255;        //刚刚少了一个分号导致服务无法启动
}

再次启动成功:
[root@MissHou ~]# service dhcpd start
Starting dhcpd:                                            [  OK  ]

  4.测试验证

client端修改IP地址为动态获取:
[root@client ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
[root@client ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=dhcp

重启网络让client端自动获取IP地址:
[root@client ~]# service network restart
Shutting down loopback interface:                          [  OK  ]
Bringing up loopback interface:                            [  OK  ]
Bringing up interface eth0:  Active connection state: activating
Active connection path: /org/freedesktop/NetworkManager/ActiveConnection/8
state: activated
Connection activated
                                                           [  OK  ]
查看IP地址是否是指定的IP范围:
[root@client ~]# ifconfig eth1
eth1      Link encap:Ethernet  HWaddr 00:0C:29:41:A2:FC  
          inet addr:10.1.1.100  Bcast:10.1.1.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fe41:a2fc/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:17493870 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2271 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:1319498963 (1.2 GiB)  TX bytes:221741 (216.5 KiB)

课后作业:

  1. 完成课堂练习

  2. 搭建一个简单的DHCP服务器

需求:

需求: server:eth0 10.1.1.2

eth0:1 192.168.1.2

client:eth0 dhcp 192.168.1.0

环境准备: dhcp server端:增加一个子接口,并且配置192.168.1.0/24网段的IP

[root@server ~]# cat /etc/dhcp/dhcpd.conf 
#
# DHCP Server Configuration file.
#   see /usr/share/doc/dhcp*/dhcpd.conf.sample
#   see 'man 5 dhcpd.conf'
#
option domain-name "itcast.cc"; 
option domain-name-servers 8.8.8.8;
default-lease-time 3600;
max-lease-time 7200;
log-facility local7;

subnet 192.168.1.0 netmask 255.255.255.0 { 
  range 192.168.1.100 192.168.1.150; 
  option routers 192.168.1.1;
  option broadcast-address 192.168.1.255;
}

扩展

telnet服务

一、telnet服务介绍

  • telnet远程管理服务,TCP协议 23号端口

  • telnet服务是依赖服务,由xinetd服务管理

  • 通过明文的帐号与密码传输,不安全,不适用于类unix系统

  • Linux系统默认不使用telnet,使用ssh

二、搭建telnet服务

需求1:搭建一个telnet服务,客户端使用专门的工具telnet可以访问或者管理telnet服务器

环境:

server:10.1.1.2 搭建telnet服务

client:10.1.1.3 测试telnet服务 使用telnet工具远程登录server

思路:

  • 安装软件包(telnet-server|xinetd)

  • 根据需求通过修改配置文件来完成服务的搭建

  • 启动服务,开机自启动(启动xinetd服务)

  • 测试验证

步骤:

  1. 关闭防火墙和selinux

[root@server ~]# service iptables stop
[root@server ~]# chkconfig iptables off
[root@server ~]# chkconfig --list|grep iptables
iptables           0:off    1:off    2:off    3:off    4:off    5:off    6:off

[root@server ~]# getenforce 
Enforcing
[root@server ~]# setenforce
usage:  setenforce [ Enforcing | Permissive | 1 | 0 ]
[root@server ~]# setenforce 0
[root@server ~]# getenforce 
Permissive

永久关闭:
[root@server ~]# vim /etc/sysconfig/selinux
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled    //关闭    重启机器生效
  1. 配置yum源

  2. 软件三步曲

    • 查看和安装相对应的软件包

[root@server ~]# yum list|grep telnet
telnet.x86_64                           1:0.17-47.el6_3.1                 server
telnet-server.x86_64                    1:0.17-47.el6_3.1                 server
[root@server ~]# yum list|grep xinetd
xinetd.x86_64                           2:2.3.14-39.el6_4                 server

[root@server ~]# yum -y install telnet-server xinetd
    • 确认软件成功安装
[root@server ~]# rpm -q xinetd telnet-server
xinetd-2.3.14-39.el6_4.x86_64
telnet-server-0.17-47.el6_3.1.x86_64
    • 查看软件带来的文件列表
[root@server ~]# rpm -ql xinetd
/etc/rc.d/init.d/xinetd
/etc/xinetd.conf        //主配置文件
/usr/sbin/xinetd        //二进制命令
/etc/xinetd.d/            //子配置文件的主目录

[root@server ~]# rpm -ql telnet-server
/etc/xinetd.d/telnet    //telnet服务的子配置文件
/usr/sbin/in.telnetd    //二进制命令(程序)

   4. 了解相关的配置文件

RHEL6/CentOS6:
主配置文件
cat /etc/xinetd.conf  |grep -v ^# |grep -v ^$
defaults
{
    log_type    = SYSLOG daemon info   --日志类型,表示使用syslog进行服务登记。
    log_on_failure    = HOST                 --失败日志,失败后记录客户机的IP地址。
    log_on_success    = PID HOST DURATION EXIT  --成功日志,记录客户机的IP地址和进程ID
    cps        = 50 10  表示每秒50个连接,如果超过限制,则等待10秒。主要用于对付拒绝服务攻击。
    instances    = 50  最大连接数
    per_source    = 10  每个IP地址最大连接数
    v6only        = no  不使用ipv6
    groups        = yes  确定该服务的进程组ID,/etc/group
    umask        = 002  文件生成码反掩码   666(664) 777(775)
}
includedir /etc/xinetd.d  外部调用的目录


子配置文件
cat /etc/xinetd.d/telnet 
# default: on
# description: The telnet server serves telnet sessions; it uses \
#       unencrypted username/password pairs for authentication.
service telnet
{
        disable = no                    默认开启服务,=yes表示关闭
        flags           = REUSE       标记
        socket_type     = stream     tcp协议
        wait            = no        表示不需等待,即服务将以多线程的方式运行,并发连接;yes表示单线程
        user            = root      以root身份启动该进程
        server          = /usr/sbin/in.telnetd   二进制命令
        log_on_failure  += USERID       表示设置失败时,UID添加到系统登记表
}

  5.根据需求通过修改配置文件来完成服务的搭建

service telnet
{
        flags           = REUSE
        socket_type     = stream
        wait            = no
        user            = root
        server          = /usr/sbin/in.telnetd
        log_on_failure  += USERID
        disable         = no
}

  6.启动服务,开机自启动

[root@server ~]# /etc/init.d/xinetd start
Starting xinetd:                                           [  OK  ]
[root@server ~]# netstat -nltp|grep xinetd
tcp        0      0 :::23                       :::*                        LISTEN      7471/xinetd         
[root@server ~]# chkconfig xinetd on
[root@server ~]# chkconfig --list|grep xinetd 
xinetd             0:off    1:off    2:on    3:on    4:on    5:on    6:off
xinetd based services:

  7.测试验证

  client端:

[root@client ~]# telnet 10.1.1.2
Trying 10.1.1.2...
Connected to 10.1.1.2.
Escape character is '^]'.
CentOS release 6.5 (Final)
Kernel 2.6.32-431.el6.x86_64 on an x86_64
login: root
Password: 
Login incorrect

说明:默认情况下不允许root用户登录,可以通过以下方式让root用户登录:
[root@server ~]# mv /etc/securetty /etc/securetty.bak
注意:不建议root直接登录

再次测试登录成功:
[root@client ~]# telnet 10.1.1.2
Trying 10.1.1.2...
Connected to 10.1.1.2.
Escape character is '^]'.
CentOS release 6.5 (Final)
Kernel 2.6.32-431.el6.x86_64 on an x86_64
login: root
Password: 
Last login: Tue Apr 17 10:31:49 from 10.1.1.1
[root@server ~]#

[root@client ~]# telnet 10.1.1.2
Trying 10.1.1.2...
Connected to 10.1.1.2.
Escape character is '^]'.
CentOS release 6.5 (Final)
Kernel 2.6.32-431.el6.x86_64 on an x86_64
login: stu1
Password: 
Last login: Mon Apr 16 17:02:29 from 10.1.1.3
[stu1@server ~]$ ls

三、综合案例

根据需求来配置telnet服务

要求1:只允许192.168.0.254和192.168.0.2访问;通过user01 密码123登录

要求2:只允许192.168.0.0/24网段,拒绝192.168.0.2访问

 
只允许10.1.1.0/24网段的所有人来访问,除了10.1.1.3

[root@server ~]# cat /etc/xinetd.d/telnet 
# default: on
# description: The telnet server serves telnet sessions; it uses \
#    unencrypted username/password pairs for authentication.
service telnet
{
    flags        = REUSE
    socket_type    = stream        
    wait        = no
    user        = root
    server        = /usr/sbin/in.telnetd
    log_on_failure    += USERID
    disable        = no
    no_access    = 10.1.1.3
    only_from    = 10.1.1.0/24
}

 

要求3:以上基础上增加一些功能 man xinetd.conf

1)控制这个服务最多只能3个连接,每个源IP只能1个连接

2)控制只能9:00到18:00才能telnet连接

3)指定日志记录到/var/log/xinetd_telnet.log里

4)更改更改telnet服务的默认端口号10023

service telnet
{
    flags        = REUSE
    socket_type    = stream        
    wait        = no
    user        = root
    server        = /usr/sbin/in.telnetd
    log_on_failure    += USERID
    disable        = no
    instances    = 3
    per_source    = 1
    access_times    = 9:00-12:00 14:30-17:30
    log_type    = FILE /var/log/xinetd_telnet.log
    port        = 10023
}

注意:端口号改变后需要修改/etc/services文件,端口号必须保持一致
[root@server ~]# grep telnet /etc/services 
telnet          10023/tcp
telnet          10023/udp

root@server ~]# netstat -nltp|grep 10023
tcp        0      0 :::10023                    :::*                        LISTEN      8036/xinetd 

测试验证:

 

 

课后扩展:

根据telnet安装步骤,搭建tftp服务

  • tftp服务:简单文件传输协议 udp 69端口

  • 用途 :小文件的传输(pxe网络安装文件)

要求:
1、只允许工作时间9:30 -- 12:00,2:00 -- 5:30访问 
2、只允许192.168.0.1和192.168.0.2访问
3、每个IP最多连接2次,最大连接数是3
4、修改端口号为10069

 

Linx之FTP服务

课程目标

  • 了解FTP服务器的应用场景

  • 了解FTP服务器的两种工作模式

  • 掌握FTP服务的基本配置

  • 能够根据需求对FTP进行访问控制

一、FTP服务介绍

FTP(File Transfer Protocol)是一种应用非常广泛并且古老的一个互联网文件传输协议。

 

  • 主要用于互联网中文件的双向传输(上传/下载)、文件共享

  • 跨平台 Linux、Windows

  • FTP是C/S架构,拥有一个客户端和服务端,使用TCP协议作为底层传输协议,提供可靠的数据传输

  • FTP的默认端口 21号(命令端口) 20号(数据端口) 默认被动模式下

  • FTP程序(软件)vsftpd

 

二、开胃菜-搭建简易FTP服务器

思路:

  • 关闭防火墙和selinux

  • 配置yum源

  • 软件三步曲(安装|确认|软件列表)

  • 了解配置文件——>(man 5 xxx.conf)

  • 根据需求通过修改配置文件来完成服务的搭建

  • 启动服务,开机自启动

  • 测试验证

三、FTP服务的客户端工具

Linux:ftp、lftp(客户端程序)

Windows:FileZilla、IE、Chrome、Firefox

lftp和ftp工具区别:

  • lftp可以批量并且下载目录

lftp localhost:~> mirror remote local  下载整个目录到本地
lftp localhost:~> mirror -R local remote  rename 上传整个目录到远程同时可以重命名

四、FTP服务的两种工作模式

  • 主动模式

 

  1. 客户端打开大于1023的随机命令端口和大于1023的随机数据端口向服务的的21号端口发起请求

  2. 服务端的21号命令端口响应客户端的随机命令端口

  3. 服务端的20号端口主动请求连接客户端的随机数据端口

  4. 客户端的随机数据端口进行确认

  • 被动模式

 

  1. 客户端打开大于1023的随机命令端口和大于1023的随机数据端口向服务的的21号端口发起请求

  2. 服务端的21号命令端口响应客户端的随机命令端口

  3. 客户端主动连接服务端打开的大于1023的随机端口

  4. 服务端进行确认

思考1:

FTP的主动模式好还是被动模式好?

lftp localhost:~> mirror remote local  下载整个目录到本地
lftp localhost:~> mirror -R local remote  rename 上传整个目录到远程同时可以重命名

五、FTP服务的基本配置

1. FTP服务的基本应用

默认安装:没有任何需求

环境:

node1:FTP-server 10.1.1.2

node2:client 10.1.1.3

步骤:

1.1 关闭防火墙和selinux

1.2 配置yum源

1.3 软件三步曲

  • 安装软件 vsftpd

  • 确认安装成功
[root@ftp-server ftp]# rpm -q vsftpd
vsftpd-2.2.2-11.el6_4.1.x86_64
  • 查看软件带来的文件列表
/etc/logrotate.d/vsftpd            //日志轮转的文件
/etc/pam.d/vsftpd                //安全认证
/etc/rc.d/init.d/vsftpd            //启动脚本
/etc/vsftpd                        //配置文件的主目录
/etc/vsftpd/ftpusers            //用户列表(黑名单)
/etc/vsftpd/user_list            //用户列表(默认黑名单|可黑可白)
/etc/vsftpd/vsftpd.conf            //主配置文件
/usr/sbin/vsftpd            //二进制命令


/usr/share/doc/vsftpd-2.2.2/EXAMPLE/VIRTUAL_HOSTS
/usr/share/doc/vsftpd-2.2.2/EXAMPLE/VIRTUAL_HOSTS/README    //虚拟主机
/usr/share/doc/vsftpd-2.2.2/EXAMPLE/VIRTUAL_USERS    
/usr/share/doc/vsftpd-2.2.2/EXAMPLE/VIRTUAL_USERS/README    //虚拟用户

/usr/share/man/man5/vsftpd.conf.5.gz            //man文档

/var/ftp            //匿名用户的默认数据的根目录
/var/ftp/pub        //匿名用户的默认数据目录的扩展目录

1.4 了解配置文件

主配置文件:man 5 vsftpd.conf

[root@ftp-server ~]# grep -v ^# /etc/vsftpd/vsftpd.conf 
anonymous_enable=YES    //支持匿名用户访问    
local_enable=YES        //非匿名用户
write_enable=YES        //写总开关
local_umask=022            //反掩码  file:644  dir:755
dirmessage_enable=YES    //启用消息功能
xferlog_enable=YES        //开启或启用xferlog日志
connect_from_port_20=YES    //支持主动模式(默认被动模式)
xferlog_std_format=YES        //xferlog日志格式
listen=YES                    //ftp服务独立模式下的监听

pam_service_name=vsftpd    //指定认证文件
userlist_enable=YES        //启用用户列表
tcp_wrappers=YES        //支持tcp_wrappers功能

1.5 根据需求通过修改配置文件来完成服务的搭建

没需求

1.6 启动服务,开机自启动

[root@ftp-server ~]# netstat -nltp|grep vsftpd
tcp        0      0 0.0.0.0:21                  0.0.0.0:*                   LISTEN      3534/vsftpd  

1.7 测试验证

clinet:

Linux:
[root@client ~]# lftp stu1@10.1.1.2
Password: 
lftp stu1@10.1.1.2:~> put install.log
52124 bytes transferred                        
lftp stu1@10.1.1.2:~> exit
[root@client ~]# ftp 10.1.1.2
Connected to 10.1.1.2 (10.1.1.2).
220 (vsFTPd 2.2.2)
Name (10.1.1.2:root): stu1
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (10,1,1,2,168,207).
150 Here comes the directory listing.
-rw-r--r--    1 500      500         52124 Apr 19 03:52 install.log
-rw-rw-r--    1 500      500            12 Apr 19 03:51 test1
226 Directory send OK.
ftp> put install.log.syslog 
local: install.log.syslog remote: install.log.syslog
227 Entering Passive Mode (10,1,1,2,83,153).
150 Ok to send data.
226 Transfer complete.
10033 bytes sent in 0.105 secs (95.86 Kbytes/sec)
ftp> ls
227 Entering Passive Mode (10,1,1,2,92,62).
150 Here comes the directory listing.
-rw-r--r--    1 500      500         52124 Apr 19 03:52 install.log
-rw-r--r--    1 500      500         10033 Apr 19 03:54 install.log.syslog
-rw-rw-r--    1 500      500            12 Apr 19 03:51 test1
226 Directory send OK.
ftp> exit
221 Goodbye.


[root@client ~]# ftp 10.1.1.2
Connected to 10.1.1.2 (10.1.1.2).
220 (vsFTPd 2.2.2)
Name (10.1.1.2:root): ftp
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls


总结:
1. ftp    默认使用用户名和密码登录    ——>ftp 或者匿名用户
2. lftp 默认使用的匿名用户登录        ——> lftp 10.1.1.2:/> user username
                              ——>lftp user@ip
                              
3. 工具不知道咋用  里面输入?或者 man ftp 和lftp

总结:

  • 匿名用户可以下载文件但是不能上传文件

  • 本地用户可以上传和下载文件

需求1:允许匿名用户上传文件
[root@ftp-server vsftpd]# cat vsftpd.conf 
anonymous_enable=YES
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES

pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES

测试验证:
[root@client ~]# lftp 10.1.1.2
lftp 10.1.1.2:~> ls
-rw-r--r--    1 0        0               0 Apr 19 02:45 file1
-rw-r--r--    1 0        0               0 Apr 19 02:45 file2
-rw-r--r--    1 0        0               0 Apr 19 02:45 file3
-rw-r--r--    1 0        0               0 Apr 19 02:45 file4
-rw-r--r--    1 0        0               0 Apr 19 02:45 file5
drwxr-xr-x    2 0        0            4096 Mar 01  2013 pub
lftp 10.1.1.2:/> put install.log
put: Access failed: 553 Could not create file. (install.log)
lftp 10.1.1.2:/> 
原因:匿名用户的默认数据根目录/var/ftp没有写权限
解决:
chmod o+w /var/ftp

解决后遇到另外一个问题:如下

[root@client ~]# ftp 10.1.1.2
Connected to 10.1.1.2 (10.1.1.2).
220 (vsFTPd 2.2.2)
Name (10.1.1.2:root): ftp
331 Please specify the password.
Password:
500 OOPS: vsftpd: refusing to run with writable anonymous root
Login failed.
ftp> exit
[root@client ~]# lftp 10.1.1.2
lftp 10.1.1.2:~> ls
ls: Login failed: 500 OOPS: vsftpd: refusing to run with writable anonymous root
lftp 10.1.1.2:~> exit

原因:/var/ftp数据目录权限太大  o+w  777
解决:chmod o-w 

最终想让匿名用户上传文件的解决办法是:
1.在/var/ftp目录里自己创建一个数据目录或者直接将匿名用户的数据上传到pub目录
2.将/var/ftp/pub目录权限给o+w 或者777
需求2:下载其他匿名用户上传的文件
anon_umask=022

测试验证:
[root@client ~]# lftp 10.1.1.2
lftp 10.1.1.2:~> ls
-rw-r--r--    1 0        0               0 Apr 19 02:45 file2
-rw-r--r--    1 0        0               0 Apr 19 02:45 file3
-rw-r--r--    1 0        0               0 Apr 19 02:45 file4
-rw-r--r--    1 0        0               0 Apr 19 02:45 file5
-rw-------    1 14       50          52124 Apr 19 06:42 install.log
drwxr-xrwx    2 0        0            4096 Apr 19 06:48 pub
-rw-r--r--    1 0        0               0 Apr 19 02:45 test1
lftp 10.1.1.2:/> cd pub/
lftp 10.1.1.2:/pub> ls
-rw-------    1 14       50          52124 Apr 19 06:48 install.log
lftp 10.1.1.2:/pub> put install.log.syslog 
10033 bytes transferred
lftp 10.1.1.2:/pub> ls
-rw-------    1 14       50          52124 Apr 19 06:48 install.log
-rw-r--r--    1 14       50          10033 Apr 19 07:01 install.log.syslog
//更改完anon_umask后,匿名用户上传的文件权限就变成了644,其他人就可以下载文件了
lftp 10.1.1.2:/pub> 
需求3:开启本地用户消息功能

1)本地用户访问——>/home/username

[root@ftp-server ~]# echo "welcome to my home" > /home/stu1/.message

2)匿名用户访问——>/var/ftp

[root@ftp-server ~]# echo "welcome to anon home" > /var/ftp/.message

测试验证:

[root@client ~]# ftp 10.1.1.2
Connected to 10.1.1.2 (10.1.1.2).
220 (vsFTPd 2.2.2)
Name (10.1.1.2:root): stu1
331 Please specify the password.
Password:
230-welcome to myhome
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> exit
221 Goodbye.
[root@client ~]# ftp 10.1.1.2
Connected to 10.1.1.2 (10.1.1.2).
220 (vsFTPd 2.2.2)
Name (10.1.1.2:root): ftp
331 Please specify the password.
Password:
230-welcome to anon home
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> 
ftp> exit
221 Goodbye.

另外一种情况:

1. 修改配置文件指定消息文件
banner_file=/etc/vsftpd/banner_file

2. 创建消息文件
vim /etc/vsftpd/banner_file
......

3. 测试验证

[root@client ~]# ftp 10.1.1.2
Connected to 10.1.1.2 (10.1.1.2).
220-@@@@@@@@@@@
220--------            -------
220-
220-哈哈哈哈h
220-嘿嘿嘿
220-
220 
Name (10.1.1.2:root): ftp
331 Please specify the password.
Password:
230-welcome to anon home
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> 
需求4:禁锢本地用户的家,只能在自己的家中活动

1)禁锢所有的本地用户

chroot_local_user=YES //禁锢所有的本地用户(不能随便跳转)

2)禁锢大部分用户,允许小部分

chroot_local_user=YES

chroot_list_enable=YES //启用用户文件列表

chroot_list_file=/etc/vsftpd/chroot_list //定义用户文件列表

3)允许大部分,禁锢小部分

chroot_local_user=NO 或者 # chroot_local_user=YES

chroot_list_enable=YES //启用用户文件列表

chroot_list_file=/etc/vsftpd/chroot_list //定义用户文件列表

 

需求5:指定匿名用户和本地用户上传文件的目录

课堂练习:

按照如下要求搭建一个ftp服务器:

1)允许匿名用户上传文件,并且可以下载其他用户上传的文件

anon_upload_enable=YES

anon_umask=022

2)匿名用户上传的文件都保存在/anon/data里

默认:/var/ftp

mkdir /anon/data -p

vim /etc/vsftpd/vsftpd.conf

...

anon_root=/anon

chmod o+w /anon/data

 

3)本地用户上传的文件都保存到/local/data里

默认:/home/username

mkdir /local/data -p

...

local_root=/local/data

 

4)禁锢所有用户的家,不能来回跳转

chroot_local_user=YES

 

2. FTP服务的访问控制

  • FTP服务的自身访问控制(对象访问控制)

    ftpusers 黑名单

    user_list 默认是黑名单(可以成为白名单)

需求1:不允许stu1用户访问ftp服务

echo stu1 >> /etc/vsftpd/ftpusers

需求2:只允许stu2用户访问ftp服务

1)修改配置文件将user_list文件变成白名单

userlist_deny=NO

2)将stu2用户加入到user_list文件中

echo stu2 >> user_list

 

总结:

  1. 用户在ftpusers文件中,那么用户不能访问ftp服务器

  2. 用户在user_list文件中,如果该文件是白名单,那么在该文件中的用户可以访问ftp服务

  3. 如果user_list文件是白名单,用户即在ftpusers中又在user_list中,那么ftpusers拒绝优先

 

  • FTP服务的网络访问控制

    • 支持tcp_wrappers

      /etc/hosts.allow

      /etc/hosts.deny

    • 写法

/etc/hosts.deny
vsftpd:all                        全部拒绝
vsftpd:all  EXCEPT 192.168.0.2    拒绝所有除了192.168.0.2  
vsftpd:192.168.0.254      拒绝单个ip地址=hosts.allow文件里增加vsftpd:192.168.0.254:deny
vsftpd:192.168.0.0/255.255.255.0   拒绝某个网段
vsftpd:192.168.0.0/255.255.255.0 EXCEPT 192.168.0.254   拒绝某个网段,但是除了某个ip地址
注意:子网掩码不支持192.168.0.0/24这种写法

思考2: 如何判断一个服务是否支持tcp_wrappers?

1)./configure --enable-libwrap 表示支持tcp_wrappers访问控制

 

2)rpm安装

[root@ftp-server vsftpd]# ldd /usr/sbin/vsftpd |grep libwrap*
    libwrap.so.0 => /lib64/libwrap.so.0 (0x00007f2956480000)

[root@ftp-server vsftpd]# ldd /usr/sbin/sshd |grep libwrap*
    libwrap.so.0 => /lib64/libwrap.so.0 (0x00007f015ff29000)

需求:拒绝10.1.1.0/24和192.168.91.0/24网段的所有人访问,除了10.1.1.3服务器

vim /etc/hosts.deny
vsftpd:10.1.1.0/255.255.255.0,192.168.91.0/255.255.255.0 EXCEPT 10.1.1.3

总结:FTP访问控制

1、对象的访问控制(用户)

ftpusers 和 user_list

2、网络访问控制

  • tcp_wrappers工具——>/etc/hosts.allow和/etc/hosts.deny

  • 托管给xinetd服务去管理

 

课后作业:

  • 准备环境:

主机1(server):FTP服务器 主机2(client):FTP客户端

  • 根据需求搭建自己的FTP服务器:

  1. 匿名用户可以到/anon/data目录里上传下载文件,同时也可以下载其他人所上传的文件;

    mkdir /anon/data -p

    anon_root=/anon

    anon_upload_enable=YES

    anon_umask=022

    chmod o+w /anon/data

  2. 客户端可以使用zhangsan(自己名字),访问你的ftp服务器,但是不能登录ftp服务器的操作系统,并且只能在自己的家目录中活动;

    FTP的server端创建用户zhangsan

    useradd -s /sbin/nologin zhangsan

    chroot_local_user=YES

    或者

    chroot_local_user=NO

    chroot_list_enable=YES

    chroot_list_file=/etc/vsftpd/chroot_list

    echo zhangsan >> /etc/vsftpd/chroot_list

     

  3. zhangsan(自己名字)用户可以上传下载文件,并且所有本地用户上传的文件都存放在/local/data;

    local_root=/local/data

  4. 在客户端/tmp/zhangsan(自己名字)下面创建5个文件,叫file{1..5},通过客户端工具以匿名用户身份将/tmp/zhangsan整个以你名字命名的目录上传到FTP服务器的data目录中;

    lftp localhost:~> mirror remote local 下载整个目录到本地 lftp localhost:~> mirror -R local remote rename 上传整个目录到远程同时可以重命名

     

  5. 客户端通过redhat用户(密码redhat)下载FTP服务器上的"2016-12-23"文件(自己创建)到你本地/tmp/zhangsan(自己名字)目录里;

     

  6. 不允许192.168.0.254访问你的ftp服务,但是只允许192.168.0.1访问。

    /etc/hosts.deny

  7. 固定服务器端被动模式下的端口号范围为2000~2050

    pasv_max_port=2050

    pasv_min_port=2000

  8. 限制匿名用户下载文件的速率为500kbps,最大连接数为10个

    anon_max_rate=500000

    max_clients=10

 

扩展:FTP的虚拟主机

  • 基于IP的虚拟主机

  • 基于端口的虚拟主机

eth0:10.1.1.2 只允许本地用户访问

eth1:10.1.1.3 只允许匿名用户访问,并且各种限制

 

/usr/share/doc/vsftpd-2.2.2/EXAMPLE/VIRTUAL_HOSTS /usr/share/doc/vsftpd-2.2.2/EXAMPLE/VIRTUAL_HOSTS/README

 

 

NFS服务

课程目标1

  • 了解NFS服务器的应用场景及特点

  • 掌握NFS服务器实现读/写文件共享

  • 掌握NFS Client 访问及挂载

一、NFS服务介绍

NFS(Network File System)网络文件系统

  • 主要用于linux系统上实现文件共享的一种协议,其客户端主要是Linux

  • 没有用户认证机制,且数据在网络上传送的时候是明文传送,一般只能在局域网中使用

  • 支持多节点同时挂载及并发写入

企业应用:为集群中的web server提供后端存储

该服务包括的组件:

RPC(Remote Procedure Call Protocol): 远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,不需要了解底层网络技术的协议。

rpcbind //负责NFS的数据传输,远程过程调用 tcp协议 端口111

nfs-utils //控制共享哪些文件,权限管理

二、NFS服务器搭建

nfs-utils-1.2.3-26.el6.x86_64         nfs服务的一个脚本控制工具(服务端与客户端)
nfs4-acl-tools-0.3.3-6.el6.x86_64    acl 工具包
nfs-utils-lib-1.1.5-4.el6.x86_64      nfs 库文件

[root@server ~]# rpm -q rpcbind
rpcbind-0.2.0-11.el6.x86_64
[root@server ~]# rpm -aq|grep ^nfs
nfs-utils-1.2.3-39.el6.x86_64
nfs-utils-lib-1.1.5-6.el6.x86_64
nfs4-acl-tools-0.3.3-6.el6.x86_64
/etc/exports  man 5 exports

共享目录        共享选项
/nfs/share      *(ro,sync)
共享主机:
*   :代表所有主机
192.168.0.0/24:代表共享给某个网段
192.168.0.0/24(rw) 192.168.1.0/24(ro) :代表共享给不同网段
192.168.0.254:共享给某个IP
*.itcast.com:代表共享给某个域下的所有主机
共享选项:
ro:只读
rw:读写
sync:实时同步,直接写入磁盘
async:异步,先缓存在内存再同步磁盘
anonuid:设置访问nfs服务的用户的uid,uid需要在/etc/passwd中存在
anongid:设置访问nfs服务的用户的gid
root_squash :默认选项 root用户创建的文件的属主和属组都变成nfsnobody,其他人server端是它自己,client端是nobody。
no_root_squash:root用户创建的文件属主和属组还是root,其他人server端是它自己uid,client端是nobody。
all_squash: 不管是root还是其他普通用户创建的文件的属主和属组都是nfsnobody

说明:
anonuid和anongid参数和all_squash一起使用。
all_squash表示不管是root还是其他普通用户从客户端所创建的文件在服务器端的拥有者和所属组都是nfsnobody;服务端为了对文件做相应管理,可以设置anonuid和anongid进而指定文件的拥有者和所属组。

需求1:共享本地/share/nfs目录给所有人,以读写方式共享

server端:
1. mkdir /share/nfs -p
2. vim /etc/exports
/share/nfs    *(rw)

3. 启动服务
service rpcbind restart
service nfs start

client端测试:
mkdir /u01
mount.nfs 10.1.1.2:/share/nfs /u01
df -h
...
10.1.1.2:/share/nfs              18G  4.4G   13G  27% /u01    说明挂载成功

测试写入:
[root@client ~]# cd /u01
[root@client u01]# ls
file1  file2  file3  file4  file5
[root@client u01]# touch file6
touch: cannot touch `file6': Permission denied        //权限拒绝

原因:server端的共享目录权限不够
解决:
[root@server ~]# ll -d /share/nfs/
drwxr-xr-x 2 root root 4096 Apr 20 09:53 /share/nfs/
[root@server ~]# chmod o+w /share/nfs/

[root@client u01]# touch file6
[root@client u01]# ls
file1  file2  file3  file4  file5  file6

[root@server ~]# ll /share/nfs/
total 0
-rw-r--r-- 1 root      root      0 Apr 20 09:53 file1
-rw-r--r-- 1 root      root      0 Apr 20 09:53 file2
-rw-r--r-- 1 root      root      0 Apr 20 09:53 file3
-rw-r--r-- 1 root      root      0 Apr 20 09:53 file4
-rw-r--r-- 1 root      root      0 Apr 20 09:53 file5
-rw-r--r-- 1 nfsnobody nfsnobody 0 Apr 20 10:03 file6

课堂练习:

  1. 搭建一个NFS服务,将本机的/nfs/share目录共享给192.168.91.0/24网段和10.1.1.2,10.1.1.3主机,192网段以读写的方式访问,10网段以只读的方式共享

  • server端 10.1.1.2

1. mkdir /nfs/share    
2. vim /etc/exports
   /nfs/share192.168.91.0/24(rw) 10.1.1.2(ro) 10.1.1.3(ro)
  • 客户端挂载到本地/u01目录里

  client端 10.1.1.3

 1. 创建一个空的目录 挂载点   /u01
 2. mount.nfs 10.1.1.2:/nfs/share /u01
   或者
      mount -t nfs 10.1.1.2:/nfs/share /u01
例1:NFS自动挂载家目录

 

思路:
A主机上:
1. 需要创建相应的用户user1~user3   eg:user1——> /user1(挂载点)
B主机上:
搭建NFS服务,将/nfs/share共享出来
A主机上:
1. 挂载B主机上的共享目录到指定挂载点上

测试验证:
在A主机进行

步骤:
环境:
FTP-server:10.1.1.2
NFS-server:10.1.1.3
client:10.1.1.4

方法1实现:
FTP-server上完成
1. 创建用户并且指定用户的家目录
[root@ftp-server ~]# mkdir /rhome
[root@ftp-server ~]# useradd -d /rhome/user01 -M user01
[root@ftp-server ~]# useradd -d /rhome/user02 -M user02
[root@ftp-server ~]# useradd -d /rhome/user03 -M user03

[root@ftp-server ~]# echo 123|passwd --stdin user01
Changing password for user user01.
passwd: all authentication tokens updated successfully.
[root@ftp-server ~]# echo 123|passwd --stdin user02
Changing password for user user02.
passwd: all authentication tokens updated successfully.
[root@ftp-server ~]# echo 123|passwd --stdin user03
Changing password for user user03.
passwd: all authentication tokens updated successfully.

NFS-server操作:
[root@nfs-server ~]# mkdir /data/{user01,user02,user03}        //创建相应的目录
[root@nfs-server ~]# cat /etc/exports 
/data    10.1.1.2(rw)

[root@nfs-server ~]# service nfs restart

FTP-server端操作:

[root@ftp-server ~]# mkdir /rhome/user0{1..3}
[root@ftp-server ~]# mount.nfs 10.1.1.3:/data/user01 /rhome/user01
[root@ftp-server ~]# df -h
Filesystem                      Size  Used Avail Use% Mounted on
/dev/mapper/vg_misshou-lv_root   18G  4.4G   13G  27% /
tmpfs                           491M   76K  491M   1% /dev/shm
/dev/sda1                       485M   35M  426M   8% /boot
/dev/sr0                        4.2G  4.2G     0 100% /iso
.host:/                         489G   30G  459G   7% /mnt/hgfs
10.1.1.3:/data/user01            20G  172M   19G   1% /rhome/user01    //挂载成功

client测试验证:
1. 首先测试user01是否能在FTP-server端正常登录:
[root@ftp-server ~]# su - user01 
-bash-4.1$ pwd
/rhome/user01
-bash-4.1$         //这种情况是家不完整

家不完整怎么解决:
直接使用当前用户拷贝指定的相关文件:
-bash-4.1$ cp /etc/skel/.bash* .
cp: cannot create regular file `./.bash_logout': Permission denied
cp: cannot create regular file `./.bash_profile': Permission denied
cp: cannot create regular file `./.bashrc': Permission denied

原因:NFS-server端共享目录没有写权限
解决:NFS-SERVER端
[root@nfs-server user01]# chmod 1777 /data/ -R
[root@nfs-server user01]# ll

补充高级权限:o+t  粘滞位  一般作用在公共的目录上(777)  只能自己管理自己,在该目录下,只有root和文件的创建者可以删除,其他人不可以删除不属于自己的文件

[root@client ~]# ll -d /tmp/
drwxrwxrwt. 13 root root 4096 Apr 20 13:56 /tmp/


-bash-4.1$ cp /etc/skel/.bash* .        //拷贝成功
-bash-4.1$ 
//退出重新登录,家完整了
-bash-4.1$ exit        
logout
[root@ftp-server ~]# su - user01
[user01@ftp-server ~]$ 


-bash-4.1$ cd /etc/skel
-bash-4.1$ cp .bashrc .bash_logout .bash_profile /home/uu1

[root@ftp-server ~]# su - user01
[user01@ftp-server ~]$


2. 测试客户端访问ftp服务

[root@client ~]# ftp 10.1.1.2
Connected to 10.1.1.2 (10.1.1.2).
220 (vsFTPd 2.2.2)
Name (10.1.1.2:root): user01
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (10,1,1,2,71,48).
150 Here comes the directory listing.
226 Directory send OK.
//以上登录成功,没有文件

在NFS-server端的/data/user01创建一个测试文件file1,再次查看就可以看到
ftp> ls
227 Entering Passive Mode (10,1,1,2,92,180).
150 Here comes the directory listing.
-rw-r--r--    1 0        0              12 Apr 20 06:53 file1
226 Directory send OK.
//之前已经给/data目录加了1777权限,所以也可以上传文件,如果上传失败请检查目录权限

ftp> put install.log
local: install.log remote: install.log
227 Entering Passive Mode (10,1,1,2,143,2).
150 Ok to send data.
226 Transfer complete.
52124 bytes sent in 0.0968 secs (538.39 Kbytes/sec)
ftp> 
-rwxrwxrwt 1 root root    12 Apr 20 14:53 file1
-rw-rw-r-- 1  503  505     0 Apr 20 14:58 file2
-rw-r--r-- 1  503  505 52124 Apr 20 14:58 install.log


方法2实现:
FTP-SERVER:10.1.1.2
NFS-SERVER:10.1.1.3
client:10.1.1.4

步骤:
FTP-server操作:
1. 创建用户
useradd uu1        ——>/home/uu1
useradd uu2        ——>/home/uu2

NFS-server操作:
1. 在/data目录里给用户创建相应的目录
mkdir /data/uu1
mkdir /data/uu1

2. 给共享目录设置相应的权限
chmod 1777 /data -R

3. 发布共享目录
vim /etc/exports
/data    10.1.1.2(rw)

4. 重启nfs服务
service nfs restart

FTP-server端操作:
uu1用户:
mount.nfs 10.1.1.3:/data/uu1    /home/uu1
示例2:实现web集群后端存储

 

NFS-SERVER端:共享目录,并且创建一个首页文件
1. mkdir /share/web -p
2. echo "hello world 我爱你们" > /share/web/index.html
3. vim /etc/exports
/share/web    10.1.1.0/24(ro)
4. 重启服务(nfs)
service nfs restart
或者
[root@nfs-server ~]# exportfs -rv

WEB1服务端:
1. 安装httpd软件
2. 挂载nfs-server端的共享目录到/var/www/html
3. 启动服务

[root@web1 ~]# rpm -q httpd
httpd-2.2.15-29.el6.centos.x86_64
[root@web1 ~]# ls /var/www/html/
[root@web1 ~]# mount -t nfs 10.1.1.2:/share/web /var/www/html
[root@web1 ~]# df -h
Filesystem                      Size  Used Avail Use% Mounted on
/dev/mapper/vg_misshou-lv_root   18G  4.2G   13G  26% /
tmpfs                           491M   76K  491M   1% /dev/shm
/dev/sda1                       485M   35M  426M   8% /boot
/dev/sr0                        4.2G  4.2G     0 100% /media/CentOS_6.5_Final
10.1.1.2:/share/nfs              18G  4.4G   13G  27% /u01
10.1.1.2:/share/web              18G  4.4G   13G  27% /var/www/html
[root@web1 ~]# ls /var/www/html/
index.html
[root@web1 ~]# service httpd start
Starting httpd: httpd: apr_sockaddr_info_get() failed for web1
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
                                                           [  OK  ]

WEB2服务端:
1. 安装httpd软件
2. 挂载nfs-server端的共享目录到/var/www/html
3. 启动服务


问题:httpd服务启动不了,报
[root@web2 ~]# service httpd start
Starting httpd: Syntax error on line 292 of /etc/httpd/conf/httpd.conf:
DocumentRoot must be a directory
                                                           [FAILED]
解决:
setenforce 0


测试验证:

windows:
IE:
http://10.1.1.3
http://10.1.1.3
结果:可以看到相同的页面

SAMBA服务(扩展)

课程目标2

  • Samba服务器的应用场景及特点

  • Samba服务器的搭建与配置

  • 基于用户名/密码的企业综合案例

一、samba介绍

  • SMB(Server Message Block)协议实现文件共享,也称为CIFS(Common Internet File System )

  • 是Windows和类Unix系统之间共享文件的一种协议

  • 客户端主要是Windows;支持多节点同时挂载以及并发写入

  • 主要用于windows和Linux下的文件共享、打印共享

  • 实现匿名与本地用户文件共享

Samba服务的主要进程:

  • smbd进程 控制发布共享目录与权限、负责文件传输 TCP 139 445

  • nmbd进程 用于名称解析netbios UDP 137 138 ;基于NETBIOS协议获得计算机名称——>解析为相应IP地址,实现信息通讯

NetBIOS是Network Basic Input/Output System的简称,一般指用于局域网通信的一套API

二、samba服务器搭建

[root@smb-server ~]# rpm -aq|grep ^samba
samba-3.6.9-164.el6.x86_64
samba-common-3.6.9-164.el6.x86_64
samba-winbind-3.6.9-164.el6.x86_64
samba-client-3.6.9-164.el6.x86_64
samba-winbind-clients-3.6.9-164.el6.x86_64
samba4-libs-4.0.0-58.el6.rc4.x86_64

配置文件:

/etc/samba/smb.conf
[global]  全局选项
    workgroup = MYGROUP                 定义samba服务器所在的工作组
    server string = Samba Server Version %v         smb服务的描述
    log file = /var/log/samba/log.%m            日志文件
    max log size = 50                   日志的最大大小KB  
    security = user             认证模式:share匿名|user用户密码|server外部服务器用户密码
    passdb backend = tdbsam         密码格式
    load printers = yes         加载打印机
    cups options = raw          打印机选项
[homes]                 局部选项(共享名称)
    comment = Home Directories      描述
    browseable = no      隐藏共享名称
    writable = yes      可读可写
[printers]      共享名称
    comment = All Printers       描述
    path = /var/spool/samba  本地的共享目录
    browseable = no  隐藏
    guest ok = no ——>   public = no  需要帐号和密码访问
    writable = no  ——>  read only =yes 不可写 
    printable = yes      打印选项

客户端工具如何使用:

[root@client ~]# smbclient -L //10.1.1.2    查看samba服务器的共享名
Enter root's password: 回车        匿名用户查看
Anonymous login successful

将zhagnsan本地用户加入到smb数据库中:
[root@smb-server ~]# smbpasswd -a zhangsan
New SMB password:
Retype new SMB password:
Added user zhangsan.
[root@smb-server ~]# pd
pdbedit    pdf2ps     pdfimages  pdfopt     pdftoppm   pdftotext  
pdf2dsc    pdffonts   pdfinfo    pdftohtml  pdftops    
[root@smb-server ~]# pdbedit -L
zhangsan:508:

[root@client ~]# smbclient //10.1.1.2/zhangsan -U zhangsan    //指定用户名访问samba服务
Enter zhangsan's password: 
Domain=[MYGROUP] OS=[Unix] Server=[Samba 3.6.9-164.el6]
smb: \> ls


需求:让匿名用户访问/samba/share共享资源,本地用户不能访问

[anon_share]
    path=/samba/share
    public = yes
    writable = yes


[root@client ~]# smbclient //10.1.1.2/anon_share(共享标签名称)        /匿名用户可以访问
Enter root's password: 
Anonymous login successful
Domain=[MYGROUP] OS=[Unix] Server=[Samba 3.6.9-164.el6]
smb: \> 


[root@client ~]# smbclient //10.1.1.2/anon_share -U zhangsan    //本地用户可以访问
Enter zhangsan's password: 
Domain=[MYGROUP] OS=[Unix] Server=[Samba 3.6.9-164.el6]
smb: \> ls

通过挂载的方式访问:
[root@client ~]# mount.cifs -o user=zhangsan,pass=123 //10.1.1.2/anon_share /u01


总结:
1. samba服务默认是基于用户名和密码认证的服务
2. samba服务的用户必须是samba服务器上存在的用户,密码必须是samba数据库里的密码
3. 对于发布的共享资源,默认情况下本地用户是可以访问的,匿名用户是否访问看是否打开public=yes

访问控制:

控制读写权限
    writable = yes/no
    readonly = yes/no

如果资源可写,但只允许某些用户可写,其他都是只读
write list = admin, root, @staff(用户组)
read list = mary, @students

控制访问对象
    valid users = tom mary 
    invalid users = tom
注意:以上两个选项只能存在其中一个

网络访问控制:
hosts deny = 192.168.0.   拒绝某个网段
host allow = 192.168.0.254  允许某个IP
hosts deny = all  拒绝所有
hosts allow = 192.168.0. EXCEPT 192.168.0.254  允许某个网段,但拒绝某个单个IP
注意:deny和allow同时存在,allow优先

综合案例:

公司:itcast,有三个部门cw,rs,sc和一个公共区pub,每个部门的资料根据如下需求进行共享:

1、财务部门 /samba/itcast_cw ,cw01财务总监有可读可写权限,财务部门员工可读,boss01对其有管理权限。

2、市场部门 /samba/itcast_sc,市场部门员工可读可写,公司员工可以查询资料,boss02对其有管理权限。

3、HR部门 /samba/itcast_rs ,rs01HR总监可读写,HR部门员工可以对财务部查询,vip用户可以查询

4、休息区 /samba/ticast_pub 自己管理自己的文件

步骤:
1. 在服务器上创建相应的目录保存不同部门的资料
mkdir /smb/{cw,rs,sc,pub} -p
2. 创建相应的用户组(方便管理)
groupadd itcast
groupadd cw
groupadd rs
groupadd sc

useradd cw01 -g cw -G itcast
useradd cw02 -g cw -G itcast
useradd rs01 -g rs -G itcast
useradd rs02 -g rs -G itcast
useradd sc01 -g sc -G itcast
useradd sc02 -g sc -G itcast
useradd boss01 -g itcast
useradd boss02 -g itcast

useradd vip

3. 修改相应目录的权限

4. 搭建samba服务,共享不同部门的资料
vim /etc/samba/smb.conf
...
[cw]
    path=/smb/cw
    valid users = boss01,@cw,@rs
    write list = cw01,boss01

[rs]
    path=/smb/rs
    valid users = vip,@rs
    write list = rs01

[sc]
    path=/smb/sc
    valid users = @itcast
    write list = @sc,boss02

[pub]
    path=/smb/pub
    valid users = @itcast
    writable = yes

5. 将用户加入到samba数据库里
smbpasswd -a cw01
...

6. 测试验证
Linux:
windows:

总结:

  1. ftp 局域网和外网都可以

  2. nfs 局域网 挂载方式访问 mount.nfs

  3. samba 局域网 直接访问(smbclinet) 挂载的方式

三、综合案例代码参考

1. 创建相应的目录用户组
root@smb-server ~]# mkdir /smb/{cw,rs,sc,pub} -p
[root@smb-server ~]# groupadd itcast
[root@smb-server ~]# groupadd cw
[root@smb-server ~]# groupadd rs
[root@smb-server ~]# groupadd sc
[root@smb-server ~]# useradd cw01 -g cw -G itcast
[root@smb-server ~]# useradd cw02 -g cw -G itcast
[root@smb-server ~]# useradd rs01 -g rs -G itcast
[root@smb-server ~]# useradd rs02 -g rs -G itcast
[root@smb-server ~]# useradd sc01 -g sc -G itcast
[root@smb-server ~]# useradd sc02 -g sc -G itcast
[root@smb-server ~]# useradd boss01 -g itcast
[root@smb-server ~]# useradd boss02 -g itcast
[root@smb-server ~]# useradd vip

2. 搭建samba服务,修改配置文件,发布共享目录
[root@smb-server ~]# tail -19 /etc/samba/smb.conf 
[cw]
    path=/smb/cw
    valid users = boss01,@cw,@rs
    write list = cw01,boss01

[rs]
    path=/smb/rs
    valid users = vip,@rs
    write list = rs01

[sc]
    path=/smb/sc
    valid users = @itcast
    write list = @sc,boss02

[pub]
    path=/smb/pub
    valid users = @itcast,vip    //是否让vip查看公共资源,根据需求
    writable = yes


3. 将用户加入到smb数据库里,设密码
[root@smb-server ~]# smbpasswd -a cw01
New SMB password:
Retype new SMB password:
Added user cw01.
[root@smb-server ~]# smbpasswd -a cw02
New SMB password:
Retype new SMB password:
Added user cw02.
[root@smb-server ~]# smbpasswd -a rs01
New SMB password:
Retype new SMB password:
Added user rs01.
[root@smb-server ~]# smbpasswd -a rs02
New SMB password:
Retype new SMB password:
Added user rs02.
[root@smb-server ~]# smbpasswd -a sc01
New SMB password:
Retype new SMB password:
Added user sc01.
[root@smb-server ~]# smbpasswd -a sc02
New SMB password:
Retype new SMB password:
Added user sc02.
[root@smb-server ~]# smbpasswd -a boss01
New SMB password:
Retype new SMB password:
Added user boss01.
[root@smb-server ~]# smbpasswd -a boss02
New SMB password:
Retype new SMB password:
Added user boss02.
[root@smb-server ~]# smbpasswd -a vip
New SMB password:
Retype new SMB password:
Added user vip.

4. 启动服务
[root@smb-server ~]# service nmb start
Starting NMB services:                                     [  OK  ]
[root@smb-server ~]# service smb start
Starting SMB services:                                     [  OK  ]
[root@smb-server ~]# 

5. 测试验证:
[root@client ~]# smbclient //10.1.1.2/cw -U cw01
Enter cw01's password: 
Domain=[MYGROUP] OS=[Unix] Server=[Samba 3.6.9-164.el6]
smb: \> ls
  .                                   D        0  Sat Apr 21 10:12:11 2018
  ..                                  D        0  Sat Apr 21 10:12:11 2018

        35418 blocks of size 524288. 25177 blocks available
smb: \> mkdir aaa        //创建失败
NT_STATUS_ACCESS_DENIED making remote directory \aaa

原因:smb服务端/smb/cw目录没有写权限;查看smb服务的相关目录权限:
[root@smb-server ~]# ll -d /smb/
drwxr-xr-x. 6 root root 4096 Apr 21 10:12 /smb/

[root@smb-server ~]# ll -d /smb/*
drwxr-xr-x. 2 root root 4096 Apr 21 10:12 /smb/cw
drwxr-xr-x. 2 root root 4096 Apr 21 10:12 /smb/pub
drwxr-xr-x. 2 root root 4096 Apr 21 10:12 /smb/rs
drwxr-xr-x. 2 root root 4096 Apr 21 10:12 /smb/sc

6. 统一更改权限:原则权限最小化
//权限最小化
[root@smb-server ~]# chmod 700 -R /smb
[root@smb-server ~]# chgrp itcast /smb
[root@smb-server ~]# chgrp cw /smb/cw
[root@smb-server ~]# chgrp rs /smb/rs
[root@smb-server ~]# chgrp sc /smb/sc
[root@smb-server ~]# chgrp itcast /smb/pub


[root@smb-server ~]# ll -d /smb/
drwx------. 6 root itcast 4096 Apr 21 10:12 /smb/
[root@smb-server ~]# ll -d /smb/*
drwx------. 2 root cw     4096 Apr 21 10:12 /smb/cw
drwx------. 2 root itcast 4096 Apr 21 10:12 /smb/pub
drwx------. 2 root rs     4096 Apr 21 10:12 /smb/rs
drwx------. 2 root sc     4096 Apr 21 10:12 /smb/sc

//根据需求增加权限
[root@smb-server ~]# setfacl -m g:itcast:rx /smb
[root@smb-server ~]# setfacl -m g:cw:rwx /smb/cw
[root@smb-server ~]# setfacl -m g:rs:rwx /smb/rs
[root@smb-server ~]# setfacl -m g:sc:rwx /smb/sc
[root@smb-server ~]# chmod 1777 /smb/pub/
[root@smb-server ~]# 
[root@smb-server ~]# setfacl -m u:vip:rx /smb/
[root@smb-server ~]# setfacl -m u:vip:rx /smb/rs/

[root@smb-server ~]# id boss01
uid=506(boss01) gid=500(itcast) groups=500(itcast)
[root@smb-server ~]# id boss02
uid=507(boss02) gid=500(itcast) groups=500(itcast)
[root@smb-server ~]# setfacl -m u:boss01:rwx /smb/cw
[root@smb-server ~]# setfacl -m g:rs:rx /smb/cw
[root@smb-server ~]# setfacl -m u:boss02:rwx /smb/sc


7. 继续测试验证

[root@client ~]# smbclient //10.1.1.2/cw -U cw01
Enter cw01's password: 
Domain=[MYGROUP] OS=[Unix] Server=[Samba 3.6.9-164.el6]
smb: \> ls
  .                                   D        0  Sat Apr 21 10:12:11 2018
  ..                                  D        0  Sat Apr 21 10:12:11 2018

        35418 blocks of size 524288. 25177 blocks available
smb: \> mkdir aaa
smb:\>  创建成功

//boss01可以读写
[root@client ~]# smbclient //10.1.1.2/cw -U boss01
Enter boss01's password: 
Domain=[MYGROUP] OS=[Unix] Server=[Samba 3.6.9-164.el6]
smb: \> mkdir bbb
smb: \> 

//cw02只能读不能写
[root@client ~]# smbclient //10.1.1.2/cw -U cw02
Enter cw02's password: 
Domain=[MYGROUP] OS=[Unix] Server=[Samba 3.6.9-164.el6]
smb: \> ls
  .                                   D        0  Sat Apr 21 10:48:15 2018
  ..                                  D        0  Sat Apr 21 10:12:11 2018
  aaa                                 D        0  Sat Apr 21 10:45:23 2018
  bbb                                 D        0  Sat Apr 21 10:48:15 2018

        35418 blocks of size 524288. 25177 blocks available
smb: \> mkdir ccc
NT_STATUS_MEDIA_WRITE_PROTECTED making remote directory \ccc
smb: \> 

//人事部门可以查看财务部门的资料,但是不能写
[root@client ~]# smbclient //10.1.1.2/cw -U rs01
Enter rs01's password: 
Domain=[MYGROUP] OS=[Unix] Server=[Samba 3.6.9-164.el6]
smb: \> ls
  .                                   D        0  Sat Apr 21 10:48:15 2018
  ..                                  D        0  Sat Apr 21 10:12:11 2018
  aaa                                 D        0  Sat Apr 21 10:45:23 2018
  bbb                                 D        0  Sat Apr 21 10:48:15 2018

        35418 blocks of size 524288. 25177 blocks available
smb: \> mkdir ccc
NT_STATUS_MEDIA_WRITE_PROTECTED making remote directory \ccc
smb: \> 

//cw01没有权限访问rs部门的资料,直接拒绝
[root@client ~]# smbclient //10.1.1.2/rs -U cw01
Enter cw01's password: 
Domain=[MYGROUP] OS=[Unix] Server=[Samba 3.6.9-164.el6]
tree connect failed: NT_STATUS_ACCESS_DENIED

剩下的自己测试,测试有问题,去看目录和服务的权限
...

 DNS服务

DNS域名管理服务

课程目标

  • DNS服务的作用及工作原理

  • DNS服务的正向和反向解析配置

  • DNS服务的主从同步搭建

一、DNS介绍

DNS(domain name system ) 域名管理系统

  • 域名:

由特定的格式组成,用来表示互联网中某一台计算机或者计算机组的名称,能够是人更方便的访问互联网,而不用记住能够被机器直接读取的IP地址。

1. DNS的作用
  • 域名的正向解析

    将主机域名转换为对应的IP 地址,以便网络程序能够通过主机域名访问到对应的服务器主机

    域名——>IP A记录

  • 域名的反向解析

    将主机的IP地址转换为对应的域名,以便网络(服务)程序能够通过IP地址查询到主机的域名

    IP——>域名 PTR记录

2. DNS的结构

 

根域 .

  • 在整个 DNS 系统的最上方一定是 . (小数点) 这个 DNS 服务器 (称为 root),也叫”根域“。

  • 根域 <13台 全世界只有13台。1个为主根服务器,放置在美国。其余12个均为辅根服务器,其中9个放置在美国,欧洲2个,位于英国和瑞典,亚洲1个,位于日本。>

一级域名<顶级域|国家域>

com edu gov org cc io| cn uk us ru ja ko

二级域名

qq.com baidu.com google.com

域名机构

收费<新网|万网> 老牌免费域名:TK顶级域名、TK域名DNS、TK域名商

http://www.freehao123.com

3. DNS工作原理

 如果询问一次得到结果 递归查询 C-S

如果询问多次得到结果 迭代查询 S-S

 

一次递归 多次迭代

 

dig +trace www.baidu.com      追踪dns解析过程
dig @server www.baidu.com      正向解析查询
dig -x 192.168.0.1 @server  反向解析查询
dig +trace www.baidu.com      追踪一个域名解析过程

二、DNS服务器搭建

  • DNS 的域名解析都是 udp/53 . 主从之间的数据传输默认使用tcp/53

  • DNS软件:

    Bind是一款开放源码的DNS服务器软件,Bind由美国加州大学Berkeley(伯克利)分校开发和维护的,全名为Berkeley Internet Name Domain它是目前世界上使用最为广泛的DNS服务器软件,支持各种unix平台和windows平台。BIND现在由互联网系统协会(Internet Systems Consortium)负责开发与维护。

需求1:

搭建DNS服务器,能够将www.misshou.io解析成192.168.1.254——>正向解析

环境:

DNS-server :10.1.1.2

client:10.1.1.3

思路:

  1. 关闭防火墙和selinux

  2. 配置yum源

  3. 软件三步曲

    • 查看并安装软件

    • 确认成功安装

    • 查看软件列表

  4. 了解配置文件(语法|参数配置)——>man 5 xxx.conf

  5. 根据需求通过修改配置文件完成服务的搭建

  6. 启动服务,开机自启动

  7. 测试验证

步骤:

DNS-server上完成:

  1. 关闭防火墙和selinux

[root@dns-server ~]# service iptables stop
[root@dns-server ~]# chkconfig iptables off
[root@dns-server ~]# getenforce 
Enforcing
[root@dns-server ~]# setenforce 0
[root@dns-server ~]# getenforce 
Permissive
[root@dns-server ~]# vim /etc/sysconfig/selinux 
[root@dns-server ~]# grep ^SELINUX /etc/sysconfig/selinux 
SELINUX=disabled
SELINUXTYPE=targeted 
  1. 配置yum源

 

  1. 软件三步曲

  • 查看并安装软件

yum -y install bind
  • 确认成功安装
[root@dns-server ~]# rpm -q bind
bind-9.8.2-0.17.rc1.el6_4.6.x86_64
  • 查看软件的文件列表
/etc/logrotate.d/named            //日志轮转文件
/etc/named                        //配置文件的主目录
/etc/named.conf                    主配置文件
/etc/named.rfc1912.zones         zone文件,定义域
/etc/rc.d/init.d/named             启动脚本

/usr/sbin/named                    二进制命令
/usr/sbin/named-checkconf        检查配置文件的命令    named.conf   named.rfc1912.zones
/usr/sbin/named-checkzone        检查区域文件的命令

/var/log/named.log                日志文件
/var/named                        数据文件的主目录
/var/named/data
/var/named/named.ca                根域服务器
/var/named/named.empty
/var/named/named.localhost        正向解析区域文件的模板
/var/named/named.loopback        反向解析区域文件的模板
/var/named/slaves                从dns服务器下载文件的默认路径
/var/run/named                    进程文件
  1. 了解配置文件

主配置文件:

vim /etc/named.conf
options {
        listen-on port 53 { 127.0.0.1; any; };      监听方式 ,any表示全网监听
        directory       "/var/named";    
        dump-file       "/var/named/data/cache_dump.db";      DNS缓存
        statistics-file "/var/named/data/named_stats.txt";      统计
        memstatistics-file "/var/named/data/named_mem_stats.txt";  内存统计
        allow-query     { localhost; any; };   允许哪些人可以查询;any代表任何人
        recursion yes;  是否递归  
 
        dnssec-enable no;       dns安全扩展机制(签名认证)
        dnssec-validation no;              
        dnssec-lookaside auto;

        /* Path to ISC DLV key */
        bindkeys-file "/etc/named.iscdlv.key";

        managed-keys-directory "/var/named/dynamic";
};
说明:
DNSSEC 域名系统安全,他是DNS的安全扩展协议
DLV DNSSEC 后备密钥
这些安全机制的设定,是为了保护DNS服务器与用户之间的数据安全,避免恶意数据对用户的欺骗

zone "." IN {     根域服务器
        type hint;
        file "named.ca";
};

include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";

子配置文件:

vim /etc/named.rfc1912.zones
...
//定义正向域的模板
zone "localhost.localdomain" IN {
    type master;
    file "named.localhost";
    allow-update { none; };
};

//定义反向的模板
zone "1.0.0.127.in-addr.arpa" IN {
    type master;
    file "named.loopback";
    allow-update { none; };
};



# cat /var/named/named.localhost

$TTL  缓存的生存周期
@ = zonename = itcast.com  当前域
IN  互联网
SOA 开始授权
NS  dns服务端    nameserver
A   ipv4 正向
AAAA IPV6
CNAME 别名
MX  邮件交互记录  5 数字代表优先级 数字越小优先级越高


$TTL 1D
@       IN SOA  @ root.itcast.cn. (
                                        0       ; serial     更新序列号    
                                        1D      ; refresh    更新间隔(从服务器下载数据)
                                        1H      ; retry      失败重试
                                        1W      ; expire     区域文件的过期时间
                                        3H )    ; minimum    缓存的最小生存周期

5.根据需求通过修改配置文件来完成服务的搭建

www.misshou.io——>192.168.1.254

1. 修改主配置文件/etc/named.conf——>监听方式和允许谁来查询
options {
        listen-on port 53 { 127.0.0.1;any; };        any全网监听
        listen-on-v6 port 53 { ::1; };
        directory       "/var/named";
        dump-file       "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        allow-query     { localhost;any; };            any允许任何人查询
        recursion yes;

        dnssec-enable no;
        dnssec-validation no;
        dnssec-lookaside auto;

        /* Path to ISC DLV key */
        bindkeys-file "/etc/named.iscdlv.key";

        managed-keys-directory "/var/named/dynamic";
};
。。。。

2. 修改子配置文件/etc/named.rfc1912.zones    ——>定义管理域 misshou.io
[root@dns-server ~]# vim /etc/named.rfc1912.zones
在该文件最后面增加以下内容:
zone "misshou.io" IN {
        type master;
        file "misshou.io.zone";            //文件名自己写,么有要求
        allow-update { none; };
};

3. 在/var/named目录里创建相应的zone文件
[root@dns-server ~]# cp -p /var/named/named.localhost /var/named/misshou.io.zone
[root@dns-server ~]# ll /var/named/misshou.io.zone 
-rw-r-----. 1 root named 152 Jun 21  2007 /var/named/misshou.io.zone

[root@dns-server ~]# vim /var/named/misshou.io.zone 
[root@dns-server ~]# cat /var/named/misshou.io.zone 
$TTL 1D
@    IN SOA    misshou.io. rname.invalid. (
                    0    ; serial
                    1D    ; refresh
                    1H    ; retry
                    1W    ; expire
                    3H )    ; minimum
@    NS    dns1.misshou.io.            //dns1可以随便指定,但是后面的A记录保持一致就行
dns1    A    10.1.1.2            //前两行一定是当前DNS服务器的IP
www        A    192.168.1.254            

4. 使用命令检查配置文件的语法是否有误
[root@dns-server ~]# named-checkconf /etc/named.conf
[root@dns-server ~]# named-checkconf /etc/named.rfc1912.zones
[root@dns-server ~]# cd /var/named/
[root@dns-server named]# ls
data  dynamic  misshou.io.zone  named.ca  named.empty  named.localhost  named.loopback  slaves
[root@dns-server named]# named-checkzone misshou.io.zone misshou.io.zone //区域文件写2遍
zone misshou.io.zone/IN: loaded serial 0
OK

6.启动服务,开机自启动

[root@dns-server named]# service named start
Generating /etc/rndc.key:                                  [  OK  ]
Starting named:                                            [  OK  ]
[root@dns-server named]# chkconfig named on

[root@dns-server named]# netstat -nltup|grep 53
tcp        0      0 10.1.1.2:53                 0.0.0.0:*                   LISTEN      33354/named         
tcp        0      0 127.0.0.1:53                0.0.0.0:*                   LISTEN      33354/named         
tcp        0      0 127.0.0.1:953               0.0.0.0:*                   LISTEN      33354/named         
tcp        0      0 ::1:53                      :::*                        LISTEN      33354/named         
tcp        0      0 ::1:953                     :::*                        LISTEN      33354/named         
udp        0      0 10.1.1.2:53                 0.0.0.0:*                               33354/named         
udp        0      0 127.0.0.1:53                0.0.0.0:*                               33354/named         
udp        0      0 ::1:53                      :::*                                    33354/named  
  1. 测试验证

client:10.1.1.3

. 指定DNS服务器
[root@client ~]# echo nameserver 10.1.1.2 > /etc/resolv.conf 
[root@client ~]# cat /etc/resolv.conf 
nameserver 10.1.1.2
2. 使用相应的工具测试
[root@client ~]# nslookup www.misshou.io
Server:        10.1.1.2
Address:    10.1.1.2#53

Name:    www.misshou.io
Address: 192.168.1.254

[root@client ~]# dig @10.1.1.2 www.misshou.io
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6_4.6 <<>> @10.1.1.2 www.misshou.io
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 994
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1

;; QUESTION SECTION:
;www.misshou.io.            IN    A

;; ANSWER SECTION:
www.misshou.io.        86400    IN    A    192.168.1.254

;; AUTHORITY SECTION:
misshou.io.        86400    IN    NS    dns1.misshou.io.

;; ADDITIONAL SECTION:
dns1.misshou.io.    86400    IN    A    10.1.1.2

;; Query time: 0 msec
;; SERVER: 10.1.1.2#53(10.1.1.2)
;; WHEN: Sun Apr 22 11:52:51 2018
;; MSG SIZE  rcvd: 83


[root@client ~]# host www.misshou.io
www.misshou.io has address 192.168.1.254

结果:
1. 看到以上信息说明正向解析没有问题
2. 不能够反向解析,原因没有配置
3. 如果配置文件没有错误,服务业启动了,那么解析不了检查你的防火墙selinux还有网络

思考:如何去配置反向解析?

需求2:

搭建DNS服务器实现,正向反向解析 192.168.1.254 ——> www.misshou.io

步骤:

1. /etc/named.conf    主配置文件    
2. /etc/named.rfc1912.zones        定义了misshou.io正向域
[root@dns-server ~]# vim /etc/named.rfc1912.zones
增加如下内容:
zone "1.168.192.in-addr.arpa" IN {
        type master;
        file "192.168.1.zone";
        allow-update { none; };
};

3. 创建192.168.1.zone文件
[root@dns-server ~]# cp -p /var/named/named.loopback /var/named/192.168.1.zone
[root@dns-server ~]# vim /var/named/192.168.1.zone 
[root@dns-server ~]# cat /var/named/192.168.1.zone 
$TTL 1D
@    IN SOA    misshou.io. rname.invalid. (
                    0    ; serial
                    1D    ; refresh
                    1H    ; retry
                    1W    ; expire
                    3H )    ; minimum
@    NS    abc.misshou.io.    //如果abc.misshou.io在正向区域文件里存在,可以不用写下面的A记录
abc    A    10.1.1.2
254    PTR    www.misshou.io.        //192.168.1.254

4. 重启服务


5. 测试验证

[root@client ~]# echo nameserver 10.1.1.2 >/etc/resolv.conf 
[root@client ~]# cat /etc/resolv.conf 
nameserver 10.1.1.2
[root@client ~]# nslookup www.misshou.io
Server:        10.1.1.2
Address:    10.1.1.2#53

Name:    www.misshou.io
Address: 192.168.1.254

[root@client ~]# nslookup 192.168.1.254
Server:        10.1.1.2
Address:    10.1.1.2#53

254.1.168.192.in-addr.arpa    name = www.misshou.io.


[root@client ~]# dig @10.1.1.2 -x 192.168.1.254

[root@client ~]# host 192.168.1.254
254.1.168.192.in-addr.arpa domain name pointer www.misshou.io.

课堂练习:

根据如下需求搭建一个DNS服务器:

  1. 正向解析

    bbs.test.org ——>172.16.10.110

    www.momowu.cc——>192.168.0.254

  2. 反向解析

将以上的IP反向解析

DNS-server:10.1.1.2
步骤:
1. 修改主配置文件 /etc/named.conf
略  ——>两个any
2. 修改子配置文件  /etc/named.rfc1912.zones    ——>定义DNS管理的域
在该文件的后面增加如下内容:
zone "test.org" IN {
    type master;
    file "test.org.zone";
    allow-update { none; };
};

zone "momowu.cc" IN {
    type master;
    file "momowu.cc.zone";
    allow-update { none; };
};

zone "10.16.172.in-addr.arpa" IN {
    type master;
    file "172.16.10.zone";
    allow-update { none; };
};

zone "0.168.192.in-addr.arpa" IN {
    type master;
    file "192.168.0.zone";
    allow-update { none; };
};

3. 在/var/named里创建相应的区域文件
//清空之前的环境
[root@dns-server named]# rm -f 192.168.1.zone misshou.io.zone
//创建相应的区域文件
[root@dns-server named]# cp -p named.localhost test.org.zone
[root@dns-server named]# cp -p named.localhost momowu.cc.zone
[root@dns-server named]# cp -p named.loopback 192.168.0.zone
[root@dns-server named]# cp -p named.loopback 172.16.10.zone
//修改区域文件
[root@dns-server named]# cat test.org.zone momowu.cc.zone 172.16.10.zone 192.168.0.zone 
$TTL 1D
@    IN SOA    test.org. rname.invalid. (
                    0    ; serial
                    1D    ; refresh
                    1H    ; retry
                    1W    ; expire
                    3H )    ; minimum
@    NS    a.test.org.
a    A    10.1.1.2
bbs    A    172.16.10.110
$TTL 1D
@    IN SOA    momowu.cc. rname.invalid. (
                    0    ; serial
                    1D    ; refresh
                    1H    ; retry
                    1W    ; expire
                    3H )    ; minimum
@    NS    b.momowu.cc.
b    A    10.1.1.2
www    A    192.168.0.254
$TTL 1D
@    IN SOA    test.org. rname.invalid. (
                    0    ; serial
                    1D    ; refresh
                    1H    ; retry
                    1W    ; expire
                    3H )    ; minimum
@    NS    a.test.org.
110    PTR    bbs.test.org.
$TTL 1D
@    IN SOA    momowu.cc. rname.invalid. (
                    0    ; serial
                    1D    ; refresh
                    1H    ; retry
                    1W    ; expire
                    3H )    ; minimum
@    NS    b.momowu.cc.
254    PTR    www.momowu.cc.


4. 重启服务
service named restart

5.测试验证
[root@client ~]# cat /etc/resolv.conf 
nameserver 10.1.1.2
[root@client ~]# nslookup bbs.test.org
Server:        10.1.1.2
Address:    10.1.1.2#53

Name:    bbs.test.org
Address: 172.16.10.110

[root@client ~]# nslookup www.momowu.cc
Server:        10.1.1.2
Address:    10.1.1.2#53

Name:    www.momowu.cc
Address: 192.168.0.254

[root@client ~]# nslookup 172.16.10.110
Server:        10.1.1.2
Address:    10.1.1.2#53

110.10.16.172.in-addr.arpa    name = bbs.test.org.

[root@client ~]# nslookup 192.168.0.254
Server:        10.1.1.2
Address:    10.1.1.2#53

254.0.168.192.in-addr.arpa    name = www.momowu.cc.

三、主从DNS搭建

1. 搭建时间同步服务器

ntp-server:10.1.1.4

方法1:

ntp (network time protocol) 端口:123

[root@ntp-server ~]# vim /etc/ntp.conf
restrict 192.168.1.0 mask 255.255.0.0 nomodify notrap   
restrict 172.16.0.0 mask 255.255.0.0 nomodify notrap    
restrict 10.1.1.0 mask 255.0.0.0 nomodify notrap    //允许10.1.1.0/24网段的主机同步时间

[root@ntp-server ~]# service ntpd start
Starting ntpd:                                             [  OK  ]
[root@ntp-server ~]# netstat -nltpu|grep ntpd
udp        0      0 10.1.1.4:123                0.0.0.0:*                               2885/ntpd           
udp        0      0 127.0.0.1:123               0.0.0.0:*                               2885/ntpd           
udp        0      0 0.0.0.0:123                 0.0.0.0:*                               2885/ntpd           
udp        0      0 fe80::20c:29ff:fea5:6f7a:123 :::*                                    2885/ntpd           
udp        0      0 ::1:123                     :::*                                    2885/ntpd           
udp        0      0 :::123                      :::*                                    2885/ntpd  

客户端同步:
[root@client ~]# ntpdate 10.1.1.4

依赖于外网,同步时间有延迟

方法2:

vim /etc/xinetd.d/time-dgram
...
disable = no

vim /etc/xinetd.d/stream
...
disable = no

service xinetd restart  

netstat -ntlup |grep :37


[root@ntp-server ~]# vim /etc/xinetd.d/time-dgram 
[root@ntp-server ~]# vim /etc/xinetd.d/time-stream 
[root@ntp-server ~]# service xinetd restart
Stopping xinetd:                                           [FAILED]
Starting xinetd:                                           [  OK  ]
[root@ntp-server ~]# netstat -nltup|grep 37
tcp        0      0 :::37                       :::*                        LISTEN      2945/xinetd         
udp        0      0 :::37                       :::*                                    2945/xinetd 

客户端同步时间:
[root@client ~]# date
Sun Apr 22 16:37:43 CST 2018
[root@client ~]# date -s "2020-10-10 11:11:11"
Sat Oct 10 11:11:11 CST 2020

[root@client ~]# rdate -s 10.1.1.4
[root@client ~]# date
Sun Apr 22 16:39:00 CST 2018
2. 部署安装

环境:

master-dns:10.1.1.2

slave-dns:10.1.1.3

ntp-server:10.1.1.4

思路:

  1. master和slave的系统时间保持一致

  2. slave服务器上安装相应的软件(系统版本、软件版本高度保持一致)

  3. 根据需求修改相应的配置文件(master和slave都应该去修改)

步骤:

1. 同步master和slave的系统时间
master和slave上都要操作:
[root@master-dns ~]# crontab -l
*/2 * * * * /usr/bin/rdate -s 10.1.1.4 &>/dev/null

[root@slave-dns ~]# crontab -l
*/2 * * * * /usr/bin/rdate -s 10.1.1.4 &>/dev/null

2. 搭建备用的dns服务器
以下操作在slave上进行
1) 安装软件
yum -y install bind
2) 修改主配置文件
[root@slave-dns ~]# vim /etc/named.conf    定义监听方式以及允许谁来查询
略  两个any
3) 修改子配置文件    /etc/named.rfc1912.zones

在文件的最下面增加如下内容:
zone "test.org" IN {
        type slave;            //类型是slave
        masters {10.1.1.2;};    //指定master dns的ip地址
        file "slaves/slave.test.org";    //同步过来的文件的保存路径及名字
};

zone "momowu.cc" IN {
        type slave;
        masters {10.1.1.2;};
        file "slaves/slave.momowu.cc";
};   

3. 在master上操作
1) /etc/named.conf

2) /etc/named.rfc1912.zones

zone "test.org" IN {
        type master;
        file "test.org.zone";
        allow-update { none; };        //删除
};

zone "momowu.cc" IN {
        type master;
        file "momowu.cc.zone";
        allow-update { none; };        //删除
};

4. 重启服务
master:service named restart

[root@slave-dns slaves]# ll
total 0
[root@slave-dns slaves]# service named start
Generating /etc/rndc.key:                                  [  OK  ]
Starting named:                                            [  OK  ]
[root@slave-dns slaves]# ll
total 8
-rw-r--r--. 1 named named 313 Apr 22 17:06 slave.momowu.cc
-rw-r--r--. 1 named named 309 Apr 22 17:06 slave.test.org

5. 测试验证
client:10.1.1.4
[root@ntp-server ~]# echo nameserver 10.1.1.2 > /etc/resolv.conf 
[root@ntp-server ~]# echo nameserver 10.1.1.3 >> /etc/resolv.conf 
[root@ntp-server ~]# cat /etc/resolv.conf 
nameserver 10.1.1.2
nameserver 10.1.1.3
[root@ntp-server ~]# nslookup bbs.test.org
Server:        10.1.1.2
Address:    10.1.1.2#53

Name:    bbs.test.org
Address: 172.16.10.110

[root@ntp-server ~]# nslookup bbs.test.org
Server:        10.1.1.3
Address:    10.1.1.3#53

Name:    bbs.test.org
Address: 172.16.10.110

[root@ntp-server ~]# nslookup bbs.test.org
Server:        10.1.1.2
Address:    10.1.1.2#53

Name:    bbs.test.org
Address: 172.16.10.110

[root@ntp-server ~]# nslookup 192.168.0.254
Server:        10.1.1.2
Address:    10.1.1.2#53

254.0.168.192.in-addr.arpa    name = www.momowu.cc.

[root@ntp-server ~]# nslookup 192.168.0.254
;; connection timed out; trying next origin
;; connection timed out; no servers could be reached

思考:如果只允许指定的slave来同步数据怎么做?
master:

vim /etc/named.conf
options {
        listen-on port 53 { 127.0.0.1;any; };
        listen-on-v6 port 53 { ::1; };
        allow-transfer {10.1.1.3;};        //指定允许哪个slave来下载数据
        directory       "/var/named";
        dump-file       "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        allow-query     { localhost;any; };
        recursion yes;

        dnssec-enable no;
        dnssec-validation no;
        dnssec-lookaside auto;

        /* Path to ISC DLV key */
        bindkeys-file "/etc/named.iscdlv.key";

        managed-keys-directory "/var/named/dynamic";
};

 Rsyslog系统日志管理

 

课程目标

  • 了解日志的级别及作用

  • 掌握rsyslog服务的本地日志和远程日志的管理;

  • 能够使用logrotate程序根据需求对日志进行轮转

一、常见的系统日志

日志格式:文本日志/二进制日志/数据库日志
默认的相关日志文件:
/var/log/boot.log       系统引导日志,记录开机启动信息
/var/log/dmesg          核心的启动日志
/var/log/messages       系统的日志文件
/var/log/maillog        邮件服务的日志
/var/log/xferlog        ftp服务的日志
/var/log/secure           网络连接及系统登录的安全信息
/var/log/cron            定时任务的日志
/var/log/wtmp           记录所有的登入和登出    last -f 查看
/var/log/btmp           记录失败的登入尝试

二、日志管理程序

  • 在RHEL6中,syslogd已经被rsyslog取代。它可以将日志写入数据库,并可以利用模块和插件控制输入输出。

  • rsyslog程序管理本地和远程日志

    • 安装软件

    • 根据需求修改配置文件

    • 启动服务

    • 测试验证

二、日志级别

# man syslog
日志信息分为以下级别,从上到下级别依次降低
    none       <-- none 不算是一个等级,它表示不记录服务的所有信息
0    emerg      <-- 系统不可用 
1    alert      <-- 特别留意的报警信息
2    crit       <-- 非常严重的状况 
3    err        <-- 错误信息
4    warning    <-- 警告信息
5    notice     <-- 稍微需要注意的信息
6    info       <-- 正常信息
7    debug      <-- 调试信息,开发人员使用

三、日志配置

1. 日志定义相关符号

配置文件中常见的表示符号
.          <-- 用来分隔服务和级别
*          <-- 任何服务,或者任何级别
=          <-- 有等号表示等于某一级别,没有等号表示大于或者等于某一级别
!          <-- 排除操作,前面有相同服务的表达式,这个操作才有意义
               代表从前面表达式所包含的内容中排除某些内容
;          <-- 用于分隔不同的  服务.级别 组合
,          <-- 用于分隔不同的服务
-          <-- 用于指定目标文件时,代表异步写入

举例说明:

mail.=info
mail.info    mail服务的大于等于info级别的日志
mail.info;cron.=info        /var/log/test.log
mail,cron.err    

cron.=warning
mail,cron.info

cron.info;cron.!=err    012456
0123456    0124567
cron.info;cron.!err        456
0123456       4567

2. 了解配置文件

*.info;mail.none;authpriv.none;cron.none                /var/log/messages

特别说明:

说明:
# man rsyslog.conf
The  facility  is one of the following keywords: auth, authpriv,
       cron, daemon, kern, lpr, mail, mark,  news,  security  (same  as
       auth), syslog, user, uucp and local0 through local7.
       
log facility  设备 设施: 用来记录一种类型日志的日志设备

daemon
auth
authpriv
user
mail
lpr
news
uucp
ftp
local0-7

四、本地日志管理

需求1:将本地邮件服务的日志记录到/var/log/test_mail.log里

思路:

  • 软件安装

  • 修改配置文件

  • 启动服务测试验证

    环境:

    log-server:10.1.1.2 mail服务

步骤:

1. 修改配置文件
vim /etc/rsyslog.conf
...
mail.info                                               /var/log/test_mail.log

2. 启动服务
[root@log-server ~]# service rsyslog restart
Shutting down system logger:                               [  OK  ]
Starting system logger:                                    [  OK  ]


3. 测试验证
   1) 发送一封邮件
   echo hello world |mail -s test root
   [root@log-server ~]# echo hahaha |mail -s "test mail log" stu1
   2) 发个log消息测试
   logger 用于往系统中写入日志,他提供一个shell命令接口到syslog系统模块

# logger -t "Loggertest" -p mail.info "Testing log info"
-t        指定标记记录
-p       指定输入消息的优先级,优先级可以是数字或者指定为 " facility.level" 的格式。
-i       逐行记录每一次logger的进程ID

需求2:把ssh的日志指定记录到/var/log/ssh下

思路:

  1. 更改ssh服务的默认日志记录载体(在ssh服务端完成,修改ssh服务的配置文件)

  2. 通过rsyslog程序去管理来自指定设备载体的日志记录到指定的文件(修改/etc/rsyslog.conf)

  3. 测试验证

步骤:

1. 修改ssh服务的默认的日志载体
[root@log-server ~]# vim /etc/ssh/sshd_config
SyslogFacility LOCAL6
2. 重启服务
[root@log-server ~]# service sshd restart
Stopping sshd:                                             [  OK  ]
Starting sshd:                                             [  OK  ]

3. 将来自LOCAL6设备载体的日志记录到指定位置(rsyslog)
[root@log-server ~]# vim /etc/rsyslog.conf
。。。
local6.*                                                /var/log/ssh

4. 重启rsyslog服务
[root@log-server ~]# service rsyslog restart
Shutting down system logger:                               [  OK  ]
Starting system logger:                                    [  OK  ]

5. 测试验证
client端:
[root@client ~]# ssh 10.1.1.2
root@10.1.1.2's password: 
Last login: Mon Apr 23 09:28:20 2018 from 10.1.1.3
[root@log-server ~]# exit
logout
Connection to 10.1.1.2 closed.

查看log-server端的日志文件:
[root@log-server log]# tail -f ssh
Apr 23 11:01:16 log-server sshd[4301]: Accepted password for root from 10.1.1.3 port 54742 ssh2
Apr 23 11:02:10 log-server sshd[4301]: Received disconnect from 10.1.1.3: 11: disconnected by user



结果:
1. 记录到了指定的/var/log/ssh文件里,同事也记录到了/var/log/messages
2. 如果不想记录到/var/log/messages里,修改配置文件如下:
*.info;mail.none;authpriv.none;cron.none;local6.none                /var/log/messages


# man sshd_config
SyslogFacility
             Gives the facility code that is used when logging messages from
             sshd(8).  The possible values are: DAEMON, USER, AUTH, AUTHPRIV,
             LOCAL0, LOCAL1, LOCAL2, LOCAL3, LOCAL4, LOCAL5, LOCAL6, LOCAL7.
             The default is AUTH.

五、远程日志管理

目的:把多台服务器的日志远程记录到其中一台日志服务器集中化管理,方便对其统一分析和管理

环境:

log-server:10.1.1.2

应用服务器:10.1.1.3

ssh服务——>其他人远程访问该应用服务器——>产生ssh服务日志——>远程记录到log-server上

clinet:10.1.1.4

ssh 10.1.1.3——>日志记录10.1.1.2

需求:把web服务器上的ssh的服务日志,远程记录到log-server上

思路:

以下2步在web应用服务器上操作:

  1. 将web服务器上的ssh服务的日志单独记录

    • 指定ssh服务的设备载体

    • 重启服务sshd

  2. 将来自于ssh服务的日志设备载体上的日志远程发送到log-server

以下操作在log-server上完成

  1. 修改配置文件打开日志传输的接收端口

    • 加载模块 tcp|udp

    • 打开接收端口 默认514端口

  2. 启动服务后日志默认会保存到/var/log/messages

 

步骤:

以下操作在log-server(10.1.1.2)服务完成:
1. 加载相应的模块打开接收端口
[root@log-server ~]# vim /etc/rsyslog.conf
# Provides UDP syslog reception        //加载UDP协议的模块,端口514
$ModLoad imudp        
$UDPServerRun 514

# Provides TCP syslog reception     //加载TCP协议的模块,端口514
$ModLoad imtcp
$InputTCPServerRun 514

2. 重启服务
serivce rsyslog restart

[root@log-server ~]# netstat -nltup|grep 514
tcp        0      0 0.0.0.0:514                 0.0.0.0:*                   LISTEN      4683/rsyslogd       
tcp        0      0 :::514                      :::*                        LISTEN      4683/rsyslogd       
udp        0      0 0.0.0.0:514                 0.0.0.0:*                               4683/rsyslogd       
udp        0      0 :::514                      :::*                                    4683/rsyslogd  

以下操作在应用服务器完成(10.1.1.3):
1. 指定ssh服务的日志文件的设备载体
[root@ssh-server ~]# vim /etc/ssh/sshd_config
...
SyslogFacility LOCAL0

2. 重启ssh服务
[root@ssh-server ~]# service sshd restart
Stopping sshd:                                             [  OK  ]
Starting sshd:                                             [  OK  ]

3. 修改/etc/rsyslog.conf文件来指定ssh服务的日志发送到远端去
[root@ssh-server ~]# vim /etc/rsyslog.conf
...
local0.*        @10.1.1.2:514        //@代表UDP协议传输;@@代表TCP协议传输

4. 重启服务
[root@ssh-server ~]# service rsyslog restart
Shutting down system logger:                               [  OK  ]
Starting system logger:                                    [  OK  ]


测试验证(client:10.1.1.4):
[root@client ~]# ssh 10.1.1.3
The authenticity of host '10.1.1.3 (10.1.1.3)' can't be established.
RSA key fingerprint is 9f:71:de:3c:86:25:dd:f0:06:78:ab:ba:96:5a:e4:95.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.1.1.3' (RSA) to the list of known hosts.
root@10.1.1.3's password: 
Last login: Mon Apr 23 11:41:40 2018 from 10.1.1.1
[root@ssh-server ~]# exit
logout
Connection to 10.1.1.3 closed.
log-server端查看:
[root@log-server ~]# tail -f /var/log/messages
Apr 23 11:50:01 ssh-server sshd[4519]: Accepted password for root from 10.1.1.4 port 46450 ssh2

Apr 23 11:51:07 ssh-server sshd[4519]: Received disconnect from 10.1.1.4: 11: disconnected by user

ssh-server端查看(web应用服务器):
[root@ssh-server ~]# tail -f /var/log/messages 
。。。

也有记录,不想记录,修改/etc/rsyslog.conf文件

 六、日志轮转

日志轮循(轮转):日志轮转,切割,备份,归档

  • 为什么要日志轮转?

1、避免日志过大占满/var/log的文件系统

2、方便日志查看

3、 将丢弃系统中最旧的日志文件,以节省空间

4、日志轮转的程序是logrotate

5、 logrotate本身不是系统守护进程,它是通过计划任务crond每天执行

  • 如何进行日志轮转?

    • 了解相关配置文件

      

[root@MissHou ~]# cat /etc/logrotate.conf
# see "man logrotate" for details
# rotate log files weekly
weekly
#以7天为一个周期(每周轮转)
rotate 4
#每4周备份日志文件(保留4份日志文件)
create
#当老的转储文件被归档后,创建一个新的空的转储文件重新记录,权限和原来的转储文件权限一样.
dateext
#用日期来做轮转之后的文件的后缀名
#compress
#指定不压缩转储文件,如需压缩去掉注释就可以了.通过gzip压缩
include /etc/logrotate.d #加载外部目录
# no packages own wtmp and btmp -- we'll rotate them here
/var/log/wtmp {
    monthly     表示此文件是每月轮转,而不会用到上面的每周轮转
    create 0664 root utmp   轮转之后创建新文件,权限是0664,属于root用户和utmp组
    minsize 1M      文件大于1M,而且周期到了,才会轮转
    rotate 1        保留1分日志文件,每1个月备份一次日志文件
}

/var/log/btmp {
    missingok               如果日志文件不存在,不报错
    monthly
    create 0600 root utmp
    rotate 1
}

[root@MissHou ~]# cat /etc/logrotate.d/syslog
//这个子配置文件,没有指定的参数都会以默认方式轮转

/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
{
    sharedscripts       不管有多少个文件待轮转,prerotate 和 postrotate 代码只执行一次
    postrotate           轮转完后执行postrotate 和 endscript 之间的shell代码
        /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true  这一句话表示轮转后对rsyslog的pid进行刷新(但pid其实不变)
    endscript
}

思考:
为什么轮转后需要对rsyslog的pid进行刷新呢?
View Code

需求1:ssh服务的日志单独保存到了/var/log/ssh里,如何进行轮转?

要求:

  1. 每天进行轮转,保留5天的日志文件

  2. 日志文件大小大于5M进行轮转

思路:

  1. 修改logrotate程序的主配置文件增加/var/log/ssh文件的轮转

或者

  1. 在/etc/logrotate.d/目录创建一个文件

步骤:

方法1:修改主配置文件
vim /etc/logrotate.conf
...
/var/log/ssh {
  daily
  rotate    5
  size        5M
  create  
}
测试验证:
[root@log-server log]# find ./ -type f -delete
[root@log-server log]# ls
audit  ConsoleKit  cups  gdm  httpd  ntpstats  ppp  prelink  sa  samba  sssd
[root@log-server log]# service rsyslog restart
Shutting down system logger:                               [  OK  ]
Starting system logger:                                    [  OK  ]
[root@log-server log]# ls
audit     ConsoleKit  cups  httpd    messages  ppp      sa     secure             spooler  sssd
boot.log  cron        gdm   maillog  ntpstats  prelink  samba  spice-vdagent.log  ssh
[root@log-server log]# logrotate -f /etc/logrotate.conf
[root@log-server logrotate.d]# ls /var/log/
audit       cron           gdm      maillog-20180423   ntpstats  sa      secure-20180423    spooler-20180423  sssd
boot.log    cron-20180423  httpd    messages           ppp       samba   spice-vdagent.log  ssh
ConsoleKit  cups           maillog  messages-20180423  prelink   secure  spooler            ssh-20180423

方法2:创建子配置文件
[root@log-server logrotate.d]# pwd
/etc/logrotate.d
[root@log-server logrotate.d]# vim ssh 
/var/log/ssh {
  missingok
  daily
  rotate        5
  size          5M
  create
  nodateext        //不以日期作为后缀
}


测试验证:
[root@log-server logrotate.d]# cd /var/log/
[root@log-server log]# ls
audit       cron           gdm      maillog-20180423   ntpstats  sa      secure-20180423    spooler-20180423  sssd
boot.log    cron-20180423  httpd    messages           ppp       samba   spice-vdagent.log  ssh
ConsoleKit  cups           maillog  messages-20180423  prelink   secure  spooler            ssh-20180423
[root@log-server log]# find ./ -type f -delete
[root@log-server log]# service rsyslog restart
Shutting down system logger:                               [  OK  ]
Starting system logger:                                    [  OK  ]
[root@log-server log]# ls
audit     ConsoleKit  cups  httpd    messages  ppp      sa     secure             spooler  sssd
boot.log  cron        gdm   maillog  ntpstats  prelink  samba  spice-vdagent.log  ssh
[root@log-server log]# logrotate -f /etc/logrotate.conf 
[root@log-server log]# ls
audit       cron           gdm      maillog-20180423   ntpstats  sa      secure-20180423    spooler-20180423  sssd
boot.log    cron-20180423  httpd    messages           ppp       samba   spice-vdagent.log  ssh
ConsoleKit  cups           maillog  messages-20180423  prelink   secure  spooler            ssh.1

 

讨论为什么轮转后需要对rsyslog的pid进行刷新呢?

sharedscripts
    prerotate
        轮转前执行脚本
    endscript
    
sharedscripts
    postrotate
        轮转后执行脚本
    endscript

为什么轮转后要做上面的kill -HUP?    HUP是一个信号,这个信号的默认操作为终止进程

小实验:
准备环境:
不以时间作为后缀去轮转



# logger -t "哈哈" "你好"
# tail -3 /var/log/messages     --默认这条信息在当前的messages里

注释掉以日期为后缀测试:

修改子配置文件 /etc/logrotate.d/syslog
{
    sharedscripts
    postrotate
        logger -t "呵呵" "再见!" 
        /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
    endscript
}

强制轮转
# logrotate -f /etc/logrotate.conf
请问这条信息在轮转后在哪个文件里?
messages.1
结论:先写日志再刷新PID;刷新之前写的日志文件是老的日志文件。
再次编辑子配置文件

{
    sharedscripts
    postrotate
        /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
        logger -t "呵呵" "我又回来啦!" 
    endscript
}
强制轮转
# logrotate -f /etc/logrotate.conf
请问这条信息在轮转后在哪个文件里?
messages
结论:先刷新PID再写日志;日志就会写到新的日志文件里。

常见的一些参数:

常用的指令解释,这些指令都可以在man logrotate 中找得到。
daily                指定转储周期为每天
monthly             指定转储周期为每月
weekly                  <-- 每周轮转一次(monthly)
rotate 4                <-- 同一个文件最多轮转4次,4次之后就删除该文件
create 0664 root utmp   <-- 轮转之后创建新文件,权限是0664,属于root用户和utmp组
dateext                 <-- 用日期来做轮转之后的文件的后缀名
compress                <-- 用gzip对轮转后的日志进行压缩
minsize 30K             <-- 文件大于30K,而且周期到了,才会轮转
size 30k                <-- 文件必须大于30K才会轮转,而且文件只要大于30K就会轮转
                            不管周期是否已到
missingok               <-- 如果日志文件不存在,不报错
notifempty              <-- 如果日志文件是空的,不轮转
delaycompress           <-- 下一次轮转的时候才压缩
sharedscripts           <-- 不管有多少个文件待轮转,prerotate 和 postrotate 代码只执行一次
prerotate               <-- 如果符合轮转的条件
                            则在轮转之前执行prerotate和endscript 之间的shell代码
postrotate              <-- 轮转完后执行postrotate 和 endscript 之间的shell代码

思考:

日志管理服务器所接收过来的日志如何保存到指定的文件里?

  1. 这件事情需要再日志管理服务器端完成

  2. 将接收过来的日志单独管理保存称为本地日志管理

  3. 可以通过定义模板的方式完成

[root@log-server log]# vim /etc/rsyslog.conf

在该文件的最后面加入以下内容:
//定义一个模板DynFile,将日志保存在/var/log里,文件名为system-客户端的主机名.log
$template DynFile,"/var/log/system-%HOSTNAME%.log"    
//动态加载调用上面的模板
local0.*    ?DynFile

结果:
web1日志客户端发过来的日志就会单独保存在/var/log/system-web1.log,这样就实现了日志的单独保存

 

作业

作业1:将authpriv设备日志记录到/var/log/auth.log

vim /etc/rsyslog.conf

authpriv.* /var/log/auth.log

 

作业2:改变应用程序sshd的日志设备为local5, 并定义local5设备日志记录到/var/log/local5.local

vim /etc/ssh/sshd_config

SyslogFacility LOCAL5

vim /etc/rsyslog.conf

local5.* /var/log/local5.local

 

作业3: 要求如下:

  1. 记录所有日志类型的 info 级别以及大于 info 级别的信息,保存到/var/log/test,但是 mail 邮件信息,authpriv 验证方面的信息和 cron 时间任务相关的信息除外

vim /etc/rsyslog.conf

*.info;mail.none;authpriv.none;cron.none;local5.none /var/log/test

 

  1. /var/log/test 日志轮询方式为:

1> 每天轮询一次; 2> 保留 4 个文件; 3> 以时间命名; 4> 创建与原日志同名的新文件。

/var/log/test {

daily

rotate 4

create

}

/etc/logrotate.conf

vim /etc/logrotate.d/test

 

 

 

课后作业:

  1. 将ftp服务的日志保存在/var/log/ftp.log

    方法1:
    
    rsyslog ——>设备载体——>/etc/rsyslog.conf——>设备.* /var/logxxxx
    
    xinetd.conf vsftpd log_type = SYSLOG xxx info
    
    方法2:
    
    xferlog_enable=YES
    
    xferlog_std_format=YES
    
    xferlog_file=/var/log/ftp.log
    
    或者
    
    dual_log_enable=YES
    
    xferlog_enable=YES
    
    xferlog_file=/var/log/ftp.log
    
    vsftpd_log_file=/var/log/test_vsftpd.log

     

     

  2. 按照以下要求轮转/var/log/ftp/ftp.log日志文件

    1> 每个月轮转一次
    
    2> 保留1个月的日志
    
    3> 文件大小超过10M并且到了轮转周期再轮转

     

  3. 尽可能使用多种方式来共享server端的/share/data目录下的所有文件

  4. 将ssh、rsync、ftp、nfs、samba服务的配置自己重新做一遍

  5. 预习LAMP环境搭建

 

 APACHE构建WEB服务器

课程目标:

  • 了解常见的WEB服务器

  • 熟悉apache服务的基本配置

  • 掌握apache服务的虚拟主机配置

  • 掌握apache的访问控制

  • 掌握MySQL的安装

一、WEB服务概述

web服务是我们日常使用最多的服务,所有的网站都是以web服务的形式为我们呈现

1. WEB服务的特点

  • web服务分为客户端和服务端

  • web客户端通常是我们所使用的浏览器(IE/Chrome/Firefox/Safari或者命令行浏览器等)

  • web服务端就是我们所访问的网站提供的web服务器

    • 常见的web服务端程序有:

      Apache/Nginx/Tengine/Lighttpd/IIS等,不同的web服务针对不同的系统平台各自有优缺点

2. HTTP协议

  • web服务端与客户端是通过HTTP协议(HyperText Transfer Protocol)超文本传输协议进行交互

  •  Apache或Nginx都只支持静态页面的解析

3. 静态页面和动态页面

  • HTML语言

    • HTML(HyperText Markup Language)超文本标记语言,是绝大多数网页使用的语言,几乎所有的网页都是以HTML作为源代码,通过浏览器解释后展现出来

    • HTML有固定语法,用来存储网页数据,定义不同元素,如文字、标题、图片等,现在的网页都用CSS语言来存储网页的表现形式

    • 现代主流的网页设计架构: ​ 内容存储:HTML ​ 网页架构:div ​ 网页样式:css

    • HTML形式的页面我们称之为静态页面,包含一些图片、文本、表格等

  • 动态语言

    • 网站使用特定的语言编写的一些程序,在用户访问的时候基于不同的条件生成不同的HTML代码返回给用户浏览器,这样就实现网页的动态化

    • 常见的动态语言: .php .jsp .cgi .asp、python等

4. WEB服务的中间件

  • php: PHP-FPM、HHVM (HipHop Virtual Machine)

  • jsp: Tomcat、JBOSS、Resin、IBM WebSphere

5.常见的WEB组合方式

  • LAMP (Linux + Apache + MySQL + PHP) //php作为Apache的模块

  • LNMP (Linux + Nginx + MySQL + PHP) //php-fpm进程(服务)

  • Nginx /Apache+ Tomcat

二、Apache的介绍

Apache是著名的web服务器软件,开源,由apche软件基金会负责管理开发。

  • Apache服务特点:

  1. 开放源码

  2. 跨平台

  3. 支持多种编程语言

  4. 采用模块化设计

  5. 安全稳定

  • Apache的工作原理

 

Apache的官网和手册

httpd-manual.noarch            //安装后启动服务就可以本地查看
yum -y install httpd-manual.noarch    
service httpd restart
查看官方手册:
IE:http://10.1.1.1/manual
  • Apache的软件包

    • 软件包: httpd

三、开胃菜-搭建简易WEB服务

1. 关闭防火墙和selinux
2. 配置yum源
3. 软件三步曲(查看安装|确认成功安装|查看软件的文件列表)
4. 了解配置文件    man 5 xxx.conf |程序的官方手册(apache、mysql、oracle)
5. 根据需求通过修改配置文件来完成服务搭建
6. 启动服务,开机自启动
7. 测试验证
需求1:访问一个静态页面,内容:hello world 五一快乐!
环境:
web-server:10.1.1.1
步骤:
1.略
2.略
3.软件三步曲

/etc/httpd
/etc/httpd/conf                //主配置文件的主目录
/etc/httpd/conf.d            //子配置文件的目录
/etc/httpd/conf.d/README
/etc/httpd/conf.d/welcome.conf    //欢迎页
/etc/httpd/conf/httpd.conf    //主配置文件
/etc/httpd/conf/magic
/etc/httpd/logs        /var/log/httpd        //互为硬连接
/etc/httpd/modules
/etc/httpd/run        /var/run/httpd        //互为硬连接        
/etc/logrotate.d/httpd                //日志轮转
/etc/rc.d/init.d/htcacheclean
/etc/rc.d/init.d/httpd                //服务启动脚本
/etc/sysconfig/htcacheclean

/usr/sbin/apachectl
/usr/sbin/htcacheclean
/usr/sbin/httpd                //二进制命令

/var/log/httpd
/var/run/httpd
/var/www                    //apache服务的数据目录
/var/www/html                //apache服务的静态页面存放路径

//以下两个目录互为硬连接,互为硬连接的文件是同一个文件,一个改变另一个也改变
[root@web-server ~]# ll -id /var/log/httpd/
798080 drwx------. 2 root root 4096 Apr 25 10:17 /var/log/httpd/
[root@web-server ~]# ll -id /etc/httpd/logs/
798080 drwx------. 2 root root 4096 Apr 25 10:17 /etc/httpd/logs/

4. 了解配置文件
5. 根据需求通过修改配置文件完成服务搭建
1)创建一个首页文件
echo "hello world 五一快乐" > /var/www/html/index.html

2)启动服务

6. 测试验证
IE:http://10.1.1.1

四、Apache服务的基本配置

 

RHEL6/CentOS6:2.2版本

RHEL7/CentOS7:2.4版本

1. Apache基础

服务端口:
80/tcp(http)
配置文件:
/etc/httpd/conf/httpd.conf        //主配置文件
/etc/httpd/conf.d/*.conf        //子配置文件
/etc/httpd/conf.d/welcome.conf    //默认测试页面
/etc/httpd/conf              配置文件目录  
/etc/httpd/conf.d           子配置文件目录
/etc/httpd/conf.d/README     说明书
/etc/httpd/conf.d/welcome.conf   当没有首页index.html 显示红帽欢迎页面
/etc/httpd/conf/httpd.conf      主配置文件
/etc/httpd/logs                 日志目录 /var/log/httpd/硬链接
/etc/httpd/modules              库文件 /usr/lib64/httpd/modules硬链接
/etc/httpd/run                  pid信息
/etc/logrotate.d/httpd          日志轮循
/etc/rc.d/init.d/httpd          启动脚本
/etc/sysconfig/httpd            额外配置文件
/usr/lib64/httpd               
/usr/lib64/httpd/modules        库文件
/usr/lib64/httpd/modules/mod_actions.so
/usr/sbin/apachectl             apache官方启动脚本
/usr/sbin/httpd
/var/www                        apache数据目录
/var/www/cgi-bin                存放apache的cgi脚本数据目录
/var/www/html                    存放apache的html数据目录
/var/www/error                 
/var/www/error/HTTP_NOT_FOUND.html.var    404
/var/www/error/HTTP_FORBIDDEN.html.var    403

2. Apache基本配置选项

ServerRoot "/etc/httpd"                          //服务主目录
Listen 80                                    //监听端口
IncludeOptional conf.d/*.conf                 //包含conf.d下的*.conf文件
User apache                                   //运行Apache的用户
Group apache                               //运行Apache的用户组
DirectoryIndex index.html index.php         //设置默认主页
DocumentRoot               /var/www/html/               //站点默认数据主目录

<Directory />       //系统的根目录授权
    Options FollowSymLinks      //支持软链接
    AllowOverride None         //不支持.htaccess 访问列表 .htaccess文件提供了针对每个目录改变配置的方法
</Directory>

RHEL6:
<Directory "/var/www/html">         //授权
    Options Indexes FollowSymLinks      //支持索引 支持软链接
    AllowOverride None          //不支持 .htaccess 访问列表
    Order allow,deny            //排序 先允许再拒绝
    Allow from all                 //允许all
</Directory>

REHL7:
<Directory "/var/www/html">
     AllowOverride None
     Require all granted        //允许所有人访问
</Directory>
View Code

 

扩展:配置进程和线程 针对apache2.2 针对面试
# prefork MPM                                    //进程模式
<IfModule prefork.c>
StartServers            10                        //初始建立的进程数
MinSpareServers     10                            //最小空闲的进程数
MaxSpareServers    15                            //最大空闲的进程数
ServerLimit          2000                        //最大启动的进程数 默认256
MaxClients           2000                        //最大并发连接数  默认256    
MaxRequestsPerChild  4000            //每个子进程在其生命周期内允许响应的最大请求数,0不限制
</IfModule>

# worker MPM                                   //线程模式
<IfModule worker.c>
StartServers            2                           //初始建立的进程数
ThreadsPerChild     50                           //每个进程建立的线程数
MinSpareThreads   100                       //最小空闲的线程数
MaxSpareThreads  200                       //最大空间的线程数
MaxClients           2000                        //最大的并发访问量(线程)
MaxRequestsPerChild 0                   //每个子进程在其生命周期内允许响应的最大请求数,0不限制
</IfModule>
View Code

3.Apache更改默认数据根目录

DocumentRoot "/webserver"
<Directory "/webserver/">
    Options Indexes FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

[root@web-server conf]# service httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd: Syntax error on line 293 of /etc/httpd/conf/httpd.conf:
DocumentRoot must be a directory
                                                           [FAILED]
[root@web-server conf]# mkdir /webserver

[root@web-server conf]# service httpd restart
Stopping httpd:                                            [FAILED]
Starting httpd: httpd: apr_sockaddr_info_get() failed for web-server
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
原因:主机名和IP地址解析问题                                                           [  OK  ]

[root@web-server conf]# service httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using 10.1.1.1 for ServerName
                                                           [  OK  ]
vim /etc/httpd/conf/httpd.conf
...
ServerName  10.1.1.1:80

[root@web-server conf]# service httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd:                                            [  OK  ]


root@web-server conf]# cp /var/www/html/index.html /webserver/

测试验证
View Code

 

4.Apache共享文件

Apache如何共享文件呢?

  • 软连接方式

需求1:共享web-server服务端的/data目录里的所有文件
1. apache服务默认情况下到哪个目录里找相应的文件
2. 将本地的/data目录做一个快捷方式(软连接)到指定的目录里

步骤:
1. 创建/data/共享目录
[root@web-server ~]# touch /data/file{1..5}
[root@web-server ~]# mkdir /data/kangjian
[root@web-server ~]# ll /data/
total 4
-rw-r--r-- 1 root root    0 Apr 25 11:21 file1
-rw-r--r-- 1 root root    0 Apr 25 11:21 file2
-rw-r--r-- 1 root root    0 Apr 25 11:21 file3
-rw-r--r-- 1 root root    0 Apr 25 11:21 file4
-rw-r--r-- 1 root root    0 Apr 25 11:21 file5
drwxr-xr-x 2 root root 4096 Apr 25 11:22 kangjian
[root@web-server ~]# ll /webserver/
total 4
-rw-r--r-- 1 root root 25 Apr 25 11:16 index.html
2. 创建快捷方式(软连接)
[root@web-server ~]# ln -s /data/ /webserver/share
[root@web-server ~]# ll /webserver/share/
total 4
-rw-r--r-- 1 root root    0 Apr 25 11:21 file1
-rw-r--r-- 1 root root    0 Apr 25 11:21 file2
-rw-r--r-- 1 root root    0 Apr 25 11:21 file3
-rw-r--r-- 1 root root    0 Apr 25 11:21 file4
-rw-r--r-- 1 root root    0 Apr 25 11:21 file5
drwxr-xr-x 2 root root 4096 Apr 25 11:22 kangjian
[root@web-server ~]# ll /webserver/
total 4
-rw-r--r-- 1 root root 25 Apr 25 11:16 index.html
lrwxrwxrwx 1 root root  6 Apr 25 11:23 share -> /data/

3. 测试验证
结论:
1. 当默认数据目录里有index.html的首页文件时,优先找首页文件
2. 当默认数据目录里没有index.html的首页文件时,会显示测试页
3. 不管有没有首页文件都不会直接找数据文件
解决:
1. 加入路径
http://10.1.1.1/share
2. 将测试页欢迎页删除或者重命名即可
[root@web-server conf.d]# mv welcome.conf welcome.conf.bak
[root@web-server conf.d]# service httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd:                                            [  OK  ]
View Code
  • 别名方式
Alias /test/ "/data/"

<Directory "/data">
    Options Indexes MultiViews FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

注意:
别名后面的路径"/""会影响访问

IE:http://10.1.1.1/test        ——>不能访问
IE:http://10.1.1.1/test/    可以访问
View Code

课堂练习:

通过2种方式共享你的/home目录和/tmp目录里的所有文件

 

三、Apache服务的访问控制

1. 开启基本认证(用户密码)

AuthType Basic
AuthName "Restricted Files"
#(下面这一行是可选的)
AuthBasicProvider file
AuthUserFile /usr/local/apache2/passwd/passwords
Require user rbowen

需求:/webserver——>index.html

步骤:
1. 创建密码文件
[root@web-server conf]# htpasswd -cm /etc/httpd/conf/.passfile harry
New password: 
Re-type new password: 
Adding password for user harry
[root@web-server conf]# cat .passfile 
harry:$apr1$eMymxFmU$A1/l6yw29iVRdwE968TBT0
[root@web-server conf]# htpasswd -mb /etc/httpd/conf/.passfile jack 123
Adding password for user jack
[root@web-server conf]# cat .passfile 
harry:$apr1$eMymxFmU$A1/l6yw29iVRdwE968TBT0
jack:$apr1$C3TPLnU8$s2F2Dv8Aol2LjbSqqizDI/

htpasswd:
-c:创建新的密码文件
-m:密码使用md5加密
-b:非交互式

2. 修改配置文件开启基本认证
vim /etc/httpd/conf/httpd.conf
。。。
<Directory "/webserver/">
    Options Indexes FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all
    AuthType Basic            //开启基本认证
    AuthName "Input your name and password:"    //认证信息
    AuthBasicProvider file        //文件
    AuthUserFile  /etc/httpd/conf/.passfile        //刚刚创建的密码文件
    Require user  harry            //可用用户
</Directory>

3. 重启服务
service httpd restart


总结:
1. 开启用户名密码认证有几点注意
1) 需要知道网站的数据根目录  /webserver
2) 将认证信息加入到 <Directory "/webserver"> .....</Directory>
3) 创建一个密码文件来保存用户名和密码


需求2:允许多个人来访问如何实现
1. 创建一个文件保存所有的用户(将很多用户加入到一个组里)
vim /etc/httpd/conf/groups
admin:user01 user02 user03

2. 将组成员加入到密码文件中
htpasswd -mb /etc/httpd/conf/.passfile user01 123
htpasswd -mb /etc/httpd/conf/.passfile user02 123
htpasswd -mb /etc/httpd/conf/.passfile user03 123

3. 修改主配置文件
<Directory "/webserver/">
    Options Indexes FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all
    AuthType Basic
    AuthName "Input your name and password:"
   AuthBasicProvider file
   AuthUserFile /etc/httpd/conf/.passfile
   AuthGroupFile /etc/httpd/conf/groups
   Require group admin
</Directory>

4. 重启服务
service httpd restart

5. 测试验证

总结:
1. 将很多人加入到组里(创建一个文件建立组和用户的关系)    /etc/httpd/conf/groups
2. 在配置文件中指定允许属于组成员来访问       Require group admin
结论:只允许admin组成员访问,那么密码文件中的其他用户不可以访问
思考:想允许其他用户和admin组成员都可以访问,咋办?

   Require group admin
   Require valid-user harry

Require valid-user:指定多个用户访问
Require user:指定某个人访问
View Code

2. 网络访问控制

RHEL6:http 2.2
Order allow,deny  如果allow和deny冲突,deny为准
Order deny,allow  如果allow和deny冲突,allow为准
1、禁止部分ip不能访问网站
Order allow,deny
Allow from  all
Deny from  192.168.0.254 172.16.2.10

2、针对某个网段
Order allow,deny
Allow from  all
Deny from  192.168.0.0/255.255.255.0

3、针对域名
Order allow,deny
Allow from  all
Deny from  node1.itcast.cc *.itcast.cc

4、拒绝大部分,只允许某个ip
Order deny,allow
Deny from  all
Allow from 192.168.0.254

需求3:只拒绝10.1.1.2主机访问我的网站

Order allow,deny
Allow from  all
Deny from  10.1.1.2
View Code

 

引申扩展:
RHEL7:http 2.4+
案例1:允许所有主机访问
<Directory "/var/www/html">
     AllowOverride None
     Require all granted
</Directory>

AllowOverride All        允许子目中的 .htaccess 中的设置覆盖当前设置
AllowOverride None       不允许子目中的 .htaccess 中的设置覆盖当前设置

案例2:只允许网段192.168.0.0/24和192.168.10.254/24访问
<Directory "/var/www/html">
     AllowOverride None
     Require ip 192.168.0.0/24
     Require ip 192.168.10.254
</Directory>

案例3:只拒绝某些主机访问
<Directory "/var/www/html">
        AllowOverride None
        <RequireAll>
                Require not ip 10.1.1.254
                Require all granted
        </RequireAll>
</Directory>
View Code
  • HTTP通过状态码来标记返回信息,以下为常见的状态码:
常用状态码分类:
200:成功,请求的所有的数据通过响应报文的entity-body部分发送;ok
301:请求的URL指向的资源已经被删除,但是在响应报文中通过首部Location指明了资源现在所处的新位置;Moved Permanently
302:与301相似,但是在响应报文中通过Location指明资源现在所处的临时的新位置;Found
304:客户端发出了条件式请求,但是服务器上的资源未发送改变,通过响应此响应状态码通知客户端,Not Modified
401:需要客户端输入账号和密码才能访问资源;Unauthorized
403:请求被禁止;Forbidden
404:服务器无法找到客户端请求的资源;Not Found
500:服务器内部错误;Internal Server Error
502:代理服务器从后端服务器收到了一条伪响应;Bad Gateway

课堂练习1:

  1. 根据如下需求搭建web服务

  2. 更改默认数据根目录/webserver

  3. 只允许sysadmin组里的user01成员去访问你的默认数据根目录,密码是123;同时拒绝192.168.0.0网段的人去访问,除了192.168.0.1

默认数据目录    /webserver        index.html
1. 创建一个密码文件
htpasswd -cmb /etc/httpd/conf/.passfile user01 123
2. 创建一个文件来保存用户和组的信息
echo "sysadmin:user01 user02" > /etc/httpd/conf/groups

3. 修改配置文件开启基本认证
vim /etc/httpd/conf/httpd.conf
。。。
<Directory "/webserver/">
    Options Indexes FollowSymLinks
    AllowOverride None
    Order deny,allow
    Deny from 192.168.0.0/255.255.255.0
    Allow from 192.168.0.1
    AuthType Basic
    AuthName "Input your name and password:"
   AuthBasicProvider file
   AuthUserFile /etc/httpd/conf/.passfile
   AuthGroupFile /etc/httpd/conf/groups
   Require group sysadmin
   Require user user01
</Directory>

四、Apache服务的虚拟主机

1. 基于IP的虚拟主机

环境准备:
方法1:增加一个虚拟网卡,配置IP地址    (两个网卡是同一种网络模式)
eth0:10.1.1.1
eth1:192.168.0.1
方法2:通过增加子接口的方式
ifconfig eth0:1 192.168.0.1/24         //临时增加子接口(重启失效)

注意:不管什么方式只需要当前主机有2个不同网段的IP即可

需求:
IE:http://10.1.1.1    ———> this is 10.1.1.1 test page
    http://192.168.0.1 ——> this is 192.168.0.1 test page
    
    
步骤:
1. 创建相应的数据目录及首页文件
mkdir /web{1,2}/data -p
echo "this is 10.1.1.1 test page" > /web1/data/index.html
echo "this is 192.168.0.1 test page" > /web2/data/index.html

2. 发布网站
vim /etc/httpd/conf/httpd.conf
最后面增加以下内容:
<VirtualHost 10.1.1.1:80>
    ServerAdmin webmaster@dummy-host.example.com    //管理员邮箱(可改可不改)
    DocumentRoot /web1/data/                    //定义网站文件的数据目录
    #ServerName dummy-host.example.com
    ErrorLog logs/10.1.1.1-error_log            //错误日志文件名(/etc/httpd/logs/下)
    CustomLog logs/10.1.1.1-access_log common    //正常的访问日志文件
</VirtualHost>

<VirtualHost 192.168.0.1:80>
    ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot /web2/data/
    #ServerName dummy-host.example.com
    ErrorLog logs/192.168.0.1-error_log
    CustomLog logs/192.168.0.1-access_log common
</VirtualHost>

3. 重启服务

4. 测试验证
client:10.1.1.2
[root@client Desktop]# route add -net 192.168.0.0/24 dev eth0    //临时添加一条道192.168.0.0网络的路由
[root@client Desktop]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.0.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
10.1.1.0        0.0.0.0         255.255.255.0   U     1      0        0 eth0
0.0.0.0         10.1.1.254      0.0.0.0         UG    0      0        0 eth0
[root@client Desktop]# ping 192.168.0.1
PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
64 bytes from 192.168.0.1: icmp_seq=1 ttl=64 time=1.85 ms

[root@client Desktop]# yum -y install elinks
[root@client Desktop]# elinks http://10.1.1.1
[root@client Desktop]# elinks http://192.168.0.1
View Code

2. 基于端口的虚拟主机

需求2:
IE: 
http://10.1.1.1:80            this is 80 test page
http://10.1.1.1:10086        this is 10086 test page

1. 创建相应的数据目录及首页文件
mkdir /data/{80,10086} -p
echo "this is 80 test page" > /data/80/index.html
echo "this is 10086 test page" > /data/10086/index.html

2. 发布虚拟主机
Listen 80
Listen 10086

<VirtualHost *:80>
    ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot /data/80
    #ServerName dummy-host.example.com
    ErrorLog logs/80-error_log
    CustomLog logs/80-access_log common
</VirtualHost>

<VirtualHost *:10086>
    ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot /data/10086
    #ServerName dummy-host.example.com
    ErrorLog logs/10086-error_log
    CustomLog logs/10086-access_log common
</VirtualHost>

[root@web-server conf]# netstat -nltp|grep 10086
tcp        0      0 :::10086                    :::*                        LISTEN      7570/httpd          
[root@web-server conf]# netstat -nltp|grep 80
tcp        0      0 :::80                       :::*                        LISTEN      7570/httpd       
View Code

3.基于域名的虚拟主机

需求3:
http://www.myweb.cc        ——> this is myweb.cc
http://ftp.test.net        ——> this is myftp

思路:
1. 搭建DNS服务器
2. 搭建web服务器
3. 客户端指定DNS服务器测试验证

环境:
WEB-server:10.1.1.1
DNS-server:10.1.1.3
client:10.1.1.2

步骤:
1. 搭建DNS服务器(在10.1.1.3上完成)
[root@DNS-server ~]# vim /etc/named.conf 
options {
    listen-on port 53 { 127.0.0.1;any; };
    listen-on-v6 port 53 { ::1; };
    directory     "/var/named";
    dump-file     "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
    allow-query     { localhost; any;};
    recursion yes;
。。。。



[root@DNS-server ~]# vim /etc/named.rfc1912.zones 
...
增加以下内容:
zone "myweb.cc" IN {
    type master;
    file "myweb.cc.zone";
    allow-update { none; };
};

zone "test.net" IN {
    type master;
    file "test.net.zone";
    allow-update { none; };
};

[root@DNS-server ~]# cd /var/named/
[root@DNS-server named]# ll
total 28
drwxrwx--- 2 named named 4096 Aug 27  2013 data
drwxrwx--- 2 named named 4096 Aug 27  2013 dynamic
-rw-r----- 1 root  named 1892 Feb 18  2008 named.ca
-rw-r----- 1 root  named  152 Dec 15  2009 named.empty
-rw-r----- 1 root  named  152 Jun 21  2007 named.localhost
-rw-r----- 1 root  named  168 Dec 15  2009 named.loopback
drwxrwx--- 2 named named 4096 Aug 27  2013 slaves
[root@DNS-server named]# cp -p named.localhost myweb.cc.zone
[root@DNS-server named]# cp -p named.localhost test.net.zone
[root@DNS-server named]# vim myweb.cc.zone 
[root@DNS-server named]# vim test.net.zone 
[root@DNS-server named]# service named start
Generating /etc/rndc.key:                                  [  OK  ]
Starting named:                                            [  OK  ]
[root@DNS-server named]# 


相关文件内容:
[root@DNS-server named]# cat myweb.cc.zone test.net.zone 
$TTL 1D
@    IN SOA    myweb.cc. rname.invalid. (
                    0    ; serial
                    1D    ; refresh
                    1H    ; retry
                    1W    ; expire
                    3H )    ; minimum
@    NS    a.myweb.cc.
a    A    10.1.1.3
www    A    10.1.1.1
$TTL 1D
@    IN SOA    test.net. rname.invalid. (
                    0    ; serial
                    1D    ; refresh
                    1H    ; retry
                    1W    ; expire
                    3H )    ; minimum
    NS    b.test.net.
b    A    10.1.1.3
ftp    A    10.1.1.1



2. 搭建web服务器,发布2个虚拟主机(网站)  [在10.1.1.1上完成]
1) 创建相应的数据目录和首页文件
[root@web-server ~]# mkdir /data/{myweb,myftp}
[root@web-server ~]# echo "this is myweb.cc" > /data/myweb/index.html
[root@web-server ~]# echo "this is myftp" > /data/myftp/index.html

2)发布网站
[root@web-server ~]# vim /etc/httpd/conf/httpd.conf
...
NameVirtualHost *:80
<VirtualHost *:80>
    ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot /data/myweb
    ServerName www.myweb.cc
    ErrorLog logs/myweb-error_log
    CustomLog logs/myweb-access_log common
</VirtualHost>

<VirtualHost *:80>
    ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot /data/myftp
    ServerName ftp.test.net
    ErrorLog logs/ftp-error_log
    CustomLog logs/ftp-access_log common
</VirtualHost>

3) 重启服务


3. 客户端测试验证 [10.1.1.2]

[root@client Desktop]# echo nameserver 10.1.1.3 > /etc/resolv.conf 
[root@client Desktop]# elinks http://www.myweb.cc
[root@client Desktop]# elinks http://ftp.test.net
View Code

课堂练习2:

搭建web服务器,要求如下:

  1. 当访问www.zhangsan.net时看到“welcome to myweb!!!”

  2. 当访问www.test.com时看到“this is test page!”

  3. 拒绝192.168.0.0/24网段和example.com这个域所管理的主机访问www.zhangsan.net网站,但是允许harry用户访问

  4. www.test.com网站的数据根目录为/web/www

环境:
web-server:10.1.1.1
client:10.1.1.2

1. 搭建基于域名的虚拟主机(10.1.1.11) 创建相应的数据目录和网页文件
[root@web-server ~]# rpm -q httpd
httpd-2.2.15-29.el6.centos.x86_64
[root@web-server ~]# mkdir /web/{zhangsan,test} -p
[root@web-server ~]# echo "this is zhangsan.com test page " > /web/zhangsan/index.html
[root@web-server ~]# echo "this is test.com test page " > /web/test/index.html

2) 发布虚拟主机
NameVirtualHost *:80
<VirtualHost *:80>
    ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot /web/zhangsan
    ServerName www.zhangsan.net
    ErrorLog logs/dummy-host.example.com-error_log
    CustomLog logs/dummy-host.example.com-access_log common
</VirtualHost>
<VirtualHost *:80>
    ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot /web/test
    ServerName www.test.com
    ErrorLog logs/dummy-host.example.com-error_log
    CustomLog logs/dummy-host.example.com-access_log common
</VirtualHost>

3. 拒绝192.168.0.0/24网段和example.com这个域所管理的主机访问www.zhangsan.net网站,但是允许harry用户访问

vim /etc/httpd/conf/httpd.conf
...
<Directory "/web/zhangsan/">
    Options Indexes FollowSymLinks
    AllowOverride None
    Order deny,allow
    Deny from 192.168.0.0/24 .example.com
    AuthType Basic
    AuthName "Input your name and password:"
    AuthBasicProvider file
    AuthUserFile  /etc/httpd/conf/.passfile
    Require user  harry
</Directory>
View Code

五、MySQL数据库的安装

1. 通用的二进制包安装

shell> groupadd mysql
shell> useradd -r -g mysql -s /bin/false mysql
shell> cd /usr/local
shell> tar zxvf /path/to/mysql-VERSION-OS.tar.gz
shell> ln -s full-path-to-mysql-VERSION-OS mysql
shell> cd mysql
shell> chown -R mysql .
shell> chgrp -R mysql .
shell> scripts/mysql_install_db --user=mysql
shell> chown -R root .
shell> chown -R mysql data
shell> bin/mysqld_safe --user=mysql &
# Next command is optional
shell> cp support-files/mysql.server /etc/init.d/mysql.server
View Code

2.源码包安装

根据需求进行配置,参考官方文档

默认情况下载当前目录下直接可以配置
shell> cmake . -LAH  查看所有支持的配置选项
shell> cmake .
//配置选项
CMAKE_INSTALL_PREFIX  /usr/local/mysql      安装路径
DEFAULT_CHARSET  latin1      拉丁  默认字符集
DEFAULT_COLLATION    latin1_swedish_ci     指定服务器默认的校对规则(排序规则)
ENABLED_LOCAL_INFILE    OFF     是否开启内部加载外部文件功能 默认off 1代表开启0代表关闭
MYSQL_DATADIR       数据文件目录
SYSCONFDIR         初始化参数文件目录(主配置文件路径(默认优先去/etc目录去找))
MYSQL_TCP_PORT                    服务端口号,默认3306
MYSQL_UNIX_ADDR                   socket文件路径,默认/tmp/mysql.sock 
WITHOUT_xxx_STORAGE_ENGINE        指定不编译的存储引擎
WITH_xxx_STORAGE_ENGINE       指定静态编译到mysql的存储引擎,MyISAM,MERGE,MEMBER以及CSV四种引擎默认已被编译至服务器,不需要特别指定。
WITH_EXTRA_CHARSETS    扩展字符集
View Code
  • 根据需求进行配置
编写cmake脚本:
vim cmake.sh
#!/bin/bash
cmake . \
-DCMAKE_INSTALL_PREFIX=/mysql25 \
-DENABLED_LOCAL_INFILE=1 \
-DMYSQL_DATADIR=/mysql25/data \
-DSYSCONFDIR=/mysql25 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DMYSQL_UNIX_ADDR=/mysql25/mysql.sock \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_EXTRA_CHARSETS=all \
-DMYSQL_TCP_PORT=3309 \
-DMYSQL_USER=mysql
说明:如果第一次配置出错,再次配置前删掉上一次的缓存文件
rm -f  CMakeCache.txt
View Code
  • 编译
make
  • 安装
make install

引申拓展:

  • 字符集与字符编码

字符是各种文字和符号的总称,包括各个国家文字、标点符号、图形符号、数字等。字符集是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同,计算机要准确的处理各种字符集文字,需要进行字符编码,以便计算机能够识别和存储各种文字。也就是说字符编码是字符集的实现方式。 注意:有的字符编码和字符集的名称是一致的。

  • 常见的字符集

    • Unicode:也叫统一字符集,它包含了几乎世界上所有的已经发现且需要使用的字符(如中文、日文、英文、德文等)

    • ASCII:早期的计算机系统只能处理英文,所以ASCII也就成为了计算机的缺省字符集,包含了英文所需要的所有字符

    • GB2312:中文字符集,包含ASCII字符集。ASCII部分用单字节表示,剩余部分用双字节表示

    • GBK:GB2312的扩展,但完整包含了GB2312的所有内容

    • GB18030:GBK字符集的超集,常叫大汉字字符集,也叫CJK(Chinese,Japanese,Korea)字符集,包含了中、日、韩三国语言中的所有字符

  • 常见的字符编码

UTF-8 UTF-16 UCS-2 UCS-4 
GBK/GB2312
GB18030
  • 生产环境字符集建议
    • 非常肯定终端用户只有中文时,可选择gbk / gb2312

    • 为了方便数据迁移、以及多种终端展示,最好是utf8

    • 字符无需区分大小写时,采用默认的xx_ci校验集可以,否则选择xx_bin校验集(生产环境中,尽量不要修改校验集)

    • 默认字符集是latin1,该字符集存放汉字是分开存放,以至于检索结果时不够精确,好处就是节省空间,不推荐使用

 

3.常见启动报错

初始化数据库(安装默认的库和表):

cd /mysql25
# scripts/mysql_install_db --user=mysql
错误:
2017-07-16 10:55:20 22725 [ERROR] InnoDB: Unable to lock ./ibdata1, error: 11
2017-07-16 10:55:20 22725 [Note] InnoDB: Check that you do not already have another mysqld process using the same InnoDB data or log files.

原因:
默认情况下会到/usr/local/mysql里去找文件;通用的二进制包的安装路径正好在该目录写,并且是启动的

# ./mysql_install_db --help
--no-defaults:不要从任何的配置文件中读取相应的参数,忽略掉mysql安装过程中的默认配置,如创建默认用户并设置默认密码等
解决:
# ./mysql_install_db --basedir=/mysql25 --datadir=/mysql25/data --user=mysql 

启动数据库:
# ./mysqld_safe --user=mysql 
170716 11:05:51 mysqld_safe Logging to '/var/lib/mysql/node1.uplook.com.err'.
170716 11:05:51 mysqld_safe A mysqld process already exists

原因:是因为/var/lib/mysql启动的是另外一个数据库库,所以进程冲突
解决:如下
# ./mysqld_safe --basedir=/mysql25 --datadir=/mysql25/data --user=mysql
170716 11:09:13 mysqld_safe Logging to '/mysql25/data/node1.uplook.com.err'.
170716 11:09:13 mysqld_safe Starting mysqld daemon with databases from /mysql25/data
170716 11:09:14 mysqld_safe mysqld from pid file /mysql25/data/node1.uplook.com.pid ended
原因:
mysql用户无法在安装目录里创建pid文件和sock文件
解决:
chown -R mysql. /mysql25
再次启动,依然无法启动:
# ./mysqld_safe --basedir=/mysql25 --datadir=/mysql25/data --user=mysql
170716 11:14:42 mysqld_safe Logging to '/mysql25/data/node1.uplook.com.err'.
170716 11:14:42 mysqld_safe Starting mysqld daemon with databases from /mysql25/data
170716 11:14:44 mysqld_safe mysqld from pid file /mysql25/data/node1.uplook.com.pid ended

查看错误日志:
2017-07-16 11:14:43 23957 [Note] Server socket created on IP: '::'.
2017-07-16 11:14:43 23957 [ERROR] Can't start server: Bind on TCP/IP port: Address already in use
2017-07-16 11:14:43 23957 [ERROR] Do you already have another mysqld server running on port: 3308 ?
2017-07-16 11:14:43 23957 [ERROR] Aborting

分析:
mysql 5.6.19 ——>rpm——>/etc/mysql/my.cnf
# cat /etc/mysql/my.cnf 
[mysqld]
basedir=/usr
datadir=/var/lib/mysql
port=3308
socket=/var/lib/mysql/mysql.sock

mysql 5.6.25 配置文件/mysql25/my.cnf
该文件没有做任何配置,所以默认去到/etc/my.cnf——>/etc/mysql/my.cnf....

最终如何解决:
vim /mysql25/my.cnf
[mysqld]
 basedir = /mysql25
 datadir = /mysql25/data
 port = 3309
 socket = /mysql25/mysql.sock



报错:
# service mysql start
Starting MySQL.The server quit without updating PID file (/mysql/data/vm1.uplook.com.pid).[FAILED]
解决:
chown mysql.mysql /mysql -R

环境变量:
export PATH=$PATH:/usr/local/mysql/bin

# mysql
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
[root@vm1 data]# mysql --socket=/data/mysql.sock 


# ln -s /data/mysql.sock /var/lib/mysql/mysql.sock

# mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.6.25 Source distribution

Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> exit
Bye

补充:

硬连接:

 

软连接:

 

源码构建LAMP环境

课程目标:

  • 使用源码方式基于LAMP架构搭建BBS论坛或者博客

思考:

基础班使用yum工具搭建了LAMP的环境,为什么还要用源码包再搭建一次呢?

  • rpm版本

    安装方便,升级、卸载都灵活,很难或者无法定制主要组件的功能,适合批量部署

  • 源码包编译 根据业务需求定制,前提是需要对平台的功能需要非常了解;卸载、升级、安装并不是很方便灵活

  • 生产环境如何做?

    • 上线前,在测试环境中编译安装并且调试完毕后,把编译后的源码同步到其余软硬环境一样的机器,直接make install即可

    • 上线前,在测试环境中编译安装并且调试完毕后,把源码包封装成rpm包,再使用批量化部署软件进行统一安装

一、项目简介

  • LAMP是Linux+Apache+MySQL+Perl/Php/Python的一个缩写 , 它们通常一起使用来运行动态网站。虽然这些开放源代码程序本身并不是专门设计成同另外几个程序一起工作的 , 但由于它们的免费和开源,这个组合开始流行(大多数 Linux 发行版本捆绑了这些软件),这就导致了这些组件经常在一起使用。LAMP网站架构是目前国际流行的 Web 框架,是国际上非常成熟的架构框架,很多流行的商业应用都是采取这个架构。LAMP具有 Web 资源丰富、轻量、快速开发等特点,与微软的.NET 架构相比,LAMP 具有通用、跨平台、高性能、低价格的 优势,因此 LAMP 无论是性能、质量还是价格都是企业搭建网站的首选平台,现已为商用型 web 架构代名词。

  • 本章的目标是完全通过源代码编译安装,组建一个LAMP的环境,并运行一个PHP写的web网站。

二、环境准备

1. 需要准备的软件包

apr-1.5.2.tar.bz2
apr-util-1.5.4.tar.bz2
httpd-2.4.12.tar.bz2
php-5.6.11.tar.xz
mysql-5.6.25.tar.gz

2. 安装前环境准备

说明:

如果你在一台机器启动两个 apache 和 mysql ,那么很可能造成一定的冲突,所以为了 减少不必要的麻烦,首先停止卸载它们。

由于整个环境会涉及比较多的依赖关系包,所以我们先将一些依赖包装上。(根据不同 的环境可能不仅限于这些包)

清空环境、安装相应的软件包
# yum groupinstall "Development tools" -y
# yum groupinstall "Desktop Platform Development" -y   桌面开发工具包(图形化相关包)
# yum install cmake
# yum install ncurses-devel

准备相应的软件:将所需要的软件包放到虚拟机里,我放到了/LAMP目录里
[root@server ~]# cd /LAMP/
[root@server LAMP]# ls
apr-1.5.2.tar.bz2                          mysql-5.6.25.tar.gz                        phpMyAdmin-4.4.11-all-languages.zip
apr-util-1.5.4.tar.bz2                     mysql-5.6.30-linux-glibc2.5-x86_64.tar.gz  phpwind_v9.0.1_utf8.zip
Discuz_X2.5_SC_UTF8.zip                    mysql-5.6.31.tar.gz                        wordpress-4.7.3-zh_CN.tar.gz
httpd-2.4.12.tar.bz2                       php-5.6.11.tar.xz
mysql-5.6.25-linux-glibc2.5-x86_64.tar.gz  php-5.6.23.tar.xz

3. 编译方式

Apache——>MySQL——>PHP 或者  MySQL——>Apache——>PHP

说明:

  1. apache必须要先于php安装;因为php是作为apache的模块libphp.so ,被apache加载调用。

  2. apache和mysql之间并没有直接先后顺序的依赖,所以谁先谁后没所谓。

  3. 在php-5.3版本前,mysql必须先于php的编译;因为php需要实现连接数据库的功能,它通过mysql的接口才能编译出该功能;

  4. 在php-5.3版本或者之后,php已经集成了一套连接mysql数据的代码,并不依赖mysql的接口,这个时候,mysql和php的编译顺序也就无所谓了。

三、编译安装MySQL

版本:mysql-5.6.25.tar.gz
需求:
1. 安装目录        /mysql25/base_dir
2. 数据目录        /mysql25/data
3. 端口         3307
4. socket文件        /mysql25/base_dir

安装:
1. 官方网站下载相应的软件包
mysql-5.6.25.tar.gz
2. 解压软件包
[root@server ~]# cd /LAMP
[root@server LAMP]# tar -xf mysql-5.6.25.tar.gz -C /usr/src/
[root@server LAMP]# ls /usr/src/
debug  kernels  mysql-5.6.25

3. 安装
1) 创建相应的目录和用户并授权
[root@server LAMP]# mkdir /mysql25/base_dir -p
[root@server LAMP]# mkdir /mysql25/data
[root@server LAMP]# id mysql
id: mysql: No such user
//-r创建一个系统用户,-s指定默认的shell /sbin/nologin 不能登录操作系统
[root@server LAMP]# useradd -r mysql -s /sbin/nologin    
[root@server LAMP]# id mysql
uid=496(mysql) gid=493(mysql) groups=493(mysql)
[root@server LAMP]# ll -d /mysql25/
drwxr-xr-x 4 root root 4096 Apr 26 10:09 /mysql25/
[root@server LAMP]# chown -R mysql.mysql /mysql25/
[root@server LAMP]# ll -d /mysql25/
drwxr-xr-x 4 mysql mysql 4096 Apr 26 10:09 /mysql25/
[root@server LAMP]# ll  /mysql25/
total 8
drwxr-xr-x 2 mysql mysql 4096 Apr 26 10:09 data
drwxr-xr-x 2 mysql mysql 4096 Apr 26 10:09 base_dir

2) 进入到到解压后的路径进行安装
[root@server LAMP]# cd /usr/src/mysql-5.6.25/
[root@server mysql-5.6.25]# pwd
/usr/src/mysql-5.6.25
[root@server mysql-5.6.25]# ls

根据需求配置:
[root@server mysql-5.6.25]# vim cmake.sh
cmake . \
-DCMAKE_INSTALL_PREFIX=/mysql25/base_dir/ \
-DMYSQL_DATADIR=/mysql25/data \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DSYSCONFDIR=/mysql25/base_dir/etc \
-DMYSQL_UNIX_ADDR=/mysql25/base_dir/mysql.sock \
-DMYSQL_TCP_PORT=3307 \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_EXTRA_CHARSETS=all \
-DMYSQL_USER=mysql

[root@server mysql-5.6.25]# chmod +x cmake.sh

编译:
make

安装:
make install

总结:
1、配置的时候指定安装路径,该路径可以存在也可以不存在,建议事先创建出来并且更改权限
2、系统默认自动创建,权限是root,后续还需要自己更改

参数说明:
cmake . \
-DCMAKE_INSTALL_PREFIX=/mysql25/base_dir/ \         指定安装路径
-DMYSQL_DATADIR=/mysql25/data \                    指定数据目录
-DENABLED_LOCAL_INFILE=1 \                        开启加载外部文件功能,1开启;0关闭
-DWITH_INNOBASE_STORAGE_ENGINE=1 \                开启innodb存储引擎
-DSYSCONFDIR=/mysql25/base_dir/etc \            初始化参数配置文件路径
-DMYSQL_UNIX_ADDR=/mysql25/base_dir/mysql.sock \    socket文件路径
-DMYSQL_TCP_PORT=3307 \                            指定端口号
-DDEFAULT_CHARSET=utf8 \                        默认字符集
-DDEFAULT_COLLATION=utf8_general_ci \             默认校对规则(排序规则)
-DWITH_EXTRA_CHARSETS=all \                        扩展字符集
-DMYSQL_USER=mysql                               运行mysql用户身份

后续配置:

//初始化数据到/mysql25/data
[root@server base_dir]# scripts/mysql_install_db --user=mysql --basedir=/mysql25/base_dir --datadir=/mysql25/data

//启动数据库
tail -f /var/log/mysqld.log
2018-04-26 11:20:41 56477 [Note] InnoDB: 128 rollback segment(s) are active.
2018-04-26 11:20:41 56477 [Note] InnoDB: Waiting for purge to start
2018-04-26 11:20:41 56477 [Note] InnoDB: 5.6.25 started; log sequence number 1600607
2018-04-26 11:20:41 56477 [Note] Server hostname (bind-address): '*'; port: 3307
2018-04-26 11:20:41 56477 [Note] IPv6 is available.
2018-04-26 11:20:41 56477 [Note]   - '::' resolves to '::';
2018-04-26 11:20:41 56477 [Note] Server socket created on IP: '::'.
2018-04-26 11:20:41 56477 [ERROR] /mysql25/base_dir/bin/mysqld: Can't create/write to file '/var/run/mysqld/mysqld.pid' (Errcode: 2 - No such file or directory)
2018-04-26 11:20:41 56477 [ERROR] Can't start server: can't create PID file: No such file or directory
180426 11:20:41 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended

原因:
在启动数据库的时候,默认会到/var/lib/mysql里去找相应的文件,但是我们指定的数据目录/mysql25/data,原因是因为系统有一个默认的配置文件/etc/my.cnf,在该文件中定义了数据目录是/var/lib/mysql

解决:
1. 删除/etc/my.cnf
或者
2. 修改/etc/my.cnf文件

[root@server base_dir]# rm -f /etc/my.cnf

再次启动:
[root@server base_dir]# bin/mysqld_safe --user=mysql &
验证:
[root@server mysql25]# ps -ef|grep mysql
root      56548   3186  0 11:27 pts/0    00:00:00 /bin/sh bin/mysqld_safe --user=mysql
mysql     56638  56548  1 11:27 pts/0    00:00:00 /mysql25/base_dir/bin/mysqld --basedir=/mysql25/base_dir --datadir=/mysql25/data --plugin-dir=/mysql25/base_dir/lib/plugin --user=mysql --log-error=/mysql25/data/server.itcast.cc.err --pid-file=/mysql25/data/server.itcast.cc.pid
root      56664  52572  0 11:27 pts/1    00:00:00 grep mysql
[root@server mysql25]# netstat -nltp|grep 3307
tcp        0      0 :::3307                     :::*                        LISTEN      56638/mysqld      

如果希望使用service方式启动mysql,可以做如下配置:
[root@server base_dir]# pkill -9 mysqld
[root@server base_dir]# cp support-files/mysql.server /etc/init.d/mysql25
[root@server base_dir]# netstat -nltp|grep 3307
[root@server base_dir]# service mysql25 start
Starting MySQL                                             [  OK  ]
[root@server base_dir]# netstat -nltp|grep 3307
tcp        0      0 :::3307                     :::*                        LISTEN      56820/mysqld 


登录验证:
1. /mysql25/base_dir/bin/mysql        //默认情况下mysql命令安装到了mysql的安装目录的bin目录里
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.6.25 Source distribution

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> exit
Bye

2. 直接登录
[root@server base_dir]# mysql
-bash: mysql: command not found
原因:环境变量问题,无法找到mysql命令

解决:
临时:
[root@server base_dir]# export PATH=/mysql25/base_dir/bin:$PATH
[root@server base_dir]# echo $PATH
/mysql25/base_dir/bin:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[root@server base_dir]# mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.6.25 Source distribution

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> exit
Bye


永久;
[root@server base_dir]# vim /etc/profile
在文件的最后增加以下内容:
export PATH=/mysql25/base_dir/bin:$PATH
[root@server base_dir]# source /etc/profile   //重新读取该配置文件

[root@server ~]# mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.6.25 Source distribution

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 


mysql数据库设置密码:
[root@server ~]# mysqladmin -uroot password '123'
Warning: Using a password on the command line interface can be insecure.
[root@server ~]# mysql -uroot -p123

四、编译安装Apache

环境准备:

 

 

1. 安装依赖包apr

说明:

在rhel6.5下直接编译安装apache的2.4系列版本,会报下面的错误:

checking for APR... configure: WARNING: APR version 1.4.0 or later is required, found 1.3.9
configure: WARNING: skipped APR at apr-1-config, version not acceptable

原因:表示系统自带的apr软件版本为1.3.9,但它需要1.4.0以上的版本。

解决方法:
第一种:把apache降为2.2系列,就OK了。
第二种:去下载新版本apr先编译,再编译apache调用它。(选择第二种)
安装apr软件:
# tar xf apr-1.5.2.tar.bz2 -C /usr/src/
# cd /usr/src/apr-1.5.2
# ./configure
# make
# make install
安装apr-util软件:
# tar xf apr-util-1.5.4.tar.bz2 -C /usr/src/
# cd /usr/src/apr-util-1.5.4/
# ./configure --with-apr=/usr/local/apr/bin/apr-1-config    指定软件apr的路径
# make
# make install

思考: 一个软件的库文件是有可能被其它软件所调用,那么其它软件能否找到你的库文件呢?

  • 一般来说,库文件安装到/lib,/lib64,/usr/lib/,/usr/lib64等,都可以找得到; 但是如果一个软件A把库文件安装到/usr/local/A/lib下,就要把这个路径加入到ldconfig命令可以找到的路径列表里面去,别人才能找到。

  • ldconfig是一个动态链接库管理命令;主要用途是在默认搜索目录(/lib,/lib64,/usr/lib/,/usr/lib64)以及动态库配置文件/etc/ld.so.conf中所列的目录中搜索出可共享的动态链接库。

问题:怎样将库文件的指定安装路径加入到ldconfig命令的搜索列表里?

方法1:在/etc/ld.so.conf这个主配置文件里加上一行,写上让别人要查找库文件的路径
方法2:在/etc/ld.so.conf.d/目录下创建一个*.conf结尾的文件,里面加入该路径即可    

# echo /usr/local/apr/lib/ > /etc/ld.so.conf.d/lamp.conf
# ldconfig      上面加入路径后,就使用此命令让其生效

加载动态链接库如图示:

 

2. 安装httpd软件

版本:httpd-2.4.12.tar.bz2
1.下载
2.解压
3.安装(解压目录)
[root@server ~]# cd /LAMP
[root@server LAMP]# tar -xf httpd-2.4.12.tar.bz2 -C /usr/src/
[root@server LAMP]# cd /usr/src/
[root@server src]# ls
apr-1.5.2  apr-util-1.5.4  debug  httpd-2.4.12  kernels  mysql-5.6.25
[root@server src]# cd httpd-2.4.12/
[root@server httpd-2.4.12]# pwd
/usr/src/httpd-2.4.12

配置:
[root@server httpd-2.4.12]# vim apache.sh
./configure \
--enable-modules=all \
--enable-mods-shared=all \
--enable-so \
--enable-rewrite \
--with-mpm=prefork \
--with-apr=/usr/local/apr/bin/apr-1-config \
--with-apr-util=/usr/local/apr/bin/apu-1-config

[root@server httpd-2.4.12]# chmod +x apache.sh 

[root@server httpd-2.4.12]# ./apache.sh
checking how to run the C preprocessor... gcc -E
checking for gcc option to accept ISO C99... -std=gnu99
checking for pcre-config... false
configure: error: pcre-config for libpcre not found. PCRE is required and available from http://pcre.org/
原因:缺少软件包  pcre相关
解决:
[root@server httpd-2.4.12]# yum list|grep pcre
pcre.x86_64                              7.8-6.el6                         @anaconda-CentOS-201311272149.x86_64/6.5
mingw32-pcre.noarch                      8.10-2.el6.5                      demo 
pcre.i686                                7.8-6.el6                         demo 
pcre-devel.i686                          7.8-6.el6                         demo 
pcre-devel.x86_64                        7.8-6.el6                         demo 
pcre-static.x86_64                       7.8-6.el6                         demo 
[root@server httpd-2.4.12]# yum -y install pcre-devel
安装好依赖包后,继续配置,没有error说明配置完成

[root@server httpd-2.4.12]# ./apache.sh
...

//确认是否成功安装apache:
[root@server httpd-2.4.12]# ls /usr/local/apache2/    
bin  build  cgi-bin  conf  error  htdocs  icons  include  logs  man  manual  modules
注意:
确认这个目录产生后,说明apache编译安装成功

配置参数说明:
# ./configure \
--enable-modules=all \             加载所有支持模块
--enable-mods-shared=all \          共享方式加载大部分常用的模块
--enable-so \                    启动动态模块加载功能
--enable-rewrite  \                启用地址重写功能
--with-mpm=prefork \    插入式并行处理模块,称为多路处理模块,Prefork 是类UNIX平台上默认的MPM
--with-apr=/usr/local/apr/bin/apr-1-config \    指定依赖软件apr路径
--with-apr-util=/usr/local/apr/bin/apu-1-config 
View Code

五、编译安装PHP

版本:php-5.6.11.tar.xz
1. 下载软件
2. 解压
3. 进入到解压的目录里
[root@server LAMP]# tar -xf php-5.6.11.tar.xz -C /usr/src/
[root@server LAMP]# cd /usr/src/
[root@server src]# ls
apr-1.5.2  apr-util-1.5.4  debug  httpd-2.4.12  kernels  mysql-5.6.25  php-5.6.11
[root@server src]# cd php-5.6.11/
[root@server php-5.6.11]# pwd
/usr/src/php-5.6.11
[root@server php-5.6.11]# 

1) 配置
[root@server php-5.6.11]# vim php.sh
./configure \
--with-apxs2=/usr/local/apache2/bin/apxs \
--with-mysql=/mysql25/base_dir/ \
--with-mysqli=/mysql25/base_dir/bin/mysql_config \
--with-pdo-mysql=/mysql25/base_dir \
--with-zlib \
--with-zlib-dir=/mysql25/base_dir/zlib \
--with-curl \
--enable-zip \
--with-gd \
--with-freetype-dir \
--with-jpeg-dir \
--with-png-dir \
--enable-sockets \
--with-xmlrpc \
--enable-soap \
--enable-opcache \
--enable-mbstring \
--enable-mbregex \
--enable-pcntl \
--enable-shmop \
--enable-sysvmsg \
--enable-sysvsem \
--enable-sysvshm \
--enable-calendar \
--enable-bcmath

[root@server php-5.6.11]# chmod +x php.sh

[root@server php-5.6.11]# ./php.sh
checking for cURL support... yes
checking for cURL in default path... not found
configure: error: Please reinstall the libcurl distribution -
    easy.h should be in <curl-dir>/include/curl/
原因:缺少软件包
解决:
[root@server php-5.6.11]# yum list|grep libcurl
libcurl.x86_64                           7.19.7-37.el6_4                   @anaconda-CentOS-201311272149.x86_64/6.5
libcurl.i686                             7.19.7-37.el6_4                   demo 
libcurl-devel.i686                       7.19.7-37.el6_4                   demo 
libcurl-devel.x86_64                     7.19.7-37.el6_4                   demo 
[root@server php-5.6.11]# yum -y install libcurl-devel
...

2)编译
make            //make成功后,会显示让你make test,不用做
3)安装
make install

//确认php成功安装:
[root@server php-5.6.11]# ls /usr/local/apache2/modules/libphp5.so    
注意:确认有这个libphp5.so模块文件,就表示编译php成功
View Code

PHP常见参数介绍:

-with-config-file-path 和 --with-config-file-scan-dir     //在指定 php 配置文件的路径
--with-mysql 和 --with-mysqli                 //在指定你的 mysql 的位置和它的相关工具
--with-iconv-dir
--with-freetype-dir
--with-jpeg-dir
--with-png-dir
--with-gd
--with-zlib
--with-libxml-dir                     //这些都是在启用对某种文件的支持
--with-curl 和 --with-curlwrappers     //用于支持 curl 函数,此函数允许你用不同的协议连接和沟通                                    不同的服务器
--with-openssl,--with-mhash,--with-mcrypt     //这都是和加密有关的参数,启用它们是为了让php可以                                            更好的支持各种加密。
--enable-bcmath                            //高精度数学运算组件。
--enable-shmop和 --enable-sysvsem        //使得你的PHP系统可以处理相关的IPC函数.
//IPC是一个Unix标准通讯机制,它提供了使得在同一台主机不同进程之间可以互相通讯的方法。
--enable-inline-optimization        //栈堆指针和优化线程。
--enable-pcntl                        //多线程优化。

with-apxs2        调用apache加载模块支持PHP
gd                  画图库
libiconv         字符变换转换
libmcrypt         字符加密
mcrypt          字符加密
mhash           哈希运算
View Code

六、后续配置

1. 配置apache和php的联系

1、修改apache主配置文件
# vim /usr/local/apache2/conf/httpd.conf

//配置语言支持
LoadModule negotiation_module modules/mod_negotiation.so    此模块打开注释
Include conf/extra/httpd-languages.conf            打开此选项,扩展配置文件就生效了
...

//打开对虚拟主机的支持
Include conf/extra/httpd-vhosts.conf

//加载php模块解析php页面,添加两行,告诉httpd把.php文件交给模块去编译
LoadModule php5_module    modules/libphp5.so    找到这一句,在这句下面加上两句
//添加以下两行意思是以.php结尾的文件都认为是php程序文件,注意两句话的.php前面都是有一个空格的
AddHandler php5-script   .php        
AddType text/html  .php

//默认主页加上index.php,并放在index.html前,支持php的首页文件
<IfModule dir_module>
    DirectoryIndex index.php index.html
</IfModule>
        

注意:默认的网站目录是:/usr/local/apache2/htdocs/
2. 修改apache的子配置文件,优先支持中文
# vim /usr/local/apache2/conf/extra/httpd-languages.conf
DefaultLanguage zh-CN        打开注释,默认语言集改为中文
LanguagePriority zh-CN en ca cs da de el eo es et fr he hr it ja ko ltz nl nn no pl pt pt-BR ru sv tr zh-TW        语言集优先集,把zh-CN 写到前面
View Code

2. 让php支持连接本地的数据库

说明:

本地数据库一般是通过socket文件连接,而本地数据库的socket文件如果不在默认路径,就必须告诉php从哪里读取socket文件。

# cp /usr/src/php-5.6.11/php.ini-production /usr/local/lib/php.ini
vim /usr/local/lib/php.ini
.....
[MySQL]
mysql.default_port = 3307        改成对应的mysql的端口
mysql.default_socket = /mysql25/base_dir/mysql.sock        对应的socket文件地址

[MySQLi]
mysqli.default_port = 3307
mysqli.default_socket = /mysql25/base_dir/mysql.sock

3. 网站加目录里写php测试页

# vim /usr/local/apache2/htdocs/index.php
<?php
        phpinfo();
?>

七、启动相关服务

1. 启动mysql数据库

service mysql25 restart

2. 启动apche

[root@server ~]# /usr/local/apache2/bin/apachectl start
[root@server ~]# netstat -nltp|grep httpd
tcp        0      0 :::80                       :::*                        LISTEN      2847/httpd 
或者
# lsof -i:80
[root@server ~]# lsof -i:80
COMMAND  PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
httpd   2847   root    4u  IPv6  19265      0t0  TCP *:http (LISTEN)
httpd   2848 daemon    4u  IPv6  19265      0t0  TCP *:http (LISTEN)
httpd   2849 daemon    4u  IPv6  19265      0t0  TCP *:http (LISTEN)
httpd   2850 daemon    4u  IPv6  19265      0t0  TCP *:http (LISTEN)
httpd   2851 daemon    4u  IPv6  19265      0t0  TCP *:http (LISTEN)
httpd   2852 daemon    4u  IPv6  19265      0t0  TCP *:http (LISTEN)


为了方便启动,做成脚本启动脚本:
# cp /usr/local/apache2/bin/apachectl /etc/init.d/apache
# service apache stop
# lsof -i :80
# service apache start


可能遇到的错误:
# /usr/local/apache2/bin/apachectl start
(98)Address already in use: make_sock: could not bind to address [::]:80
(98)Address already in use: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
Unable to open logs

注意:
上面的报错表示80被占用,可以去先停掉rpm版(或者改端口)httpd再启动
启不来的一个错误小示例:
vim /etc/hosts
10.1.1. 1   node1.misshou.com     --这里写错了,最后一个1前有一个空格    

# /usr/local/apache2/bin/apachectl start    --会造成start或stop 卡在那里

3. 测试是否支持php

浏览器里输入:http://10.1.1.1 //看到php的测试页表示ok

到此,lamp的编译安装和基本配置完毕,下面就可以安装你的web应用了.

八、源码编译软件经验总结

1. 配置阶段

# 通过指定参数,来确认你想要安装的软件安装在哪里,加上哪些功能和去掉哪些功能
./configure 或者 cmake
# 如果这一步报错,基本都是缺少依赖包,解决办法:
1>    使用yum去安装,一般来说,rhel/centos做为一个成熟的linux操作系统,常见的底层依赖包都自带了,所以安装下面这两个组,一般都会有你所需要的依赖包。
# yum groupinstall "Development tools" -y
# yum groupinstall "Desktop Platform Development" -y 
2>    如果缺少依赖包在rhel/centos的yum源里找不到,则上网下载第三方的软件,先编译第三方软件,再编译本软件

关于./configure参数选择的基本方法:

./configure --help 查看所有的编译参数
第一个重要参数
--prefix=    此参数指定安装目录(一般安装到/usr/local/或者/usr/local/软件名下)

第二类重要参数:
--enable-xxx    打开一个功能(默认是关闭的)
--disable-xxx    关闭一个功能(默认是打开的)

第三类参数:
--with-xxx=DIR    指定一个目录,调用此目录的功能

2. 编译阶段

make   相当于是根据你上一步定义好的文件(Makefile),把这个软件给做出来(这一步一般很少出错,如果出错,问题都比较麻烦。可能是一些兼容性的问题等等,你可以尝试上网查询解决方法,如果查不到,只能换个环境或者换个软件版本或者换些编译参数重新编译)

3. 安装阶段

make install  把做好的软件,安装到你第一步所指定的安装目录里(这一步几乎不会出错的)

4. 思考总结

假设一个软件aaa,安装到/usr/local和安装到/usr/local/aaa之间的区别?

  • 安装到/usr/local下:

    • 优点:

      1. 此软件的命令一般会安装到/usr/local/bin或/usr/local/sbin等;

      2. 这些路径都默认在$PATH里,所以安装的命令可以直接用,而不用使用绝对路径;

      3. 库文件一般都会安装到/usr/local/lib下,所以把它加入ldconfig,以后所有安装在此目录的库文件都可以被找到。

    • 缺点:

      1. 不方便删除,因为很多软件都安装到/usr/local下

  • 安装到/usr/local/aaa下:

    • 优缺点与上面正好相反

最终建议:小软件一般默认安装/usr/local/;大软件安装/usr/local/软件名/下

 

九、部署WEB应用

 
搭建Discuz论坛
Discuz_X3.2_SC_UTF8.zip        Discuz论坛
phpMyAdmin-4.4.11-all-languages.zip        php写的mysql的管理工具(类似oracle的OEM)
phpwind_v9.0.1_utf8.zip    wind   论坛
wordpress-4.7.3-zh_CN.tar.gz    博客

需求:
搭建2个网站,一个个人博客,一个是web界面管理mysql数据库的应用;
访问:www.mysqladmin.cc可以看到登录mysql数据库的web界面
访问:www.myblog.net可以看到自己搭建的博客

软件包:
phpMyAdmin-4.4.11-all-languages.zip
wordpress-4.7.3-zh_CN.tar.gz

步骤:
1. 创建2个目录分别存放不同的网站
mkdir /webserver/{admin,myblog} -p

2. 拷贝网站相关的数据文件到指定目录并更改权限
[root@server LAMP]# unzip phpMyAdmin-4.4.11-all-languages.zip 
[root@server LAMP]# tar -xf wordpress-4.7.3-zh_CN.tar.gz 
[root@server LAMP]# cp -a phpMyAdmin-4.4.11-all-languages/* /webserver/admin/
[root@server LAMP]# cp -a wordpress/* /webserver/myblog/  
[root@server LAMP]# ls /webserver/admin/
[root@server LAMP]# ls /webserver/myblog/

[root@server LAMP]# chown -R daemon. /webserver/

3. 通过虚拟主机将网站发布出去

虚拟主机:
[root@server LAMP]# cd /usr/local/apache2/conf/extra/
[root@server extra]# vim httpd-vhosts.conf 
<VirtualHost *:80>
    ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot "/webserver/admin"
    ServerName www.mysqladmin.cc
    #ServerAlias www.dummy-host.example.com
    ErrorLog "logs/dummy-host.example.com-error_log"
    CustomLog "logs/dummy-host.example.com-access_log" common
</VirtualHost>

<VirtualHost *:80>
    ServerAdmin webmaster@dummy-host2.example.com
    DocumentRoot "/webserver/myblog"
    ServerName www.myblog.net
    ErrorLog "logs/dummy-host2.example.com-error_log"
    CustomLog "logs/dummy-host2.example.com-access_log" common
</VirtualHost>

4. 修改每个网站各自连接mysql数据库的配置文件
1) mysql的web管理网站phpMyAdmin相关文件
[root@server LAMP]# cd /webserver/admin/
[root@server admin]# cp config.sample.inc.php config.inc.php
[root@server admin]# vim config.inc.php
....
/* Authentication type */
$cfg['Servers'][$i]['auth_type'] = 'cookie';
/* Server parameters */
$cfg['Servers'][$i]['host'] = '127.0.0.1';    ————>将localhost改为127.0.0.1
$cfg['Servers'][$i]['connect_type'] = 'tcp';
$cfg['Servers'][$i]['compress'] = false;
$cfg['Servers'][$i]['AllowNoPassword'] = false;
....

2) myblog网站wordpress
[root@server admin]# cd /webserver/myblog/
[root@server myblog]# cp wp-config-sample.php wp-config.php
[root@server myblog]# vim wp-config.php
...
// ** MySQL 设置 - 具体信息来自您正在使用的主机 ** //
/** WordPress数据库的名称 */
define('DB_NAME', 'myblog');

/** MySQL数据库用户名 */
define('DB_USER', 'root');

/** MySQL数据库密码 */
define('DB_PASSWORD', '123');

/** MySQL主机 */
define('DB_HOST', '127.0.0.1');

/** 创建数据表时默认的文字编码 */
define('DB_CHARSET', 'utf8');

/** 数据库整理类型。如不确定请勿更改 */
define('DB_COLLATE', '');
...

[root@server myblog]# mysql -p123
Warning: Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.25 Source distribution

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> create database myblog;            //创建myblog库来存放wordpress的数据
Query OK, 1 row affected (0.01 sec)

mysql> 
View Code

十、测试验证

正确完成以上操作,就可以在本机进行测试验证。如下图所示:

//使用hosts文件进行域名解析
[root@server ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
10.1.1.1 www.mysqladmin.cc
10.1.1.1 www.myblog.net

安装wordpress博客:

 安装成功后直接访问:www.myblog.net

 

 

 

十一、架构理解

 网络的基础知识

课程目标:

  • 了解OSI七层模型和TCP/IP四层模型

  • 理解TCP/IP的三次握手四次断开

思考:

数据是如何在两台主机之间传输的?

数据传输过程:

 

一、OSI七层模型

1. 什么是OSI模型

OSI:

  • 开放系统互连参考模型,是国际标准化组织(ISO)和国际电报电话咨询委员会(CCITT)联合制定的开放系统互连参考模型。

  • 目的:为开放式互连信息系统提供了一种功能结构的框架和参考。

  • 这里所说的开放系统,实质上指的是遵循OSI参考模型和相关协议能够实现互连的具有各种应用目的的计算机系统。

  • OSI采用了分层的结构化技术,共分七层:

    物理层、数据链路层、网络层、传输层、会话层、表示层、应用层

2. OSI的七层介绍

2.1 应用层
  • 应用层是计算机用户,以及各种应用程序和网络之间的接口,其功能是直接向用户提供服务,完成用户希望在网络上完成的各种工作。

  • 应用层为用户提供的服务和协议:文件传输服务(FTP)、远程登录服务(ssh)、网络管理服等。

  • 上述的各种网络服务由该层的不同应用协议和程序完成。

  • 应用层的主要功能如下:

    • 用户接口:应用层是用户与网络,以及应用程序与网络间的直接接口,使得用户能够与网络进行交互式联系。

    • 实现各种服务:该层具有的各种应用程序可以完成和实现用户请求的各种服务。

2.2 表示层
  • 表示层是对来自应用层的命令和数据进行解释,对各种语法赋予相应的含义,并按照一定的格式传送给会话层。

  • 其主要功能是处理用户信息的表示问题,如编码、数据格式转换和加密解密等。

  • 表示层的具体功能如下:

    • 数据格式处理:协商和建立数据交换的格式,解决各应用程序之间在数据格式表示上的差异。

    • 数据的编码:处理字符集和数字的转换。例如由于用户程序中的数据类型(整型或非整型、有符号或无符号等)、用户标识等都可以有不同的表示方式,因此,在设备之间需要具有在不同字符集或格式之间转换的功能。

    • 压缩和解压缩:为了减少数据的传输量,这一层还负责数据的压缩与解压缩。

    • 数据的加密和解密:可以提高网络的安全性。

2.3 会话层
  • 会话层是用户应用程序和网络之间的接口,主要任务是:组织和协调两个会话进程之间的通信,并对数据交换进行管理。

  • 当建立会话时,用户必须提供他们想要连接的远程地址。

  • 会话层的具体功能如下:

    • 会话管理:

    允许用户在两个实体设备之间建立、维持和终止会话,并支持他们之间的数据交换.

    比如:提供单方向会话或者双方向会话时,管理会话中的发送顺序,以及会话所占用时间的长短。

    • 会话流量控制:提供会话流量控制和交叉会话功能。

    • 寻址:使用远程地址建立会话连接。

    • 差错控制:

    从逻辑上讲会话层主要负责数据交换的建立、保持和终止,但实际的工作是接收来自传输层的数据,并负责纠正错误。但需要注意,该层检查的错误不是通讯介质的错误,而是磁盘空间、打印机缺纸之类的高级错误。

2.4 传输层
  • OSI上3层:应用层、表示层、会话层的主要任务是数据处理——资源子网

  • OSI下3层:网络层、数据链路层、物理层的主要任务是数据通讯——通讯子网

  • 传输层是OSI模型的第4层,它是通信子网和资源子网的接口和桥梁,起到承上启下的作用

  • 传输层的主要任务是:向用户提供可靠的端到端的差错和流量控制,保证报文的正确传输

报文:报文(message)是网络中交换与传输的数据单元

2.5 网络层
  • 主要任务是:数据链路层的数据在这一层被转换为数据包,然后通过路径选择、分段组合、顺序、进/出路由等控制,将信息从一个网络设备传送到另一个网络设备。

  • 一般情况下,数据链路层是解决同一网络(局域网)内节点之间的通信,而网络层主要解决不同子网间的通信。

2.6 数据链路层

在计算机网络中由于各种干扰的存在,物理链路是不可靠的。因此,这一层的主要功能是:

  • 在物理层提供的比特流的基础上,通过差错控制、流量控制方法,使有差错的物理线路变为无差错的数据链路,即提供可靠的通过物理介质传输数据的方法。

  • 具体工作是:接收来自物理层的位流(比特流)形式的数据,并封装成帧,传送到上一层;同样,也将来自上层的数据帧,拆装为位流形式的数据转发到物理层;并且,还负责处理接收端发回的确认帧的信息,以便提供可靠的数据传输。

2.7 物理层
  • 主要功能是:利用传输介质为数据链路层提供物理连接,实现比特流的透明传输。尽可能屏蔽掉具体传输介质和物理设备的差异。

3. 总结

  • 由于OSI是一个理想的模型,因此一般网络系统只涉及其中的几层,很少有系统能够具有所有的7层,并完全遵循它的规定。

  • 在7层模型中,每一层都提供一个特殊的网络功能。

  • 从网络功能的角度观察:

    • 物理层、数据链路层、网络层:主要提供数据传输和交换功能,即以节点到节点之间的通信为主;

    • 传输层(第4层):作为上下两部分的桥梁,是整个网络体系结构中最关键的部分;

    • 会话层、表示层和应用层:以提供用户与应用程序之间的信息和数据处理功能为主;

二、TCP/IP协议模型

1. 什么是TCP/IP模型

  • TCP/IP协议模型(Transmission Control Protocol/Internet Protocol),包含了一系列构成互联网基础的网络协议,是Internet的核心协议,通过20多年的发展已日渐成熟,并被广泛应用于局域网和广域网中,目前已成为一种国际标准

  • TCP/IP协议簇是一组不同层次上的多个协议的组合,该协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的协议来完成自己的需求,与OSI的七层模型相对应。

  • 尽管通常称该协议族为TCP/IP,但TCP和IP只是其中的两种协议而已(该协议族的另一个名字是Internet协议族(Internet Protocol Suite))

2. TCP/IP的分层结构

 

2.1 链路层

OSI的物理层和数据链路层

  • ARP(地址解析协议IP-MAC)和RARP(逆地址解析协议MAC-IP)是某些网络接口(如以太网)使用的特殊协议,用来转换IP层和网络接口层使用的地址。

2.2 网络层

OSI网络层

  • 也称作互联网层或网际层,处理分组在网络中的活动,例如分组的选路。

  • 在TCP/IP协议族中,网络层协议包括IP协议(网际协议),ICMP协议(Internet互联网控制报文协议),以及IGMP协议(Internet组管理协议)。

    • IP是一种网络层协议,提供的是一种不可靠的服务,它只是尽可能快地把分组从源结点送到目的结点,但是并不提供任何可靠性保证。同时被TCP和UDP使用。

    • TCP和UDP的每组数据都通过端系统和每个中间路由器中的IP层在互联网中进行传输。

    • ICMP是IP协议的附属协议。IP层用它来与其他主机或路由器交换错误报文和其他重要信息。它主要是用来提供有关通向目的地址的路径信息。Ping和Traceroute工具,它们都使用了ICMP协议。

    • IGMP是Internet组管理协议。它用来把一个UDP数据报多播到多个主机。该协议运行在主机和组播路由器之间。

2.3 运输层

OSI传输层

主要为两台主机上的应用程序提供端到端的通信。在TCP/IP协议族中,有两个互不相同的传输协议:

  TCP(传输控制协议)和UDP(用户数据报协议) TCP协议:为两台主机提供高可靠性的数据通信。TCP是面向连接的通信协议,通过三次握手建立连接,通讯完成时要断开连接,由于TCP是面向连接的所以只能用于端到端的通讯。TCP提供的是一种可靠的数据流服务,采用“带重传的肯定确认”技术来实现传输的可靠性。也就是TCP数据包中包括序号(seq)和确认(ack),所以未按照顺序收到的包可以被排序,而损坏的包可以被重传。 UDP协议:则为应用层提供一种非常简单的服务。它是面向无连接的通讯协议,UDP数据包括目的端口号和源端口号信息,由于通讯不需要连接,所以可以实现广播发送。 UDP通讯时不需要接收方确认,不保证该数据报能到达另一端,属于不可靠的传输,可能会出现丢包现象。UDP与TCP位于同一层,但它不管数据包的顺序、错误或重发。

2.4 应用层

OSI会话层、表示层、应用层

应用层负责处理特定的应用程序细节。

3. 数据封装过程

  • 数据格式

    TCP数据信息:TCP头部+实际数据 (TCP头包括源和目标主机端口号、顺序号、确认号、校验字等)

    IP数据包:IP头部+TCP数据信息(IP头包括源和目标主机IP地址、类型、生存期等)

    数据帧:帧头+IP数据包+帧尾 (帧头包括源和目标主机MAC初步地址及类型,帧尾是校验字)

  • 数据的封装与解封装: 封装:数据要通过网络进行传输,要从高层一层一层的向下传送,如果一个主机要传送数据到别的主机,先把数据装到一个特殊协议报头中,这个过程叫-----封装。 解封装:上述的逆向过程

    当数据以TCP/IP协议传输时的封装与街封装过程如下图:

 

三、TCP/IP协议三次握手四次断开

1. 了解相关名词

序列号:Seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。
确认序号:Ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,Ack=Seq+1。

常见的标志位:
    ACK:确认序号有效。
    SYN:发起一个新连接。
    FIN:释放一个连接。

2. 了解netstat中的网络状态

 CLOSED            初始(无连接)状态。
    LISTEN            侦听状态,等待远程机器的连接请求。
    SYN_SEND
    在TCP三次握手中,主动连接端发送了SYN包后,进入SYN_SEND状态,等待对方的ACK包。
    SYN_RECV 
    在TCP三次握手中,主动连接端收到SYN包后,进入SYN_RECV状态。
    ESTABLISHED 
    完成TCP三次握手后,主动连接端进入ESTABLISHED状态。此时,TCP连接已经建立,可以进行通信。
    
    FIN_WAIT_1         在TCP四次断开时,主动关闭端发送FIN包后,进入FIN_WAIT_1状态。
    FIN_WAIT_2        在TCP四次断开时,主动关闭端收到ACK包后,进入FIN_WAIT_2状态。
    TIME_WAIT         在TCP四次断开时,主动关闭端发送了ACK包之后,进入TIME_WAIT状态。
    CLOSE_WAIT         在TCP四次断开时,被动关闭端收到FIN包后,进入CLOSE_WAIT状态。
    LAST_ACK     在TCP四次断开时,被动关闭端发送FIN包后,进入LAST_ACK状态,等待对方的ACK包。

3. TCP/IP三次握手

 

TCP三次握手的过程如下:
   1. 客户机A端(主动连接端)发送一个SYN包给服务器B端(被动连接端);
   2. 服务器B端(被动连接端)收到SYN包后,发送一个带ACK和SYN标志的包给客户机A端(主动连接端);
   3. 客户机A端(主动连接端)发送一个带ACK标志的包给服务器B端(被动连接端),握手动作完成。

3. TCP/IP四次断开

 

TCP四次断开的过程如下:
1. 客户机A端(主动连接端)发送一个FIN包给服务器B端(被动连接端)请求断开连接;
2. 服务器B端(被动连接端)收到FIN包后,发送一个ACK包给客户机A端(主动连接端);
3. 服务器B端(被动连接端)发送了ACK包后,再发送一个FIN包给客户机A端(主动连接端)确认断开;
4. 客户机A端(主动连接端)收到FIN包后,发送一个ACK包,当服务器B端(被动连接端)收到ACK包后,四次断开动作完成,连接断开。

注解:

[数据单元]  数据单元是网络信息传输的基本单位。一般网络连接不允许传送任意大小的数据包,而是采用分组技术将一个数据分成若干个很小的数据包,并给每个小数据包加上一些关于此数据包的属性信息.
[数据包]  包(Packet)是TCP/IP协议通信传输中的数据单位,一般也称“数据包”。
 

iptables

思考:

什么是交换,什么是路由,什么是路由表?

交换是指同网络访问(两台机器连在同一个交换机上,配置同网段的不同ip就可以直接通迅) 路由就是跨网络访问(路径选择) 路由表是记录路由信息的表

一、查看路由表信息

//route命令用来查看和设置路由表信息

[root@server ~]# route -n        //查看路由表信息
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.0.0     0.0.0.0         255.255.255.0   U     0      0        0 eth1
10.1.1.0        0.0.0.0         255.255.255.0   U     0      0        0 eth0
0.0.0.0         10.1.1.254      0.0.0.0         UG    0      0        0 eth0
目标网络        网关             子网掩码         路由标志                 网卡
                                            Up:启动状态
                                            UG:该网关为路由器
讨论1:
按上面的路由表来看,如果我ping一个公网IP(如ping 14.200.151.38),应该怎么走?

1) 先看目标ip是否为本地ip,如果是,则直接访问本地;如果不是,则找路由表里是否有你访问的网段.
2) 如果路由表有则从这个路由条目后面指定的网卡出去;如果路由表里没有你访问的网段,则会找默认路由 
  (也就是网关)。
3) 如果网关也没有的话,则会报错网络不可达。

讨论2:
按上面的路由表来看,如果我ping一个局域网IP为10.1.1.10,会怎么走?

ping 10.1.1.10不会走网关,而是走本地路由从eth0网卡出去(因为路由表里有10.1.1.0/24的路由)。

讨论3:
如何加网关和删除网关,加网关有什么要求?
route add default gw  x.x.x.x        临时加网关,马上生效
route del default gw  x.x.x.x         临时删网关,马上生效
永久增加网关:
vim  /etc/sysconfig/network-scripts/ifcfg-eth0
GATEWAY=x.x.x.x
或者
vim /etc/rc.local
..
route add default gw xxxxx

注意事项:
1. 加网关只能加你已经有的路由网段里的一个IP才行(此IP不一定存在)
2. 加网关可以不用指定子网掩码(因为是已有的一个网段的ip,所以掩码已经确认了)

讨论4:
一个linux服务器上能有几个有效网关?
准确来说:一个路由表上可以加多个网关,但只有一个生效。

讨论5:
我一台linux上如果有双物理网卡,请问可不可以两个网卡配置同网段的不同IP呢?
eth0 10.1.1.1/24        
eth1 10.1.1.2/24    

如果两个网卡同网段,则会有下面两条路由
10.1.1.0        0.0.0.0         255.255.255.0   U     0      0        0 eth0
10.1.1.0        0.0.0.0         255.255.255.0   U     0      0        0 eth1

结果:
它会实现从两张网卡进来的包,却从一张网卡出去,问题就产生了。假设eth0网卡有问题时,路由表里匹配到第一条后,依然会走eth0网卡,而不会走eth1。
也有解决方法(比如多路由表或者双网卡绑定),这里不涉及。

二、IP路由选择实验

1. route相关命令

route -n  查看路由,显示ip,不解析
route del default    删除默认路由
route add default gw 192.168.1.110    添加一个默认网关,把所有不知道的网络交给网关来转发
rouate add -net 192.168.2.0/24 dev eth0        对一个网络添加一个新的路由(另一个网段)
route add -host 192.168.3.1 gw 192.168.1.110      对一个具体的ip添加路由

2. 实验需求

环境准备:
node1:10.1.1.1和192.168.0.1  作为网关服务器,开启路由转发功能/proc/sys/net/ipv4/ip_forward
node2:172.16.0.254        
node3:10.12.0.254
要求:
实现不同网络(10.12.0.0/24和172.16.0.254/24)之间的互通,使用第三方主机node1作为路由进行转发

3. 具体步骤

1. node2上配置172.16.0.254的静态IP地址
略

添加默认路由网关:
# route add -net 10.1.1.0/24 dev eth0
# route add default gw 10.1.1.1

验证:
[root@node2 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
172.16.0.0      0.0.0.0         255.255.255.0   U     0      0        0 eth0
10.1.1.0        0.0.0.0         255.255.255.0   U     0      0        0 eth0
0.0.0.0         10.1.1.1        0.0.0.0         UG    0      0        0 eth0

2. node3上配置10.12.0.254的静态IP地址
[root@node3 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=none
IPADDR=10.12.0.254
NETMASK=255.255.255.0
GATEWAY=10.1.1.1

验证:
[root@node3 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.1.1.1        0.0.0.0         255.255.255.255 UH    0      0        0 eth0
10.12.0.0       0.0.0.0         255.255.255.0   U     1      0        0 eth0
0.0.0.0         10.1.1.1        0.0.0.0         UG    0      0        0 eth0

3. 在node1上开启路由转发的功能
1) 临时开启
[root@node1 ~]# cat /proc/sys/net/ipv4/ip_forward 
0
[root@node1 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward 
[root@node1 ~]# cat /proc/sys/net/ipv4/ip_forward 
1

注意:如果重启网络,失效

2) 永久开启
[root@node1 ~]# vim /etc/sysctl.conf
# Controls IP packet forwarding
net.ipv4.ip_forward = 0        0代表不开启路由转发;1代表开启转发

4. 在node1上增加2条分别到达node2和node3的路由信息
[root@node1 ~]# route add -net 172.16.0.0/24 dev eth0    
[root@node1 ~]# route add -net 10.12.0.0/24 dev eth0
[root@node1 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
172.16.0.0      0.0.0.0         255.255.255.0   U     0      0        0 eth0
10.12.0.0       0.0.0.0         255.255.255.0   U     0      0        0 eth0
192.168.0.0     0.0.0.0         255.255.255.0   U     0      0        0 eth1
10.1.1.0        0.0.0.0         255.255.255.0   U     0      0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1003   0        0 eth1
0.0.0.0         10.1.1.254      0.0.0.0         UG    0      0        0 eth0

5. 测试验证
node1:
[root@node1 ~]# ping 172.16.0.254
PING 172.16.0.254 (172.16.0.254) 56(84) bytes of data.
64 bytes from 172.16.0.254: icmp_seq=1 ttl=64 time=2.83 ms

[root@node1 ~]# ping 10.12.0.254
PING 10.12.0.254 (10.12.0.254) 56(84) bytes of data.
64 bytes from 10.12.0.254: icmp_seq=1 ttl=64 time=1.10 ms

node2:访问node3主机
[root@node2 ~]# ping 10.12.0.254
PING 10.12.0.254 (10.12.0.254) 56(84) bytes of data.
From 10.1.1.1: icmp_seq=1 Redirect Host(New nexthop: 10.12.0.254)
64 bytes from 10.12.0.254: icmp_seq=1 ttl=64 time=0.624 ms
64 bytes from 10.12.0.254: icmp_seq=2 ttl=64 time=0.576 ms

node3:访问node2主机
[root@node3 ~]# ping 172.16.0.254
PING 172.16.0.254 (172.16.0.254) 56(84) bytes of data.
From 10.1.1.1: icmp_seq=1 Redirect Host(New nexthop: 172.16.0.254)
64 bytes from 172.16.0.254: icmp_seq=1 ttl=63 time=19.5 ms
From 10.1.1.1: icmp_seq=2 Redirect Host(New nexthop: 172.16.0.254)
64 bytes from 172.16.0.254: icmp_seq=2 ttl=63 time=1.45 ms


注意:
node2和node3的网关必须指向node1的ip而不是网关。
View Code

 

Iptables防火墙

课程目标:

  • 了解Iptables的基本知识和工作原理

  • 掌握Iptables的基本语法结构

  • 掌握常见的Iptables规则配置

  • 能够根据需求对服务器进行Iptables的基本配置

思考1:服务如何进行网络访问控制?

 

思考2:系统如何进行访问控制?

 

一、防火墙介绍

  • 防火墙分类和作用

    • 硬件防火墙

    • 软件防火墙

 作用:

防火墙作为内部网与外部网之间的一种访问控制设备, 常常安装在内部网络和外部网络的边际上。防火墙具有很好的网络安全保护作用。入侵者必须首先穿越防火墙的安全防线,才能接触目标计算机。你可以将防火墙配置成许多不同保护级别。高级别的保护可能会禁止一些服务,如视频流等,但至少这是你自己的保护选择。

主要作用:
1、Internet防火墙可以防止Internet上的危险传播到网络内部;
2、能强化安全策略;
3、能有效记录Internet上的活动;

二、Iptables防火墙介绍

  • Linux系统内核集成了网络访问控制的功能,通过netfilter模块来实现,是内核的一部分(内核空间)

  • 用户层(用户空间)可以通过iptables程序对netfilter进行控制管理,进而实现网络的访问控制

  • TCP_Wrappers 也是一个网络访问控制的一个工具,作用在应用层(7层防火墙)

总结:

  • netfilter模块 内核空间,是内核一部分

  • iptables组件 用户空间,提供管理防火墙的手段,它主要作用在传输层(4层防火墙)

三、Iptables防火墙结构

  • 四张表

    • filter:实现对数据包的过滤

    • nat:主要修改数据包的地址和端口,例如源地址或目标地址
    • mangle对数据包进行修改,例如给数据包打标记MARK
    • ​raw:主要做连接追踪

五条链

  • PREROUTING

  • INPUT

  • OUTPUT

  • FORWARD

  • POSTROUTING

总结:

防火墙是表的集合,表示链的集合,链式规则的集合

 思考:B主机一直尝试登录A主机的ssh服务,怎么拒绝?

 

四、防火墙工作原理(数据包流向)

 

五、Iptables基本语法

  • iptables [-t 表名] 命令选项 [链名] [规则号码] [条件匹配] [-j 目标动作]

    小写 大写 大写 小写 大写 说明: 表名和链名:用于指定 iptables命令所操作的表和链; 命令选项:用于指定管理iptables规则的方式(比如:插入、增加、删除、查看等); 规则号吗:用于指定规则的编号; 条件匹配:用于指定对符合什么样条件的数据包进行处理(比如:什么协议、出入网卡等); 目标动作:用于指定数据包的处理方式(比如:允许通过、拒绝、丢弃等)

示例:
iptables -L            
iptables -t filter -L    
iptables -t nat -L
iptables -t raw -L
iptables -t mangle -L
  • iptables的启动和关闭以及保存
//临时停止|启动|查看状态|重新加载|重新启动
service iptables stop|start|status|reload|restart    
//开机是否自启动
chkconfig iptables off|on
//永久保存规则
vim    /etc/sysconfig/iptables
...
增加规则
  • iptables常用的命令选项
常见的命令选项:
-L                                查看
-A                                追加,放置最后一条
-I                                插入,默认插入成第一条
-D                                删除
-F                                清空flush
-P                                 设置默认策略policy

处理动作:
filter表:
-j ACCEPT                允许
-j DROP                    丢弃,没有任何提示信息
-j REJECT                拒绝,有提示信息
-j LOG                    写日志     /var/log/messages    然后将数据包传递给下一条规则



nat表:
-j SNAT                        源地址转换 POSTROUTING
-j DNAT                        目标地址转换 PREROUTING

1. Filter表

1.1 示例1:(全部允许/拒绝/丢弃)

iptables -t filter -A INPUT -j DROP            添加规则,丢弃所有进来的数据包
iptables -t filter -A INPUT -j ACCEPT        添加规则,允许所有进来的数据包

//指定位置插入规则,允许所有进来的数据包第1条规则
iptables -t filter -I INPUT 1 -j ACCEPT      


iptables -t filter -A OUTPUT -j DROP      添加规则,丢弃所有出去的数据包

//指定位置插入规则,拒绝所有进来的数据包为第3条规则
iptables -t filter -I INPUT 3 -j REJECT      

iptables -t filter -L --line-numbers      查看规则编号
iptables -t filter -R INPUT 1 -j ACCEPT        覆盖已有规则

iptables -t filter -D INPUT 3            删除INPUT链的第3条规则
iptables -t filter -F                    清空filter表的所有规则

iptables -A INPUT -j LOG            增加规则,先写日志,然后将数据包传递给下一条规则
iptables -I INPUT 2 -j DROP            

iptables -t filter -P INPUT DROP        设置链上的默认规则
iptables -D INPUT 1

说明:如果不指定表名,默认操作filter表

课堂练习1:

1.2 示例2:(根据源和目标地址匹配)

匹配的条件:
-s 192.168.134.0/24            源地址
-d 192.168.134.1            目标地址
-p tcp|upd|icmp                协议
-i  lo                        input 从lo接口进入的数据包
-o eth0                      output 从eth0出去的数据包
-p tcp --dport 80           目标端口是80,必须和-p tcp|udp 连用
-p udp --dport 53           目标端口是53/udp

思考:什么是源地址和目标地址?

iptables -t filter -A INPUT -s 10.1.1.3 -j ACCEPT        允许源地址为10.1.1.3进入
iptables -t filter -A INPUT ! -s 10.1.1.3 -j ACCEPT        不允许源地址为10.1.1.3进入
iptables -t filter -A INPUT -s 10.1.1.3 -j DROP            拒绝源地址为10.1.1.3进入
iptables -t filter -A OUTPUT -d 10.1.1.3 -j DROP    丢弃到达目标地址为10.1.1.3的包
iptables -t filter -A OUTPUT ! -d 10.1.1.3 -j ACCEPT  丢弃到达目标地址为10.1.1.3的包

iptables -t filter -A INPUT -d 10.1.1.2 -j DROP        丢弃所有到目标地址10.1.1.2的包    
iptables -t filter -A OUTPUT -s 10.1.1.2 -j ACCEPT    源地址为10.1.1.2出去的包全部允许

课堂练习2:
禁止你的另外一台服务器访问你(INPUT和OUTPUT)

1.3 示例3:(根据协议匹配过滤)

iptableS -A INPUT -s 10.1.1.3 -p icmp -j DROP
iptables -A INPUT -s 10.1.1.3 -p tcp -j DROP
iptables -A INPUT -s 10.1.1.3 ! -p tcp -j DROP

icmp协议中:
icmp-type 8 类型为8代表请求回显,ping请求
icmp-type 0 类型为0代表回显应答,ping应答

需求1:只允许自己ping通别人,不允许别人ping通自己
iptables -t filter -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT
iptables -t filter -A INPUT -p icmp --icmp-type 0 -j ACCEPT

需求2:只允许自己和10.1.1.2相互ping通,其他人不能ping通自己,但是允许自己ping通别人
iptables -A INPUT -s 10.1.1.2 -p icmp --icmp-type 8 -j ACCEPT

1.4 示例4:(根据端口匹配过滤)

iptables -A INPUT -s 10.1.1.2 -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -s 10.1.1.2 -p tcp --dport 20:21 -j ACCEPT
iptables -A INPUT -s 10.1.1.2 -p tcp --dport 22 -j ACCEPT


课堂练习3:
1. 禁止你的另外一台服务器访问你的80端口,在INPUT和OUTPUT

2. 只允许别人访问你的80端口

3. 拒绝所有人登录你的sshd服务

1.5 iptables内置模块(扩展)

-m 参数+ <模块名>
1. multiport  多端口    目的:指定多个不连续的端口,减少iptables的条目,达到优化效果
用法:
iptables -m multiport --help
-m multiport 
        --dports port[,port:port,port...]
        --sports port[,port:port,port...]
示例:
iptables -t filter -A INPUT -s 10.1.1.2 -p tcp --dport 22 -j ACCEPT
iptables -t filter -A INPUT -s 10.1.1.2 -p tcp --dport 80 -j ACCEPT
等于
iptables -t filter -I INPUT -s 10.1.1.2 -p tcp -m multiport --dports 22,80 -j ACCEPT

2. iprange    ip范围
用法:
iptable -m iprange --help
-m iprange
        --src-range ip[-ip]
        --dst-range ip[-ip]
        
iprange match options:
[!] --src-range ip[-ip]    Match source IP in the specified range
[!] --dst-range ip[-ip]    Match destination IP in the specified range

示例:
iptable -t filter -A INPUT -m iprange --src-range 10.1.1.2-10.1.1.5 -j DROP

3. state   连接状态        目的:根据连接请求的状态进行数据过滤
状态值:
NEW:            首次访问,比如:打开网站看到首页文件,后续点击叫后续操作
ESTABLISHED:    连接完成  1)某服务的后续所有访问    2)服务器的所有响应    
RELATED:        相关联的连接,比如ftp连接,命令连接成功后,建立数据连接
INVALID:        无效链接

示例:
iptables -A OUTPUT -p tcp -m multiport --sports 20:22,80,137,445 -j ACCEPT
等于
iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT 

1.6 综合案例

环境:
server:10.1.1.1        部署了FTP服务,httpd服务,samba服务,ssh服务
client1:10.1.1.2    
client2:10.1.1.3    
    

要求:
1. server端根据权限最小化原则,INPUT和OUTPUT的默认规则改为DROP
2. client2可以访问server端的所有服务
3. client1只能访问server端的ftp服务和ssh服务
4. IP地址为10.1.1.100到10.1.1.200之间的人只能访问server端的samba服务

具体步骤:

首先,server端部署相关服务并启动
//查看相应的软件包是否成功安装,没安装请安装它
[root@server ~]# rpm -q vsftpd httpd samba openssh-server
vsftpd-2.2.2-11.el6_4.1.x86_64
httpd-2.2.15-29.el6.centos.x86_64
samba-3.6.9-164.el6.x86_64
openssh-server-5.3p1-94.el6.x86_64

//启动相应的服务
[root@server ~]# service vsftpd start
[root@server ~]# service httpd restart
[root@server ~]# service nmb start
[root@server ~]# service smb start
[root@server ~]# service sshd restart

//检查端口是否处于监听状态

[root@server ~]# netstat -anltp|grep vsftpd                tcp/21号端口
[root@server ~]# netstat -anltp|grep httpd                tcp/80号端口
[root@server ~]# netstat -anltp|grep smb                tcp/139,445号端口
[root@server ~]# netstat -anltp|grep sshd                tcp/22号端口

1. server端根据权限最小化原则,INPUT链的默认规则改为DROP
[root@server ~]# iptables -F
[root@server ~]# iptables -L
[root@server ~]# iptables -P INPUT DROP
[root@server ~]# iptables -L
Chain INPUT (policy DROP)    //默认拒绝    
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)    
target     prot opt source               destination  


2. client2可以访问server端的所有服务
                             
[root@server ~]# iptables -A INPUT -s 10.1.1.3 -d 10.1.1.1 -m multiport -p tcp --dports 20:22,80,139,445 -j ACCEPT

//ftp服务比较麻烦,需要固定被动模式下的端口
vim /etc/vsftpd/vsftpd.conf
增加如下内容:
pasv_min_port=2000
pasv_max_port=3000

[root@server ~]# iptables -A INPUT -d 10.1.1.1 -s 10.1.1.3 -p tcp --sport 2000:3000 -j ACCEPT

3. client1只能访问server端的ftp服务和ssh服务
//client1访问server端的ssh服务,server端规则如下:
[root@server ~]# iptables -A INPUT -s 10.1.1.2 -d 10.1.1.1 -p tcp --dport 22 -j ACCEPT

注意:此时server如果不能远程访问client1主机,解决方案如下:
则需要再添加如下规则:
[root@server ~]# iptables -A INPUT -s 10.1.1.2 -d 10.1.1.1 -m state --state ESTABLISHED -j ACCEPT

//client1访问server端ftp服务,server端规则如下:

[root@server ~]# iptables -A INPUT -s 10.1.1.2 -d 10.1.1.1 -m multiport -p tcp --dports 20:21,2000:3000 -j ACCEPT

4. IP地址为10.1.1.100到10.1.1.200之间的人只能访问server端的samba服务
iptables -A INPUT -m iprange --src-range 10.1.1.100-10.1.1.200 -p tcp -m multiport --dports 139,445 -j ACCEPT

扩展:

FTP服务除了在server端指定被动模式下的随机端口号的范围外,还有没有其他方法实现?

方法一: 为vsftpd指定数据端口
# iptables -I INPUT -p tcp --dport 20:21 -j ACCEPT
# vim /etc/vsftpd/vsftpd.conf
pasv_min_port=50000
pasv_max_port=60000
# iptables -I INPUT -p tcp --dport 50000:60000 -j ACCEPT

方法二: 使用连接追踪模块(扩展)
[root@hou ~]# iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@hou ~]# iptables -I INPUT -p tcp --dport 20:21 -j ACCEPT      
[root@hou ~]# modprobe nf_conntrack_ftp                    //加载连接追踪模块(临时)
[root@hou ~]# vim /etc/sysconfig/iptables-config        //开机自动加载
IPTABLES_MODULES="nf_conntrack_ftp"

nf_conntrack_ftp: 针对数据端口连接时,将三次握手第一次的状态由NEW识别成RELATED

注意:修改完配置文件需要重启防火墙

常见协议的端口 /etc/services
[root@hou ~]# grep ^http /etc/services
服务        协议                端口/传输协议
sshd        ssh                22/tcp
httpd       http                80/tcp
            https                443/tcp
dns            domain            53/udp,53/tcp
mail        smtp                25/tcp                
            smtps               465/tcp             
            pop3                110/tcp            
            pop3s            995/tcp
            imap                143/tcp
            imaps            993/tcp
dhcp        bootps              67/udp          
nfs            nfs                2049/tcp
samba                        137,138,139/tcp
                                445/tcp
ftp            ftp                    21/tcp
            ftp-data            20/tcp
tftp           tftp               69/udp
ntp           ntp                123/udp      
syslog        syslog            514/udp

2. Nat表

三条链:
PREROUTING
POSTROUTING
OUTPUT

处理动作
nat表:
-j SNAT                        源地址转换 POSTROUTING
-j DNAT                        目标地址转换 PREROUTING
-j MASQUERADE                 地址伪装

2.1 地址转换应用场景

  • 公司内部员工访问互联网

 

  • 互联网用户访问公司服务器

 

2.2 地址转换原理

2.2.1 源地址转换(SNAT)

 

2.2.2 目标地址转换(DNAT)

 

2.3 地址转换应用

2.3.1 源地址转换—SNAT
环境:
client:10.1.1.2
nat-server:10.1.1.12.2.2.1
web-server:2.2.2.2

需求:
客户端client是私有IP,想要访问互联网中的web服务

步骤:
1. client端:设置自己的默认路由(网关)指向nat-server服务器
[root@client ~]# route add default gw 10.1.1.1
[root@client ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.1.1.0        0.0.0.0         255.255.255.0   U     1      0        0 eth0
0.0.0.0         10.1.1.1        0.0.0.0         UG    0      0        0 eth0

2. nat-server端:开启路由转发功能并添加防火墙规则
[root@nat-server ~]# iptables -t nat -A POSTROUTING -s 10.1.1.0/24 -j SNAT --to 2.2.2.1

3. web-server端:搭建web服务
[root@web-server ~]# echo "this is snat test page" > /var/www/html/index.html
[root@web-server ~]# service httpd restart

[root@web-server ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
2.2.2.0         0.0.0.0         255.255.255.0   U     1      0        0 eth0

4. client端测试验证:client端10.1.1.2是否可以访问web-server端2.2.2.2的web服务

[root@client ~]# elinks --dump http://2.2.2.2
   this is snat test page

思考1:家里实现上网和上面有什么不同?

[root@nat-server ~]# iptables -t nat -A POSTROUTING -s 10.1.1.0/24 -j MASQUERADE

思考2:地址转换是在NAT表上进行,如果我在nat-server上的filter的FORWARD链拒绝转发,是否可以正常访问?

总结:

  1. SNAT源地址转换目的实现私网地址可以访问互联网

  2. NAT设备可以是硬件防火墙、路由器等物理设备,但是都得具有路由和地址转换功能

  3. 当请求发送到NAT设备后,NAT设备首先查看自己的路由表,然后再进行地址转换,所以应该在NAT表的POSTROUTING链上进行源地址转换(路由后)

  4. 对于NAT表和FILTER表来说,数据包进来先经过NAT表的PREROUTING链,再过路由表,再选择不同的路出去

 

2.3.2 目标地址转换—DNAT
环境:
web-server:10.1.1.3
nat-server:10.1.1.12.2.2.1
client:2.2.2.2

需求:公网用户client访问私网服务器提供的WEB服务

步骤:
1. web-server端:10.1.1.3上搭建web服务
2. nat-server端:10.1.1.12.2.2.1端开启路由转发功能并添加DNAT规则
[root@nat-server ~]# iptables -t nat -A PREROUTING -d 2.2.2.1 -p tcp --dport 80 -j DNAT --to 10.1.1.3

3. client端:2.2.2.2客户端测试验证
[root@client ~]# elinks --dump http://2.2.2.1
   this is dnat test page

六、总结

 puppet自动化配置

课程目标

  • 理解

    • 了解puppet的概念和应用场景

    • 了解puppet基本语法和资源的定义⽅法

  • 掌握

    • puppet服务端和客户端的安装配置

一、puppet的介绍

  • puppet是什么?

    • puppet是一种Linux、Unix、windows平台的集中配置管理系统,使用自有的puppet描述语言,可管理配置文件、用户、cron任务、软件包、系统服务等。

    • puppet将自己所管理的系统实体(文件、用户、软件包等等)称之为资源

    • puppet是开源的可以免费使用,基于ruby语⾔言开发

  • puppet的作用和目的是什么?

    • 作用:是实现资源的自动化批量部署配置管理,最常用的是集群服务和配置文件的管理

    • 目的:提高运维人员的工作效率,降低了运维人员的工作难度

  • puppet的工作模式什么?

    • puppet采用C/S的结构模型,服务端/客户端。

      • 服务端 puppetmaster—>负责配置和配置任务

      • 客户端 puppet —>既是一个命令也是一个服务,从puppetmaster端主动拉取数据

  • puppet的应用场景有哪些?

    • 用户管理

    • 集群配置

    • 等等

  • puppet的工作模式是什么?

    • 每个puppet客户端每半小时(可以设置)连接一次服务器端, 下载最新的配置文件,并且严格按照配置文件来配置客户端。

    • 配置完成以后,puppet客户端可以反馈给服务器端一个消息. 如果出错,也会给服务器端反馈一个消息。

 puppet的agent和master之间的数据传输是通过SSL证书认证完成的。具有服务器身份验证和数据传输加密功能。

 

二、puppet的安装配置

1. 环境说明

puppet-master:    192.168.159.128    FQDN:puppet-master.hou.cc
puppet-agent1:    192.168.159.128    FQDN:agent1.hou.cc
puppet-agent2:    192.168.159.130    FQDN:agent2.hou.cc

说明:
三台虚拟主机建议都在nat模式,保证都能够上外网。

2. 环境准备

2.1 配置FQDN(重要)
[root@puppet-master ~]# cat /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=puppet-master.hou.cc

[root@puppet-master ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.159.128    puppet-master.hou.cc master
192.168.159.129 puppet-agent1.hou.cc agent1
192.168.159.130 puppet-agent2.hou.cc agent2


注意:更改完后记得重启机器
2.2 所有服务器系统时间保证一致(重要)
1. 搭建NTP服务器    puppet-master

2. 所有的agent客户端定义计划任务来像puppet-master同步时间
# crontab -e
*/2 * * * * /usr/bin/rdate -s 192.168.159.128 2>/tmp/date.log
2.3 关闭防火墙和SElinux

 

2.4 配置yum源

puppetlabs-release-6-5.noarch.rpm

1. 清理你当前的yum环境(把本地源注释掉)
2. 将centos系统自带的基础的yum源配好
3. 配置puppet的yum源


[root@puppet-master yum.repos.d]# ls
bak  demo.repo
[root@puppet-master yum.repos.d]# mv demo.repo demo.repo.bak
[root@puppet-master yum.repos.d]# mv bak/* .
[root@puppet-master yum.repos.d]# ls
bak  CentOS-Base.repo  CentOS-Debuginfo.repo  CentOS-Media.repo  CentOS-Vault.repo  demo.repo.bak

//下载相应puppet的yum源的软件包
-P 指定下载的路径
[root@puppet-master yum.repos.d]# wget -P /usr/src/ http://yum.puppetlabs.com/el/6/products/x86_64/puppetlabs-release-6-5.noarch.rpm

//安装软件包来配置yum源
[root@puppet-master src]# ls
debug  kernels  puppetlabs-release-6-5.noarch.rpm
[root@puppet-master src]# rpm -ivh puppetlabs-release-6-5.noarch.rpm

[root@puppet-master src]# ls /etc/yum.repos.d/
bak  CentOS-Base.repo  CentOS-Debuginfo.repo  CentOS-Media.repo  CentOS-Vault.repo  demo.repo.bak  puppetlabs.repo

//测试验证
yum clean all
yum makecache
View Code

 

3. 安装puppet的server端

puppet-master:
[root@puppet-master ~]# yum -y install puppet-server puppet

启动puppetmaster服务:
[root@puppet-master ~]# service puppetmaster start
Starting puppetmaster:                                     [  OK  ]
[root@puppet-master ~]# netstat -nltp|grep ruby
tcp        0      0 0.0.0.0:8140                0.0.0.0:*                   LISTEN      3034/ruby    

4. 安装puppet的agent端

puppet-agent1和puppet-agent2:
[root@puppet-agent1 ~]# yum -y install puppet
[root@puppet-agent2 ~]# yum -y install puppet

客户端服务暂时不要启动:
[root@puppet-agent1 ~]# service puppet status
puppet is stopped

5. 修改相关配置文件

1. 修改master端配置文件
[root@puppet-master ~]# vim /etc/puppet/puppet.conf 
[main]
.....
[master]
certname=puppet-master.hou.cc        //定义签名认证的名称,自己的主机名
2. 修改agent端配置文件
[root@puppet-agent1 ~]# vim /etc/puppet/puppet.conf 
[agent]        //默认有
certname = puppet-agent1.hou.cc            //定义自己签名认证的名称,自己的主机名
server = puppet-master.hou.cc    //指定puppetmaster(作为自己的服务端和认证端)
runinterval = 180                //定义多长时间主动从master端拉取一次,单位秒


[root@puppet-agent2 ~]# vim /etc/puppet/puppet.conf 
[agent]
certname = puppet-agent2.hou.cc
server = puppet-master.hou.cc
runinterval = 60

6. 配置客户端和服务的认证连接

注意:客户端先不要开启puppet服务,启动会自动发起认证请求

1. agent端尝试发起注册申请
// 手动测试;一次性向服务端尝试拉取一次;如果是新装的客户端就是先发起注册申请
# puppet agent -t  

[root@puppet-agent1 ~]# puppet agent -t
Info: Creating a new SSL key for puppet-agent1.hou.cc
Info: Caching certificate for ca
Info: csr_attributes file loading from /etc/puppet/csr_attributes.yaml
Info: Creating a new SSL certificate request for puppet-agent1.hou.cc
Info: Certificate Request fingerprint (SHA256): E5:9F:EA:B4:9F:15:7E:36:9A:72:98:0D:9C:C6:8B:FF:9E:D2:B9:E3:82:1E:EF:D2:D9:16:1B:87:B0:CC:9D:4B
Info: Caching certificate for ca
Exiting; no certificate found and waitforcert is disabled
[root@puppet-agent1 ~]# 

[root@puppet-agent2 ~]# puppet agent -t
Info: Creating a new SSL key for puppet-agent2.hou.cc
Info: Caching certificate for ca
Info: csr_attributes file loading from /etc/puppet/csr_attributes.yaml
Info: Creating a new SSL certificate request for puppet-agent2.hou.cc
Info: Certificate Request fingerprint (SHA256): D7:35:AF:14:C6:94:90:29:12:86:BC:44:5D:87:79:66:47:64:85:ED:46:A7:54:15:4F:05:07:C0:5F:1B:CA:58
Info: Caching certificate for ca
Exiting; no certificate found and waitforcert is disabled
2. master端查看当前注册申请
[root@puppet-master ~]# puppet cert --list        //查看谁来向我发起认证请求
  "puppet-agent1.hou.cc" (SHA256) E5:9F:EA:B4:9F:15:7E:36:9A:72:98:0D:9C:C6:8B:FF:9E:D2:B9:E3:82:1E:EF:D2:D9:16:1B:87:B0:CC:9D:4B
  "puppet-agent2.hou.cc" (SHA256) D7:35:AF:14:C6:94:90:29:12:86:BC:44:5D:87:79:66:47:64:85:ED:46:A7:54:15:4F:05:07:C0:5F:1B:CA:58
3. master端签发认证
[root@puppet-master ~]# puppet cert sign --all
Notice: Signed certificate request for puppet-agent1.hou.cc
Notice: Removing file Puppet::SSL::CertificateRequest puppet-agent1.hou.cc at '/var/lib/puppet/ssl/ca/requests/puppet-agent1.hou.cc.pem'
Notice: Signed certificate request for puppet-agent2.hou.cc
Notice: Removing file Puppet::SSL::CertificateRequest puppet-agent2.hou.cc at '/var/lib/puppet/ssl/ca/requests/puppet-agent2.hou.cc.pem'

注意:如果给单独的agent签名,直接指定agent的主机名即可
4. agent端再次发起申请测试
[root@puppet-agent1 ~]# puppet agent -t
Info: Caching certificate for puppet-agent1.hou.cc
Info: Caching certificate_revocation_list for ca
Info: Caching certificate for puppet-agent1.hou.cc
Warning: Unable to fetch my node definition, but the agent run will continue:
Warning: undefined method `include?' for nil:NilClass
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Caching catalog for puppet-agent1.hou.cc
Info: Applying configuration version '1525285931'
Info: Creating state file /var/lib/puppet/state/state.yaml
Notice: Finished catalog run in 0.03 seconds

说明:
1. 以下信息说明agent1端已经注册完成
Info: Caching catalog for puppet-agent1.hou.cc
Notice: Finished catalog run in 0.03 seconds
2. 以下warning提示说客户端在服务端的配置中还没有被定义节点,就是puppet服务端的配置文件中还没有给这个新来的客户端定义它的工作内容,目前可以忽略

三、puppet的C/S模式工作原理

 

 

四、puppet的基本语法和资源定义

1. 资源类型

回忆:什么是puppet里的资源? puppet的操作对象

常见的资源类型:

 

2. 目录说明
[root@puppet-master ~]# ls /etc/puppet/
auth.conf  environments  fileserver.conf  manifests  modules  puppet.conf

manifests 
1. Puppet的清单目录,至少需要包含site.pp文件;
2. puppet的清单文件是以.pp来结尾的;
3. site.pp文件是puppet的一个索引文件,类似网页文件的index.html文件

modules 
1. 模块目录,这个模块主要是由资源,文件,模板,类来组成的。(puppet的核心)
2. 模块的核心配置文件是init.pp,该文件定义了具体某个模块的相应资源

puppet.conf
//master端配置文件,该文件是由puppet软件带来
3. 资源定义格式
node 'xxxx' {
type{'title':
    attr1 => value1,
    attr2 => value2,
    ...  
    ;——>此分号可以省略
}
}

解释:
type代表资源类型——>file,user,service...
{}里定义资源的属性信息
'title':代表资源标题,固定写法。用来表示资源的,同一类型资源中,资源的title不能重复,负责会报错
attr1和attr2代表资源的属性,比如file资源,mode属性代表文件的权限信息;比如user资源,name属性代表用户名等
value1和value2代表属性值;给属性赋值用=>符号

特殊属性:
ensure属性:用来定义资源的目标状态,不同的资源ensure值不同。比如,user资源中ensure可以设置为present表示用户必须存在;设置为absent表示用户不能存在(删除用户)。
但是在service资源中,ensure的值往往被设置为stopped或者running。大部分是前者。

五、应用案例

1. 在所有的agent端创建文件
在puppetmaster端创建一个索引文件site.pp

[root@puppet-master ~]# cat /etc/puppet/manifests/site.pp
node 'default'{
   file {"abc": 
    path => "/tmp/haha.txt",
    content => "Hello puppet agent1";
    }
}

说明:
1. node 'xxxx'代表定义一个新的客户端节点(使用FQDN);
2. node 'default' 代表所有的agent主机,一般放在最上面
2.在不同的agent上创建不同文件
[root@puppet-master ~]# cat /etc/puppet/manifests/site.pp
node 'puppet-agent1.hou.cc'{
   file {"/tmp/puppet1.txt": 
   content => "Hello puppet agent1";
   }
}

node 'puppet-agent2.hou.cc'{
    file {"aaa": 
    path => "/tmp/2.txt",
    content => "hello puppet agent2";
    }
}
3.在所有的agent上创建oracle和mysql用户
node 'default'{
   user {"abc": 
    name => oracle,
    ensure =>present,
    uid => 666;
    }
    user {"aaa": 
    name => mysql,
    ensure =>present,
    uid => 777;
    }
}


node 'default'{
   user {"abc": 
    name => oracle,
    ensure =>absent
    }
    user {"aaa":
    name => mysql,
    ensure => present
    }
}
4.在agent端安装vsftpd
1. puppet-master端操作:
1) 创建模块目录
[root@puppet-master ~]# mkdir -pv /etc/puppet/modules/vsftpd/{manifests,files}
说明:
manifest目录是vsftpd模块的功能代码目录,该模块有什么功能都会在这里定义
files目录是资源目录,在manifest里定义的代码需要发送一些文件可以放在这里
注意:除了以上两个目录外,一般还有模板templates目录

2) 编辑模块核心文件init.pp 

class vsftpd{                //class定义一个类叫vsftpd,类的名字必须和模块名相同
  yumrepo {"Server":         //定义一个软件仓库资源
  descr => "Server repo", 
  baseurl => "file:///media/CentOS_6.5_Final", 
  gpgcheck => "0", 
  enabled => "1";
  }
  package {"vsftpd":         //定义一个软件包资源
  ensure => installed, 
  require => Yumrepo["Server"];        //注意:关联资源时首字母要大写 
  }    
}

3) 调用模块  

[root@puppet-master ~]# cat /etc/puppet/manifests/site.pp 

node default{
   include vsftpd        //加载调用vsftpd模块
}


4) 检测配置文件语法

[root@puppet-master ~]# puppet parser validate /etc/puppet/modules/vsftpd/manifests/init.pp 
[root@puppet-master ~]# puppet parser validate /etc/puppet/manifests/site.pp 

2. agent端测试验证

[root@puppet-agent1 tmp]# puppet agent -t
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Caching catalog for puppet-agent1.hou.cc
Info: Applying configuration version '1525297414'
Notice: /Stage[main]/Vsftpd/Yumrepo[Server]/ensure: created
Info: changing mode of /etc/yum.repos.d/Server.repo from 600 to 644
Notice: /Stage[main]/Vsftpd/Package[vsftpd]/ensure: created
Notice: Finished catalog run in 16.36 seconds
[root@puppet-agent1 tmp]# rpm -q vsftpd
vsftpd-2.2.2-24.el6.x86_64

[root@puppet-agent1 yum.repos.d]# cat Server.repo 
[Server]
enabled=1
baseurl=file:///media/CentOS_6.5_Final
gpgcheck=0
name=Server repo



思考:安装后需要启动怎么办?
service {"vsftpd":
  ensure => running;
  }

六、总结

1. 如何查看puppet的官方手册

https://docs.puppet.com/puppet/3.8/

https://docs.puppet.com/puppet/3.8/man/file.html

2. 如何查看man文档

Usage: puppet <subcommand> [options] <action> [options]

[root@puppet-master ~]# puppet help
[root@puppet-master ~]# puppet help describe        //列出所有资源类型
EXAMPLE
-------
    $ puppet describe --list        //列出所有资源类型
    $ puppet describe file            //列出关于file资源详细信息
    $ puppet describe user -s -m    //以简短的方式列出user资源相关信息

squid代理

课程目标

  • 了解squid的应用场景

  • 理解squid的工作原理和作用

  • 理解squid的代理类型(重点)

  • 掌握squid的正向和透明代理的配置(重点)

  • 能够根据需求对squid服务器做简单的访问控制

一、squid基本概述

1. squid是什么?用来做什么?

Squid cache(简称为Squid)是流行最广的,使用最普遍的开源缓存代理服务器

2. squid的作用和应用场景有哪些?

  • 用来做前置的Web缓存,加快用户访问Web的速度

  • 代理内网用户访问互联网资源

  • 设置访问控制策略,控制用户的上网行为

  • 主要支持http、ftp等应用协议

  • 官网地址:http://www.squid-cache.org/

3. 常见的代理服务器软件

  • squid 非常古老,功能齐全

  • varnish 性能优于squid,功能相对没有squid多

  • 其他 haproxy 、nginx等

4. squid的工作原理

 

二、squid代理类型

1. 正向代理

 

 

2. 透明代理

 

 正向代理的过程隐藏了真实的请求客户端,服务器不知道真实的客户端是谁,客户端请求的服务都被代理服务器代替请求。我们常说的代理也就是正向代理,正向代理代理的是请求方,也就是客户端;

3. 反向代理

 

 

反向代理的过程隐藏了真实的服务器,客户不知道真正提供服务的人是谁,客户端请求的服务都被代理服务器处理。反向代理代理的是响应方,也就是服务端;

总结:

  1. 正向代理和透明代理中的代理服务器和客户端同属一个LAN,对server端是透明的,服务器并不知道自己为谁提供服务。作用都是让内网用户可以通过代理服务器上互联网,也可以提高访问速度,并且可以通过代理服务器的访问控制限制内网用户的上网行为。

  2. 反向代理的过程隐藏了真正的服务器,对client端是透明的,客户端并不知道真正提供服务的服务器。可以起到负载均衡的作用,提高用户的访问速度。

  3. 两者的区别在于代理的对象不一样:正向代理代理的对象是客户端,反向代理代理的对象是服务端

  4. 应用场景

    • 正向和透明代理:一般用于公司内网用户访问互联网,根据需求进行访问控制

    • 反向代理:一般用于公司服务器集群前做web缓存,提高用户访问效率,同时可以起到负载均衡作用,为互联网提供可持续的web服务

三、squid代理服务器和SNAT|DNAT的区别

1. SNAT和DNAT

  • 网络层次:网络层

    局域网用户访问外网走snat模式,同一个数据包,改变数据包头部的来源地址,再把数据包发到internet。

  • 作用:内网用户上外网(SNAT)和内网服务发布到公网(DNAT)

2. 代理服务器模式

  • 网络层次:应用层

    不改变数据包头信息,把数据包代理给internet的服务器,基于应用层的过滤。

  • 应用层:

    • 协议:http、ftp、pop、smtp、p2p等

  • 作用:缓存页面,加速访问,ACL资源访问控制

  • 反向代理:

    • internet用户访问局域网服务器

    • Squid做反向代理服务器,把用户的请求转发到后方的真实的服务器,可以做到负载均衡的效果,同时缓冲用户经常访问的页面提高访问速度

四、了解squid代理软件相关信息

1. 安装软件

//squid在本地镜像里有,只需要配置好本地yum源即可
[root@squid-server ~]# yum -y install squid

2. 软件的文件列表

[root@squid-server ~]# rpm -ql squid
/etc/squid/squid.conf            //配置文件
/etc/rc.d/init.d/squid                //启动脚本
/usr/sbin/squid                        //二进制命令
/usr/share/doc/squid-3.1.10             //手册
/var/log/squid                        //日志目录
/var/spool/squid                    //缓存目录

3. 配置文件说明

# cat /etc/squid/squid.conf
//设置监听的IP与端口号
http_port 3128

//额外提供给squid使用的内存大小
cache_mem     默认256 MB   

//设置squid磁盘缓存最大文件,超过4M的文件不保存到硬盘
maximum_object_size 4 MB   

//设置squid磁盘缓存最小文件
minimum_object_size 0 KB 

//设置squid内存缓存最大文件,超过4M的文件不保存到内存
maximum_object_size_in_memory 4096 KB   

//定义squid的cache存放路径 、cache目录容量(单位M)、一级缓存目录数量、二级缓存目录数量
cache_dir ufs /var/spool/squid 100 16 256   

//log文件日志格式
logformat combined %&gt;a %ui %un [%tl] "%rm %ru HTTP/%rv" %Hs %<st "%{Referer}>h" "%{User-Agent}&gt;h" %Ss:%Sh        

//log文件存放路径和日志格式
access_log /var/log/squid/access.log combined  

//设置缓存日志
cache_log /var/log/squid/cache.log   

//log轮转60天
logfile_rotate 60   

//cache目录使用量大于95%时,开始清理旧的cache
cache_swap_high 95  

//cache目录清理到90%时停止
cache_swap_low 90   

//定义本地网段
acl localnet src 192.168.1.0/24  

//允许本地网段使用
http_access allow localnet  

//拒绝所有
http_access deny all  

//主机名
visible_hostname xxx.xxxx.xxxx 

//管理员邮箱
cache_mgr 123456@qq.com 

五、squid的正向代理配置

需求:内网用户通过浏览器指定代理服务器的IP和端口访问互联网中的web服务

环境:
client:10.1.1.2
squid-server:10.1.1.12.2.2.1
web-server: 2.2.2.2

思路:
1. squid-server需要2个IP,一个公网一个私网
2. client端只需要和squid-server能互通即可,不需要指定gw和dns;
3. client端需要在浏览器上设置代理服务器的IP和端口
4. squid-server可以上外网,client不能上外网,目的就是让squid代理内网用户访问互联网web服务
5. 搭建一个web服务

步骤:
搭建squid-server服务器:
1. 安装软件
yum -y install squid

2. 根据需求修改配置文件
需求:代理内网所有用户访问互联网的web服务
[root@squid-server ~]# vim /etc/squid/squid.conf
...
#http_access deny all        //注释掉这行
http_access allow all        //将原来的deny all 改成 allow all,允许所有人来访问该代理服务器

cache_dir ufs /var/spool/squid 100 16 256    //取掉前面的注释,打开缓存目录
//增加以下2行
visible_hostname squid-server.itcast.cc        //定义squid服务器主机名
access_log      /var/log/squid/access.log    //定义访问日志

3. 启动squid服务
[root@squid-server ~]# service squid start
init_cache_dir /var/spool/squid... Starting squid: .       [  OK  ]

//服务器启动后会再缓存目录里产生以下一级、二级缓存目录文件
[root@squid-server ~]# ls /var/spool/squid/
00  01  02  03  04  05  06  07  08  09  0A  0B  0C  0D  0E  0F  swap.state

//查看端口3128已经处于监听状态
[root@squid-server ~]# netstat -nltp|grep squid
tcp        0      0 :::3128         :::*       LISTEN      31722/(squid)  

注意:如果再次重启会报以下警告
WARNING cache_mem is larger than total disk cache space!
原因:默认情况下,cache_mem为256M,而squid的配置里磁盘缓存默认为100M
解决:
方法1:调小cache_mem的值
在配置文件中增加:cache_mem 100 MB
方法2:调大磁盘缓存
修改配置文件中如下内容:
cache_dir ufs /var/spool/squid 256 16 256    ——>把100换成256

说明:squid缓存从     内存        ————>    磁盘
                cache_mem        /var/spool/squid

搭建web服务:
web-server:2.2.2.2


客户端测试:
client:10.1.1.2 注意:不需要设置网关和DNS
配置代理服务器前:不能够直接访问web服务
[root@client ~]# ping 2.2.2.2
connect: Network is unreachable
[root@client ~]# wget http://2.2.2.2
--2018-05-05 11:48:12--  http://2.2.2.2/
Connecting to 2.2.2.2:80... failed: Network is unreachable.

浏览器配置代理服务器:指定代理服务器的IP和端口
Firefox:
Edit————>Preference————>Advanced————>Network————>Settings————>Manual proxy configuration
编辑--首选项--高级--网络--设置-- 手动填写代理服务器的IP和代理端口

Chrome:
设置——>高级——>打开代理设置——>连接——>局域网设置——>为LAN使用代理服务器前打勾并填上代理服务器的内网IP及其代理端口
IE:
设置——>Internet选项——>连接——>局域网设置--为LAN使用代理服务器前打勾并填上代理服务器的内网IP及其代理端口

测试访问web页面:
1. client端:打开浏览器,输入:http://2.2.2.2        可以看到web-server的web页面
2. web-server端:查看/var/log/httpd/access.log日志
3. squid-server端:查看/var/log/squid/access.log日志
4. 测试web-server服务停止,squid-server是否缓存

六、squid的透明代理配置

需求:内网用户通过代理服务器可以直接访问互联网中的web服务,不用指定proxy地址和端口

思路:
1. squid-server需要2个IP,一个公网一个私网
2. client端浏览器不需要指定代理服务器的IP和端口,但是需要指定网关为squid-server的私网地址;
3. squid-server需要借助iptables将内网的80端口重定向到自己的3128端口帮内网用户代理上网
4. 搭建一个web服务

步骤:
client端浏览器清空刚刚的代理设置(不要忘记)
client端指定自己的默认网关为squid-server的私有地址:
[root@client ~]# route add default gw 10.1.1.1

squid-server端配置透明代理服务并添加iptables规则:
1. 修改squid配置文件
[root@squid-server ~]# vim /etc/squid/squid.conf
http_port 3128 transparent            //在代理端口后面加上transparent(透明),代表透明代理

重启服务:
service squid restart

2. 添加防火墙规则
[root@squid-server ~]# iptables -t nat -A PREROUTING -s 10.1.1.0/24 -p tcp --dport 80 -j REDIRECT --to-port 3128
[root@squid-server ~]# iptables -t nat -nL

说明:
-j REDIRECT 表示端口重定向,仅用于tcp和udp协议
This is only valid if the rule also specifies -p tcp or -p udp

3. 客户端测试验证
1). client端:打开浏览器,输入:http://2.2.2.2        可以看到web-server的web页面
[root@client ~]# curl -I http://2.2.2.2/index.html    //查看是否缓存
...
X-Cache: HIT from squid-server.itcast.cc
X-Cache-Lookup: HIT from squid-server.itcast.cc:3128    //HIT代表命中,缓存

...
X-Cache: MISS from squid-server.itcast.cc
X-Cache-Lookup: MISS from squid-server.itcast.cc:3128    //MISS代表没有命中,没有缓存

2). web-server端:查看/var/log/httpd/access.log日志
3). squid-server端:查看/var/log/squid/access.log日志
4). 测试web-server服务停止,squid-server是否缓存

七、squid实现访问控制

1. 访问控制配置语法
1. 禁止IP地址为192.168.0.100的客户机上网
    acl test src 192.168.0.100        //定义来源IP,test可以自己定义,代表定义的IP
    http_access deny test            //拒绝test后面定义的源IP:192.168.0.100上网

2. 禁止192.168.1.0这个网段里的所有客户机上网
    acl test src 192.168.1.0/255.255.255.0
    或者
    acl test src 192.168.1.0/24
    http_access deny test

3. 禁止用户访问IP为210.21.118.68的网站
    acl test dst 210.21.118.68
    http_access deny test
    
4. 禁止用户访问域名为www.163.com的网站
    acl test dstdomain –i www.163.com                    //-i: 忽略大小写
    http_access deny test

5. 禁止用户访问多个网址
    acl  test  dstdom_regex "/etc/squid/baddsturl"  
    //如果网址太多,可以写成一个文件,然后在这个文件里一行一个网站写上你要禁止的
    http_access deny test    
    
问题:拒绝了域名访问,IP理论上是可以访问,但是不能访问?why?
原因:通过查看官方手册,发现如下说明:
For dstdomain and dstdom_regex a reverse lookup is tried if a IP based URL is used and no match is found. The name "none" is used if the reverse lookup fails.

对于dstdomain和dstdomregex来说,如果使用基于IP的URL,并且没有找到匹配的话,就会尝试反向查找。如果反向查找失败,则使用“none”这个名称


6. 禁止用户访问域名包含有163.com的网站
    acl test url_regex –i 163.com            //使用正则表达式匹配URL地址 
    http_access deny test
    
7. 禁止用户访问包含有itcast关键字的URL
    acl test url_regex –i itcast
    http_access deny test
    

8. vip用户没有任何限制
    acl vip  arp  00:0C:29:79:0C:1A        //绑定mac地址
    http_access allow  vip 

9. 禁止192.168.2.0这个子网里所有客户机在周一至周五的9点到18点上网
    acl test1 src 192.168.2.0/255.255.255.0
    acl test2 time D 9:00-18:00
    http_access deny test1 test2
    
    时间列表:
        S    Sunday        周日
        M    Monday        周一
        T    Tuesday        周二
        W    Wednesday    周三
        H    Thursday    周四
        F    Friday        周五
        A    Saturday    周六
        D    All weekdays (M-F)    周一到周五
            
10. 禁止用户下载*.mp3,*.exe,*.zip,*.rar带有定义后缀名的文件
    acl test urlpath_regex –i \.mp3$ \.exe$ \.zip$ \.rar$ \.txt$
    //urlpath_regex:正则表达式匹配URI地址
    http_access deny test

注意:
    http_access deny的行为要写在allow的上方    先拒绝再允许

总结:acl访问控制,从上往下匹配,如果匹配到了规则不会往下走,如果都没有匹配上规则,则看最后面的
http_access allow|deny all
2. 应用案例
2.1 根据IP地址访问控制
acl deny_ip src 10.1.1.4
http_access deny deny_ip

注意:如果有多个不同ip地址可以放到一个文件中,如下:
acl deny_ip src "/tmp/ip.txt"
http_access deny deny_ip
2.2 根据域名访问控制
acl deny_dom dstdomain -i www.misshou.cc        //拒绝具体某个域
http_access deny deny_dom

acl deny_dom url_regex -i misshou.cc            //拒绝包含misshou.cc关键字的域
http_access deny deny_dom
2.3 根据时间和日期访问控制
acl idle_time time SA        //课余时间,周六周日
acl work_time time D  9:00-12:00 14:30-17:30    //工作时间周一到周五的上课时间
http_access deny work_time        //上课时间不能上网
http_access allow idle_time        //业余时间可以上网

注意:关于时间的几种错误写法
acl idle_time time A 14:00-18:00 S 9:00-12:00    //错误,只取周六和周天的9:00-12:00

正确写法如下:分成2行写
acl idle_time1 time A 14:00-18:00
acl idle_time2 time S 9:00-12:00

acl idle_time time 20:00-04:00    跨越子夜  //错误
正确写法如下:
acl idle_time time !04:00-20:00
2.4 根据文件名访问控制
acl idle_time time SA
acl work_time time D  9:00-12:00 14:30-17:30
acl content urlpath_regex \.mp4$ \.rmvb$ \.avi$ \.txt$
http_access deny work_time
http_access deny content
http_access allow idle_time

注意:
先deny在allow,匹配规则从上往下一条一条匹配,如果没有匹配到看最后的http_access deny|allow all
3. 综合案例(自己完成)

根据需求控制内网用户访问互联网:

  1. 允许周一到周五12:00-14:00和17:30-21:00和双休能上网,别的时间不能上网

  2. 禁止下载.exe .rar .mp3 .avi .rmvb .mp4后缀的文件

  3. 禁止访问qq.com,mop.com,sina.com,163.com,youku.com

  4. 禁止访问网址中包含某些关键字的网站:比如 sex news movie sport game

  5. vip没有任何限制

具体步骤:
1. squid-server上修改配置文件squid.conf
1) 定义访问控制资源
acl lunchtime time MTWHF 12:00-14:00
acl dinnertime time MTWHF 17:30-21:00
acl weekend time SA 00:00-24:00
acl badfile urlpath_regex -i \.mp3$ \.rmvb$ \.exe$ \.zip$ \.mp4$ \.avi$  \.rar$
acl badweb  dstdom_regex "/etc/squid/denywebsite"
acl badword  url_regex  -i sex news movie sport game stock
acl vip arp 00:0C:29:BB:F6:14

2) 创建禁止访问的网站
vim /etc/squid/denywebsite
qq.com
sina.com
mop.com
163.com
youku.com


3) 根据需求对以上资源做出访问控制
http_access allow vip
http_access deny badfile
http_access deny badweb
http_access deny badword
http_access allow lunchtime
http_access allow dinnertime
http_access allow weekend
http_access deny all

2. 测试验证
总结:

 

 

八、反向代理(扩展)

需求:某公司内网搭建了一台web服务器,希望互联网用户来访问该web服务,越多越好

画图理解:反向代理

环境:
client:2.2.2.2    互联网用户
squid-server:2.2.2.1和10.1.1.1    2个IP,一个公网一个私网
web-server:10.1.1.3  公司内网web服务器

搭建反向代理服务器squid步骤:
1. 清空之前的环境
[root@squid-server ~]# iptables -t nat -nL

2. 修改squid.conf配置文件来配置反向代理
[root@squid-server ~]# vim /etc/squid/squid.conf
...
http_port 80 vhost
cache_peer 10.1.1.3 parent 80 0 originserver 

解释说明:
[root@squid-server ~]# less /usr/share/doc/squid-3.1.10/squid.conf.documented
...
cache_peer hostname type http-port icp-port [options]

cache_peer:做反向代理的关键字
hostname:代表后台真正的web服务器
type:代表代理服务器的类型,有PARENT和SIBLING两种;parent代表父亲,sibling代表兄弟伙伴
http-port:后台web服务的端口
icp-port:代表代理服务器之间通讯的端口(用于查询兄弟缓存的端口)
[options]:代表可选项
originserver:代表原始服务器(真正的web服务)
weight:代表权重
max-conn:代表
...

3. 测试验证
在client端:2.2.2.2上直接访问代理服务器:
http://2.2.2.1

 Nagios监控

课程目标:

  • 了解监控的重要性

  • 能够说出企业里常用的监控软件

  • 了解Nagios的工作原理

  • 掌握Nagios的安装配置

  • 使用Nagios实现邮件报警

一、企业里常用的监控软件

1. 监控软件具备功能

数据采集、数据保存、图像展示、报警系统

2. 常见的监控软件

Cacti:

Cacti是一套基于PHP、MySQL、SNMP:及RRDTool开发的监测图形分析工具。它提供了非常强大的数据和用户管理功能.Cacti监控关注的是对数据的展示,却不关注数据异常后的反馈。

Nagios:

Nagios是一款开源的免费网络监控报警服务,能有效监控Windows、Linux和 Unix的主机状态,交换机、路由器和防火墙等网络设置.在系统或服务状态异常时发出邮件或短信报警第一时间通知运维人员,在状态恢复后发出正常的邮件或短信通知。Nagios有完善的插件功能,可以方便的根据应用服务扩展功能。

Zabbix:Zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案

课后上网查一下现在流行的开源的监控软件

[SNMP]  简单网络管理协议(SNMP),用以监测连接到网络上的设备是否有任何引起管理上关注的情况。
[RRDTool]  (Round Robin Database Tool)就是一个强大的绘图的引擎
 

二、Nagios概述

http://nagios-cn.sourceforge.net/

1. 什么是Nagios?

  • Nagios原名为NetSaint,由Ethan Galstad和一组开发人员开发并维护至今。

  • Nagios是一个监视系统运行状态和网络信息的监视系统。Nagios能监视所指定的本地或远程主机以及服务,同时提供异常通知功能等。

  • Nagios可运行在Linux/Unix平台之上,同时提供一个可选的基于浏览器的WEB界面以方便系统管理人员查看网络状态,各种系统问题,以及日志等。

2. Nagios主要功能

  • 网络服务监控(SMTP、POP3、HTTP、PING等) 公共服务

  • 主机资源监控(cpu负载、磁盘使用情况等) 私有服务

  • 简单地插件设计使得用户可以方便地扩展自己服务的检测方法

  • 当服务或主机问题产生与解决时将告警发送给联系人(EMail、短信、用户定义方式)

  • 可选的WEB界面用于查看当前的网络状态、通知和故障历史、日志文件等

  • 远程监控支持SSH或SSL加通道方式进行监控

3. Nagios的组成

  • nagios的核心组件

  • nagios监控插件

  • nagios web页面

  • nrpe远程主机私有服务的监控组件

说明:

  NRPE是Nagios的一个功能扩展,它可在远程Linux/Unix主机上执行插件程序。通过在远程服务器上安装NRPE插件及Nagios插件程序来向Nagios监控平台提供该服务器的本地情况,如CPU负载,内存使用,磁盘使用等。

三、Nagios监控流程

1. Nagios的工作原理

  • Nagios的功能是监控服务和主机,但是他自身并不包括这部分功能,所有的监控、检测功能都是通过各种插件来完成的。

  • 启动Nagios后,它会周期性的自动调用插件去检测服务器状态,同时Nagios会维持一个队列,所有插件返回来的状态信息都进入队列,Nagios每次都从队首开始读取信息,并进行处理后,把状态结果通过web显示出来。

2. Nagios的插件机制

  • Nagios提供了许多插件,利用这些插件可以方便的监控很多服务状态。

  • 安装完成后,在Nagios主目录下的libexec里放有Nagios自带的可以使用的所有插件,如:check_disk是检查磁盘空间的插件,check_load是检查CPU负载的等等。

  • 每一个插件可以通过运行./check_xxx –h 来查看其使用方法和功能。

  • 基本语法:

./check_xxx  -h

3. Nagios的4种监控状态

Nagios可以识别4种状态返回信息,即:

 

 

4. Nagios的执行流程

当Nagios需要进行对主机和服务进行状态检测时,它将需要检测的信息传给一个插件,由插件来检测主机或服务并给出一个可供进一步运作的状态,将结果返给Nagios守护进程。Nagios按照主机或服务的结果来做适当地动作(如发出告警等)。

 

 

Nagios有许多"外部构件"软件包可供使用。外部构件可以扩展Nagios的应用并使之与其他软件集成。

4.1 Nagios的常见外部构件
  1. NRPE是一个可在远程Linux/Unix主机上执行的插件的外部构件包。如果你需要监控远程的主机上的本地资源或属性,如磁盘利用率、CPU负荷、内存利用率等时是很有用的。

  2. NSCA是一个可在远程Linux/Unix主机上执行被动检测并将结果传给Nagios守护进程的外部构件包。这在分布式冗余/失效监控的设置时非常有用。

  3. NDOUtils是一个可以把全部状态信息保存到MySQL数据库里的外部构件。

 

4.2 Nagios监控过程
  1. Nagios监控端执行安装在它里面的check_nrpe 插件,并告诉check_nrpe去检测哪些服务

  2. Nagios监控端通过SSL协议,check_nrpe连接远端被监控机上的NRPE

  3. 被监控端NRPE运行本地的各种插件去检测本地的服务和状态(check_disk,check_load等)

  4. 最后,由NRPE把检测的结果传给Nagios监控端的check_nrpe插件,check_nrpe 再把结果加到Nagios状态队列中。

  5. Nagios依次读取队列中的信息,再把结果通过web显示出来。

5. Nagios的监控服务

5.1 公有服务(公共服务)
  • Linux/UNIX的"公共服务"如:(公共服务直接监控就可以了)

    • HTTP

    • FTP

    • SSH

    • SMTP

    • ...

5.2 私有服务
  • Linux/UNIX的"私有"服务如下:(需要走nrpe私有通道)

    • CPU负荷

    • 内存使用率

    • 磁盘利用率

    • 登录用户

    • 运行进程

    • cpu负载等

总结:

 

四、Nagios的安装

1. RPM搭建LAMP环境

[root@nagios-server ~]# yum -y install gd mysql mysql-server php httpd* gcc glibc glibc-common mysql-devel
[root@nagios-server ~]# yum -y localinstall gd-devel-2.0.35-11.el6.x86_64.rpm
如果报错可以加:
--nogpgcheck 不检查软件包签名

启动mysql数据:
# service mysqld start
设置用户名和密码:
# mysqladmin -uroot -h localhost password '123'
# mysql -uroot -p123

2. 创建用户组

[root@nagios-server ~]# useradd nagios
[root@nagios-server ~]# groupadd nagiosgroup
[root@nagios-server ~]# usermod -G nagiosgroup nagios
[root@nagios-server ~]# usermod -G nagiosgroup apache    
//你的web服务器由哪个用户跑,就把哪个用户也加到这个组

3. 安装Nagios的主程序包

//找到你nagios相关软件包的存放路径,我在/nagios下
[root@nagios-server ~]# cd /nagios/
[root@nagios-server nagios]# tar -xf nagios-4.0.5.tar.gz -C /usr/src/
[root@nagios-server nagios]# cd /usr/src/nagios-4.0.5/
[root@nagios-server nagios-4.0.5]# ./configure --with-nagios-user=nagios --with-nagios-group=nagiosgroup --with-gd-lib=/usr/lib --with-gd-inc=/usr/include/

//编译
make all                    

//安装
make install                安装主程序,CGI脚本和web网页文件
make install-init            安装服务脚本/etc/init.d/nagios
make install-commandmode     修改一些相应的目录权限
make install-config            安装/usr/local/nagios/etc这个目录(包含配置文件模版)
make install-webconf        安装/etc/httpd/conf.d/nagios.conf子配置文件
make install-exfoliation    安装exfoliation主题(也就是web皮肤和样式),会覆盖其它主题
make install-classicui        安装classicui主题,会覆盖其它主题

//安装完后查询相关目录内容
[root@nagios-server nagios-4.0.5]# ls /usr/local/nagios/
bin  etc  libexec  sbin  share  var

//libexec目录为空,需要安装插件包才会有很多命令与脚本
[root@nagios-server nagios-4.0.5]# ls /usr/local/nagios/libexec/

4. 安装Nagios的插件包

[root@nagios-server nagios]# tar -xf nagios-plugins-2.0.3.tar.gz -C /usr/src/
[root@nagios-server nagios]# cd /usr/src/nagios-plugins-2.0.3/
[root@nagios-server nagios]# ./configure --with-nagios-user=nagios --with-nagios-group=nagiosgroup 
[root@nagios-server nagios-plugins-2.0.3]# make
[root@nagios-server nagios-plugins-2.0.3]# make install

5. 创建web页面可以访问的用户

/etc/httpd/conf.d/nagios.conf        //这个文件里已经配置了nagios的apache验证,所以我们要把用户给创建出来

# htpasswd -c /usr/local/nagios/etc/htpasswd.users nagiosadmin 
New password: 
Re-type new password: 
Adding password for user nagiosadmin

//这里注意一下,用户名一定要用nagiosadmin,如果你用其它自定义的用户名,可以通过apache的验证,但是查看nagios数据时,会没有权限查看到数据

# /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg 
//检测nagios配置文件正确性

6. 启动Nagios和http服务

/etc/init.d/nagios restart
/etc/init.d/httpd restart

注意:selinux关闭,否则可能造成图形看不到信息

7. 测试访问Nagios的web页面

http://10.1.1.1/nagios/

 

五、Nagios配置文件介绍

1. 常见的配置文件

/usr/local/nagios/etc/nagios.cfg        主配置文件,核心配置文件

/usr/local/nagios/etc/resource.cfg        nagios的资源或者变量定义文件
其中,变 $USER1$指定安装nagios插件的路径,如果把插件安装在了其它路径只需在这里进行修改即可。需要注意的是,变量必须先定义,然后才能在其它配置文件中进行引用。

/usr/local/nagios/etc/cgi.cfg
此文件用来控制相关cgi脚本的,如果想在nagios的web监控界面执行cgi脚本,如重启nagios进程、关闭nagios通知、停止nagios主机检测等,这时就需要配置cgi.cfg文件 。


CGI:通用网关接口(Common Gateway Interface)是一个Web服务器主机提供信息服务的标准接口。通过CGI接口,Web服务器就能够获取客户端提交的信息,转交给服务器端的CGI程序进行处理,最后返回结果给客户端。
CGI脚本:简单地讲是个运行在Web服务器上的程序, 由浏览器的用户输入触发. 

/usr/local/nagios/etc/objects/            子配置文件的目录
        localhost.cfg            一个示例模版,默认定义了监控本机的8个服务
        templates.cfg            模版定义文件
        commands.cfg            命令定义文件
        contacts.cfg            定义通知方式的文件
        timeperiods.cfg            监控时间段定义文件

nagios主要用于监控主机资源以及服务,在nagios配置中称为对象,为了不必重复定义监控对象,Nagios引个模板配置文件,将这些共性的属性定义成模板,以便于多次引 。这就是templates.cfg的作用。

2. nagios配置文件之间的联系(重点)

在Nagios的配置过程中涉及到的几个定义有:主机、主机组,服务、服务组,联系人、联系人组,监控时间,监控命令等,从这些定义可以看出,Nagios各个配置文件之间是互为关联,彼此引用的。成功配置出一台Nagios监控系统,必须要弄清楚每个配置文件之间依赖与被依赖的关系,最重要的有四点:

1)定义监控哪些主机、主机组、服务和服务组;

2)定义这个监控要用什么命令实现;

3)定义监控的时间段;

4)定义主机或服务出现问题时要通知的联系人和联系人组。

 

以监控本地主机为例说明:

 

# vim /usr/local/nagios/etc/nagios.cfg

//cfg_file:指定监控对象的配置文件
cfg_file=/usr/local/nagios/etc/objects/localhost.cfg


# vim /usr/local/nagios/etc/objects/localhost.cfg 
//定义具体监控的内容
//define host 表示定义监控主机
define host{
        use                     linux-server  调用模版,在templates.cfg 里定义的
        host_name               localhost      主机名    
        alias                   localhost      主机别名    
        address                 127.0.0.1      被监控机器的IP
        }


define hostgroup{
        hostgroup_name  linux-servers         定义一个监控主机组
        alias           Linux Servers         别名
        members         localhost        linux Servers组现在只有localhost这一个成员 
        }


下面是8个默认定义的服务,以监控主机是否"活着"的这一段为例
define service{
        use            local-service    使用模版,在templates.cfg 里定义的 
        host_name      localhost   主机名,调用的是同配置文件里define host里定义的host_name
        service_description   PING    服务描述,会在web界面显示的一个标题
        check_command     check_ping!100.0,20%!500.0,60%      检测是否活着,通过ping命令
        }

      
# vim /usr/local/nagios/etc/objects/templates.cfg 
//模板文件

define host{
    name                            linux-server
    use                             generic-host    
说明:linux主机模版也使用了一个叫generic-host的模版,也在templates.cfg里
    check_period                    24x7         //在timeperiods.cfg 里定义的时间段
    check_interval                  5     //检测时间间隔
    retry_interval                  1     //重试时间间隔
    max_check_attempts              10     //最大检测次数
    check_command                   check-host-alive  //在commands.cfg 里定义的命令
    notification_period             workhours    //通知时间在timeperiods.cfg里定义的
    notification_interval           120        //通知间隔
    notification_options            d,u,r         //通知选项
    contact_groups                  admins        //通知组,在contacts.cfg 里定义
    register                        0          //不注册,表示这只是一个模版,被调用,不会被nagios进程认为就是一台主机
    }

其中,通知选项中,w即warn,表示警告状态,u即unknown,表示不明状态; c即criticle,表示紧急状态,r 即recover,表示恢复状态。d即down,表示宕机状态; 

# vim /usr/local/nagios/etc/objects/commands.cfg
define command{
        command_name    check-host-alive
        command_line    $USER1$/check_ping -H $HOSTADDRESS$ -w 3000.0,80% -c 5000.0,100% -p 5
        }

解释说明:
1. $USER1$表示resource.cfg文件中定义的插件的存放路径
2. -H 表示check_ping插件的一个参数,-H, --hostname=HOST,host to ping,需要ping的主机
3. $HOSTADDRESS$表示Nagios定义的一个宏。代表主机地址,取自于主机定义里的address域。
4. -w、-c和-p表示check_ping插件的参数:
-w, --warning=THRESHOLD,warning threshold pair
-c, --critical=THRESHOLD,critical threshold pair
-w:后面跟的是一对阀值,网络延迟平均3000ms(3s),包丢失率在80%会发出警告;
-c:后面跟的是一对阀值,网络延迟平均5000ms(5s),包丢失率在100%会发出错误;
-p, --packets=INTEGER        表示每次探测默认发送5个数据包
    number of ICMP ECHO packets to send (Default: 5)

命令都在libexec下,用--help去查
# /usr/local/nagios/libexec/check_ping --help

延伸:对于宏的概念理解。

(Macro),是一种批量处理的称谓。计算机科学里的宏是一种抽象(Abstraction),它根据一系列预定义的规则替换一定的文本模式。解释器或编译器在遇到宏时会自动进行这一模式替换。

Nagios中宏的理解理解Nagios宏及其工作机制

 

现在查看web界面,默认只监控了localhost,并监控了其8个服务

一些小操作:
1. 如果http服务为黄色,是警告,则需要把网站家目录里加一个主页进去(家目录为空,他就会警告)。
但需要等它下一次check才会OK。如果要手动check,可以点http,再右边点Re-schedule the next check of this service去强制check,就OK了

2. 默认http和ssh是关闭通知的,是因为在localhost.cfg里这两个服务有一句 
notifications_enabled       0。
也可以手动打开,点进去,再右边点enabled notifications for this service.

3. 关闭ssh服务,刷新web界面,还是没有critical.
   点击ssh,可以看到下一次计划的check时间。如果不等的话,在右边点Re-schedule the next check of this service强制check,再刷新就critical

总结:

 

六、监控本机的公共服务

1. 监控本机的FTP服务

需求:监控本机的FTP服务

思路:
1)看libexec/下是否有检测ftp的命令,如果没有,网上下载,或自己开发
2)在localhost.cfg里定义这个服务
3)在command.cfg里定义命令

步骤:

# vim /usr/local/nagios/etc/objects/localhost.cfg      //加上下面一段
define service{
        use                             local-service
        host_name                       localhost
        service_description             FTP
        check_command                   check_ftp!2!4
        notifications_enabled           1            //开启通知,不加默认开启
        }

说明:对于check_ftp命令不懂,看帮助,其中!是用于分割参数的。
check_ftp!2!4    表示相应时间分别为2s和4s

./check_ftp --help
-w, --warning=DOUBLE
    Response time to result in warning status (seconds)
 -c, --critical=DOUBLE
    Response time to result in critical status (seconds)

# vim /usr/local/nagios/etc/objects/commands.cfg  //下面一段默认就有,不需要加,直接改一下

define command{
        command_name    check_ftp
        command_line    $USER1$/check_ftp -H $HOSTADDRESS$ -w $ARG1$ -c $ARG2$  
        }

说明:
$ARG1$代表上面设置的第一个值(2s); $ARG2$ 代表上面设置的第二个值(4s)
-w:表示状态,警告
-c:表示状态,严重

总结:根据以上定义,当访问ftp的响应时间为2s时,Nagios收集的状态为警告;当访问ftp的相应时间为4s时,Nagios收集的状态为严重。

# /etc/init.d/nagios restart        //重启nagios

测试验证

2. FTP服务的非默认端口监控

思考:如果本机的FTP服务的默认端口不是默认端口,是2121应该如何监控?

思路:
1. 更改ftp的默认端口为2121
2. 在监控主机的配置文件localhost.cfg文件里加上监控命令
3. 如果命令没有在commands.cfg就需要自己写
# vim /etc/vsftpd/vsftpd.conf    
listen_port=2121        --加上这一句

# /etc/init.d/vsftpd restart

# netstat -ntlup |grep ftp
tcp        0      0 0.0.0.0:2121                0.0.0.0:*                   LISTEN      29883/vsftpd   



# vim /usr/local/nagios/etc/objects/localhost.cfg 

修改刚刚添加的监控服务内容:
define service{
        use                             local-service
        host_name                       localhost
        service_description             FTP
        check_command                   check_ftp!2!4!2121
        notifications_enabled           1            //开启通知,不加默认开启
        }
说明:
!为参数分隔符,2是第一个参数,4是第二个参数,2121是第三个参数;它们对应于我下面定义的-w -c -p
-p, --port=INTEGER
    Port number (default: none)

# vim /usr/local/nagios/etc/objects/commands.cfg 
define command{
        command_name    check_ftp
        command_line    $USER1$/check_ftp -H $HOSTADDRESS$ -w $ARG1$ -c $ARG2$ -p $ARG3$
        }

直接使用监控命令去手工check一下,OK的
# /usr/local/nagios/libexec/check_ftp -w 1 -c 3 -p 2121
FTP OK - 0.004 second response time on port 2121 [220-#############################
220-#]|time=0.00389s;1.000000;3.000000;0.000000;10.000000


# /etc/init.d/nagios reload
去web界面可以看到能监控本机的ftp这个服务了
View Code

3. 小试牛刀

需求:使用Nagios监控本机的mysql服务.

# vim /usr/local/nagios/etc/objects/localhost.cfg 

define service{
        use                             local-service
        host_name                       localhost
        service_description             MYSQL
        check_command                   check_mysql!root!123
        }


# vim /usr/local/nagios/etc/objects/commands.cfg 
define command{
        command_name    check_mysql
        command_line    $USER1$/check_mysql -H $HOSTADDRESS$ -u $ARG1$ -p $ARG2$
        }

说明:
第一个参数对应上面的root,第二个对应密码123

手动check一下mysql,OK
# /usr/local/nagios/libexec/check_mysql -u root -p123
Uptime: 189  Threads: 1  Questions: 5  Slow queries: 0  Opens: 12  Flush tables: 1  Open tables: 6  Queries per second avg: 0.026

# /etc/init.d/nagios reload

去nagios 的web界面刷新查看,OK
View Code

七、监控远程主机的公有服务

需求:监控远程服务器10.1.1.2和10.1.1.3是否存活,并且再监控10.1.1.3上的http服务

思路:

  1. 在/usr/local/nagios/etc/objects/目录下编写对象文件

  2. 在/usr/local/nagios/etc/nagios.cfg文件里指定刚编写的对象文件

  3. 重启Nagios测试验证

vim /usr/local/nagios/etc/objects/remote.cfg
//先定义需要监控的对象主机
define host{
        use                     linux-server
    host_name               10.1.1.2        //主机名,最好/etc/hosts里对应好IP,我这里没有做,就直接写IP
        alias                   10.1.1.2    //显示到web上的名字
        address                 10.1.1.2    //实际监控的主机IP
        }

define host{
        use                     linux-server
    host_name               10.1.1.3
        alias                   10.1.1.3
        address                 10.1.1.3
        }

//以下定义了一个主机组,方便监控相同服务
注意:这里我定义了一个新组remote linux-servers,不能和localhost.cfg里的组同名,会冲突
define hostgroup{
        hostgroup_name  remote linux-servers    
        alias           remote Linux Servers
        members         10.1.1.2,10.1.1.3    //成员用逗号隔开
        }

//以下定义需要对以上主机监控哪些服务

# 下面第一段表示对主机组remote linux-servers的主机都监控是否存活
define service{
        use                             local-service  
        hostgroup_name                  remote linux-servers
        service_description             PING
        check_command                   check_ping!100.0,20%!500.0,60%
        }

#下面一段定义表示仅对10.1.1.3主机监控其http服务
define service{
        use                             local-service 
        host_name                       10.1.1.3
        service_description             HTTP
        check_command                   check_http
        }


==================================================================================
当然你也可以根据自己的需求增加如下监控服务:
define service{
        use                             local-service   
        host_name                       10.1.1.2
        service_description             SSH
        check_command                   check_ssh
        }

define service{
        use                             local-service 
        host_name                       10.1.1.2
        service_description             HTTP
        check_command                   check_http
        }


define service{
        use                             local-service
        host_name                       10.1.1.2
        service_description             FTP
        check_command                   check_ftp!3!6
        }
View Code

八、监控远程主机的私有服务

 

1. nagios服务器上操作配置

1.1 安装NRPE插件
[root@nagios-server nagios]# tar -xf nrpe-2.12.tar.gz -C /usr/src/
[root@nagios-server nagios]# cd /usr/src/nrpe-2.12/
[root@nagios-server nrpe-2.12]# ./configure 
[root@nagios-server nrpe-2.12]# make
[root@nagios-server nrpe-2.12]# make install

//可以查看到check_nrpe命令说明安装成功
[root@nagios-server nrpe-2.12]# ls /usr/local/nagios/libexec/check_nrpe 
/usr/local/nagios/libexec/check_nrpe
1.2 commands.cfg文件里增加check_nrpe命令
define command{
        command_name    check_nrpe
        command_line    $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$
        }
说明:
-c参数后接command, 也就说check_nrpe可以调用别的check命令
1.3 配置需要监控远程主机的私有服务
说明:
1. 你可以重新编写一个xxx.cfg文件,也可以直接放到上面创建的remote.cfg文件里,我直接放到remote.cfg文件里
2. 下面定义的命令比如check_remote_root,是被监控机上的命令,监控机可以调用它。

define service{
        use                             local-service 
        host_name                       10.1.1.2
        service_description             Root Partition
        check_command                   check_nrpe!check_remote_root    
        }


define service{
        use                             local-service
        host_name                       10.1.1.2
        service_description             Current Users
        check_command                   check_nrpe!check_remote_users
        }


define service{
        use                             local-service
        host_name                       10.1.1.2
        service_description             Total Processes
        check_command                   check_nrpe!check_remote_total_procs
        }


define service{
        use                             local-service
        host_name                       10.1.1.2
        service_description             Current Load
        check_command                   check_nrpe!check_remote_load
        }


define service{
        use                             local-service
        host_name                       10.1.1.2
        service_description             Swap Usage
        check_command                   check_nrpe!check_remote_swap
        }


检查配置文件是否正确:
/usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg

注意:Nagios监控端配置好后,不着急重启Nagios,等被监控端配置完后再重新加载
View Code

2. 被监控主机上操作配置

准备软件包:
[root@client ~]# cd /nagios/
[root@client nagios]# ls
nagios-plugins-2.0.3.tar.gz  nrpe-2.12.tar.gz

1.新建用户
# useradd nagios
# groupadd nagiosgroup
# usermod -G nagiosgroup nagios

2.安装plugins插件,包含了数据采集命令脚本
# tar xf nagios-plugins-2.0.3.tar.gz -C /usr/src/
# cd /usr/src/nagios-plugins-2.0.3/
# ./configure --with-nagios-user=nagios --with-nagios-group=nagiosgroup
# make && make install

3.安装nrpe
注意:配置过程中可能会出现如下错误:
checking for SSL headers... configure: error: Cannot find ssl headers
原因:缺少openssl-devel软件包
解决:安装它

# tar xf nrpe-2.12.tar.gz -C /usr/src/
# cd /usr/src/nrpe-2.12/
# ./configure && make && make install

# make install-plugin
# make install-daemon
# make install-daemon-config
# make install-xinetd

4.修改nrpe的超级守护进程的配置文件

# vim /etc/xinetd.d/nrpe 

service nrpe
{
        flags           = REUSE
        socket_type     = stream
        port            = 5666
        wait            = no
        user            = nagios
        group           = nagios
        server          = /usr/local/nagios/bin/nrpe
        server_args     = -c /usr/local/nagios/etc/nrpe.cfg --inetd
        log_on_failure  += USERID
        disable         = no
        only_from       = 127.0.0.1 10.1.1.1    //加上nagios服务器的IP,允许它来访问
}


# vim /etc/services        //最后面加一行
nrpe            5666/tcp        # NRPE



5. 在nrpe配置文件里定义check命令,使nagios服务能调用

# vim /usr/local/nagios/etc/nrpe.cfg
command[check_remote_users]=/usr/local/nagios/libexec/check_users -w 5 -c 10
command[check_remote_load]=/usr/local/nagios/libexec/check_load -w 15,10,5 -c 30,25,20

// /dev/sda2是被监控端的根分区,也可以直接就写一个“/” 就可以了
command[check_remote_root]=/usr/local/nagios/libexec/check_disk -w 20% -c 10% -p /dev/sda2 

command[check_remote_total_procs]=/usr/local/nagios/libexec/check_procs -w 150 -c 200

//下面这句默认没有的,但nagios服务器有配置,所以加上这句
command[check_remote_swap]=/usr/local/nagios/libexec/check_swap -w 40%% -c 20%%

//下面这个是默认有的,但nagios服务器那边我没有加,所以这个在这里没有用    
command[check_zombie_procs]=/usr/local/nagios/libexec/check_procs -w 5 -c 10 -s Z

6. 安装xinetd服务
# yum install xinetd -y
# /etc/init.d/xinetd restart    //启动超级守护进程
# netstat -ntlup |grep 5666        //有端口被监听了
tcp        0      0 0.0.0.0:5666                0.0.0.0:*                   LISTEN      22120/xinetd  


7. 在本地或nagios服务器测试
在被监控端测试成功
# /usr/local/nagios/libexec/check_users -w 5 -c 10
USERS OK - 3 users currently logged in |users=3;5;10;0


在nagios服务器上测试成功
# /usr/local/nagios/libexec/check_nrpe -H 10.1.1.2 -c check_remote_users
USERS OK - 3 users currently logged in |users=3;5;10;0

8. 回到nagios服务器重启服务
# /etc/init.d/nagios restart
View Code

九、实现邮件报警

1. 测试当前服务器是否可以发送邮件

[root@nagios-server ~]# ping www.baidu.com
PING www.a.shifen.com (119.75.213.61) 56(84) bytes of data.
64 bytes from 127.0.0.1 (119.75.213.61): icmp_seq=1 ttl=128 time=6.94 ms

[root@nagios-server ~]# echo test nagios |mail -s 'nagios' 39xxxx85@qq.com

2. 定义指定的收件人

[root@nagios-server ~]# vim /usr/local/nagios/etc/objects/contacts.cfg 
define contact{
        contact_name        nagiosadmin
        use                 generic-contact
        alias               Nagios Admin
        email               xxxxxx@qq.com
        }

3. 测试验证

把几个服务关闭,再开启一下,等邮件通知,通知过就会发到手机

 

 

nagios监控-配置文件补充说明

一、模板文件参考说明

vim /usr/local/nagios/etc/objects/templates.cfg  
##以下是定义联系人的模板
define contact{
name     generic-contact         //联系人名称
service_notification_period     24x7    
//当服务出现异常时,发送通知的时间段,这个时间段“7x24"在timeperiods.cfg文件中定义

host_notification_period         24x7 
//当主机出现异常时,发送通知的时间段,这个时间段“7x24"在 timeperiods.cfg文件中定义

service_notification_options     w,u,c,r 
//这个定义的是“通知可以被发出的情况”。w 即warn,表示警告状态,u即 unknown,表示不明状态,c 即 criticle,表示紧急状态,r 即 recover,表示恢复状态。也就是在服务出现警告状态、未知状态、紧急状态和重新恢复状态时都发送通知给使用者。

host_notification_options d,u,r 
//定义主机在什么状态下需要发送通知给使用者,d即down,表示宕机状态,u即 unreachable,表示不可到达状态,r即 recovery,表示重新恢复状态。

service_notification_commands     notify-service-by-email 
//服务故障时,发送通知的方式,可以是邮件和短信,这里发送的方式是邮件,其中“notify-service-by-email”在 commands.cfg文件中定义。

host_notification_commands notify-host-by-email 
//主机故障时,发送通知的方式,可以是邮件和短信,这里发送的方式是邮件,其中“notify-host-by-email”在 commands.cfg文件中定义。

register 0
//不注册,表示它不是一个真正的联系人,只是一个模板
}

##以下是定义主机的模板
define host{
name generic-host 
//主机名称,这里的主机名,并不是直接对应到真正机器的主机名,乃是对应到在主机配置文件里所设定的主机名。
notifications_enabled 1
event_handler_enabled 1
flap_detection_enabled 1
failure_prediction_enabled 1
process_perf_data 1
retain_status_information 1
retain_nonstatus_information 1
notification_period 24x7
//指定“发送通知”的时间段,也就是可以在什么时候发送通知给使用者。
register 0
}

define host{
name linux-server     //主机名称
use generic-host 
//use表示引用(调用),也就是将主机generic-host的所有属性引用到linux-server中来,在 nagios配置中,很多情况下会用到引用。

check_period 24x7 
//这里的 check_period告诉nagios检查主机的时间段

check_interval 5 
//nagios对主机的检查时间间隔,这里是 5分钟。

retry_interval 1 
//重试检查时间间隔,单位是分钟。

max_check_attempts 10 
//nagios对主机的最大检查次数,也就是 nagios在检查发现某主机异常时,并不马上判断为异常状况,而是多试几次,因为有可能只是一时网络太拥挤,或是一些其他原因,让主机受到了一点影响,这里的10就是最多试 10 次的意思。

check_command check-host-alive 
//指定检查主机状态的命令,其中“check-host-alive”在 commands.cfg文件中定义。

notification_period workhours 
//主机故障时,发送通知的时间范围,其中“workhours”在 timeperiods.cfg中进行了定义.

notification_interval 120 
//在主机出现异常后,故障一直没有解决,nagios再次对使用者发出通知的时间。单位是分钟。如果你觉得,所有的事件只需要一次通知就够了,可以把这里的选项设为 0

notification_options d,u,r 
//定义主机在什么状态下可以发送通知给使用者,d 即down,表示宕机状态,u即 unreachable,表示不可到达状态,r即 recovery,表示重新恢复状态。

contact_groups admins 
//指定联系人组,这个“admins”在 contacts.cfg文件中定义。
register 0
}

##以下是定义服务的模板
define service{
name generic-service         //定义一个服务名称
active_checks_enabled 1
passive_checks_enabled 1
parallelize_check 1
obsess_over_service 1
check_freshness 0
notifications_enabled 1
event_handler_enabled 1
flap_detection_enabled 1
failure_prediction_enabled 1
process_perf_data 1
retain_status_information 1
retain_nonstatus_information 1
is_volatile 0
check_period 24x7 
//这里的 check_period告诉 nagios检查服务的时间段。

max_check_attempts 3 
//nagios对服务的最大检查次数。

normal_check_interval 10 
//此选项是用来设置服务检查时间间隔,也就是说,nagios这一次检查和下一次检查之间所隔的时间,这里是 10分钟。

retry_check_interval 2 
//重试检查时间间隔,单位是分钟。

contact_groups admins 
//指定联系人组,同上。这个“admins”在 contacts.cfg文件中定义。

notification_options w,u,c,r 
//这个定义的是“通知可以被发出的情况”。w 即 warn,表示警告状态,u即 unknown,表示不明状态,c 即 criticle,表示紧急状态,r 即 recover,表示恢复状态。也就是在服务出现警告状态、未知状态、紧急状态和重新恢复后都发送通知给使用者。

notification_interval 60 
//在服务出现异常后,故障一直没有解决,nagios再次对使用者发出通知的时间。单位是分钟。如果你认为,所有的事件只需要一次通知就够了,可以把这里的选项设为 0。

notification_period 24x7 
//指定“发送通知”的时间段,也就是可以在什么时候发送通知给使用者。
register 0
}
View Code

二、定义主机和主机组参考

define host{
    host_name   主机名, $HOSTNAME$使用的是这个字段
    alias   别名$HOSTALIAS$使用了这个字段
    display_name    显示名称
    address IP地址
    hostgroups  Host所在的主机组 以逗号分割
    check_command   指定检查主机的命令
    max_check_attempts  对主机最大的检查次数.如果不想检查主机是否存活check_command留空. max_check_attempts这个值最少是1用于表示检查到几次异常报警
    check_interval  检查时间间隔.单位是分钟
    retry_interval  重试次数.发现异常后多久重试一次,触发到重试上限后发送异常报警 单位是分钟
    active_checks_enabled   [0/1] 是否启用主动监控
    passive_checks_enabled  [0/1] 是否启动被动监控
    check_period    定义需要检查的时间段.需要在时间段文档中定义
    event_handler   自定义事件处理程序.(主机UP/Down是生效)
    event_handler_enabled   [0/1]是否启动事件处理程序
    process_perf_data   [0/1] 设定启用进程性能数据记录
    retain_status_information   [0/1] 设定启用状态信息保存功能。当Nagios重新启动的时候不会是空数据,而是先显示上次离线时最后保留的状态数据。
    retain_nonstatus_information    [0/1] 设定启用非状态信息保存功能。当Nagios重新启动的时候不会是空数据,而是先显示上次离线时最后保留的非状态数据。
    contacts    通知人
    contact_groups  通知组
    notification_interval   主机在故障后 再次发送通知的间隔时间
    first_notification_delay    主机故障后 第一次发送时间的延迟
    notification_period 主机故障时发送通知的时间范围
    notification_options    [d,u,r] d代表down奔溃;u代表不可达 r代表recover恢复
    notifications_enabled   [0/1]  是否发送通知
    register    0 表示是一个模板

    use generic-host    #use 表示引用
    }   

define hostgroup{
    hostgroup_name  Host组名
    alias   组别名
    members 填写已经声明的host 将host引入该组,以逗号分隔
    hostgroup_members   填写已经声明的组 引入子组
    notes   说明 用于界面显示
}
View Code

 

posted @ 2023-12-29 09:31  wq9  阅读(211)  评论(0)    收藏  举报