06、自动挂载+超级守护进程+时间同步+tcpwrapper+软硬链接+日志管理
autofs 自动挂载服务
把下面这两条命令做成自动挂载
172.16.2.35:/share/soft /nfs/soft
172.16.2.35:/share/iso /nfs/iso
1.mkdir /nfs 2.vim /etc/auto.master /nfs /etc/auto.nfs --后面这个文件不存在,自定义的名字 3.# vim /etc/auto.nfs soft - 172.16.2.35:/share/soft iso - 172.16.2.35:/share/iso 4. /etc/init.d/autofs restart --服务只要是开启状态就可以,不用重启
--挂载的目录默认在/nfs目录下用ls命令看不到, 但可以 cd /nfs/iso 进去, 这时会帮你自动挂载大概五分钟后,没有使用的话,会自动umount掉
=============================================================
超级守护进程 xinetd
--很多程序的部分子程序会拖管在超级守护进程下(如:rsync,ftp,tftp,nagios的远程监控)
Extended Internet Services Daemon chkconfig --list |grep xinetd xinetd based services: chargen-dgram: off chargen-stream: off cvs: off daytime-dgram: off daytime-stream: off discard-dgram: off discard-stream: off echo-dgram: off echo-stream: off rsync: off tcpmux-server: off tftp: on time-dgram: on time-stream: on
守护进程分为:
stand alone --指的非xinetd下的那些服务 super daemon --指的就是xinetd下的那些服务
super daemon相当于是它下面的所有服务的管理程序,在安全性上更加了一道门,因为super daemon有很多原服务没有的控制参数
--注意:拖管后,服务原来的配置文件里的参数选项仍然有效
以rsync服务为例
vim /etc/xinetd.d/rsync
service rsync --服务名 { disable = yes --disable等于yes表示此服务关闭 socket_type = stream --tcp的连线机制 wait = no --不等待,可以同时进行大量连线功能 user = root --用root身份启动服务 server = /usr/bin/rsync --定义你的rsync的服务执行文件的位置 server_args = --daemon --服务参数,man rsync可以查到这个参数,表示rsync以守护进程的方式来运行 log_on_failure += USERID --登录错误时,额外记录你的用户id }
例子一:
实现把ssh拖管到super daemon下管理
# yum install xinetd -y --确认把这个软件包给安装上
man xinetd.conf --写法去这里找帮助
vim /etc/xinetd.d/ssh --新建一个文件,写上下面的内容,下面的文本,直接复制的话会启不来的,因为它的格式也有所要求:最好手动写,每一个参数前用tab键(制表符)隔开,等号两边也要有空格
service ssh { disable = no socket_type = stream protocol = tcp wait = no user = root server = /usr/sbin/sshd server_args = -i }
/etc/init.d/sshd stop
/etc/init.d/xinetd restart
netstat -ntlup |grep :22
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 8182/xinetd --这时候查看你的端口会发现守护进程为xinetd,不是以前的sshd
--什么样的程序才可以托管到xinetd
--一般来说,有类似/usr/sbin/sshd的服务启动进程,都可以拖管,但需要对其支持才行
例子二:
在上面例子的基础上再加上访问控制
service ssh { disable = no socket_type = stream protocol = tcp wait = no user = root server = /usr/sbin/sshd server_args = -i only_from = 10.1.1.0/24 --允许10.1.1.0/24网段访问 no_access = 10.1.1.104 --拒绝10.1.1.104访问 }
[root@a ~]# ssh 10.1.1.35
ssh_exchange_identification: Connection closed by remote host --被拒绝后报错如上
例三:定义只能上午10点到下午2点之间才能被ssh,服务器总共只允许2个ssh连接,每个IP只能最多有1个ssh连接,并将日志记录到/var/log/xinetd_ssh.log
man xinetd.conf 查找access_times log_type instances per_source
service ssh { disable = no socket_type = stream protocol = tcp wait = no user = root server = /usr/sbin/sshd server_args = -i only_from = 2.2.2.0/24 no_access = 2.2.2.35 access_times = 10:00-14:00 instances = 2 per_source = 1 log_type = file /var/log/xinetd_ssh.log }
/etc/init.d/xinetd restart
例四:定义连接你的连接,都被重定向连接到2.2.2.156的22端口
service ssh { disable = no socket_type = stream protocol = tcp wait = no user = root server = /usr/sbin/sshd server_args = -i only_from = 2.2.2.0/24 no_access = 2.2.2.35 access_times = 10:00-14:00 instances = 2 per_source = 1 log_type = file /var/log/xinetd_ssh.log redirect = 2.2.2.156 22 }
/etc/init.d/xinetd restart
例五: 把端口换成2222
man xinetd.conf 查找 port
vim /etc/services --把ssh对应的22端口改成2222
service ssh { disable = no socket_type = stream protocol = tcp port = 2222 wait = no user = root server = /usr/sbin/sshd server_args = -i only_from = 2.2.2.0/24 no_access = 2.2.2.35 access_times = 10:00-14:00 instances = 2 per_source = 1 log_type = file /var/log/xinetd_ssh.log # redirect = 2.2.2.156 22 }
/etc/init.d/xinetd restart
# netstat -ntlup |grep 2222
tcp 0 0 0.0.0.0:2222 0.0.0.0:* LISTEN 3993/xinetd
时间同步:(用于用到时间的公网服务,集群,VPN等各方面)
ntp (network time protocol)
0.rhel.pool.ntp.org
1.rhel.pool.ntp.org
2.rhel.pool.ntp.org
# ntpdate 1.rhel.pool.ntp.org
# vim /etc/ntp.conf
两种简单的内网时间服务器的配法:
第一种:
8 restrict 127.0.0.1 kod nomodify notrap nopeer noquery 14 #restrict 127.0.0.1
--restrict是表示限制一个网段或一个IP,默认的14行对本地回环没有做任何限制;
--默认的8行对default(指所有人)限制了nomodify notrap nopeer noquery;如果对所有人限制noquery,则表示所有人都无法在这个服务器同步时间
第二种
18 restrict 172.16.2.0 mask 255.255.255.0 nomodify notrap
--在原来的基础(原配置文件,不是改过第一种方法之后的配置文件)上,再加一个网段的限制,对172.16.2.0网段限制nomodify notrap,但是可以query,那就表示这个网段的客户端可以对这个服务器同步时间
# /etc/init.d/ntpd restart
# ntpdate 172.16.2.35 --自己同步自己不可以,只能是没有开启ntp的客户端同步开启ntp的服务器 16 Nov 14:24:16 ntpdate[13933]: the NTP socket is in use, exiting
# ntpdate 172.16.2.35 --用其它客户端来同步服务器,大概需要等待5分钟左右才可以同步 22 Sep 11:31:48 ntpdate[2527]: no server suitable for synchronization found
例六:
介绍一个super daemon下的一个时间同步的方法
[root@li test]# vim /etc/xinetd.d/time-dgram disable = no [root@li test]# vim /etc/xinetd.d/time-stream disable = no /etc/init.d/xinetd restart
--重启后,查看tcp和udp的37端口都会开放
客户端使用 rdate -s 172.16.2.35 来同步时间
--总结:时间同步,是大型项目里一个基本的环节;如果现在多台服务器需要时间是标准时间,那么你可以有两种做法:
第一种:把一台能上外网的机器配成公网时间服务器的下一层(这个配法有兴趣可以去查资料),然后所有其他的内网服务器使用ntpdate来同步这一台就可以了
第二种:把一台能上外网的机器写一个脚本用ntpdate定时去同步公网时间服务器,然后把它配置37端口的时间服务器,其它内网服务器用rdate -s定时同步它就可以了
==============================
tcpwrapper --看成tcp的壳程序
# rpm -qi tcp_wrappers-7.6-40.7.el5
Summary : A security tool which acts as a wrapper for TCP daemons. Description : The tcp_wrappers package provides small daemon programs which can monitor and filter incoming requests for systat, finger, FTP, telnet, rlogin, rsh, exec, tftp, talk and other network services. Install the tcp_wrappers program if you need a security tool for filtering incoming network services requests. This version also supports IPv6. /etc/hosts.allow /etc/hosts.deny
man /etc/hosts.allow 或 man /etc/hosts.deny
看程序是否支持tcpwrapper方式
比如说看sshd
[root@li test]# which sshd /usr/sbin/sshd [root@li test]# ldd /usr/sbin/sshd |grep wrap libwrap.so.0 => /lib/libwrap.so.0 (0x00d39000) --有此模块就表示支持 # rpm -qf /lib/libwrap.so.0 tcp_wrappers-7.6-40.7.el5 --不是所有的服务都支持,很多软件编译时会有./configure --enable-libwrap来支持tcpwrapper 由两个文件来控制 /etc/hosts.allow /etc/hosts.deny 访问控制机制为先去匹配/etc/hosts.allow,再去匹配/etc/hosts.deny,如果都没有,则都允许 vim /etc/hosts.deny sshd: all --拒绝所有 sshd: all EXCEPT 10.1.1.104 --只允许104ssh上来 sshd: all EXCEPT 10.1.1.104 10.1.1.105 sshd: 10.1.1.0/255.255.255.0 EXCEPT 10.1.1.104 --拒绝10.1.1.0网段的人ssh访问,除了104外;注意子网掩码不支持/24写法 sshd:all:spawn echo "`date`" %c %d >> /var/log/tcpwrapperdeny.log --拒绝所有人登录,并把拒绝的时间和IP等信息保存到日志文件 sshd:all:spawn wall %c "login denied" --拒绝所有人登录,只要一登录被拒绝,就发送广播信息 sshd:all EXCEPT 10.1.1.35: spawn wall %c "login denied"
--man hosts.deny查看帮助
==============================================================
硬链接和软链接(符号链接)
inode:每当创建一个文件或目录的时候,都会为这个文件创建一个inode编号,这些信息都是存放在inode表里
[root@li ~]# ll -i /etc/grub.conf 427497 lrwxrwxrwx 1 root root 22 Feb 27 08:43 /etc/grub.conf -> ../boot/grub/grub.conf [root@li ~]# ll -i /boot/grub/grub.conf 16083 -rw------- 1 root root 635 Mar 11 10:42 /boot/grub/grub.conf
--物理上并不是同一个位置,软链接(或者叫符号链接,symbolic link)
软链接: 类似windows上的快捷方式
例子: 使用vi,达到使用vim的效果; 除了做别名外,还可以做链接
[root@li ~]# which vi /bin/vi [root@li ~]# which vim /usr/bin/vim [root@li ~]# mv /bin/vi /bin/vi.bak [root@li ~]# ln -s /usr/bin/vim /bin/vi --不要写反了 [root@li ~]# ll /bin/vi lrwxrwxrwx 1 root root 12 Mar 11 14:07 /bin/vi -> /usr/bin/vim
前 后
[root@li ~]# rm /bin/vi -rf --删除是删除前面的那个,不是删除后面的;如果删除后面的会造成死链接
[root@li ~]# mv /bin/vi.bak /bin/vi
======================================================
目录做软链接:
[root@li test]# mkdir aaa [root@li test]# ln -s aaa bbb [root@li test]# ll bbb -d lrwxrwxrwx 1 root root 3 Apr 21 14:02 bbb -> aaa --目录可以手动做软链接
====================================================
[root@li ~]# touch 123 [root@li ~]# ln -s 123 /boot/456 [root@li ~]# ll /boot/456 lrwxrwxrwx 1 root root 3 Apr 21 13:48 /boot/456 -> 123 --跨分区的死链接 [root@li ~]# rm /boot/456 -rf [root@li ~]# ln -s /root/123 /boot/456 [root@li ~]# ll /boot/456 lrwxrwxrwx 1 root root 9 Apr 21 13:49 /boot/456 -> /root/123 --链接时应该写绝对路径
===================================
[root@li ~]# ldd /bin/ls linux-gate.so.1 => (0x00e5e000) librt.so.1 => /lib/librt.so.1 (0x00792000) libacl.so.1 => /lib/libacl.so.1 (0x00ae4000) libselinux.so.1 => /lib/libselinux.so.1 (0x00a0a000) libc.so.6 => /lib/libc.so.6 (0x004c9000) libpthread.so.0 => /lib/libpthread.so.0 (0x00640000) /lib/ld-linux.so.2 (0x004ab000) libattr.so.1 => /lib/libattr.so.1 (0x00d78000) libdl.so.2 => /lib/libdl.so.2 (0x0063a000) libsepol.so.1 => /lib/libsepol.so.1 (0x00a24000)
特点:
1.它会创建一个新的inode编号,相当是一个独立的文件
2.它类似于windows下的快捷方式,访问的时候多了一个中转的过程,最终访问的内容就是它链接的目标文件
3.它可以跨分区创建
4.它可以对目录进行链接
===============================================================
硬链接: inode相同,物理上指的是同一个位置
[root@li test]# touch 1
[root@li test]# ln 1 2 --不加-s参数就表示是硬链接
[root@li test]# ll -i
total 4
327367 -rw-r--r-- 2 root root 0 Apr 18 09:56 1
327367 -rw-r--r-- 2 root root 0 Apr 18 09:56 2
[root@li test]# ln 3 /boot/4 ln: creating hard link `/boot/4' to `3': Invalid cross-device link [root@li test]# mkdir aaa [root@li test]# ln aaa bbb ln: `aaa': hard link not allowed for directory --不能手动对目录进行硬链接,但是系统还是有一些目录的硬链接。如下面的三对: [root@li test]# ll -di /var/mail/ 196459 drwxrwxr-x 2 root mail 4096 Jul 5 10:45 /var/mail/ [root@li test]# ll -di /var/spool/mail/ 196459 drwxrwxr-x 2 root mail 4096 Jul 5 10:45 /var/spool/mail/ [root@li test]# ll -di /etc/httpd/logs/ 261891 drwx------ 2 root root 4096 Jul 3 10:54 /etc/httpd/logs/ [root@li test]# ll -di /var/log/httpd/ 261891 drwx------ 2 root root 4096 Jul 3 10:54 /var/log/httpd/ [root@li test]# ll -di /etc/init.d/ 10672002 drwxr-xr-x 2 root root 4096 Jul 5 11:25 /etc/init.d/ [root@li test]# ll -di /etc/rc.d/init.d/ 10672002 drwxr-xr-x 2 root root 4096 Jul 5 11:25 /etc/rc.d/init.d/
特点:
1,它不会新创建一个inode编号,不代表一个独立的文件,物理上指向同一个文件
2,它不能跨分区创建
3,它相当于是为文件创建了一个冗余
4,不能手工对目录进行硬链接
================================
linux的日志管理
/var/log/ --此目录下很多系统日志都存放在此 /var/log/messages --非常重要的日志文件,几乎所有系统发生的重要错误都会记录在此 /var/log/secure --ssh ftp telnet pop3 pam等有关 /var/log/dmesg --开机时核心检测过程中所产生的信息 /var/log/cron --查看时间任务有关的日志 /var/log/wtmp --用last查看,不能直接cat /var/log/btmp --用lastb查看,不能直接cat /var/log/lastlog --用lastlog查看 /var/log/boot.log --dns指向的更新会记录在这 /var/log/rpmpkgs --rpm相关 /var/log/maillog --mail相关 /var/log/spooler --news,uucp /var/log/acpid --高级电源管理 /var/log/yum.log --yum程序相关的日志
还有一种日志就是每个服务所保存的日志,路径因服务会有所不同
一般是在/var/log/服务名/下
/etc/init.d/syslog --系统log服务,打开它才能记录系统日志
yum list |grep log
sysklogd.i386 --相关软件包
logrotate.i386
# description: Syslog is the facility by which many daemons use to log messages to various system log files. It is a good idea to always run syslog.
# rpm -qa |grep log --rhel6里的包
rsyslog-5.8.10-2.el6.x86_64
logrotate-3.7.8-15.el6.x86_64
设备:(facility)
auth -- pam产生的日志 authpriv --包括权限,登录相关的信息 cron --时间任务相关的信息,crontab,at mail --邮件相关的信息 kern --内核产生的信息 uucp --unix to unxi copy 指的是unix系统之间拷贝协议相关的信息 news --新闻组相关的信息 local0 到 local7 --程序自定义的日志设备 mark --syslog服务内部的一些信息,产生一个时间标识 user --用户程序产生的相关信息
日志级别:(log level)
debug --调试,产生的日志是最多的一个级别 info --一般信息的日志,最常用 notice --最具有重要性的普通条件的信息 warning或warn --警告级别 err或error --错误级别,阻止某个功能或者模块不能正常工作的信息 crit --严重级别,阻止整个系统或者整个软件不能正常工作的信息 alert --需要马上修改的信息 emerg或panic --内核崩溃等严重错误 none --什么都不记录
--上面的日志级别,从上往下级别从低到高,记录的信息是多到少,级别低的记录的信息包括级别高的
连接符号
. 记录大于等于此等级 .= 只记录等于此等级的信息 .! 不等于此等级,也就是记录此等级之外的信息
# vim /etc/syslog.conf --在rhel6里是vim /etc/rsyslog.conf
# Log all kernel messages to the console. # Logging much else clutters up the screen. #kern.* /dev/console --/dev/console指的是一种外接的终端设备,有些封闭主机(没有screen,keyboard,mouse等),可能会需要外接设备连接 # Log anything (except mail) of level info or higher. # Don't log private authentication messages! *.info;mail.none;authpriv.none;cron.none /var/log/messages --记录所有日志类型的info级别的信息到/var/log/messages,除了mail,authpriv,cron的信息 # The authpriv file has restricted access. authpriv.* /var/log/secure --记录authpriv的所有级别的信息到/var/log/secure # Log all the mail messages in one place. mail.* /var/log/maillog --记录邮件的所有级别的信息到/var/log/maillog,关于减号-的意思为:因为邮件的信息相比于其他的来说是比较大的,所以是采用异步的方式,先存放在内存里,然后按一定的事件触发,或者到达一定的大小写到磁盘,而不是象其他的日志那样,产生了就马上写到磁盘。 # Log cron stuff cron.* /var/log/cron --记录时间任务所有级别的信息到/var/log/cron # Everybody gets emergency messages *.emerg * --记录所有日志设备的emerg信息以wall的方式发送给每个登录到系统的人知道 # Save news errors of level crit and higher in a special file. uucp,news.crit /var/log/spooler --记录uucp,new的crit信息到/var/log/spooler # Save boot messages also to boot.log local7.* /var/log/boot.log
例1:
只记录mail的info级别信息到/var/log/newmaillog
mail.=info /var/log/newmaillog
例2:
记录时间任务的info级别以上的所有信息(除了err外)到/var/log/newcron
cron.info;cron.!err /var/log/newcron
例3:
把ssh的日志单独记录到/var/log/ssh
提示 local0-local7是自定义的日志设备,可以使用其中一种
# vim /etc/ssh/sshd_config SyslogFacility local5 --修改成local5,把ssh的日志定义由local5来记录 # /etc/init.d/sshd restart --重启使之生效 # vim /etc/rsyslog.conf local5.* /var/log/ssh --加这么一句 # /etc/init.d/syslog restart --重启后/var/log/ssh文件被自动创建 验证发现所有的ssh登录有关的信息被记录到了/var/log/ssh
====================================
远程系统日志管理
管理多台主机,有时为了方便,可以把多台主机的日志给传到管理机(只一台)上,然后,系统管理员只要在管理机上查看,就可以查到多台主机的日志
例4:
把71的ssh登录信息记录到35的/var/log/remotessh.log日志文件里
真实机做日志服务端(管理端) 虚拟机做日志客户端
10.1.1.35 10.1.1.71
在35先做
vim /etc/sysconfig/syslog
SYSLOGD_OPTIONS="-m 0 -r" --加-r参数 /etc/init.d/syslog restart --重启服务 [root@li ~]# netstat -ntlup |grep sys --加了-r参数后打开了远程日志功能,那么就会多了一个监听端口,为udp的514端口 udp 0 0 0.0.0.0:514 0.0.0.0:* 4252/syslogd
在71上做:
vim /etc/ssh/sshd_config
SyslogFacility local5
/etc/init.d/sshd restart
vim /etc/syslog.conf
local5.* @10.1.1.35
/etc/init.d/syslog restart
再回到35上做
vim /etc/syslog.conf
local5.* /var/log/remotessh.log
/etc/init.d/syslog restart
rhel6的做法
先在服务器35上 # vim /etc/rsyslog.conf --把下面两行打开,表示监听tcp的514端口,供远程日志连接的 $ModLoad imtcp $InputTCPServerRun 514 # /etc/init.d/rsyslog restart 在客户端71上做 vim /etc/ssh/sshd_config SyslogFacility local5 /etc/init.d/sshd restart vim /etc/rsyslog.conf local5.* @@10.1.1.35:514 --rhel6客户端的写法不同了 /etc/init.d/syslog restart 再回到35上做 vim /etc/rsyslog.conf local5.* /var/log/remotessh.log /etc/init.d/rsyslog restart
============================================================
--把所有的日志都放到同一台机器,可以方便使用grep,awk,sed等方便对其进行截取统计
如:在35上统计4月27号10.1.1.71这台机器允许ssh的次数
[root@dns /]# cat /var/log/ssh.log |grep "Apr 27" |grep 71 |grep Acc |wc -l
[root@li ~]# echo "7月11号34被ssh过`cat /var/log/ssh |grep 2.2.2.34 |grep "Jul 11" |wc -l`次"
7月11号34被ssh过5次 --haproxy的本机日志也是使用远程日志的原理
============================================================
附一个脚本,通过read输入一个目录,就能显示出这个目录下(归递)所有的死链接
如果可以的话用两种方法:一个是用fuction () ,另一种不用fuction ()
第一种:
#!/bin/bash read -p "please input the directory:" dir find $dir -type l | while read file do if [ ! -e $file ] then echo "$file is dead link file"; fi done
第二种:
#!/bin/bash read -p "输入一个你要查找死链接的目录:" dir if [ ! -d $dir ];then echo "你输入的不是目录或不存在,重试!" exit 1 fi check_dead_link () { for i in $1/* do [ -h $i -a ! -e $i ] && echo "$i是死链接" [ -d $i ] && check_dead_link $i done } check_dead_link $dir