#脚本名称:systemyh.sh 

#本脚本中需要配合一个文档来关闭不必要的服务,文档内容为不必要的服务名称

#请斟酌使用本例中的stopservices.txt文档

#脚本内容如下:

#!/bin/bash

#关闭SELinux防火墙
cp /etc/sysconfig/selinux /etc/sysconfig/selinux-`date +"%Y%m%d"`
sed -i 's/SELINUX\=enforcing/SELINUX=disabled/' /etc/sysconfig/selinux
setenforce 0

#关闭iptables
chkconfig iptables off
service iptables stop

#关闭系统写入文件最后读取时间
cp /etc/fstab /etc/fstab-`date +"%Y%m%d"`
sed -i 's/ext3    defaults/ext3    defaults,noatime/' /etc/fstab

#关闭不必要的服务
for sv in `cat stopservices.txt`
do
    chkconfig $sv off
    service $sv stop
done

#注释掉ssh登陆时的GSS认证
cp /etc/ssh/sshd_config /etc/ssh/sshd_config-`date +"%Y%m%d"`
sed -i 's/^GSS/\#GSS/g' /etc/ssh/sshd_config
sed -i 's/\#UseDNS yes/UseDNS no/' /etc/ssh/sshd_config




# 增加文件描述符限制
mkdir /var/bak 2>/dev/null
limitfile=/etc/security/limits.conf
cp /etc/security/limits.conf /var/bak/limits.conf-`date +"%Y%m%d"`
cp /etc/rc.local /var/bak/rc.local-`date +"%Y%m%d"`

sed -i '/^#/d' $limitfile
copylimit(){
cat >> /etc/security/limits.conf << EOF
*           soft   nofile       65535
*           hard   nofile       65535
EOF
}
if [ `cat $limitfile | wc -l` -gt 0 ]
then
    linec=`egrep '^*\shard|^*\ssoft' $limitfile | wc -l`
    if [ $linec -eq 2 ]
    then
        sed -i 's/[0-9]\+/65535/g' $limitfile
    else
            sed -i '/^[\*\ssoft\w+]/d' $limitfile
            sed -i '/^[\*\shard\w+]/d' $limitfile
        copylimit    
    fi
else
    copylimit
fi

if [ `cat /etc/rc.local | grep ulimit | wc -l` -gt 0 ]
then
    sed -i '/ulimit/d' /etc/rc.local
else
    echo 'ulimit -SHn 65535' >> /etc/rc.local
fi

# 优化内核参数
cp /etc/sysctl.conf /etc/sysctl.conf-`date +"%Y%m%d"`
cat >> /etc/sysctl.sh << EOF
#!/bin/sh
modprobe ip_conntrack
sysctl -w net.ipv4.icmp_echo_ignore_all=0   #关闭ICMP回显信息
sysctl -w net.ipv4.tcp_syncookies=1         #应对syn***的参数,扩展说明见下文①
sysctl -w net.ipv4.tcp_synack_retries=1     #作用同上,减少syn重试次数
sysctl -w net.ipv4.tcp_ecn=0                #关闭TCP拥塞通告
sysctl -w net.ipv4.tcp_tw_reuse=1           #表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接
sysctl -w net.ipv4.tcp_tw_recycle=1         #表示开启TCP连接中TIME-WAIT sockets的快速回收
sysctl -w net.ipv4.tcp_max_tw_buckets=655360    #表示系统同时保持TIME_WAIT套接字的最大数量
sysctl -w net.ipv4.tcp_keepalive_time=30        #表示当keepalive启用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为30秒
sysctl -w net.ipv4.tcp_keepalive_intvl=15       #keepalive探测包的发送间隔
sysctl -w net.ipv4.tcp_keepalive_probes=3       #如果对方不予应答,探测包的发送次数
sysctl -w net.ipv4.tcp_fin_timeout=10           #表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间
sysctl -w net.ipv4.tcp_mem="1966080       2621440  41943040"    #扩展说明见下文②
sysctl -w net.ipv4.tcp_rmem="4096        87380   8388608"       #与 tcp_wmem 类似,不过它表示的是为自动调优所使用的接收缓冲区的值
sysctl -w net.ipv4.tcp_wmem="4096        87380   8388608"       #扩展说明见下文③
sysctl -w net.ipv4.tcp_max_syn_backlog=8192        #表示SYN队列长度,默认1024,改成8192,可以容纳更多等待连接的网络连接数
sysctl -w net.ipv4.ip_local_port_range="5000    65000"  #表示用于向外连接的端口范围。缺省很小:32768到61000,改为5000到65000
sysctl -w net.ipv4.route.gc_timeout=100            #路由缓存刷新频率,当一个路由失败后多长时间跳到另一个路由,默认是300。
sysctl -w net.core.rmem_default=65536              #指定了接收套接字缓冲区大小的缺省值(以字节为单位)。
sysctl -w net.core.wmem_default=65536              #定义默认的发送窗口大小;对于更大的 BDP 来说,这个大小也应该更大。
sysctl -w net.core.wmem_max=8388608                #定义发送窗口的最大大小;对于更大的 BDP 来说,这个大小也应该更大
sysctl -w net.core.rmem_max=8388608                #指定了接收套接字缓冲区大小的最大值(以字节为单位)
echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects        #关闭ICMP重定向
echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route     #是否接受含有源路由信息的ip包。安全性角度出发,建议你关闭该功能。
sysctl -w fs.file-max=6553500                                #系统可以打开的最大文件数
#以下参数是对iptables防火墙的优化,防火墙不开会有提示,可以忽略不理
#注意:在CentOS6.4以上的版本中,ip_conntrack被换为了nf_conntrack
sysctl -w net.ipv4.netfilter.ip_conntrack_max=200000        #设置系统对最大跟踪的TCP连接数的限制
sysctl -w net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait=30
sysctl -w net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait=30
sysctl -w net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait=30
sysctl -w net.ipv4.netfilter.ip_conntrack_tcp_established=200
EOF
chmod u+x /etc/sysctl.sh
/bin/sh /etc/sysctl.sh
if [ `cat /etc/rc.local | grep sysctl.sh| wc -l` -ge 0 ]
then
    sed -i '/sysctl.sh/d' /etc/rc.local
fi
echo 'bin/sh /etc/sysctl.sh' >> /etc/rc.local


#附件为自己写的stopservices.txt文件,并将该文件放到与脚本同一目录下即可