1 安装Linux系统相关经验
1.1 RAID配置
1.1.1 系统盘
raid 1
1.1.2 数据盘
raid5 raid1 raid10
1.2 分区经验
1.2.1 系统分区和数据分区隔离
便于管理,便于修复
1.2.2 LVM是否需要
作用不大,不好对数据进行修复,性能读取低
1.2.3 多分区原则
/boot / /var /usr /data
系统默认安装到/usr/local中?
1.3 swap使用建议
内存使用swap方式:
默认内存使用超过40%会使用swap,需要调整这个值
会适当的分一个swap,4G
1.4 软件安装建议
精简安装
base
开发工具
2 安装 Linux 系统后调优及安全设置
2.1 关闭 SELinux 功能
SELinux(Security-Enhanced Linux)是美国国家安全局(NSA)对于强制访问控制的实现,这个功能让系统管理员又爱又恨,这里我们还是把它给关闭了吧。
2.1.1 修改配置文件,永久生效
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
修改配置文件可使配置永久生效,但必须要重启系统,此步是 sed 快速修改方法,也可以通过 vi
编辑修改此文件。
grep SELINUX=disabled /etc/selinux/config
SELINUX=disabled #<== 检查替换结果为 disabled 就表示编辑成功了
2.1.2 临时关闭SELinux
setenforce 0
usage: setenforce [ Enforcing | Permissive | 1 | 0 ]
数字 0 表示 Permissive,即给出警告提示,但不会阻止操作,相当于 disabled。
数字 1 表示 Enforcing,即表示 SELinux 为开启状态。
setenforce 0 <== 临时将 SELinux 调成 Permissive 状态。
getenforce <== 查看 SELinux 当前状态
Permissive
命令说明如下。
‰ ‰ setenforce:用于命令行管理 SELinux 的级别,后面的数字表示设置对应的级别。
‰ ‰ getenforce:查看 SELinux 当前的级别状态。
提示: 修改配置 SELinux 后,要想使其生效,必须要重启系统。因此,可配合使用 setenforce 0 这个临时使其关闭的命令,这样在重启前后都可以使SELinux 关闭生效,也就是说无须立刻重启服务器了,在生产场景下 Linux
机器是不能随意重启的
2.2 设定运行级别为 3(文本模式)
设定运行级别(runlevel)为 3,即表示使用文本命令行模式管理 Linux
grep 3:initdefault /etc/inittab
id:3:initdefault: <== 这里的 3 就是 Linux 默认的运行级别,如果有需求可以将其
修改为其他级别。工作中常用 3 级别,即文本模式。
[root@www ~]# runlevel <== 查看当前系统运行级别
N 3
2.3 精简开机系统自启动
重要的开机自启动服务
新装Linux系统有必要保留的5个开机自启动服务
1.sshd :远程连接 Linux 服务器时需要用到这个服务程序,所以必须要开启,否则Linux 服务器就无法提供远程连接服务了
2.rsyslog :日志相关软件,这是操作系统提供的一种机制,系统的守护程序通常会使用 rsyslog 程序将各种信息写到各个系统日志文件中,在 CentOS 6 以前此服务的名字为 syslog
3.network:系统启动时,若想激活 / 关闭各个网络接口,则应(必须)考虑开启此服务。
4.crond :该服务用于周期性地执行系统及用户配置的任务计划。有要周期性执行的任务时,就要开启,此服务几乎是生产场景必须要用的一个软件
5.sysstat :sysstat 是一个软件包,包含监测系统性能及效率的一组工具,这些工具对于我们收集系统性能数据很有帮助,比如 CPU 使用率、硬盘和网络吞吐数据等,对这些数据的收集和分析,有利于判断系统运行是否正常,所以它是提高系统运行效率、安全运行服务器的得力助手。
6.脚本代码
initService(){
echo "Close Nouseful Service"
export LANG="en_US.UTF-8"
for i in `chkconfig --list | grep 3:on | awk '{print $1}'`;do chkconfig --level 3 $i off ; done
for i in cron syslog sshd network sysstat;do chkconfig --level 3 $i on ; done
export LANG="zh_CN.UTF-8"
echo "Close Nouserful service ->OK"
sleep 1
}
待定项:
rsyslog 默认系统自带,系统里面产生的各种日志
auditd 是Linux审计系统中用户空间的一个组件,作用是监控文件和目录的更改
blk-availability 块设备的可用性
ip6tables IP6,看情况
kdump 是一个内核崩溃转储机制,在系统崩溃的时候,Kdump将捕获系统信息,这对于崩溃的原因非常有帮助
lvm2-monitor 使用LVM下开启
mdmonitor RAID相关设备的守护程序,磁盘错误事件会触发 mdmonitord 守护进程对 RAID–1(镜像)卷、RAID–5 卷和热备件执行检查
messagebus 信息总线
netfs 挂载网络文件系统
postfix 邮件系统
udev-post udevd是根据一定的规则在/dev/目录下生成设备文件。是帮助实现即插即用的一个重要环节
2.4 防火墙iptables
2.4.1 关闭iptables
在企业环境中,一般只有配置外网 IP 的 Linux 服务器才需要开启防火墙,但即使有外网 IP,高并发、高流量的业务服务器仍然不能开启防火墙,因为开启后会有较大性能损失,导致网站访问速度很慢,这种情况下只能在前端加更好的硬件防火墙了
[root@www ~]# /etc/init.d/iptables stop
2.4.2 推荐iptables配置
iptables -P INPUT ACCEPT
iptables -F
iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
iptables -A INPUT -s 1.1.1.1-p tcp -m tcp --dport 22 -j ACCEPT
iptables -A INPUT -s 2.2.2.2-p tcp -m tcp --dport 22 -j ACCEPT
iptables -A INPUT -i eth1-j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
iptables -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN FIN,SYN -j DROP
iptables -A INPUT -p tcp -m tcp --tcp-flags SYN,RST SYN,RST -j DROP
iptables -A INPUT -p tcp -m tcp --tcp-flags FIN,RST FIN,RST -j DROP
iptables -A INPUT -p tcp -m tcp --tcp-flags FIN,ACK FIN -j DROP
iptables -A INPUT -p tcp -m tcp --tcp-flags PSH,ACK PSH -j DROP
iptables -A INPUT -p tcp -m tcp --tcp-flags ACK,URG URG -j DROP
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
2.5 更改 SSH 服务器端远程登录的配置
initSsh(){
cat > $ADJUST_CONF/sshd_config << EOF
PORT $SSH_PORT
Protocol 2
Compression yes
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
PermitRootLogin yes
UseDns no
SyslogFacility AUTHPRIV
PasswordAuthentication yes
ChallengeResponseAuthentication no
GSSAPIAuthentication no
GSSAPICleanupCredentials yes
UsePAM yes
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS
X11Forwarding no
Subsystem sftp /usr/libexec/openssh/sftp-server
EOF
cmp $ADJUST_CONF/sshd_config /etc/ssh/sshd_config
if [ $? -ne 0 ];then
\cp /etc/ssh/sshd_config $BACK_CONF/sshd_config.`date +%F`
cat $ADJUST_CONF/sshd_config > /etc/ssh/sshd_config
egrep "UseDns|52113|PermitRootLogin|PeermitEmpPasswords" /etc/ssh/sshd_config
/etc/init.d/sshd reload && action "11 ssh已配置完成!" /bin/true || action "11 ssh已配置完成!" /bin/false
else
action "11 ssh已配置完成!" /bin/true
fi
sleep 1
}
sshd_conf ig 修改的相关参数说明
Port:指定 sshd 守护进程监听的端口号,默认为 22。默认在本机的所有网络接口上监听,也可以通过 ListenAddress指定只在某个特定的接口上监听。端口范围:0 ~ 65535,不能与已有的服务器端口冲突。一般建议改为比 1024 大的端口
PermitEmptyPasswords: 是否允许密码为空的用户远程登录。默认为“no”
PermitRootLogin:是否允许 root 登录。可用值如下: “yes” (默认)表示允许; “no”表示禁止;
“without-password”表示禁止使用密码认证登录;
“forced-commands-only”表示只有在指定了 command 选项的情况下才允许使用公钥认证登录,同时其他认证方法全部被禁止,这个值常用于做远程备份之类的事情
UseDNS:指定 sshd 是否应该对远程主机名进行反向解析,以检查此主机名是否与其IP 地址真实对应。默认值为“yes” 。建议改成“no” ,否则可能会导致 SSH 连接很慢
GSSAPIAuthentication no :解决 Linux 之间使用 SSH 远程连接慢的问题
2.6 主机域名设置
ip=192.168.1.117
hostNameTmp=bicserver.qhfax.com
initHostName(){
\cp /etc/hosts $BACK_CONF/hosts.$(date +%F)
echo "$ip $hostNameTmp" >> /etc/hosts
#使hostname生效
hostname $hostNameTmp
#sed –i s/HOSTNAME=.*/HOSTNAME=$hostNameTmp/ /etc/sysconfig/network
echo " HOSTNAME=$hostNameTmp " > /etc/sysconfig/network
}
initHostNam
2.7 时区的设置
设置为亚洲上海
initZone(){
if [ 'ZONE="Asia/Shanghai' == `cat /etc/sysconfig/clock` ];then
cp -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
echo 'ZONE="Asia/Shanghai"' > /etc/sysconfig/clock
fi
action "04 时区已设置成功!" /bin/true
}
2.8 时间同步
第一种:ntpdate
syncSystemTime(){
if [ `grep 0.0.0.123 /var/spool/cron/root | grep -v grep | wc -l ` -lt 1 ];then
echo "*/5 * * * * root /usr/sbin/ntpdate 10.0.0.123 > /dev/null 2>&1 " >> /var/spool/cron/root
fi
action "05 同步系统时间成功!" /bin/true
}
第二种:
rdate -s IP
第三种:配置自己的ntp server 。
yum install ntp
配置时间源
vi /etc/ntp.conf
server 210.72.145.44
server ntp.api.bz
server 2.centos.pool.ntp.org
配置对客户端(172.16.5.0/24的网段机器)提供NTP服务
vi /etc/ntp.conf
restrict 172.16.5.0 mask 255.255.255.0 nomodify notrap #去掉“#”
- 推荐命令
/usr/sbin/ntpdate ntp.sjtu.edu.cn>> /var/log/ntp.log 2>&1; /sbin/hwclock –w
2.9 禁止ctrl+alt+del三键重启系统
init_safe(){
cp /etc/init/control-alt-delete.conf $BACK_CONF/control-alt-delete.conf.`date +F`
sed -i 's#exec /sbin/shutdown -r now "Control-Alt-Delete pressed"#\#exec /sbin/shutdown -r now "Control-Alt-Delete pressed"#g' /etc/init/control-alt-delete.conf
action "12 禁止ctrl+alt+del三键重启系统" /bin/true
}
2.10 历史记录数及登录超时环境变量设置
2.10.1 设置闲置账号超时时间
[root@www ~]# export TMOUT=10 < - -临时生效
[root@www ~]#
timed out waiting for input: auto-logout # ç‰ 10 秒提示超时
[root@www ~]# echo 'export TMOUT=300' >>/etc/profile < - -永久生效
2.10.2 设置 Linux 的命令行历史记录数
[root@www ~]# export HISTSIZE=5 <-- 临时生效
[root@www ~]# echo 'export HISTSIZE=5' >>/etc/profile < - -永久生效
[root@www ~]# echo 'export HISTFILESIZE=5' >>/etc/profile
HISTSIZE=5:命令行的历史记录数量变量。
HISTFILESIZE=10:历史记录文件的命令数量变量(~/.bash_history) 。
[root@www ~]# source /etc/profile # 《–‰ 使得配置文件生效
2.11 定时清理邮件服务临时目录垃圾文件
CentOS 5 系列的系统会默认安装 Sendmail 服务,因此邮件临时存放路径为 /var/spool/clientmqueue/。CentOS 6 默认情况下没有安装 Sendmail 服务,而是改装了 Postf ix 服务,因此邮件临时存放地点的路径为 /var/spool/postf ix/maildrop/。以上两个目录很容易被垃圾文件填满,导致系统的 inode 数量不够用,从而无法存放文件。
[root@oldboy ~]# find /var/spool/clientmqueue/ -type f|xargs rm -f
‰ ‰ ‰ ‰ ‰ ‰ ‰ ç‰ 适合 Centos5 的 Sendmail 服务
[root@oldboy ~]# find /var/spool/postfix/maildrop/ -type f|xargs rm -f
‰ ‰ ‰ ‰ ‰ ‰ ‰ ç‰ 适合 CentOS 6 的 Postfix 服务
2.12 清除版本信息
[root@www ~]# > /etc/issue
[root@www ~]# cat /etc/issue
[root@www ~]# > /etc/issue.net
[root@www ~]# cat /etc/issue.net
2.13 锁定关键系统文件,防止被提权篡改
chattr +i /etc/passwd /etc/shadow /etc/group /etc/gshadow /etc/inittab
解锁chattr -i /etc/passwd /etc/shadow /etc/group /etc/gshadow /etc/inittab
查看文件状态:使用lsattr命令查看文件的隐藏属性
2.14 为 grub 菜单加密码
为 grub 菜单加密码的目的是防止他人修改 grub 进行内核等启动设置,以及用单用户模式启动进行破解 root 密码等操作。实际上此步可以在安装系统的过程中设定,安装系统后的具体设定步骤如下。
[root@www ~]# /sbin/grub-md5-crypt MD5生成密码串
Password:
Retype password:
$1$hoY96$dM9GlbjKLbi/GV8J9neOm1
[root@www ~]# vi /etc/grub.conf 添加一行
password --md5 $1$hoY96$dM9GlbjKLbi/GV8J9neOm1
注意:password 要加在 splashimage 和 title 之间,否则可能无法生效
2.15 linux中文支持
默认linux字符编码是en
yum groupinstall "Chinese Support"
zh_CN.UTF-8
2.16 文件打开数等资源设置
文件描述符是由无符号整数表示的句柄,进程使用它来标识打开的文件。文件描述符与包括相关信息(如文件的打开模式、文件的位置类型、文件的初始类型等)的文件对象相关联,这些信息被称作文件的上下文。文件描述符的有效范围是 0 到 OPEN_MAX。对于内核而言,所有打开的文件都是通过文件描述符引用的。当打开一个现有文
件或创建一个新文件时,内核向进程返回一个文件描述符。当读或写一个文件时,使用open 或 creat 返回的文件描述符标识该文件,并将其作为参数传递给 read 或 write,默认1024,对于高并发的业务 Linux 服务器来说,这个默认的设置值是不够的
openFiles(){
cat > $ADJUST_CONF/limits.conf << EOF
# nofile 可以被理解为是文件句柄数 文件描述符 还有socket数```shell
* soft nofile 65535
* hard nofile 65535
# 最大进程数
* soft nproc 65535
* hard nproc 65535
EOF
cmp $ADJUST_CONF/limits.conf /etc/security/limits.conf
if [ $? -ne 0 ];then
echo "----调整最大打开系统文件个数65535个------"
\cp /etc/security/limits.conf $BACK_CONF/limits.conf.`date +%F`
cat $ADJUST_CONF/limits.conf > /etc/security/limits.conf
ulimit -HSn 65535
echo "ulimit -HSn 65535" >> /etc/rc.local
action "08 调整打开系统文件个数成功!(修改后重新登录生效)" /bin/true
else
action "08 调整打开系统文件个数已配置!" /bin/true
fi
sleep 1
}
2.17 利用sudo控制用户对系统命令的使用权限
为了安全及管理的方便,可将需要 root 权限的普通用户加入 sudo 管理,这样用户就可以通过自己的普通账户登录,利用 root 的权限来管理系统了,当然也就不需要有root 账号及密码了
Visudo
实际编辑/etc/sudoers文件
用户名 被管理主机地址=(可使用身份) 可执行的命令
root ALL=(ALL) ALL
Centos ALL=(ALL) /usr/sbin/useradd,/usr/sbin/userdel
%用户组 ALL=(ALL) /usr/sbin/useradd
\cp /etc/sudoers /etc/sudoers.ori
echo "centos ALL=(ALL) NOPASSWD: ALL " >>/etc/sudoers <-- 此处加了全部权限
tail -1 /etc/sudoers
visudo -c # →直接追加内容没有语法检查,因此要单独执行语法检查命令
- 可以禁止root用户登录
- 然后通过普通用户使用sudo切换到root权限
sudo su - - sudoers权限必须是440
2.18 禁止 Linux 系统被 ping
此项优化不是必须的,而且有时我们自己也会通过 ping 来检查服务器是否异常,对于要求很高的中小企业服务器,设置禁止 ping 也是可以的。从安全角度来说,禁止ping 还是会增加系统安全的。禁止 ping 的命令如下
[root@www ~]# echo “net.ipv4.icmp_echo_ignore_all=1” >> /etc/sysctl.conf
[root@www ~]# sysctl –p
2.19 yum源配置
配置阿里云的yum源
ConfigYum(){
echo “Config Yum CentOS-Base.repo”
#\cp的作用是逃离别名
if [ ! -f "/etc/yum.repos.d/epel.repo" ];then
\cp CentOS-Base.repo CentOS-Base.repo.bak.$(date +%F)
ping -c 1 baidu.com > /dev/null
[ ! $? -eq 0 ] && echo "Networking not configured -- exiting" && exit 1
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyuncs.com/repo/Centos-6.repo
yum clean metadata
yum makecache
else
echo “YUM源已进行过优化”
fi
}
2.20 禁止IPv6
disableIPV6(){
if [ `cat /etc/modprobe.conf | grep "alias net-pf-10 off" | wc -l` -lt 1 ];then
cp /etc/modprobe.conf $BACK_CONF/modprobe.conf.`date +%F`
echo "alias net-pf-10 off" >> /etc/modprobe.conf
echo "alias ipv6 off" >> /etc/modprobe.conf
fi
action $"13 禁止使用IPV6" /bin/true
}
2.21 更新内核和软件
清空yum缓存
yum clean all
生存缓存
yum makecache
开始更新系统以及内核
yum upgrade
必备软件
yum install ntpdatewget -y
2.22 可以删除的用户和组
#删除不必要的用户
userdel adm
userdel lp
userdel sync
userdel shutdown
userdel halt
userdel news
userdel uucp
userdel video
userdelgames
userdel gopher
userdel ftp
#删除不必要的群组
groupdel adm
groupdel lp
groupdel news
groupdel uucp
groupdel games
groupdel dip
3 系统内核调优
3.1 常见案例日志:kernel: ip_conntrack: table full, dropping packet
3.1.1 ip_conntrack_max参数
由开启iptables导致
/proc/sys/net/ipv4/netfilter/ip_conntrack_max或者
/proc/sys/net/ipv4/ip_conntrack_max (centos5.x)
/proc/sys/net/netfilter/nf_conntrack_max(centos6.x)
在/etc/sysctl.conf加入
net.ipv4.netfilter.ip_conntrack_max = 655360(centos5.x)
net.nf_conntrack_max = 100000(centos6.x)
3.1.2 swappiness参数
表示使用swap的概率,此值越大,表示使用swap的概率越大。推荐配置如下:
查看目前配置:cat/proc/sys/vm/swappiness
添加如下内容到/etc/sysctl.conf
vm.swappiness=10
表示当内存使用率超过(100-10)90%时,才开始使用swap。
3.1.3 我们线上web服务器配置参考(每天3亿的量)
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_max_syn_backlog = 20000
net.core.netdev_max_backlog = 32768
net.core.somaxconn = 32768
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_keepalive_time = 120
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_max_tw_buckets = 80000
net.ipv4.tcp_keepalive_time = 120
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_max_syn_backlog = 20000
net.core.netdev_max_backlog = 32768
net.core.somaxconn = 32768
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_max_tw_buckets = 500000
net.ipv4.tcp_keepalive_time = 60
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_keepalive_probes = 5
net.nf_conntrack_max = 2097152
sysctl -p