安装CentOS7并优化调优

安装centos7系统

首先,先介绍一下CentOS7的镜像,本文中,我们使用的是CentOS7.2的镜像
CentOS7的下载地址可以从以下这个地址下载
http://mirrors.aliyun.com/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-1708.iso
CentOS -7-x86_64 -DVD -1708.iso
从 CentOS 7 之后,版本命名就跟发行的日期有关了。
• CentOS-7 系统是 7.x 版本
• x86_64 64 位操作系统,并且从 7以后不再提供 以后不再提供 32 位镜像。 位镜像。

CentOS 7 默认网卡修改(可选)

我这里为了性能考虑,采用最小化安装

安装

磁盘分区

磁盘分区

开始准备安装

20210805183639

kdump是在系统崩溃、死锁或者死机的时候用来转储内存运行参数的一个工具和服务。(关闭)
security policy:安全策略 (关闭)

配置yum源安装所需软件

配置本地yum源

1
2
3
4
5
6
7
8
mkdir /mnt/cdrom
mount /dev/sr0 /mnt/cdrom
vi /etc/yum.repos.d/linux.repo
[linux]
name=linux
baseurl=file:///mnt/cdrom
enabled=1
gpgcheck=0

安装需要的软件

1
2
3
4
5
yum install vim wget bash-completion lrzsz nmap nc tree htop iftop net-tools -y
## 如果安装没有勾选可以安装下列软件组
yum -y groups install Compatibility\ Libraries
yum -y groups install Development\ Tools
yum groups install Base

bash-completion是linux7中补齐命令的软件包。

配置网络

编辑网卡配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
vim /etc/sysconfig/network-scripts/ifcfg-eth0 
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPV6_PRIVACY=no
IPADDR=10.1.1.10
PREFIX=24
GATEWAY=10.1.1.2
DNS1=114.114.114.114
DNS2=8.8.8.8

## 重启网卡
[root@moban ~]# systemctl restart network

优化系统

SSH登录优化

SSH 是Secure Shell Protocol的简写,由IETF网络工作小组( Network Working Group)制定;在进行数据传输之前,SSH先对联机数据包通过加密支术进行加密处理,加密后再进行数据传输。确保了传递的数据安全。
优化参数:

参数说明
Port指定sshd进程监听的端口号,默认为22。可以是使用多条指令监听多个端口。默认将在本机的所有网络接口上监听,但是可以通过ListenAddress指定只在某个特定的接口上监听。
PermitEmptyPasswords是否允许密码为空的用户远程登录。默认为“no”
PermitRootLogin是否允许root登录。可用值如下:“yes”(默认)表示允许。“no”表示禁止。“without-password”表示禁止使用密码认证登录。“force-commands-only”表示只有在指定了command选项的情况下才允许使用公钥认证登录。同时其它认证方法全部被禁止。这个值常用于做远程备份之类的事情。
UserDNS指定sshd是否应该对远程主机名进行反向解析,以此检查此主机名是否与其IP地址真是对应。默认值为“yes”。

关闭selinux

临时关闭和查看

1
2
3
[root@moban ~]# setenforce 0
[root@moban ~]# getenforce
Permissive

永久关闭

1
2
3
4
5
6
7
8
9
[root@moban ~]# sed -i.bak s/SELINUX=enforcing/SELINUX=disabled/g /etc/selinux/config
[root@moban ~]# cat /etc/selinux/config

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=disabled

配置时间同步

1
2
3
4
5
[root@moban ~]# yum -y install ntpdate
[root@moban ~]# echo -e "#time sync by boysec.cn\n*/5 * * * * /usr/sbin/ntpdate pool.ntp.org >/dev/null 2>&1" >/var/spool/cron/root
[root@moban ~]# crontab -l
#time sync by boysec.cn
*/5 * * * * /usr/sbin/ntpdate pool.ntp.org >/dev/null 2>&1

调整文件描述符数量

进程及文件打开都会消耗文件描述符
修改编辑/etc/security/limits.conf 这个文件

1
2
3
4
echo '*   -  nofile    65535 ' >>/etc/security/limits.conf 
tail -1 /etc/security/limits.conf
#查看ulimit
ulimit -n

精简并保留必要的开机自启动服务

1
systemctl list-unit-files|grep enable|grep -Ev "crond|rsyslog|sshd|network|systemd|sysatst|target|auditd|@|irqbalance"|awk '{print "systemctl disable "$1}'|bash

内核优化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#关闭ipv6 
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1

#忽略icmp ping广播包,应开启,避免放大攻击
net.ipv4.icmp_echo_ignore_broadcasts = 1

# 开启恶意icmp错误消息保护
net.ipv4.icmp_ignore_bogus_error_responses = 1

#处理无源路由的包
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0

#内核放弃建立连接之前发送SYN 包的数量
net.ipv4.tcp_syn_retries = 1
对于一个新建连接,内核要发送多少个SYN连接请求才决定放弃。不应该大于255,默认值是5,对应于180秒左右时间。(对于大负载而物理通信良好的网络而言,这个值偏高,可修改为2.这个值仅仅是针对对外的连接,对进来的连接,是由tcp_retries决定的)

