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