5.linux之开源服务

一、ngnix服务

   (1)nginx:/opt/dss/nginx/sbin --检查./nginx -t    
           加载配置:./nginx  -s reload
   (2)nginx做为web服务器的配置
        2.1.nginx的特性
           处理静态文件,索引文件以及自动索引,打开文件描述符缓存,使用缓存加速反向代理,
           简单负载均衡以及容错,远程FastCGI、uwsgi、scgi和memcache服务的缓存加速支持,
           简单的负载均衡以及容错。模块化的架构,过滤器包括gzip压缩。ranges支持、
           chunked响应、XSLT、SSI以及图像缩放,在SSI过滤器中,一个包含多个SSI的页面,
           如果经由FastCGI或反向代理处理,可被并行处理
           注1:ngnix能通过fastcgi与php结合不能通过模块的方式与php结合 
           注2:nginx自身也有缓存,但它缓存在磁盘里,httpd也支持缓存,
                它既支持磁盘缓存也支持内存缓存,面varnish是专门的缓存服务器,
                优先可使用内存缓存,还有一个专门的缓存服务器叫squid,
                它与varnish的关系同nginx与httpd的关系,squid适用于早期,
                varnish适用于现在
           注3:nginx与http都是模块化设计的,nginx有一个模块可以直接联系memcached
           注4:支持验证http referer是反盗链机制:别人的链接放我们网站上,会占用我们服务的带宽,
                通过referer能判断是谁盗链,所以我们可以只让自己的站内链接链接
               location /photo/{
                     valid_referers none blocked www.mydomain.com mysomain.com;
                           ---定义哪些合法,none在浏览器上直接输入的,blocked不符合它指定的
                              条件的都是不合法的
                     if ($invalid_referer){
                        return 403:
                        }
                      }
           注5:支持FLV与MP4是视频流
           注6:具有事件驱动功能的IO框架有epoll kqueue  /dev/poll三个,只要编程支持三个
                 模型框架就能支持异步与事件驱动,若不支持这三种就用select/poll
           注7:配置文件介绍
                worker进程主要完成的任务
                   接收、传入并处理来自客户端的连接
                   提供反向代理及过滤功能
                   nginx任何能完成的其它任务
                cache loader进程主要完成的任务包括
                    检查缓存存储的缓存对象
                    使用缓存元数据建立内存数据库
                cache manager进程主要完成的任务包括
                    缓存的失效及过期检验
                nginx的配置有着几个不同的上下文,main http server upstream和location
                     (还有实现邮件服务反向代理mail)
        2.2:nginx配置解析
          2.2.1 配置文件认识
            nginx.conf:主配置文件
            mime.types:web要传各种非文本文件靠mime
                      (多用途文件互联网扩展),web靠它来识别非文本文档
            fastcgi.conf:实现cgi功能
            uwsgi_params:跟python结合用到的配置 
          2.2.2:nginx.conf配置
             worker_process 2;----启动worker线程(跟cpu个数相同,若负载IO密集型,
                                响应大量内容给客户端,worker数应为cpu的1.5/2倍)
             events {         ----事件驱动中每个worker的请求连接数
                  use   epoll;
                  worker_connections 2048-----worker个数据
             }
             http{            ----http配置
                 include   mime.type;--包含配置文件
                 default_type    applocation/octet_stream -------默认类型
                 access_log      log/access.log main(核心配置)----访问日志,
                                     编译定义了已生效其它位置,这里是注释的
                 sendfile  on;         ------打开内核直接包装功能
                 keepalive_timeout  60;-----使用长连接并指定超时时长
                 gzip  on;---响应内容是否为压缩再发送,节省带宽
            }
            server {    ---------虚拟主机,一个主机也要定义在server里
                  listen 80
                  server_name  locallhost;----基于名称的虚拟主机
                  location /(相对路径) {
                       root html;---相对于/的网页位置路径,以/为根是/html。
                                    总体/是默认安装位置/var
                       index  index.html  index.html;----主页面
                   }
            location /URI/{-定义文件系统后的URI在网页的路径,
                       在http里documentroot定义文件系统路径,location定义URI路径
               root "/web/htdocs";---------定义文件系统上的路径,把/URI放在后面
               }
              注:URI的格式如下
                  location [ = | ~ | ~* | ^~ ] uri ----优先级由高到低
                   uri :对当前路径及子路径下的所有对象生效
                   =uri:只对当前路径生效,精确匹配指定路径,不包括子路径
                   ~uri:区分大小写,模式匹配URI,此处URI可使用正则表达式
                   ~*uri:不区分大小写
                   ^~uri:不使用正则表达式
                   eg:location ~\.php$ { -----------以php结尾的的文件
                  location的{}里的语法参数据
                   访问控制:
                      基于IP:
                      root /bbs
                      index index.html
                      deny 172.16.12.13
                      基于用户访问控制(启用authbasic模块)
                      location{
                         auth_basic    "Restrieted"
                         auth_basic_user_file   htpasswd 
                                     ------也是借助于http的htpasswd文件内写有用户帐号与密码
                       }
                        htpasswd -c -m /etc/nginx/.users  tom
                    stub status模块功能
                        location /status {
                           stub_status  on
                         }
                         reading:nginx正在读取其首部请求个数
                         writing:正读取其主体请求个数/正处理其请求内容个数/正向其客户发送响应个数
                         waiting:长连模式的保持的连接个数
                    ssl模块功能
                        server {
                            linsten  443;
                            server_name localhost;
                            ssl on;
                            ssl_certificate   cert.pem---eg:/etc/nginx/ssl/nginx.cert
                            ssl_certificate.key   cert.key
                            ssl_session_timeout   5s   会话超时
                            ssl_protocals  sslv2 sslv3
                            ssl_ciphers  HIGH:MD5----加密算法
                            location / {
                              root html;
                              index index.html
                            }
                            }----在这个虚拟机上的页面情况
                   
            错误页定义:没有在location定义的都可以跳转到错误页
               error_page  404  /404.html  --自身也可以定义在location里,告诉404在哪     

     
     
 二、SSH及telnet服务
 
(1)ssh是应用层协议,ssl是应用层与传输层之间的协议,
          telnet是应用层协议端口是23端口,SSH协议有二个协议V1与V2,
  V1协议:
    过程:
     是C/S架构,C向S发请求IP
     S给C发公钥,C把公钥保存在/root/.ssh/known_hosts文件里,C上的所有用户都可以使用这个公钥
     C自动再生成对称密钥
     C用公钥把对称密钥发给S
     C再把帐号密码用对称密钥发给S
  V2协议
    过程:
     是C/S架构,C向S发请求IP
     S给C发公钥,C把公钥保存在/root/.ssh/known_hosts文件里,C上的所有用户都可以使用这个公钥
     C自动再生成对称密钥及一对非对称密钥(ssh-keygen手动生成)其中这个公钥1不能公开是给S的
     C用公钥把对称密钥与公钥1发给S
     S把公钥1放在对应用户的家目录下
     C发个随机数用自己的私钥加密外再加上对称钥发给S,这个随机数S能打开说明认证成功,这时才能输密码
(2)客户端
  windows:putty   xshell等
  linux客户端  配置文件/etc/ssh/ssh_config:
   命令介绍:
     ssh:
        ssh  用户名@HOST---远程主机用户名
        ssh -l 用户名  HOST ---登录到远程主机-----以上二种远程到别的主机退出用exit
        ssh 用户名@HOST 'command':未登录但执行远程主机命令
     scp:
        scp 源  目标
        scp 用户名@HOST:文件目录 本地目录      ----远程到本地
        scp  本地目录文件  用户名@HOST:文件目录----本地到远程
    ssh-keygen (C上生成非对称密钥)
          -t 
             rsa:rsa加密
             dsa:dsa加密
         默认生成私钥保存-----家目录/.ssh/id_rsa
         默认生成公钥保存-----家目录/.ssh/id_rsa.pub---可用SCP复制到S服务器上,
                              放在对应家目录下,目录权限要给777,把它放在
                              家目录/.ssh/authorized_keys与家目录/.ssh/authrized_keysz
          -f:指定保存位置
          -g:指定私钥的密码
     ssh-copy-id:复制
       ssh-copy-id -i 公钥路径 用户名@HOST        
(3)服务端配置文件/etc/ssh/sshd_config
      port 22---监听端口
      ListenAddress 0.0.0.0 ---监听地址
      Hostkey for protocal version 2---用户协议2
      Hostkey /etc/ssh/ssh_host_dsa_key---协议2的指定密钥
      AuthorizedKeyFile .ssh/authorized_keys---公钥放在服务端对应的隐藏的家目录下
      PasswordAthentication  yes:使用基于口令认证
(4)ssl加密码解释,ssh只能远程的一个服务,而ssl可以帮助任何其它四层服务实现加密,
     也能帮ssh实现加密传输,这是个三层半协议,上层流下来时再加上很多密钥等东西
     客与服通信挑战
   1.机密性
       [明文---算法---密文]---外用对称密钥加密传输,缺点:每二台都要有密钥难管理
   2.机密性与数据完整性
       [数据+数据特征码]--外用对称密钥加密(用的是ike,双方用随机数很麻烦),
        缺点:无法和密钥验证对方身份有中间攻击
   3.完整性与身份验证
       数据+[数据特征码]-发送者的私钥---服务器要有客的公钥才能认证客的身份,这个公钥如何给服?
         需要第三方机构pki给
         客的公钥+加地址等信息+[特征码]---加机构的私钥:这些信息发给服后,服务才能验证客的身份
   4.机密性+完整性+身份验证(由于用的是ike,双方用随机数很麻烦所以不用这个方法)
      例:A服<------B客
        外再加对称密钥--{数据+[数据特征码]-A私钥}+[对称密钥]--外加B的公钥
                                  |
                          这一块B要认证需要第三方机构
    A服务让CA给其公钥打成证书,B客端使用CA根证书对A发过来的证书进行解密认证,所以浏览器使用的就是CA的根证书,一般为合法机制的ssl证书,若为私有证书,客户端B可以做一个CA证给服务端签证,再用自己的自签证书来认证A服务端

5)第三方机构CA的配置 1.CA是pki核心常用证书有二种 a)x501(包括:公钥 过期时间 合法拥有者) b)pkcsl2 2.互联网上安全机制应用 a)tls/ssl---用的x509证书 b)opengpg 3.概述: a)ssl不是软件是一个库,数据到TCP之前调用ssl功能 openssl软件是ssl实现的 libcrypto:库文件通用加密库,软件实现加密必需要要链到这个库 openssl libssl:会话层,实现http实现身份认证,数据加密性 openssl:命令行工具-用于实现私有证书颁发服务器 (公司内部使用)用配置文件/etc/pki/tls/openssl.cnf b)openssl命令行工具与CA创建 1.openssl 子命令: ?:帮助信息 speed:加密算法,算法测速 enc:指定对称加密算法 -:加密算法 -salt:加盐 -a:对base64编译 -in:读进来的文件 -out:加密后保存名字 -d:解密数据 eg:openssl enc -des3 -in inittab -out inittab.des3 ---加密 openssl enc -des3 -d -in inittab.des3 -out inittab ---解密 dgst:指定单向加密算法 静态:openssl dgst -shal 文件1 交互:openssl passwd -1(MD5) 输入密码---生成密钥 genrsa:生成私钥(非对称算法) --以上是给文件加密而这个是生成一对密钥加在文件等外面 rsa:提出公钥 ca:签名 req:签证 x509:看x509证书 实例:CA服务器的创建及使用 1.CA服务器: a)配置文件,定义各证书的位置信息/etc/pki/tls/openssl.cnf --后会在对应目录生成密钥/etc/pki/CA b)生成一对密钥: 指定长度默认512 名称 | | #(umask 077;openssl genrsa 512 -out cakey.pem) ---私钥必须是600的权限--生成的私钥在/etc/pki/tls下 也可以指定目录/etc/pki/CA/private 查看公钥:openssl rsa -in cakey.pem -pubout---输出公钥 c)生成自签证书 openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out cacert.pem --(证书也可指位置) 要创建几个配置文件(/etc/pki/CA下) mkdir certs newcerts crl(证书撤消列表) touch index.txt(做了哪些证书) touch serial echo 1 > serial 如何给其它服务器发证书,把其它服务器发来的.csr文件签证,签好后发给服务器 openssl ca -in httpd.csr -out httpd.crt -day 365 d)其它服务器如何生成csr文件及启用ssl,eg:http服务器 生成私钥在/etc/httpd/ssl目录下: (umask 077;openssl genrsa -out httpd.key 1024) 做申请 openssl req -new -key httpd.key -out httpd.csr---给服务的公钥做成证书 把这个文件复制发给CA服务器 4.加密算法 a)对称加密算法:1.DESOX 2.3DES(三次DES) 3.AES 4.Blowfish b)单身加密:1.MD4 2.MD5 3.SHA1 4.CRC-32 c)非对称加密:1.RSA 2.DRA 3.ElGanal (6)telnet TCP/23远程登录,但它认证明文数据传输明文不安全 三、linux日志服务 (1)概述:linux的系统服务是syslog,也可做单独服务器配置 红6:syslog-ng 红5:工作服务是syslog,配置文件/etc/rc.d/init.d/syslog,该服务读脚本配置文件, /etc/sysconfig/syslog,参数SYSLOGD_OPTIONS="-r -m 0",-r 可把本机做为日志服务器,接受外来主机的日志, 外来主机只要在/etc/syslog.conf把存储位置定义为@HOST就可以了,这个服务有二个进程 进程之一:klogd是内核启动的日志记录在/var/log/dmesg 进程之二:syslogd(读配置文件/etc/syslog.conf) 配置文件内容如下: 子系统 日志级别 动作(存储位置) auth debug /var/log/messages:系统标准错误 authpriv info:一般信息 /var/log/maillog:邮件系统 cron notice /var/log/secure:安全相关 daemon 1:管道 syslog(自己的) *级别 终端 .... @HOST 用户... 四、ftp服务 (1)安装配置 (1)yum -y install vsftpd service vsftpd start chkconfig vsftpd on 注:(1).认识其配置文件/etc/vsftpd/vsftpd.conf anonymous_enable=YES(启用匿名用户,映射到系统用户ftp上,家目录在/var/ftp) local_enable=YES(启用系统用户,登陆后直接进系统家目录了而不是/var/ftp, 所以系统的很多文件都可以上传下载了eg:/etc/fstab, 而匿名用户与虚拟用户则只能用/var/ftp/pub目录下的文件) write_enable=YES(系统用户上传文件) anon_upload_enable=YES(匿名用户上传文件,由于/var/ftp无写权限, 把/var/ftp/pub目录改为ftp有写权限就可上传文件了, 这个要启用,同时权限也要改) anon_mkdir_write_enable=YES(匿名用户创建目录) anon_other_write_enable=YES(匿名用户其它写权限) dirmessage_enable=YES(隐藏文件) xferlog_enable=YES(是否打开传输日志) xferlog_file=/var/log/vsftpd.log(日志文件路径) xferlog_std_format=YES(日志是否使用标准格式) chown_uploads=YES(用户上传完后是否把属主改为别的用户) chown_username=whoever() idle_session_timeout=600(会话超时时长,超过完600s就断开) data_connection_timeout=120(数据连接时长) ascii_upload_enable=YES(是否启用文本上传功能一般不定义) ascii_download_enable=YES(是否启用文本下载功能一般不定义) chroot_list_enable=YES(系统用户是不是用一个文件来定义将特定用户锁定家目录下) chroot_list_file=/etc/vsftpd/chroot_list(在哪个文件创建用户列表, 所有列表用户都将锁家目录中) 注:若所用用户都锁在自己的家目录下不能访问其它目录文件, 都写在chroot_list文件里太麻烦,可以把上二行注释加上这行: chroot_local_user=YES(所有用户都锁定) Listen=YES(vsftpd是否工作为独立守护进程,若是否就工作为瞬时, 这时要在/etc/xinet.d/下提供一个脚本就可以做为瞬时服务了,写法看xinet那章) pam_service_name=vsftpd(定义/etc/pam.d/下控制该服务的名称,/etc/pam.d/vsftpd) Userlist_enable=YES(1.启用/etc/vsftpd/ftpusers文件,写在这个文件的用户不能访问ftp, 这个文件能禁止访问靠的是/etc/pam.d/vsftpd定义的,所以root写在这里, 不能访问 2.启用/etc/vsftpd/user_list默认写在这个文件的用户不能登录, 要想让他们登陆就让userlist_deny=no) Userlist_deny=no max_clients=#(最多允许多少客户端访问) max_pex_ip=#(对于一个ip最多允许多少个连接请求) (2).工作目录在/var/ftp/ 公开数据在/var/ftp/pub/目录下 (2)ftp支持二种安全通信方式 (1)sftp(基于ssh实现安全传输) (2)ftps(基于ssl安全传输) 1.建CA 2.ftp服生私钥,让CA发证,改配置文件/etc/vsftpd/vsftpd.conf 启用: ssl_enable=YES ssl_tlsv1=YES ssl_tlsv2=YES ssl_tlsv3=YES allow_anon_ssl=NO(匿名不启用ssl) force_local_data_ssl=YES force_local_login_ssl=YES rsa_cert_file=/etc/vsftpd/ssl/vsftpd_cert.pem rsa_private_key_file=/etc/vsftpd/ssl/vsftpd_key.pem 3.客要有CA的证书,重启服务,客用ftp连不上了,用openssl来连 客户端实例:连接ftp服务器    格式:ftp [hostname| ip-address]    a)在linux命令行下输入:ftp 10.18.34.115    b)服务器询问你用户名和口令,分别输入yint和相应密码,待认证通过即可。    2. 下载文件,下载文件通常用get和mget这两条命令。    a) get    格式:get [remote-file] [local-file] 将文件从远端主机中传送至本地主机中.    如要获取服务器上E:\rose\1.bmp,则    ftp> get /rose/1.bmp 1.bmp (回车)    b) mget          格式:mget [remote-files] 从远端主机接收一批文件至本地主机.如要获取服务器上E:\rose\下的所有文件,则    ftp> cd /rose    ftp> mget *.* (回车)    注意:文件都下载到了linux主机的当前目录下。比如, 在/root/yint下运行的ftp命令,则文件都下载到了/root/yint下。    3.上传文件    a) put   格式:put local-file [remote-file],将本地一个文件传送至远端主机中. 如要把本地的1.bmp传送到远端主机E:\rose,并改名为333.bmp    ftp> put 1.bmp /rose/333.bmp (回车)    b) mput 格式:mput local-files,将本地主机中一批文件传送至远端主机.    如要把本地当前目录下所有bmp文件上传到服务器E:\rose 下    ftp> cd /rose (回车)    ftp> mput *.bmp (回车)    注意:上传文件都来自于主机的当前目录下。比如,在 /root/yint下运行的ftp命令, 则只有在/root/yint下的文件linux才会上传到服务器E:\rose 下。    4. 断开连接    bye:中断与服务器的连接。    ftp> bye (回车) (3)支持虚拟用户基于pam实现的,要支持虚拟用户需改pam的文件 注1./etc/pam.d/* 2. 认证模块:/lib/security/* /lib64/security/*(64位) vsftpd如何使用虚拟用户,以下二种方式都是基于pam,所以要改pam, 但pam默认不支持mysql所以给它加一个插件pam_mysql,把它当做一个认证模块 放到/lib/security目录当做pam的认证模块,所以由pam发SQL语句给mysql 1.创建文件/etc/vsftpd/vusers---转化为hash(用命令db_load它是由db4-utils的rpm包提供的) 2.创建mysql表 2.1 yum -y install mysql-server mysql-devel 在mysql中创建库及表并创建用户 2.2安装pam-mysql(准备开发包组) tar zxvf pam_mysql_0.7RC1.tar.gz cd pam_mysql_0.7RC1 ./configure --with-mysql=/usr --with-openssl(与mysql通信加密) make&&make install cp /usr/lib/security/pam_mysql.so /lib/security/(当pam的认证模块) 建pam认证所需配置文件 vi /etc/pam.d/vsftp.mysql auth required /lib/security/pam_mysql.so user=vsftpd passwd=123456 host=localhost db=vsftp table=users usercolumn=name passwdcolumn=passwd crypt=0 (必须通过pam_mysql.so的检查,连mysql服务器的帐号密码 ,mysql服务器在哪,数据库,表及字段) account required /lib/security/pam_mysql.so user=vsftpd passwd=123456 host=localhost db=vsftp table=users usercolumn=name passwdcolumn=passwd crypt=0 2.3编辑安装vsftpd(默认就可以) mkdir -pv /usr/share/empty /var/ftp useradd -s /bin/false -d /var/ftp ftp tar xzvf vsftpd-2.0.5.tar.gz cd vsftpd-2.0.5 make&&make install cp vsftpd.conf /etc 建虚拟用户映射系统用户及对应目录 useradd -s /sbin/nologin -d /var/ftp2 vsftp chmod go+rx /var/ftp2 vi /etc/vsftpd.conf 启用:anonymous_enable=YES local_enable=YES write_enable=YES anon_upload_enable=YES anon_mkdir_wirte_enable=YES chroot_local_user=YES 添加:guest_enable=YES(来宾访问) guest_username=vsftp(映射为哪个用户) pam_service_name=vsftpd.mysql Listen=YES 启动服务:/usr/local/sbin/vsftpd & chmod og-w /var/ftp 五、nfs服务 (1) nfs服务器的做法(nfs与RPC是系统自带的) service portmap status(看RPC是否启动) netstat -tulpn(RPC在111端口) service nfs start rpcinfo -p localhost(nfs启动后有三个进程在RPC上注册使用端口) 共享的目录若为服务器的根下/shared目录(/shared本身在服务器上是有文件系统的eg:ext3) vi /etc/exports /shared 192.168.2.0/24(ro) mkdir /shared service nfs restart showmount -e 192.168.2.165(服务的ip或fqdn,查服务有哪些共享目录) 结果:/shared 192.168.2.0/24(rw) 注:由于每次改/etc/exports重启服务会影响其它客户端使用所以有专门命令可以重读配置文件 exportfs -arv:重新挂载文件系统 -auv:取消导出所有文件系统(所有文件系统都不共享了) 注:/etc/sysconfig/nfs可定义mountd quotad在固定端口 (2)客的做法(挂载nfs) mkdir /mnt/nfs mount -t nfs 192.168.2.165:/shared /mnt/nfs(做为nfs的访问入口就可以使用了, nfs格式化挂载是在客戶端做的,把服务上的目录当磁盘挂载为nfs文件系统) 能自动挂载 vi /etc/fstab 192.168.2.165:/shared /mnt/nfs nfs defaults,-rnetdev(挂载不上就跳过) 0 0 问题: 1.客用root登录这时在/mnt/nfs写不了文件,但挂载的是读写为什么? 主要是因为/etc/exports中的文件系统挂载的默认属性root_squash (服的共享目录/shared的属主属组是root,客在用这个目录时在客的 这个目录的属主也是uid=0的用户,但权限太大,这个属性是把root的权限 改为一个权限最小的一个bin用户身上所以写不了,但要想就用用户, 写no_root_squash eg:/shared 192.168.2.0/24(rw,no_root_squash)) 2.若在服务器上/shared的属主属组是tom(uid=501) 那么在客上/mnt/nfs的属主属组 就是jerry(uid=501) 服与客的共享目录的属主属组是靠uid来对应起来的 3./etc/exports小括号的挂载属性有: ro(只读) rw(读写) sync(同步) async(异步) root_squash(默认属性,把root映射为来宾帐号bin,权限很小只能读) no_root_squash(root帐号还是对应root帐号) all_squash(所有都映射为来宾帐号,不是uid对应关系了) anonuid= , anongid=(指定来宾帐号的uid gid不是默认的bin,它的权限太小) 六、samba服务(默认系统是安装的,有二个版本,samba与samba3x) (1)默认系统安装的是samba-client 与 samba-common卸了用3x的 rpm -e samba-client samba-common yum -y install samba3x samba3x-client samba3x-common 装在linux上后会默认启动二个进程: (1)nmbd:提供netbios(默认) (2)提供SMB(默认) (3)如果想跟windows的域结合工作要手动启动winbindd(安装上面三个程序时这个会自动装上) 服务脚本是/etc/rc.d/init.d/smb(控制很多进程) (2)认识配置文件 /etc/samba/lmhosts:跟windows结合,最后实现本地解释的文件 /etc/samba/smbusers:把linux用户映射为windows用户的 注:samba的用户密码会保存在samba自身的文件里,第一次建用户时这个文件会自动生成 /etc/samba/smb.conf(主配置) (3)配置 3.1全局配置 1.全局 netbios name=主机名 workgroup=工作组(一般windowsxp的是WORKGROUP) server string=(鼠标停图标上的说明信息) 2. 日志 log file=/var/log/samba/log %m(每个客户端来访问都有一个独立的日志) max log size=50(日志大小) 3.独立守护进程 security=user(安全级别) passdb backend=tdbsam(用户帐号密码存放格式) 4.浏览控制信息 5.名称解析 6.打印机 load printers=yes(是否加载打印机) cups options=raw(哪种打印机驱动) 3.2共享配置 1.[homes]:共享名称,定义用户是否可以访问自己的家目录 comment=Home Diretories(注释,说明信息) browseable=no 是否能被看到(只有用户自己能看到) writable=yes 是否有写权限(用户自己有写权限)整体看是可以访问自己家目录的 2.[printers]:共享打印机 comment=All printers(说明信息,所有的打印机) path=/var/spool/samba(定义共享资源路径的) browseable=no(在浏览上看不到) guest ok=no(是否允许来宾访问) writable=no printable=yes(可以打印) writable list=user1,user2....(定义写列表) 注:假如要定义一个目录,就要给一个[共享名称],在下面定义上面的那些属性 eg:把/share/test共享出去 3.[tools] comment=share testinng(说明信息,所有的打印机) path=/share/test(定义共享资源路径的) public=yes(允许所有人访问) writable=yes(可写) 注:没写的属性都有默认的值 (4)测试该配置文件是否有语法错误 testparm (5)service smb start (把selinux关掉) (6)这时还没有samba帐号,把系统帐号加为samba用命令 smbpasswd smbpasswd -a 系统帐号(将该帐号加入samba) 输入samba密码(会自动生成一个文件放这个密码) 注:在windows上访问 1、我的电脑-地址上输入\\192.168.2.127\tools(共享名看上)---输入帐号密码 ---有二个目录(家目录与共享目录) 2、右点我的电脑--映射网络驱动器---文件夹上写\\192.168.2.165\tools---完成 这时进入我的电脑网络驱动器上就有对应的共享模块 问题:注意共享目录的权限问题,对文件系统来说的权限及samba配置定义的权限的交集, 这里定义的有写权限,但共享目录的其它权限没有写权限要改一下 setfacl -m u:用户:rwx /share/test/ 以上是windows访问linux共享的(成功) 注2:windows做服务器,linux做客 1、windows已启动服务直接配置共享文件就行,而linux用命令或挂载来使用就可以,如下 windows7: (1)开启guest账户 控制面板---网络与interner---网络和共享中心---更改高级共享设置 ---最后一项改为关闭密码保护共享---保存修改 (2)把某个盘的文件系统开启共享才能共享里面的目录 点进D盘右击---共享---高级共享--选共享此文件夹---点权限 ---点everyone允许的权限全选---确定---找安全选项卡 ----点编辑---选authenticated users---添加确定 ---高级---立即查找---选everyone---确定 ---选everyone权限全选---确定D盘文件系统共享也去了 windows:把目录共享出去后会把本地目录挂到一个新的共享目录,用共享目录则可以访问 (3)共享D盘的目录 双击计算机进入计算机界面---右击--添加一个网络位置---下步---选择自定义网络位置 --下一步---点浏览找到D盘的share/test右击---属性 ----共享---把这里的网络路径复制到格中 ---下一步---起个名字---下一步---完成这时计算机的网络位置就出现了我共享的文件 (4)在windows上添加用户 法1:控制面板---用户帐号--创建新帐号---写个用户名及是管理员权限还是标准用户权限---可创建密码 2.在linux上 法一:用命令 smbclient -L 服务器IP -U 用户名(windows上的用户) smbclient //192.168.2.139/mysharetest -U admin(windows上的用户) 法二: mount -t cifs //192.168.2.139/mysharetest /mnt -o username=用户(以谁的身份挂载Llinux上的用户) 开机自动挂载 vi /etc/fstab //192.168.2.139/mysharetest /mnt cifs credentials=/etc/samba/cred.passwd(帐号密码去建这个方件) 0 0 vi /etc/samba/cred.passwd username=用户名 password=密码 注:该文件不能让别的用户有权限 注:看电脑计算机上有二个网络位置 1.tools是远程主机挂载到本地 2.mysharetest:是本地的一个共享目录 七、tcp-wraper服务(是每个服务自带的,不是系统自带的,是一个tcp防火墙, 本身是一个库libwrap.so,若想用它实现访问控制功能,特定服务必须在编译时 把这个库编译进来才能使用,若链接到这个库,以后用户通过tcp/ip协议时, 在请求与服务套接字之间加一种过滤机制) (1)、查看某应用程序所依赖的动态库,用命令ldd ldd `which sshd`(显示为各种链接以.so结尾) (2)、查看某应用程序的静态库,用命令strings strings `which portmap` 注:不同程序有点把libwrap.so编译成动态库有的编译成静态库,所以要用这二个命令看一下 (3)、tcpwrape是根据/etc/hosts.allow(允许访问列表)与/etc/hosts.deny(拒绝访问列表) 二个配置文件来工作的 过程:请求--/etc/hosts.allow(被它匹配的都通过,不匹配的看hosts.deny) ---/etc/hosts.deny(匹配的都拒绝,没匹配的走默认法则) ---默认法则是允许(注:保存后就生效) 二个配置文件的语法: daemon_list(进程列表):client_list(客户端列表)[:options] (1)daemon_list的写法 1.1 可执行程序的二进制文件名:eg vsftpd,sshd,in.telnetd 1.2 All(所有受tcpwraper的服务) 1.3 daemon@host(有多个ip只希望一个受wraper控制,其它ip不定义) (2)client_list 2.1 ip 2.2 network address(网络地址) 2.3 hostname (包括fqdn 域名) 2.4 宏(All所有来宾 Local本地来宾 KNOWN主机名可正常解析 UNKNOWN主机名不可正常解析 PARANOID正反解析不匹配) (3)options eg:spawn(启动) echo "somebody entered `date`" >> /var/log/tcpwrapper.log (4)例 sshds仅允许192.168.2.0访问 例1:/etc/hosts.allow(这里的都通过了,没被匹配的去找/etc/hosts.deny) sshd:192.168.2.0/255.255.255.0(只接受长格式,不接受长度格式) /etc/hosts.deny sshd:All (5)tcpwrapper的宏(可用man 5 hosts_access查找) %c:客户信息 格式:user@host %s:访问这主机的哪个服务 格式:server@host %h:客户端主机名 %p:明确说明哪个服务 eg: in.telnetd:192.168.2.:spawn echo"login attempt from %c to %s" >> /var/log/tcpwrapper.log (4)若xinted接受tcpwraper控制,那xinted管的非独立守护进程都受它控制 安装xinted,由于telnet受xinted控制,所以安上telnet就会把xinted装上 (5)xinted服务 5.1、配置文件 主配置:/etc/xinetd.conf 子配置:/etc/xinetd.d/* 主配置有二部分: 5.1.1全局配置 defaults { log_type=SYSLOG daemon info或用文件来记录 file /var/log/xinetd.log log_on_failure=HOST(访问失败记录)/USERID/ATTEMPT(登录尝试信息)(失败的日志格式) log_on_success=PID HOST DURATION TEAFFIC(访问成功时的日志记录格式) } 5.1.2服务配置段:一般通过一个路么指到includedir /etc/xinetd.d/* service <名字> { 各种属性 赋值操作符 值 } eg:/etc/xinetd.d/telnet service telnet { disable=no(启用,yes是禁用要重启xinted服务) flags=REUSE(可被多次访问) socket_type=stream(套接字类型,也就是该服务基于的协议TCP dgram用的是UDP) wait=no(表一个用户请求进来,另一个是否等) user=root(以谁的身份启动telnet) server=/usr/sbin/in.telnetd(二进制程序是谁) log_on_failure+=USERID(在默认基础上加上谁) only_from=192.168.2.0/24(访问控制) }----个人:不定义telnet服务,直接在xinted来定义telnet 注:1、socket_type:套接字类型有三种 (1)tcp(基于tcp来实现的) (2)udp(基于数据报文实现) (3)rpc(远程过程调用是程序portmap) 2、xinetd本身的访问控制的相关选项也可写在telnet里 (1)only_from=仅允许哪个客户机(IP,network,fqdn,域) (2)no_access=不允许谁访问 (3)access_time=哪个时间可以被访问hh:mm-hh:mm(hh:0~23 mm:0~59) (4)bind=绑定IP(绑定监听地址) (5)资源访问控制 1.cps=每秒钟入站连接的个数 # #(一个是每秒入站连接数的最大值, 一个是临时禁用的时长)eg:cps=2 10(只允许二个连进来下一个要等10s) 2.per_source=某个客户IP能并发连接几个连接请求、 3.instances=某个特定服务最多允许多少用户同时连进来 (6)server=二进制程序路径 server_args=向启动的server传递参数 (7)banner=欢迎标语/某个文件路径 (8)port=定义服务端口 注:服务访问控制机制有三种:1.iptables 2.warpper 3.xinetd:定义瞬时控制的 八、nsswitch用户帐号认证 (1)管理资源授权的服务有三个方面 (1)认证(帐号密码能否通过):authentication (2)授权(决定用户能否访问某资源):authorization (3)审计:audition (2)认证:比较用户名与用户密码是否匹配 (由于用户名是公开的所以用户名不能做为认证用户的基本手断,它靠的是密码) (3)名称解析 (实际就找到要查找的文件,再找文件里对应的名字的数字,让计算机能识别) 3.1 不同服务都要名词解析,但由于把认证机制要写在服务里太重量级, 所以把解析专门分离出来让其它程序调用它来认证就可以了 (nsswitch是一个中间层,由/etc/nsswitch.conf定义来调用对应的库, 来实现真正的解析) 3.2 过程:名称---/etc/nsswitch.conf(定义用哪个服务用哪个库) ---找到库----找到对应的文件----对应的数据 (eg:login要用帐号密码,在/etc/nsswitch.conf定义passwd:files group:files 同时在/usr/lib/目录下有libnss_files.so库) 3.3/etc/nsswitch.conf格式: (1)服务:值 (2)服务:转换机制1 结果 转换机制2 结果:SUCCESS:服务正常,正常解析 NOTFOUND:服务正常但无对应名称 UNAVAIL:服务不正常 TRYACAIN 3.4 getent:查定义在nsswitch中的服务在某机制对应文件的所有条目 eg:passwd:files getent passwd:查/etc/passwd里所有条目信息 (4)名称解析是把帐号转换成ID号让计算机识别,完成后输入密码如何验证?另一种机制pam 有些解析需要认证如登录服务,有些不需要认证如dns,解析出IP后就行了不用密码认证 (5)pam认证 1、用户与输入的密码是否匹配 输root---nsswitch.conf---passwd:files---/etc/passwd(有就找到对应ID,这是名称解析) 输123456---nsswitch.conf---shadow:files---/etc/shadow(找到对应的密码) ----计算123456的md5与找到的密码对比是否一样 (这是认证的过程,这里认证借助了名称解析服务找/etc/shadow,但这不是必须的, 它也可以不用nsswitch,它自己也可以有一套名称解析服务 ) 2、认证过程 login 找密码有很多方式 /etc/shadow------------用库文件pam_unix.so来计算md5与这里的密码对比 mysql --------用对应库文件 ldap --------用对应库文件 nis --------用对应库文件 derberos --------用对应库文件 2.1 pam工作与nsswitch工作方式差不多,用配置文件及对应库文件来完成认证的 /etc/pam.d/服务名与模块/lib/security 若是64位系统模块在/lib64/security/ 2.2、pam配置文件 PAM配置有四类: 1、查帐号与密码是否匹配 auth 2、看匹配帐号是否在有效期内 account 3、改密码时,看是否被允许或看复杂程度 password 4、定义会话时长等内容 session /etc/pam.conf(主配置) /etc/pam.d/*(子配置,*一般是服务名要小写,其中other是定义默认规则的) 2.2.1 类型(系统类型可有多行) 控制 模块路径 [模块参数] auth account password session 2.2.2 控制类型:返回值如何处理 required:一票否定权,不过还向下检查(成功就ok还要检查,失败就失败了但还要检查, 检查也没用,是不过的,所以这一行必须过才能查下一行) eg: auth required pam_env.so(过了就检查下二项,没过也查下二项但还是没过,查下二项也没有) auth sufficient pam_unix.so(过了就过了不查下一项了) account required pam_deny.so(这个模块是相对于/lib/security的路径, 要不在这里就给个绝对路径) requisite:一票否定权,不过不向下检查了(成功就ok还要检查,失败就失败了不检查了,结束了) sufficient:一票通过,通过后就不用查了(成功就ok不检查,其它都ignore) optional:可选的 include:由其它文件决定 2.2.3 常见模块 (1)pam_unix.so:是比对md5结合/etc/shadow的模块 选项: <1>nullok:密码允许为空 <2>shadow:shadow格式的密码 <3>md5:密码加密用md5的算法 (2)pam_permit:允许访问 (3)pam_deny:拒绝访问通常放在other中 (4) pam_cracklib.so:依据字典(里面的是弱口令)中记录的密码来检查密码, 若字典中有就换个,根据规则输密码 选项:use_authtok:设置密码 (5)pam_shells.so:用户登录时默认的shells是哪个,合法的登录shell /etc/shells (6)pam_securetty.so:安全的tty.设定管理员只能登录特殊设备上写在/etc/securetty里, 改这个文件内容 就可以控制 (7)pam_listfile.so:到某文件中验证是否合法,可独立建一个文件哪个用户能登录哪些不能登录 (8)pam_rootok.so:只要是管理员就可以su到其它用户控制是sufficient (9)pam_limits.so:一次用户会话里能够使用系统资源的限定,管理员也会受限制, 默认情况使用的配置文件/etc/security/limits.conf或/etc/security/limits.d/*.conf 格式:<domain>:对谁生效可是用户可是组 <type>:限制类型(只有二个软硬soft/hard) <item>:对哪种资源限制 <value>:限制的值 常用的资源限制:nofile rss:能使用最大内存 as:地址空间限制 cpu nproc maxlogins (10)pam_env.so:设置环境变量,用户登录前根据文件/etc/srcurity/pam_env.conf 让用户设置环境变量的 (11)pam_wheel.so:谁允许su到root的(默认没启用,启用后只有wheel组中的用户才能su到root) (12)pam.motd/pam.issue:是否登录后显示/etc/motd或/etc/issue文件内容 (13)pam_succeed_if:系统用户登录不登录就用这个定义 (14)pam_time.so:限制什么时候登录操作系统, 用配置文件/etc/security/time.conf(格式:服务 终端 用户 时间) 注:我们系统登录用的配置文件是/etc/pam.d/login(一般是包含/etc/pam.d/system-auth-ac, 所以一般定义这个文件就可以生效各种限制了) 其它服务单独控制用的是/etc/pam.d/服务名 例:PAM模块是用sun提出的一种认证机制pam_tally2.so模块 1.格式 pam_tally2.so [file=/path/to/counter] [onerr=[fail|succeed]] [magic_root] [even_deny_root] [deny=n] [lock_time=n] [unlock_time=n][root_unlock_time=n] [serialize] [audit] [silent] [no_log_info]    参数:      file:指定统计次数用的文件,默认是/var/log/tallylog      magic_root:如果用户uid=0,在帐户认证时调用该模块发现失败时,不计入统计      even_deny_root:root用户一样被锁定     deny:普通用户锁定次数      lock_time:普通用户锁定后等待的时间      unlock_time:普通用户锁定后解锁要等待的时间 2.实例    auth required pam_tally2.so deny=3 unlock_time=300 even_deny_root root_unlock_time=300 /etc/pam.d/login中配置只在本地文本终端上做限制 /etc/pam.d/kde在配置时在kde图形界面调用时限制 /etc/pam.d/sshd中配置时在通过ssh连接时做限制 /etc/pam.d/system-auth中配置凡是调用 system-auth 文件的服务,都会生效 3.查看命令 查看root用户的登录失败的次数 pam_tally2 --user root 重置计数器,即手动解锁 pam_tally2 --user root --reset 实例3: (1)怎样才能强迫用户设置的密码不能与过去3次内的密码重复 (特别注意:/etc/pam.d/system-auth下的配置针对的是普通用户, 在root用户下是无效的) 修改/etc/pam.d/system-auth,增加pam_unix.so的参数,如下: # vim /etc/pam.d/system-auth password sufficient pam_unix.so md5 shadow nullok try_first_pass use_authtok remember=32)如何要求用户设置的密码必须至少包含5个数字和3个特殊符号? 修改/etc/pam.d/system-auth,在password使用pam_cracklib.so设置的最后附加 dcredit=-5 ocredit=-3 # vim /etc/pam.d/system-auth password requisite pam_cracklib.so try_first_pass retry=3 dcredit=-5 ocredit=-3 同时注意:密码中的n个数字和n个特殊字符不能全部放在一起!! (3)如何限制kevin用户最多同时登陆4个?(同时可以限制root用户) 这需要pam_limits.so模块。由于/etc/pam.d/system-auth中,默认就会通过pam_limits.so 限制用户最多使用多少系统资源. # cat /etc/pam.d/system-auth|grep limits.so session required pam_limits.so 因此只需要在/etc/security/limits.conf 中加入以下内容: # vim /etc/security/limits.conf kevin hard maxlogins 44)某用户连续登陆失败2次就锁定该账号,禁止登陆?(默认只能尝试登录三次,由retry=N决定的) 现在很多地方都有限制用户登录的功能,Linux也是如此, 当你登录失败多次后就可以限制用户登录,从而起到保护电脑安全的作用, 通过PAM模块即可实现。Linux有一个pam_tally2.so的PAM模块, 来限定用户的登录失败次数,如果次数达到设置的阈值,则锁定用户。 编译PAM的配置文件 # vi /etc/pam.d/login //在#%PAM-1.0下面添加一行 #%PAM-1.0 auth required pam_tally2.so onerr=fail deny=2 unlock_time=300 even_deny_root root_unlock_time=10 参数解释: onerr=fail 表示定义了当出现错误(比如无法打开配置文件)时的缺省返回值; even_deny_root 表示也限制root用户; deny 表示设置普通用户和root用户连续错误登陆的最大次数,超过最大次数,则锁定该用户; unlock_time 表示设定普通用户锁定后,多少时间后解锁,单位是秒; root_unlock_time 表示设定root用户锁定后,多少时间后解锁,单位是秒; 此处使用的是 pam_tally2模块,如果不支持pam_tally2,可以使用pam_tally模块。 另外,不同的pam版本,设置可能有所不同,具体使用方法,可以参照相关模块的使用规则。 特别注意: 一定要将内容添加到#%PAM-1.0的下面,即在第二行添加内容,一定要写在前面!如果写在后面, 虽然用户被锁定,但是只要用户输入正确的密码, 还是可以登录的! 也可以将上面的内容添加到/etc/pam.d/password-auth文件中,因为/etc/pam.d/login文件中包括(include)了password-auth配置 # vim /etc/pam.d/system-auth //同样添加到auth区域的第一行 #%PAM-1.0 # This file is auto-generated. # User changes will be destroyed the next time authconfig is run. auth required pam_tally2.so onerr=fail deny=2 unlock_time=300 even_deny_root root_unlock_time=10 特别注意: 上面的配置只是限制了用户从tty终端登录,而没有限制远程ssh登录,如果想限制远程登录,需要在/etc/pam.d/sshd文件里配置 # vim /etc/pam.d/sshd //同样添加到auth区域的第一行 #%PAM-1.0 auth required pam_tally2.so onerr=fail deny=2 unlock_time=300 even_deny_root root_unlock_time=10 这样的话,使用ssh远程登录的时候,连续输入两次错误密码,就会被锁定了! 如果输入错误次数没有达到deny设置的次数,再输入正确密码就可以登录。 验证: $ ssh -p22 kevin@localhost kevin@localhost's password: //第一次输入密码错误 Permission denied, please try again. kevin@localhost's password: //第二次输入密码错误,此时已被锁定 Permission denied, please try again. kevin@localhost's password: //接着第三次再输入正确密码,还是无法登录进去,因为已被锁定300s了! Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password). 因为被锁定300s了!在这个时间内,就算再输入正确密码也是无法顺利登录到机器的! $ ssh -p22 kevin@localhost kevin@localhost's password: Permission denied, please try again. 接着可以解锁!! 查看用户登录失败的次数。由下面命令可知,已经输错3次了 [root@centos6-test06 ~]# pam_tally2 --user kevin Login Failures Latest failure From kevin 3 03/30/18 07:35:49 ::1 解锁指定用户 root@centos6-test06 ~]# pam_tally2 -r -u kevin Login Failures Latest failure From kevin 3 03/30/18 07:35:49 ::1 [root@centos6-test06 ~]# pam_tally2 --user kevin Login Failures Latest failure From kevin 0 接着,就可以输入正确密码登录机器了 [bobo@centos6-test06 ~]$ ssh -p22 kevin@localhost kevin@localhost's password: Last login: Fri Mar 30 07:40:04 2018 from ::15)如何限制root只能从kevin.com这台计算机使用ssh远程登陆? 由于ssh服务器的程序文件使用sshd,而sshd刚好支持PAM,验证如下: [root@centos6-test06 ~]# ldd /usr/sbin/sshd | grep libpam.so libpam.so.0 => /lib64/libpam.so.0 (0x00007f36f254d000) 修改/etc/pam.d/sshd,加入第二行,如下: [root@centos6-test06 ~]# vim /etc/pam.d/sshd auth include system-auth account required pam_access.so accessfile=/etc/deny_sshd account required pam_nologin.so 创建/etc/deny_sshd文件 # touch /etc/deny_sshd # vim /etc/deny_sshd -:root:ALL EXCEPT kevin.com 九、DNS服务 概述:主机1通过主机2的域名去访问主机2的过程 主机1----通过本地的stub resolver----找到/etc/nsswith.conf (看访问主机通过什么方式找,hosts: file DNS) ----通过file(/etc/hosts)/通过DNS(/etc/resolv.conf找到DNS服务器) DNS服务是分布式的,上级只知道下级,但下级不知道上级,但下级都知道根的IP, (1)DNS服务器 ns.ibm.com DNS的几种机制 第一种:递归---把要找的域名给自己的ns服务器,不管ns怎么去找最终都是ns给结果, 所以只发了一次请求就能知道结果 第二种:迭代---对ns服务器来说,ns找根,根告诉.com在哪,ns再去找com, com再告诉他的下级再哪,ns再给找 第三种:找本域的由ns直接返回 DNS的工作机制 .com----ns.com. 根(内有授权数据库记录,ns1.net.---IP1 IP2:.org----ns.org.) ns1 ns2 (内有IP1,管理的域是.net. (内有IP2,管理的域是.com与.org,内有二个授权数据库。 其内的授权数据库记录如下 一个IP可以有多个主机名,一个主机名可有多个IP(请求) .com(域)---ns.com(域名) 时一次只返回一个结果轮流返回) ns.com----IP1) DNS工作性质 1.1:接受本地客户端查询请求 接受外域请求返回给它本地权威答案(1.肯定的有TTL值缓存 2.否定也有TTL值告诉别人) 接受外域请求非权威答案(主机1应找自己的ns,/etc/resolv.conf里写, 如果这个配置文件写的是别的域的ns,一般不帮忙如果要转发 那这个配置文件里写的ns服务器必须能递规,给哪些递规可定义,看DNS的配置) DNS全球有13个根(做了主从) 主从:一个为主其它为从,从会自动请求数据同步,每隔一段时间对主DNS请求同, 不是主推送的,请求同步的要求? 1.serial number:版本号,主从都有版本号,主更新一次加1,从看不一样就请求 2.refresh:多长时间检查一次 3.retry:重试时间(若refresh没有响应) 4.expine:2.3都没响应多长时间认为主挂,自己自杀 5.nagative answer TTL:否定答案的缓冲时长 DNS服务器分类 DNS服务器 缓存DNS服务器,不提供权威答案只负责缓存数据 转化器:只转发请求 DNS特性 谁做NS是上级决定的以哪个做为ns(ns与mail必须要做说明,而www不用做说明) (2)DNS服务器数据库内容结构 数据库的每个条目叫资源条目 字段: name TTL值 IN 资源记录类型 value A (表主机名--IP(ipv4)记录) AAAA(表主机名(FQDN)--ipv6记录) PTR (表IP----FQDN) NS(有二条:域(zone name)--FQDN(主机名) ---注:这是ns定义自己不是它上级的数据库定义 FQDN----IP(A记录)) MX(zone name---FQDN) eg:magedu.com. 600 IN MX 10(优先级) mail.magedu.com mail.magedu.com 600 IN A 10.10.10.10 SOA:起始授权记录,用于标明一个区域内部主从服务器之间如何同步数据必须在第一行 eg: magedu.com. 600 IN SOA 主FQDN 邮箱地址( )M(分) H(时) D(天) W(周) CNAME FQDN---FQDN(别名) 别名 IN CNAME 正式名称 总结:MX---只能记录在正向文件中 NS--正向文件都行 A---正向文件中 PTR---反向文件中 (3)一个DNS服务器里有二个区域文件(正反) 1.上级如何组下级授权,上级如何写? magedu.com. IN NS ns.magedu.com. ns.magedu.com IN A 192.168.10.0 ---.com把magedu.com授权给192.168.10.0 这个网段(上级定义下级写的是域对网段,下级定义自己用会把自己定义在一个IP上) 2.ns.magedu.com.内有什么文件如何写? 正向文件:magedu.com IN SOA 192.168.10.10 --这个域给这个网段 ns.magedu.com 反向文件:0.168.192.in-addr.arpa. IN SOA ----这个网段 1.168.192.in-addr.arpa. IN PTR www.megedu.com 3.主从的配置 (4)DNS的软件bind97 配置: 1.主配置:/etc/named.conf bind进程named工作属性,监听端口,日志,数据文件目录等 区域文件定义:定义区域在哪个文件中eg:/etc/named.rfc/9.zones, 这个数据文件目录写的这个域是自己的与根的,它不知道自己的 2.区域数据文件:/var/named/自定义名 具体配置如下: 1./etc/named.conf option{ listen ports 53 { 127.0.0.1 }; directory "/var/named";---数据区域文件目录 recursion yes;---可以给别递规 allow-recursion { IP };给谁递规 allow-query {localhost};只允许谁来查询 allow-transfer { Ip };不给谁传递 notify yes;--启动通知功能 } logging{}---日志 zone "." IN {-----给哪个域定义数据文件 type hine(根)-----类型:master(主) slave(从) hint(根) forward(转发) file "name.ca"---区域数据文件 } include 2./var/named/ eg: /etc/named.conf zone "magedu.com" IN { type master; file "magedu.com.zone"; } /var/named/magedu.com.zone(授权为664) $TTL 600(宏) SOA: magedu.com IN SOA ns.magedu.com admin.magedu.com.( 20180826 1H(1小时来一回) 5M(重试) 2D(多长时间认为挂) 6H(TTL否定缓冲时长) ) ns : magedu.com. IN NS ns1.magedu.com(给自己定义成ns绑定成对应的IP) magedu.com IN MX 10 mail.magedu.com. ns1.magedu.com. IN A 192.168.100.3 mail.magedu.com. IN A 192.168.100.4 www.magedu.com. IN A 192.168.100.15)dig用法(前提是有DNS服务器,linux常用) 1.dig -t RT(NS A MX PTR) NAME(对应资源类型前后的值,A的值是IP,NS的值是域名) [@IP]--指定的DNS服务查这个记录默认是查resolv.conf里的DNS查的 eg:dig -t NS magedu.com magedu.com的值ns1.madedu.com eg:dig -t A www.baidu.com 2.反向查询 -x dig -x IP--查FQDN host -t RT NAME host与dig是客户的命令,它们靠查resolv.conf里的DNS的结果(windows常用) >nslookup >server 172.16.100.1---指定DNS服务器 >set q=A >www.baidu.com (6)DNS的主从复制与区域传递 1.泛域名解析 把A记录的主机名改为通配符 eg:*.magedu.com IN A 192.168.1.2 2.dig补充 选项: +trace:跟踪DNS过程 +recurse:给递归 -t: axfr:完全区域传送 ixfr:增量区域传送 eg:手动区域传送 dig -t axfr magedu.com 3.从DNS服务器配置 主配置/etc/named.conf---数据文件传过来记录不同的收下 zone "magedu.com" IN { type slave; file "slave/magedu.com.zone";--数据文件传到哪由于/var/named是664权限, 文件传不过来所以在/var/named/slave,这个目录有770权限 masters {192.168.2.127};---主是谁 } 重启服务看主的/var/log/messages自己传送了,传递间断等情况主的数据文件定义的有SOA记录定义了 (7)DNS子域授权 正向父域:在区域数据文件中添加非自己的NS记录就是授权子域(就是上级与下级), 如果子域从的也添加进来否则不能使用 magedu.com加二个子域fin.magedu.com. marker.magedu.com 在ns1上授权如下: /var/named/magedu.com---加二个子域的NS记录,指定它们的NS服务器, 若有从把从的也NS也写进来(不解析本地时,从根找到父,父知道从才能定义) 父子可不在同一网段 实例: 192.168.2.127父域写一个子域 192.168.2.131子域,必须有,不然只有父域用dig还是找不到 <1>子域ns服务器配置 /etc/named.conf zone "fin.magedu.com"; /var/named/fin.magedu.com.zone----把自己的ns记录写上 <2>子域不知道到父域只能从根上知道,如何让他直接知道父域( 子域定义将给它的请求都转发给父域解析就行) /etc/named.conf option{ directory "/var/named"; forward first;----------------(only:只转发给那个服务器不给结果就算了, first:先转发给某服务器给不了结果就去找根了) forwarders {192.168.2.127}; } 注:以上全局定义所有的域都转发,只想转发某个域要申明转发的域, eg:只转发父域负责的域magedu.com zone "magedu.com" IN { type forword; forword first; forworders {192.168.2.127} } (8)DNS视图--智能DNS 1.allow-recursion{}--允许的递规的客户端来源 query{}---查询客户端来源 transfer{}----区域传递客户端来源 acl:访问控制列表,在/etc/named.conf----对重复内容可调用 /etc/named.conf acl 客户端名称 { 172.0.0.0/16; 127.0.0.0/18; };-----这里只能定义网段ip/掩码 不能定义主机(ip) allow-query {innet;}---调用 named内置的acl列表(none:什么都没有 any 任何事) 例:如何电信全国范围内分为几片,每片都有服务器如何做到客户端到对应的服务器上查数据? 定义view所有的zone都要放里面 1.客户端来源 zone "magedu.com"+数据文件(IP1) view 2.客户端来源 zone "magedu.com"+数据文件(IP2) /etc/named.conf acl telecom { 192.168.2.0; } options{ } view 名字{ match-clients { telecom };---定义客户端来源 zone "magedu.com" IN { type master; file "telecom"; } zone(反) }----有几类客户端就有几个view 十、负载均衡集群(ipvsadm与iptables不能同时使用,先把iptables服务关掉) 请求 | 前端设备 | | | 服务器1 服务器2 服务器3 (1)调试机制 Round Robin:轮调 WRR:加权轮调 例:服务器里的内容必须一样,一客户端在第一台发贴子在第二台看不到了如何实现所有服务器都能看到 请求 | 前端设备(调度器) | | | 服务器1 服务器2 服务器3(网页的页面只能保存本地页面更新的如何同步? 用到的rsync文件同步,前提是内核要有通知(inntify)能力) / \ NFS(附件放在NFS里) mysql(数据都放在数据库里) sh:源地址hash(同一地址都发给一个realserver) dh:目标地址hash 也是同一请求发给同一个realserver----------以上都是静态调度 动态调度 lc(最少连接):计算每个realserver的活动+非活动连接 活动*256+ 非活动---找最小的 wlc(加权最小连接) 活动*256+非活动/权重 sed:最短期望延迟 nq:永不排队 注:生产环境中最常用是wlc (2)常见的负载均衡集群 1.硬件负载:F5 BIGIP 2.软件负载 四层:LVS(根据用户IP与端口区分) 七层:应用层实现,nginx haproxy(对http tcp(mysql swtp)) (3)三种LVS服务器配置 集群前端设备要调到后端必须要定义成集群服务,LVS也是工作在内核上的,iptables与lvs不能同时使用 前段:ipvsadm (命令行写规则) 后端:ipvs 工作内核监控INPUT链 第一种:LVS-NAT地址转换 RIP1 客户端CIP VIP调度器DIP RIP2 例:在调度器上操作 yum -y install ipvsadm ipvsadm功能: 1.管理集群服务 -A :添加 -t|u|f(tcp|udp|防火墙) service-address(VIP:port) [-s 调度方法] eg:ipvsadm -A -t 192.168.100.1:80 -s rr -E:修改 -t|u|f(tcp|udp|防火墙) service-address [-s 调度方法] -D:删除 -t|u|f(tcp|udp|防火墙) service-address 2.管理集群服务中的realserver -a:添加 -t|u|f(tcp|udp|防火墙) service-address(VIP:port) -r realserver-address [-g(DR默认)|i(TUN)|m(NAT)] [-w weight] [-x upper] [-y lower] eg: ipvsadm -a -t 192.168.100.1:80 -r 192.168.100.8 -m ipvsadm -a -t 192.168.100.1:80 -r 192.168.100.9 -m -e:修改 -t|u|f(tcp|udp|防火墙) service-address(VIP:port) -r realserver-address [-g(DR默认)|i(TUN)|m(NAT)] [-w weight] [-x upper] [-y lower] -d:删除 -t|u|f(tcp|udp|防火墙) service-address(VIP:port) -r realserver-address: 从哪个集群服务删哪个realserver服务器 3.查看 -L|l -n:数字格式显示IP与端口 --stats:统计信息(ipvsadm -L -n --stats) --rate:输出速率信息 --timeout:显示tcp tcpfin udp的会话超时时长 --daemon:显示进程状态 --sort:对real server的地址IP:port做排序 -c:连接状态 4.删除所有集群服务 -C:清空ipvs规则 5.保存规则 -S: ipvsadm -S >/path/to/somefile(默认/etc/sysconfig/ipvsadm) service ipvsadm save 6.保存如何生效,载入此前的规则 -R ipvsadm -R < /path/to/somefile 例:集群服务时间要同步不能超过1s,用NTP服务器 (1) 调度器配置(172.16.100.1 192.168.0.7) ipvsadm -A -t 172.16.100.1:80 -s rr ipvsadm -a -t 172.16.100.1:80 -r 192.168.10.8 -m ipvsadm -a -t 172.16.100.1:80 -r 192.168.10.9 -m 调度服务器内的Ip_forward要打开他们之前才能相互转发 echo 1 > /proc/sys/net/ipv4/ip_forword ipvsadm -S > /etc/sysconfig/ipvsadm (2)RS1 192.168.0.8 RS2 192.168.0.9 网关指向192.168.0.7 网关指向192.168.0.7 第二种:LVS-DR模型都是单网卡(调度器与RIP都在一个交换机上) ------请求到调度器后转到对就的RIP,响应报文不过调度器直接走路由器回去 路由器-----------交换机--------------调度器VIP+DIP在一个网口 (只开帧首部,再重封装一个帧首部发给RS) / | \ / | \ / | \ VIP+RIP1 RIP2+VIP RIP3+VIP 注解:1.RS的网关要指向能通过互联网的路由设备才能访问互联网 2.同一网段是通过MAC地址通信的,路由器要得到RS与调度器的MAC要广播, 但这四台都有VIP,路由器如何知道是调度器的,所以RS的ARP的MAC解析功能关了 做法有三种: (1)在路由器上静态绑定VIP:MAC把调度器的MAC绑定(路由器) (2)引进ARPTABLES,基于与ARP做访问控制,在RS上定规则,若广播本机VIP就不响应(RS) (3)linux2.2.6内核后版本后引入内核参数 arp_ignore:定义接收ARP请求时响应级别 arp_announce:定义将自己地址向外通告时的通告级别 arp_ignore:RS上有二个网卡 eth0:RIP eth1:VIP lo别名VIP eth0接受请求报文,但报文请求的是VIP,所以不在同一接口就不能响应 arp_announce:通告级别,接入网络后在内网中广播自己的IP及对应MAC 注:它们的默认都为0,尽可能向外通告,尽可能响应 arp_announce: 0:将本机任何接口上的任何地址向外通告 1:尽可能仅向目标网络通告与其网络匹配的地址 2:仅将与本地接口匹配的网络通信 arp_ignore: 0:只要本机配置的有相应地址就给予响应 1:仅在请求的目标地址配置请求到达的接口上的时候才给予响应 问题:以上是ARP广播的问题,但对请求报文处理问题,Linux上请求报文从哪个口进就从哪个口出 ,调度器关系,请求会到eth0 响应要用到VIP所以要出VIP出去? 需要添加一个独特的路由条目,明确说时请求目标到达lo:0别名上的响应也要由这个网卡响应 注:以上VIP与RIP等是一个网络的,但如果VIP是外网,他们不在一个网络内如何做? 以上的架构不能使用用,换一个架构,加二个能通内外网的路由器, 内部通过路由器的内网出去由其外网发出去 例: 调度器 ech0 DIP:172.16.100.2-------只用一个网卡, 在/etc/sysconfig/network-scripts/ifcfg-eth0里把eth1禁用,ONBOOT=no ech0:0 VIP:172.16.100.1 ipvsadm -A -t 172.16.100.1:80 -s rr ipvsadm -a -t 172.16.100.1:80 -r 192.168.10.7 -m ipvsadm -a -t 172.16.100.1:80 -r 192.168.10.8 -m RS1 eth0 RIP:172.16.100.7 ech0:0 VIP:172.16.100.1 做法:1.把arp_ignore与arp_announce都写成最大值 (/proc/sys/net/ipv4/conf/(all|eth0|lo)---这三个目录下的这个值都要改) sysctl -w net.ipv4.conf.all.arp_announce=2 sysctl -w net.ipv4.conf.eth0.arp_announce=2 sysctl -w net.ipv4.conf.lo.arp_announce=2 sysctl -w net.ipv4.conf.all.arp_ignore=1 sysctl -w net.ipv4.conf.eth0.arp_ignore=1 sysctl -w net.ipv4.conf.lo.arp_ignore=1 2.添加特殊路由及别名 ifconfig lo:0 172.16.100.1 broadcast 172.16.100.1 netmask 255.255.255.255 up -定义跟自己的全网络 route add -host 172.16.100.1 dev eth0:0 ---目标为172.16.100.1都要由eth0:0发出去(因调度器关系,请求会到eth0 响应要用到VIP所以要出VIP出去) RS2 eth0 RIP:172.16.100.8 ech0:0 VIP:172.16.100.14)调度器对后端服务器的健康状态检查 用如下二个命令: 1.elink:交互式命令 elinks -dump http://192.168.10.7 echo #?---为0时就是正常 2.curl命令 --cacert <file>CA证书(SSL) --capath <directory>CA目录 --compressed:要求返回是压缩的形势 --connect-timeout:设置最大请求时间 -H/--header:自定义头信息传递给服务器 -i/--include:输出时包括protocol头信息 -I/--head:只显示文档信息 --interface 使用指定网络接口/地址 -s/--silent:静音模式,不输出任何东西 -u/--user:设置服务器的用户与密码 -p/--proxytunnel:使用HTTP代理 eg:curl -I http://192.168.10.75)LVS持久连接:在某段时间内把某IP的请求定义到一个RS机制上, 虽然用sh dh调度方式实再这一功能但某段时间的这个时间限定如下 ipvsadm -A/E ...... -P timeout(定义超时时长)--默认300s 基于ssl会话时需要用到持久连接 1.PPC(持久端口连接):将来自于同一个客户端对同一个集群服务的请求,始终定向至此前选定的RS 2.PCC(持久客户端连接):将来自于同一个客户端对所有端口的请求, 始终定向至此前选定的RS,把所有端口统统定义为集群服务,一律向RS转发 3.PNMPP:持久防火墙标记连接 十一、高可用集群的相关配置 (1)当RS坏了可用dirctor的健康状态检查来实现高可用,当dirctor坏了怎么办? 当主的dirctor坏了可以把VIP拿到备机上,但DIP不能拿到备机上, 因备机与主机还要用不同的DIP不通信,相互通知心跳信息 以DR模型为例 路由器与dirctor通信一定是靠MAC地址在路由器缓冲的是A的MAC地址, 当A坏了VIP拿到MAC就变了,路由器如何知道备机的MAC? 1.B要通知路由器我的VIP与MAC地址: HAResource:高可用资源(如VIP ipvs服务都是集群的资源) Failover:故障转移 资源粘性:资源更乐于运行哪个节点 由以上属性,A与B之间必须在某层次上完成集群事务的协议,A与B之间要有个通信的信道 CRM----资源管理器,它是一个程序,A与B都要运行 (负责计算的节点称DC,DC上要有二个组件PE:策略引擎 TE:事务引擎。另一个了 另一个子功能LRM在二个节点上动行,负责接受TE传来的指挥---例:A的转移到B上, 实际上就是A的LRM把VIP当掉,ipvs关了,B上的LRM把VIP启用,ipvs开了, 所以这个要写成脚本,这个脚本要能接受status|start|stop等参数, 注:能够在集群中用于实现集群资源管理的脚本叫RA,每个资源都有一个RA叫资源代理) Messaging layer----传心跳信息等,监听UDP的某端上通常为694/UDP A B 注:概述 1.资源组:当VIP与ipvs要共进退出现资源组 2.资源约束:资源与资源之间粘性 排列约束:定义资源是否能在一起可用作RG情况正值表可以在一起,负值:不能在一起 位置约束:可以用作资源粘性的功能,约束以整数来表示,正值:倾向于此节点 顺序约束:与节点无关,定义资源启动或关闭的次序因资源有依赖关系(inf:正无穷 -inf:负无穷) 3.高可用mysql服务需要的资源 FIP mysql service filesystem:文件系统 mysql1 ----- mysql2 心跳 共享存储(二个都要挂载存储上,当一个坏了FIP转移,一个mysql停了, 另一个mysql开了并挂载到存储上) 注:1.以上只有二个节点高可用,总是有一个空闲,能否把主备改为主主? (1)可以用于不同服务互为备份 (2)另一个情况,一个服务在二台上工作,能共享资源, 当二个都工作时由于加锁问题写文件时会错乱 这时可以用特殊文件系统集群文件系统(GFS或OCFS2) --一个另一个可以看到,能用集群文件系统的设备一定是DAS/SAS (2)高可用集群共享存储 1.类型 DAS:直接附加存储,直接接到主板总线,被识别为一个存储设备 NSA:网络附加存储,如NFS将内存数据转换到网卡IO,以挂载的方式以文件为单位, 把对放方的目录挂到本地目录上使用,不用格式化 SAN:存储区域网络,如iscsi,把对方的磁盘用网络直接做在自己主机能识的 的磁盘使用,相当于这个内核写的数据存到远程磁盘上去,用的是磁盘 协议iscsi(一般借助光网络的叫FC SAN,借助互联网的叫IP SAN) 2.资源类型 primitive:组资源,在一定时刻只能运行在一个节点的资源 clone:克隆资源,每个节点上都要运行,eg:STONITH或分布式锁管理器 group:组,把多个primitive归到一块同进同退 master/slave:主/从只能运行在二个节点上一个主节点一个从节点,用于drbd(分布式磁盘块镜像) 3.RA资源代理(接受start |stop|status) 类别:资源管理功能 legacy heartbeat V1协议 LSB:linux的shell编程风格支持接受start|stop等红帽:/etc/rc.d/init.d/* OCF:开发式集群框架 子类别:pacemaker linbit(drdb) STONITH:专门管理硬件STONITH设备 注:集群信息靠什么发送? 主播、广播 单播 例:高可用的web 资源:VIP httpserver filesystem (3)高可用集群之hearbeat安装配置 以二个节点为例node1 node2 注意:节点名称一般都可以在/etc/hosts里定义好相互能找到 节点名称必须要与uname -u 执行结果一致 每个节点能通过ssh口令互信,一般只能root权限(防其它外来设备安到交换机上变为集群) 各时节点时间同步 例:规划 VIP:172.16.100.1 HA1:172.16.100.6 HA2:172.16.100.7 网关172.16.0.1 配置如下: HA1 1.配IP hostname node1.magedu.com(vi /etc/sysconfig/network 里面改主机名) 2.ssh口令互信 ssh-keygen -t rsa -p ' ' -f ~/.ssh/id_rsa ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.100.7 3.主机名解析 vi /etc/hosts 172.16.100.6 node1.magedu.com 172.16.100.7 node2.magedu.com 4.时间同步 ntpdate 172.16.0.1---网关 crontab -e */5 * * * * /sbin/ntpdata 172.16.0.1 &> /dev/null 5.heartbeat配置 安装后heartbeat配置文件如下 配置文件:/etc/ha.d/* 资源脚本:/etc/ha.d/rc.d/* 资源代理脚本:/etc/ha.d/recource.d/* (1)启动hearbeart要提供如下配置 1.密钥文件:600权限,authkeys vi /etc/ha.d/authkeys---心跳信息等用什么加密方式传输 #auth 1 #1 crc #2 shal-h2! #3 md5 hello! 2.hearbeat服务的配置文件ha.cf vi /etc/ha.d/ha.cf logfile /var/log/hearbeat.log:日志文件 keepalive 2:多长时间发次心跳 initdead 120:第一个节点启动后等第二个节点启动要多久 udpport 694:服务端口端口 bcast eth0:广播 mcast eth0 225.0.0.1 694 1 0:主播地址 ucast eth0 172.168.100.7:单播对应地址 auto_failback on:原节点上线了是否转移回去 node node1.magedu.com node node2.magedu.com---集群里有哪些节点 ping ip 网关:仲裁用的 ping_group group ip1 ip2 deadping 30:多长时间ping一次 compreession bz2:发送事务是否会压缩 3.资源管理配置文件:haresources vi /etc/ha.d/haresources---每行定义一个集群服务,内有节点各资源等 node1.magedu.com Ipadrr::172.16.100.1/16.eth0(参数用::分开) httpd 第一个资源,如何定义VIP定义在哪个网卡上 第二个资源 Filesystem::172.16.100.10:/web/htdocs::/var/www/html::nfs 第三个资源 4.启动heartbeat service heartbeat start (4)heartbeat基于crm进行资源管理 1.在heartbeat中的另一个CRM叫crm,以crm进程来动行,它运行每个节点上在各节点上可通过 套接字监听能互相通信,给管理员实现管理,给每个资源提供一 个管理API所以开发的应用程序通过API来管理CRM 2.相关配置---在DC上操作会自动同步到其它节点 vi /etc/ha.cf---配置文件指定用crm管理(crm(mgmtd)监听在5560端口) crm on ---这时不会读haresources这个配置文件 crm工作模式1:若crm想用haresources这个配置文件就要执行 /usr/lib/heartbeat/haresourceszcib.py这个脚本, 这个脚本依赖/usr/lib/heartbeat/ ha_propagate,它的作用是在一个节点上写好会自动同步到用一个节点 crm工作模式2:直接用GUI界面来配置资源 #cib---以cib开头的命令 #crm---以crm开关的命令 crm_resource:定义资源 crm_standby:转为备节点 crm_sh:crm的命令行工具 heartbeat安装时会自动创建一个hacluster的用户, 可手动组这个用户添加密码就可以登录crm的GUI界面了 #password hacluster #hb_gui---进入图形界面 登录后右半边会有 informations(关于版本信息) configuration(集群全局配置,法定票数据是否启用stonith等) advanced(高级配置) 登录后左半边会有 nodes(三个节点) 172.16.0.1 ping node(仲裁节点) node2.magedu.com running(dc) node1.magedu.com running Resources----右键可以添加资源,按资源的类型等情况来分 constraints(资源粘性) locations orders colocations (5)高可用集群基于heartbeat和nfs的高可用的mysql 1.架构 mysql(172.16.100.6--DC) mysql(172.16.100.7)(高可用) (1)在二个节点上都挂载nfs测试一下能不能正常 (2)在二个节点上装上mysqld不要启动,它由crm控制 (3)service heartbeat start #crm-mon-----看谁是DC 用hb_gui配置资源(VIP filesystem mysqld )---有顺序约束 nfs(172.16.100.0) vi /etc/exports /mydata 172.16.100.6(no_root_squash) 172.16.100.7(no_root_squash) (6)高可用之corosync基础概念及安装配置 1.红帽6:corosync(备注:keepalived基于VRRP,只支持2个节点, corosync支持100个节点,最好配置16个节点) pacemaker----最上层,用来管理资源的可命令行也可图形配 corosync/heartbeatV3----中间层,支持命令行的各种配置 RA1 RA2------下层 2.配置 (1)准备工作 时间同步 主机名/etc/hosts ssh互信 (2)配置文件 vi /etc/corosync/corosync.conf totem{---图腾 interface{ bindnetaddr:172.16.0.0 ----绑定网络地址,多播传心跳信息,网卡要绑定在相同的网段内 ringnumber:0(定义令牌环网) mcastaddr:多播地址 226.99.6.17 meastport 5405--广播端口 } logging{ fileline:off to_stderr:no日志信息是否标准错误操作 to_logfile:yes-用独立文件记录 to_syslog:no - 若上为no这个为yes发给syslog记录 logfile:/var/log/cluster/corosysnc.log---先创建 debug:off--调试级别关 timestamp:on--记录时间戳 logger_subsys{ subsys:AMF debug:off } } 添加如下内容----启用pacemakers的 service { ver:0 name:pacemaker } aisexec {----用到ais功能时,可注释 user:root group:root } (3)生成密钥(安装corosync后会有命令行密钥工具) #corosync-skygen----保存在/etc/corosync/authkey #scp -p authkey corosync.conf node2:/etc/corosync #mkdir /var/log/cluster #ssh node2 'mkdir /var/log/cluster' #service corosync start #ssh node '/etc/init.d/corosync start' (4)测试各服务有没有起来 查看corosync引擎是否启动 grep -e "corosync cluster Engine" -e "configuration file" /var/log/messages 查看初始化成员节点通知是否正常发出 grep TOTEM /var/log/messages 检查启动过程是否有错误产生 grep ERROR:/var/log/messages | grep -v unpack_resources 查看pacemaker是否正常启动 grep pcmk_startup /var/log/messages (5)配置资源--命令行配置相关资源 配置命令同heartbeat的命令差不多,都是用crm相关命令 #crm--交互式命令 crm二模式 交互式:配置信息执行commit之后才生效 批处理:立即生效 crm(live)#help cib resource:管理资源 list:查看哪些资源 clean:清理资源,每个都要清,先停资料再清 eg:resource crm(live)resource# node:管理节点 ra:管理资源代理 classes:RA的资源类别与提供商 heartbeat lsb ocf:/heartbeat pacemaker ntonith list:某类别下某提供商的所有RA list lsb /etc/rc.d/init.d/脚本 meta:查ra的源数据信息用法 help meta provider:显示某资源是谁提供的provider Ipaddr status:查看资源状态的,用configure定义好资源后可用status查看状态 configure:配置集群资源如约束,克隆资源等配置资源前查配置有无语法错误 configure crm(live)configure#verify---查有无语法错误 } 例:配置web集群资源 configure crm(live)configure#verify #primitive webip ocf:heartbeat:Ipaddr params IP:172.16.100.1 nic=eth0 cidr_netmask=255.255.0.0 | | | | | | 配基本资源 资源名 类别 RA 指定参数 绑定网卡 crm(live)configure#verify---查是否有语法错误 crm(live)configure#commit--提交 crm(live)configure#show xml---看到定义的这个资源的配置信息用xml显示 停止资源 crm#resource resource#stop webip #start webip #migrate webip--手动迁移资源到另一个节点 再加个资源 crm(live)configure#primitive httpd lsb:httpd op start timeout=20s crm(live)configure#verify---查是否有语法错误 crm(live)configure#commit--提交 组约束二个资源绑定在一个组: configure#group webservice webip httpd configure#commit 问题:当DC变为备时资源未转移,因二个节点不具备法定票数了, 默认所有资源都stop所以要改为不具备法定票数也要允许转移,如下 configure#property no_quorum_policy=ignore configure#commit shell#crm node standby---当前变为备 crm node online:重新上线 清资源 crm resource resource#stop webservice #cleanup webip #cleanup httpd #start webservice----会自动生配置可手动编译删除 #edit--编辑 排列约束绑定: resource#stop webservice #cleanup webservice #cd #configure configure#delete webservice #commit #colocation httpd_with_webip inf:webip httpd #verify #commit 顺序约束: configure#order webip_before_httpd mandatory:webip httpd #commit 位置约束: configure#location webip_on_node1 100:#uname eq node1.magedu.com #commit (7)分布式复制设备drbd的基础概念及配置(drbd的主从高可用配置) 1.RAID1:镜像卷,二个磁盘一样,按每个存储位一一对齐,其中一个改了另一个也修改, RAID直接在主板总线上,由RAID的适配器来镜像把二边各放 一份,按位对应这二个盘必须在一个主机上 2.drbd:将位于二个系统上的磁盘分区做成镜像设备,Raid可以直接在总线上完成镜像而二个主机如何镜像? drbd是内核模块,因磁盘块要按位对应能操控磁盘的只有内核应用程序系统调用在内核上写数据时, 内核监控在某个位置,发现数据是发向定义成drbd的分区时它会将数据一分为二, 一份向自己本地存储另一份通过网卡向另外一个主机发送,另个主机要随时接受所以另一个主机 要有个服务监听,接收后发给自己的内核再存到对应的drbd设备中,它们是基于drbd协议工作 ---注:drbd是个内核模块,由于二主机并非所有硬盘数据都要同步,可能只同步某分区 所以要启用drbd并定义规则,把某些分区做成drbd,drbd有主从 概念,规则要在用户空间用命令工具 主:primary--可执行读写操作 从:secondary:文件系统不能挂载,不能读写数据按块同步 3.drbd双主模型 双主模型做成高可用集群服务,一个节点加锁能通知另一个节点,这样就可以双主了, 在CRM层把drbd定义成主从资源(一种自动切换主从一种把二个 主机对应的镜像格式成集群文件系统)---基于DLM)(分布式锁管理) 集群文件系统有二种:GFS2/OCFS2 注:drbd只支持双节点不支持多节点 4.drbd主从模型讲解 主从切换时要手动执行如何自动完成?方法如下 自动切换: 可以在高可用集群的CRM层定义成主从资源 (这时高可用可以来切换它的启动与关闭) 手动切换原理: 工作原理: 用户空间 | 内核:文件系统接口(通过内核API给用户空间) | 内核工作在内存:buffer cache(内存中缓存源数据 数据)读写在这里完成并不能立即同步到磁盘 | |----drbd过滤,非drbd磁盘的操作略过,是drbd的发往TCP/IP协议站--网卡驱动-- ---另主机网卡驱动---TCP/IP---drbd | 磁盘调度器(pisk scheduler) | pisk oriver驱动 | 磁盘 注:drbd要返回给应用程序存储完成有三种方式 A模型:自己磁盘保存完另份发给自己的TCP/IP就返回完成(性能好)--异步 B模型:报文发给从主机的TCP/IP协议就返回结果--半同步 C模型:从主机完成存储后再返回完成最可靠--常用--同步 注2:drbd只能有二个节点但一个节点可有多个drbd drbd1 | drbd1 drbd2 | drbd2 注3:drbd资源 1.资源名称 2.drdb设备(虚拟设备下去对应多个真设备,在双方节点,此drbd设备的设备文件, 一般为/dev/drbd#,其主设备147) 3.磁盘配置:在双方节点上各自提供的存储设备 4.网络配置:双方数据同步所使用的网络属性 注:格式化一个节点另一个节点也会格式化 5.drbd命令 (1)drbdadm(/etc/drbd.conf) (2)drbdsetup (3)drbdmeta:drbd源数据 6.drbd的安装配置(linux2.6.33就整合到内核了)---这里可以用到跳板机 例:node1:172.16.100.6 node2:172.16.100.7 跳板机:172.16.100.100 前提:时间同步 名称 ssh通信 100]#for I in {1,2};do ssh node$I wget ftp://172.16.0.1/pub/sources/drbd/drbd83.rpm;done --在每个节点上传一个drdb包 ssh-copy-id -i .ssh/id_rsa.pub root@node1 ssh-copy-id -i .ssh/id_rsa.pub root@node2----把本主机的公钥发给二个节点 ssh node1 `date` ssh node2 `date` for I in {1,2};do scp *.rpm node$I:/root;done for I in {1,2};do ssh node$I yum -y --nogpgcheck localinstall *.rpm;done 做成drbd 1.二个磁盘都做成一个/dev/sda5的分区1G 2.做成drbd设备(起名:mydrbd 设备:/dev/drbd0 磁盘二个都是/dev/sda5与网络配置) drbd配置 主配置:/etc/drbd.conf内包含以.conf结尾的所有文件 /etc/drbd.d/global_common.conf /etc/drbd.d/resource.d/*----资源定义任一个文件都是一个资源 vi /etc/drbd.conf global{--全局配置 usage-count yes; } common{ protocol c;默认协议是c handlers{----解决脑裂的 启用 pri-on-incon-defr "/usr/lib/drbd/notify-pri-on-incon-degr.sh"; /usr/lib/drbd/notify-emagency-reboot.sh;echo b > /proc/sys/q-trigger;reboot -f; pri-lost-after-sb...... local-io-error...... } startup{}--不启用 disk{ on-io-error detach;不同步 } net{ cram-hmac-alg "shal";---同步时加密算法 shared-secret "mydrbdlab";密码 } syncer{ rate 200M;同步时速率 } } 定义成drbd resource mydrbdq(名称){ on node1.magedu.com{ device /dev/drbd0; disk /dev/sda5;----把sda5做成drbd address 172.168.100.6:7789; meta-disk internal;(源数据放的位置) } on node2.magedu.com{ device /dev/drbd0; disk /dev/sda5;----把sda5做成drbd address 172.168.100.7:7789; meta-disk internal;(源数据放的位置) } 二个服务器的配置要一样 3.初始化资源----把drbd设备初始化 drbdadm create-md mydrbd--把mydrbd初始成名为create-md的设备 4.启动服务 /etc/init.d/drbd start 5.完成以上后查看启动状态 cat /proc/drbd / drbd-overview----查看 查看二个都是处于secondary状态,要把其中一个设置为primary 6.设置成主的命令 drbdsetup /dev/drbd0 primary -o / drbdadm --overwrite-date-of-peer primary mydrbd 完成以后就可以让二个节点完成同步如下 7.主节点做好后再主的上格式化挂载从的不能挂载 主节点:mke2fs -j -L DRBD /dev/drbd0 mkdir /mydata mount /dev/drbd0 /mydata---这个设备挂在/mydata使用 8.如何切换主从节点(要先把主改为从后才能再把从的改为主) ----手动切换或主从高可用定义成资源自动切换--先切换主从是在设备级别切换 所以要先卸载后再能切换 主节点:cp -r /etc/drbd/* /mydata umount /mydata drbdadm secondary mydrbd---让自己变为从 drbd-overview--查看自己的状态 从节点:drbdadm primary mydrbd---切换到主 mkdir /mnt/drbd mount /dev/drbd0 /mnt/drbd 到/mnt/drbd下看以前主的文件是不是都复制过来 例2:基于drbd与corosync的高可用mysql---这时mysql也要做高可用, drbd直接在磁盘级就把数据复制了,之前mysql做高可用但它的数据还是共用nfs 这里直接把数据各保存在本地备份了 1.实现主从自己切换 主节点上:umount /mnt/drbd 二个节点上停drbd:service drbd stop 二个节点上安装corosync并启动:service corosync start 在其中一个配置资源:crm configure configure#verity property stonith_enabled=false commit property no_tuorum_policy=ignore commit rsc_defaults resource_stickiness=100 commit 配置drbd资源:crm#ra ----------注:drbd有二个资源,drbd本身与文件系统挂载 ra#providers drbd----查drbd的资源代理有哪些 (heartbeat linbit是ocf)---RA ra#classes---所有的ra写法 heartbeat lsb ocf /heartbeat/linbit/pacemaker stonish ra#meta ocf:heartbeat:drbd---查源数据 第一:configure#primitive mysqldrbd ocf:heartbeat:drbd params drbd_resource:mydrbd op monitor role=master intervarl=50s timeout=30s op monitor role=slave interval=60s timeout=30s ---先定义成基本资源再定主从 #ms ms_mysqldrbd mysqldrbd meta master_max="1" master_node_max="1" clone_max="2" clone_node_max="1" notify="true" #commit 以上只定义了drbd可以自动切换但节点还不能自动挂载所以还要做个挂载资源 第二:configure#primitive mystore ocf:heartbeat:Filesystem params device=/dev/drbd0 directory=/mydata fstype=ext3 op start timeout=60 op stop timeout=60----由于资源是平均分配的但这二个资源要绑定所以不能提交 #colocation mystore_with_ms_mysqldrbd inf:mystore ms_mysqldrbd:Master #order mystore_after_ms_mysqldrbd mandatory:ms_mysqldrbd: promote mystore:start #verity #commit 配置mysql资源:#primitive mysqld lsb:mysqld #verify #colocation mysql_with_mystore inf:mysqld mystore #order mysqld_ofter_mystore mandatory:mystore mysqld #commit 配置VIP资源:#primitive myip ocf:heartbeat:Ipaddr params ip=172.16.100.1 nic=eth0 cidr_netmask=255.255.0.0 #colocation myip_with_ms_mysqldrbd inf:ms_mysqldrbd:Master myip #commit 注:LSB:是/etc/init.d/*服务脚本是 ocf:开发集群框架,有很多提供商providers Legacy HB v1 stonith (8)集群构架层的软件有:heartbeat corosync keepalived 1.红帽的RHCS中用的是cman,它的CRM层用的是rgmanager资源管理器 它的RA有二种: internal:自带 script:相当于lsb /etc/rc.d/init.d/* 2.概述: 红4以前cman是一个整组件到5后cman成为openAIS的插件,因为openAIS的法定票数管理不好, 而cman的quorum管理的好,红5中它的底层信息架构是openais上工作, 但cman的底层信息工作机制不依赖于openais openais的配置文件/etc/openais/openais.conf, 但corosync独立出来后配置是/etc/corosync/corosync.conf cman配置文件/etc/cluster/clutor.conf----- 红5底层用的是openais但cman做为它的插件做为法定票数作用, 同时它也控制openais,cman借助openais完成心跳信息传递 和成员关系管理但它保留了quorum并控制整个操作 红6:用到的底层信息通道是corosync而不是openais了, corosync自带的有quorum这时可以控制是否选择使用cman可用可不用, 如果用cman它的CRM是rgmange若不用cman它提CRM是pacemaker 集群文件系统(gfs): 功能:可以让多个节点使用同一个文件系统,ext2等是用于单节点的, 这个用于多节点,它能将一个节点的锁通知给其它节点 原理:它要借助高可用集群的基础架构来实现锁通知,基础架构层实现分布式锁管理器, 各节点使用一个文件系统为避免节点分裂以后仍出现资源抢用必须实现节点杀死, 但它依然基础架构层来实现(dlm是在各节点的进程不仅能传递锁还能当某节点坏了 将其杀死的功能) 结构如下: dlm节点1 dlm节点2 dlm节点3 共享存储,分区格式化三个节点可同时挂载 注:gfs特点:有几个节点挂载就要创建几个日志文件(日志文件挂载用日志修复时各不相同) drbd的双主模型都要写数据所以它要用集群文件系统,之前的例子是主从模型, 一个写直接同步到另一个就行(个人:几个节点的磁盘 做成一个文件系统,数据是分别分到不同节点上的,从一个节点上找数据 其它是在整个节点上都找,当一个坏了数据会转到其它 节点,每个存的都有复本) 把磁盘分区做成一个文件难扩展所以可以用逻辑卷cLVM 配置:/etc/lvm/lvm.conf locking_type锁类型 1:默认 2.共享库中的锁库 3.内键集群锁 分布式文件系统hdfs概述(hdfs适合存大文件存数据时名称节点定义以多大存一个, 按这个大小存在各节点上,所以数据是分开存的) 数据节点 从1 从2 主(名称节点放所有文件的源数据) 从3 从4 从5 3.实例解释 dirctor1 dirctor2----只用一个节点所以做成服务高可用 节点1 节点2 节点3---(web服务每个节点都用所以在dirctor上 做负载均衡,但要用SAN设备, 不同节点都写在一个SAN里,所以挂载服务要要做成高可用) mysql SNA(若为SNA设备上面四 个节点可同时使用) 4.红帽集群配置 (1)配置RHCS组件特点 1.每个集群都有唯一的集群名称,cman才能启动 2.至少有个fence设备,没有当一个坏了不能有效隔离可以用软件模拟fence设备 3.至少有三个节点,二个节点要有qdisk(表决磁盘) (2)RHCS 1.每个节点都装:cman rgmanager system-config-cluter 2.三个节点完成后要配置,配置方法如下: 方法1:CCS2配置 方法2:system_config_cluder配置 #system_config_cluder---都是在本机上操作无DC的概念 ----图形界面配置---可配置名称等与资源 3.图形界面配好后三个节点都启动cman才会同步到其它节点 service cman start 4.三个节点都启动rgmanager service rgmanager start (9)总结 1.高可用结构 RA------运行节点上哪个资源开启哪个关闭 | | | CRM----(计算资源状态应该在哪个节点上1.heartbeatV1自带的有haresources (用配置文件实现)2.heartbeatV2自带二个haresources | 与crm 3.heartbeatv3用的是V2的crm独立出来的项目pacemaker 4.rgmanager供cman使用) | | Messaging lage(1.heartbeatv1,v2 v3(v3有heartbeat、pacemakerc、cluster-glue) 2.红6默认使用corosync+额外pacemaker才能用 3.红5用的是cman有专门名称及RHCS红帽集群套件 4.keepalived它的VIP管理是基于VRP协议实现的能方便配双主-专用 于LVS高可用开发组件 5.ultramokey) | 服务器 2.调度器高可用与Mysql高可用(一个要存数据一个不用存数据,存数据要用到共享存储) (1)调度器高可用 心跳 主调度器1 ------- 备调度器2 (它们的资源是VIP与ipvs规则) | \ / | RS1 RS2 注:主坏了启动备用就可以了,没有存数据不用共享存储 (2)mysql高可用 心跳 mysql主--------mysql备 \ / 共享存储 注:不管用哪个主保存的数据在备上也能看到,但主坏了可能写数据, 备把主爆头了共享存储也可能写数据,备不知道再写把共享存储弄坏了 这时共享存储可用集群文件系统(GFS/OCFS2),有锁功能不能崩溃, 但共享存储就变为瓶镜了,所以用mysql自身可用drbd来主从同步数据 也可以用mysql主从也可以 drbd模式: mysql mysql drbd drbd---做主从 (10)高可用之keepalive 1.是HA的底层工具,早期为ipvs添加VIP在各节点做转移功能, VIP在各节点转移依赖于vrrp(虚拟路由冗余协议)--现在VIP是靠 heartbeat/corosync做成资源转移,以前靠的是vrrp协议来做的 vrrp工作原理: 能将多个物理设备虚拟成一个物理地址变为解决局域网问题? 客户端需通外网时指网关有二种: (1)动态:内网若获到一个网关地址跟外网联系,依赖的请求,vrrp客与vrrp服, vrrp客请求vrrp服响应获取网关地址,可在不同vrrp服请解决冗余 (2)动态2:基于动态路由协议:ripi协议OSPF协议这时在客户端启动路由功能, 能实现ripi/ospf协议,该协议前端网关交互能动态生成路由表,客户端也要启动很多配置 (3)静态:默认网关通过静态指定缺点,网关坏了就用不了--所以用二个网关做成高可用 vrrp协议: 将二个路由网关虚拟成一个接口向外提供,在vrrp里是一主多从的,常用一主一从, vrrp在一组物理设备上能虚拟多组虚 拟设备一个网卡上能配多个IP,vrrp就是主节点不停向从节点说自己处于活动状态 网关1 外网- }--虚拟网关<------客户端内网 网关2 2.keepalive是实现vrrp协议在linux上的服务软件它除了会移动VIP外还应该具有监控(脚本 )高可用其后节点的服务是否健康的功能健康了才能把VIP移上去, 在自己由主变为从这个状态时重启自身服务使用上线---脚本: 主变为从的同时要执行其它服务监控通知脚本 3.keepalive应用 keepalive+nginx keepalive+harproty corosync+nginx 4.基于DR模型的keepalive实现LVS的高可用,并实现后端RS的健康状态检查, 当所有节点都坏了提供一个fall_back设备显示错误信息 架构: (1)二个dirtory做高可用---可把它自身的web做成fall_back dir1:172.16.100.6 dir2:172.16.100.7 (2)二个RS RS1:arp_ignore=1 arp_announce=2 172.16.100.11 RS2:arp_ignore=1 arp_announce=2 172.16.100.12 (3)路由IP:172.16.100.1 配置: (1)二个HA上安装配置keepalive及ipvs yum -y --nogpgcheck localinstall keepalived-1.2.7-5.el5.i386.rpm yum -y install ipvsadm (2)在二个HA节点上配置keepalive vi /etc/keepalived/keepalived.conf global_defs { notification_email{---出现故障向谁发邮件通知 root@localhost---邮箱 } notication_email_from.keepalived@localhost--谁发的,本地这个用户不会验发件人 smtp_server 127.0.0.1 smtp_connect_timeout 3---连接超时时间 rounter_id LVS_DEVEL } vrrp_instance VI_1{ state MASTER(主) interface eth0---通知信息通过哪个发送及虚拟路由在哪个接口 virtual_router_id 51 priority 101----优先级,减去降低的优先级及应比从的小 advert_int 1 ----每隔多长时间发一次通告信息 authentication{ -----------认证码,每发一次通告就要发一个认证码,认证码不一样了就不接受 auth_type PASS----简单字符认证 auth_pass keepalivepass----认证码 #当发生转移时如何通知管理员? notift_master "/etc/keepalived/notify.sh -n master -a 172.16.100.1"--当前节点转成主时执行的脚本 notift_backup "/etc/keepalived/notify.sh -n backup -a 172.16.100.1"--当前节点转为备用时执行的脚本 notift_fault "/etc/keepalived/notify.sh -n fault -a 172.16.100.1"---当前节点启动不了执行的脚本 virtual_ipaddress { VIP 设备 标签 别名 172.16.100.1 dev eth0 label eth0:0 } } virtual_server 172.16.100.1 80 { delay_loop 6 lb_algo rr---算法 lb_kind DR ---什么LVS类型 nat_mask 255.255.0.0 #persistence_timeout 50--定义持久连接 protocol TCP---协议 real_server 172.16.100.11 80 {---添加一个RS1 weight 1 HTTP_GET { ----------如何进行健康状态检查,http健康检查 url { ----测试的URL path / status_code 200 ----状态码以2开头 } connect_timeout 2 ---连接超时时长 nb_get_retry 3 ---重试次数 delay_before_retry 1 ---延迟时间 } real_server 172.16.100.12 80{ } vrrp_script 名称 { script "脚本"--执行外部脚本能完成服务监测 interval # #--多长时间监测一次 weight # --若失败了让优先级降几 fall #:监测几次都失败才是失败 rise:监测几次成功一次都是成功 } 把配置文件复制给另一个节点一份172.16.100.7,其中配置修改如下 state BACKUP priority 100---优先级改小点 启动二个节点服务 service keepalived start 注:这里不用定义ipvs规则,因为keepalived配置好后会自动生成规则使用 (4)实例如下 1.当RS1坏了只能看到了RS2,当二个都坏了用fall_back,把6与7都装上http,当二个RS都坏了如何实现? 问题1:若其中6与7一个坏了,资源如何用keepalived实现转移? 6与7都装上http,提供一个错误页网/var/www/html/index.html,启动httpd 配置keepalived.conf 在protocol TCP下一行添加如下 sorry_server 127.0.0.1 80 ---这个在virtual_server的定义 重启keepalived 问题2:若调度器坏了,如何实现地址与ipvs转移,用维护模式来down vi keepalived.conf global_defs { vrrp_script chk_schedown(命名) { script "[-e /etc/keepalived/down] && exit 1 || exit 0" interval 1---多长时间执行一次script weight 5---失败了就减5 fall 2 rise 1 } #使用chk_schedown vrrp_instance_VI_1 { track_script{ chk_schedown } 重启keepalived 提供down脚本 touch /etc/keepalived/down,创建一个down后优先级就降了,VIP就转移走了 问题3: 十二.DHCP服务器---udp的67端口,不是自带的要下载安装服务端但客户端是系统自带的dhcp-client (1)概述:前身是bootp--地址不是系统的原无系统主机的IP是由bootp分配的是永久的 (IP与MAC绑定),现在系统都有自己的系统,公司局域网中由于主机的 来来回回如何分配 -----DHCP客机通过广播形式找DHCP,DHCP给我们提供IP与子网掩码 ---但由于路由器不转发广播所以DHCP不能跨物理网络实现 (2)如何实现跨物理网络 把路由器变为DHCP的中继器,2广播给路由器再单播给DHCP 部门2----路由器----部门1 (3)DHCP必须有地址,地址池中的IP必须跟DHCP在同一网段,其它网络要有另一个地址池 在一个局域网里有十台主机一个是DHCP服务器,一台ftp服务器,其它都是普通用户, 其中客的IP是随机的而ftp若是静态就用保留地址 (4)DHCP的安装配置 1.DHCP安装有二个服务 /usr/sbin/dhcpd----提供dhcp /usr/sbin/dhcrelay---中继器在路由器上配,二者不能同时使用 2.配置例子在/usr/share/doc/dhcp-3.05/dhcp.conf.comple----复制到/etc/dhcpd.conf 服务端配置 ddns_update_style interim----动态DNS更新方式[IP再变主机名不变, 所以dhcp要告诉DNS改这个关系] 定义子网(可多个) 网段 subnet 192.168.0.0 255.255.255.0{ option---给这个网段一些选项(eg:默认网关子网掩码) domain_ma---域名; domain-name-servents; DNS地址---DNS配置 } range 192.168.0.128 192.168.0.254;-----地址范围 host ns {------------------------------------保留地址 hardware ethernet 00:0c:0f:cf.... fixed_address 172.16.100.33;---不包含在地址池里 } 客户端配置 手动--#ifconfig eth0 down----释放地址 #dhclient---不能用二次先杀掉用选项-d 自动--在配置文件时改网络配置 ip addr show//查看网卡信息
十三、sqlite3数据库
  1.连数据文件:sqlite3 edget-db-data/tedge-resource.db
sql语句

 

posted @ 2021-03-26 11:33  xiong_Dana  阅读(292)  评论(0编辑  收藏  举报