#内核放弃建立连接之前发送SYN+ACK 包的数量
net.ipv4.tcp_synack_retries = 1
对于远端的连接请求SYN,内核会发送SYN + ACK数据报,以确认收到上一个 SYN连接请求包。这是所谓的三次握手( threeway handshake)机制的第二个步骤。这里决定内核在放弃连接之前所送出的 SYN+ACK 数目。不应该大于255,默认值是5,对应于180秒左右时间。

#开启重用。允许将TIME-WAIT sockets 重新用于新的TCP 连接
net.ipv4.tcp_tw_reuse = 1
表示是否允许重新应用处于TIME-WAIT状态的socket用于新的TCP连接(这个对快速重启动某些服务,而启动后提示端口已经被使用的情形非常有帮助)
net.ipv4.tcp_mem = 94500000 915000000 927000000
确定TCP栈应该如何反映内存使用,每个值的单位都是内存页(通常是4KB)。第一个值是内存使用的下限;第二个值是内存压力模式开始对缓冲区使用应用压力的上限;第三个值是内存使用的上限。在这个层次上可以将报文丢弃,从而减少对内存的使用。对于较大的BDP可以增大这些值(注意,其单位是内存页而不是字节)。默认值94011 125351 188022
net.ipv4.tcp_fin_timeout = 2
对于本端断开的socket连接,TCP保持在FIN-WAIT-2状态的时间。对方可能会断开连接或一直不结束连接或不可预料的进程死亡。默认值为 60 秒。

#启用timewait 快速回收
net.ipv4.tcp_tw_recycle = 1
打开快速 TIME-WAIT sockets 回收。请不要随意修改这个值。(做NAT的时候,建议打开它)

# 开启SYN洪水攻击保护,表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭
net.ipv4.tcp_syncookies = 1

#当keepalive 起用的时候,TCP 发送keepalive 消息的频度。默认是2 小时
net.ipv4.tcp_keepalive_time =600
TCP发送keepalive探测消息的间隔时间(秒),用于确认TCP连接是否有效。

#允许系统打开的端口范围
net.ipv4.ip_local_port_range = 4000 65000
表示用于向外连接的端口范围,默认比较小,这个范围同样会间接用于NAT表规模。默认32768 61000

#未收到客户端确认信息的连接请求的最大值
net.ipv4.tcp_max_syn_backlog = 16384
对于那些依然还未获得客户端确认的连接请求﹐需要保存在队列中最大数目。对于超过 128Mb 内存的系统﹐默认值是 1024 ﹐低于 128Mb 的则为 128。如果服务器经常出现过载﹐可以尝试增加这个数字。警告﹗假如您将此值设为大于 1024﹐最好修改include/net/tcp.h里面的TCP_SYNQ_HSIZE﹐以保持TCP_SYNQ_HSIZE*16(SYN Flood攻击利用TCP协议散布握手的缺陷,伪造虚假源IP地址发送大量TCP-SYN半打开连接到目标系统,最终导致目标系统Socket队列资源耗尽而无法接受新的连接。为了应付这种攻击,现代Unix系统中普遍采用多连接队列处理的方式来缓冲(而不是解决)这种攻击,是用一个基本队列处理正常的完全连接应用(Connect()和Accept() ),是用另一个队列单独存放半打开连接。这种双队列处理方式和其他一些系统内核措施(例如Syn-Cookies/Caches)联合应用时,能够比较有效的缓解小规模的SYN Flood攻击(事实证明)

#系统在同时所处理的最大 timewait sockets 数目。如果超过此数的话﹐time-wait socket 会被立即砍除并且显示警告信息。之所以要设定这个限制﹐纯粹为了抵御那些简单的 DoS 攻击﹐不过﹐如果网络条件需要比默认值更多﹐则可以提高它(或许还要增加内存)。(事实上做NAT的时候最好可以适当地增加该值)
net.ipv4.tcp_max_tw_buckets = 36000

#设置一个路由表项的过期时长(秒).
net.ipv4.route.gc_timeout = 100

#定义了系统中每一个端口最大的监听队列的长度,这是个全局的参数。
net.core.somaxconn = 16384
用来限制监听(LISTEN)队列最大数据包的数量,超过这个数量就会导致链接超时或者触发重传机制。
web应用中listen函数的backlog默认会给我们内核参数的net.core.somaxconn限制到128,而nginx定义的NGX_LISTEN_BACKLOG默认为511,所以有必要调整这个值。对繁忙的服务器,增加该值有助于网络性能

#设置当个别接口接收包的速度快于内核处理速度时允许的最大的包序列
net.core.netdev_max_backlog = 16384
每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目,对重负载服务器而言,该值需要调高一点。

#限制仅仅是为了防止简单的DoS 攻击
net.ipv4.tcp_max_orphans = 16384
系统所能处理不属于任何进程的TCP sockets最大数量。假如超过这个数量﹐那么不属于任何进程的连接会被立即reset,并同时显示警告信息。之所以要设定这个限制﹐纯粹为了抵御那些简单的 DoS 攻击﹐千万不要依赖这个或是人为的降低这个限制。如果内存大更应该增加这个值。(这个值Redhat AS版本中设置为32768,但是很多防火墙修改的时候,建议该值修改为2000)