linux系统优化
linux的最小化原则
1、安装系统最小化
2、开启服务最小化(crond sshd network rsyslog)
3、操作最小化,rm -rf test.txt
4、登录最小化,平时用普通用户登录系统。
5、用户权限最小化
6、配合参数合理化
服务器硬件采购优化
1、硬件供货商的选择
2、主要硬件部件的选择
3、定制化采购硬件
磁盘RAID的选择、mount及文件系统优化
1、磁盘类型接口选择优化
2、hdparm优化
3、磁盘挂载优化
4、RAID优化
操作系统选择优化
最小化软件包安装优化
安装系统时,只安装必要的软件包即可
安装:Debugging Tools compatibility Libraries Development Tools
安装基本的命令:
yum install -y vim wget bc lsof net-tools traceroute bash-completion ntpdate sysstat tcpdump time tree nmap nc lrzsz screen iftop iotop htop inxi dos2unix
禁止开启自启动无用服务
ssh远程登录优化
1、禁止root远程登录
2、修改ssh端口号
3、关闭DNS选项
chattr输定关键的系统文件
chattr +i /etc/passwd /etc/shadow /etc/group /etc/gshadow /etc/inittab
还可以将/usr/bin/chattr命令重命名或删除,使用时再上传。
内核优化
总结内核优化的参数
下列文件所在目录:/proc/sys/net/ipv4/
参数名称 | 默认值 | 建议值 | 解释 |
tcp_syn_retries | 5 | 1 | 对于一个新的连接,内核要发送多少个SYN连接请求才决定放弃。不应该大于255,默认值5。对应的时间是180秒。(这个值仅仅针对对外的连接,对进来的连接有tcp_retries1来控制) |
tcp_synack_retries | 5 | 1 | 对于远端的连接请求SYN,内核会发送SYN+ACK数据包,以确认收到上一个SYN请求连接包。该值决定在发送多少个SYN+ACK数据包后放弃连接。不应大于255,默认是5,对应的时间是180秒左右 |
tcp_keepalive_time | 7200 | 600 | TCP发送keepalive探测消息的时间间隔(秒),用于确认TCP连接是否有效。(防止只建立连接而不发送数据的恶意攻击) |
tcp_keepalive_probes | 9 | 3 | 在tcp_keepalive_time之后,没有收到对方确认,继续发送探测包的次数,默认是9次 |
tcp_keepalive_intvl | 75 | 15 | 在tcp_keepalive_time之后,没有收到对方确认,继续发送探测包的时间间隔,默认75秒 |
tcp_retries1 | 3 | 3 | 放弃回应一个tcp连接请求之前,进行重试的此数 |
tcp_retries2 | 15 | 5 | TCP失败,在进行多少次重试后才放弃连接 |
tcp_orphan_retries | 7 | 3 | 在近端丢弃TCP连接之前,进行多少次重试。默认是7次,相当于50秒-16分钟。负载大的web服务器可以降低该值。 |
tcp_fin_timeout | 60 | 2 | 对于本端断开的socket连接,TCP保持在FIN-WAIT-2状态的时间。默认值60秒 |
tcp_max_tw_buckets | 18000 | 36000 | 系统在同时处理的最大timewait sockets 数目。如果超过次值,time-wait socket将会立即被丢弃并显示警告信息。将该值提高,是为了防止一些简单的dos攻击 |
tcp_tw_recycle | 0 | 1 | 打开TIME-WAIT socket 回收 |
tcp_tw_reuse | 0 | 1 | 是否允许处于TIME-WAIT状态下的socket用于新的TCP连接(这个对于快速重启某个服务,而启动后提示端口被占用的情景非常有帮助) |
tcp_max_orphans | 8192 | 32768 | 系统所能处理的不属于任何进程的TIME-WAIT sockets的数量,如果超过这个数量,那么不属于任何进程的连接就会被立刻reset,并显示警告信息。设置这个限制是为了防止简单的dos攻击。 |
tcp_abort_on_overflow | 0 | 0 | 当守护进程太忙而不能接受新的连接时,就像对方发送reset消息,默认是关闭。打开后将会应影响客户的使用 |
tcp_syncookies | 0 | 1 | 只有在内核编译时选择了CONFIG_SYNCOOKIES时才会发生作用。当出现syn等候队列出现溢出时象对方发送syncookies。目的是为了防止syn flood攻击。 |
tcp_max_syn_backlog | 1024 | 16384 | 对于那些依然还未获得客户端确认的连接请求o需要保存在队列中最大数目。对于超过内存的系统o默认值是 1024 o低于 128Mb 的则为 128。如果服务器经常出现过载o可以尝试增加这个数字。警告u假如您将此值设为大于o最好修改include/net/tcp.h里面的TCP_SYNQ_HSIZEo以保持TCP_SYNQ_HSIZE*16(SYN Flood攻击利用TCP协议散布握手的缺陷,伪造虚假源IP地址发送大量TCP-SYN半打开连接到目标系统,最终导致目标系统Socket队列资源耗尽而无法接受新的连接。为了应付这种攻击,现代Unix系统中普遍采用多连接队列处理的方式来缓冲(而不是解决)这种攻击,是用一个基本队列处理正常的完全连接应用(Connect()和Accept() ),是用另一个队列单独存放半打开连接。这种双队列处理方式和其他一些系统内核措施(例如Syn-Cookies/Caches)联合应用时,能够比较有效的缓解小规模的SYN Flood攻击(事实证明) |
tcp_wmem:mindefaultmax | 4096 16384 131072 | 51200 131072 204800 | 发送缓存设置 min:为TCP socket预留用于发送缓冲的内存最小值。每个tcp socket都可以在建立以后使用它。默认值为4096(4K)。 default:为TCP socket预留用于发送缓冲的内存数量,默认情况下该值会影响其它协议使用的net.core.wmem_default 值,一般要低于net.core.wmem_default的值。默认值为16384(16K)。 max: 用于TCP socket发送缓冲的内存最大值。该值不会影响net.core.wmem_max,"静态"选择参数SO_SNDBUF则不受该值影响。默认值为131072(128K)。(对于服务器而言,增加这个参数的值对于发送数据很有帮助) |
tcp_rmem:mindefaultmax | 4096 87380 174760 | 接收缓存的设置 同tcp_wmem | |
tcp_mem:mindefaultmax | 根据内存计算 | low:当TCP使用了低于该值的内存页面数时,TCP不会考虑释放内存,低于此值没有内存压力。(理想状态下,该值应于指定的tcp_wmem的第2个值相匹配:页面大小*并发数/页大小131072*300/4098) pressure:当TCP使用了超过该值的内存页面数量时,TCP试图稳定其内存使用,进入pressure模式,当内存消耗低于low值时则退出pressure状态。(理想情况下这个值应该是 TCP 可以使用的总缓冲区大小的最大值 (204800 * 300 / 4096)。 ) high:允许所有tcp sockets用于排队缓冲数据报的页面量。(如果超过这个值,TCP 连接将被拒绝,这就是为什么不要令其过于保守 (512000 * 300 / 4096) 的原因了。 在这种情况下,提供的价值很大,它能处理很多连接,是所预期的 2.5 倍;或者使现有连接能够传输 2.5 倍的数据。 我的网络里为192000 300000 732000) 一般情况下这些值是在系统启动时根据系统内存数量计算得到的。 | |
ip_forward | 0 | 1 | 开启IP转发功能 |
ip_local_port_range:min max | 32768 61000 | 1024 65000 | 表示用于向外连接的端口范围 |
ip_conntrack_max | 65535 | 65535 | 系统支持的ipv4的最大连接数 |
一下文件在/proc/sys/net/ipv4/netfilter
文件需要打开防火墙才会存在
参数名称 | 默认值 | 建议值 | 解释 |
ip_conntrack_max | 65535 | 65535 | 系统支持的最大ipv4的连接数 |
ip_conntrack_tcp_timeout_established | 432000 | 180 | 已建立的TCP连接的超时时间,默认是432000,5天。这个值过大导致一些可能不用的连接常驻在内存中,占用大量的资源 |
ip_conntrack_tcp_timeout_time_wait | 120 | 120 | time-wait状态超时时间 |
ip_conntrack_tcp_timeout_close_wait | 60 | 60 | close-wait状态超时间 |
ip_conntrack_tcp_timeout_fin_wait | 120 | 120 | fin-wait状态超时时间 |
以下文件所在目录/proc/sys/net/core/
参数名称 | 默认值 | 建议值 | 解释 |
netdev_max_backlog | 1024 | 16384 | 每个网络接口接受数据包的速率比内核处理这些数据包的速率快时,允许送到队列的数据包的最大数目,对于负载重的服务器,应调大该值。 |
somaxconn | 128 | 16384 | 用来限制监听队列最大数据包的数量,超过这个数量就会导致连接超时或者触发重传机制(web应用中listen函数的backlog默认会给我们内核参数的net.core.somaxconn限制到128,而nginx定义的NGX_LISTEN_BACKLOG默认为511,所以有必要调整这个值。对繁忙的服务器,增加该值有助于网络性能) |
wmem_default | 129024 | 129024 | 默认的发送窗口大小(字节) |
rmem_default | 129024 | 129024 | 默认的接受窗口大小(字节) |
rmem_max | 129024 | 873200 | 最大的TCP数据接收缓冲 |
wmem_max | 129024 | 873200 | 最大的TCP数据发送缓冲 |
内核优化的常用参数:
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl =15
net.ipv4.tcp_retries2 = 5
net.ipv4.tcp_fin_timeout = 2
net.ipv4.tcp_max_tw_buckets = 36000
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_orphans = 32768
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_wmem = 8192 131072 16777216
net.ipv4.tcp_rmem = 32768 131072 16777216
net.ipv4.tcp_mem = 786432 1048576 1572864
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.ip_conntrack_max = 65536
net.ipv4.netfilter.ip_conntrack_max=65536
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established=180
net.core.somaxconn = 16384
net.core.netdev_max_backlog = 16384
增加系统文件描述符
vim /etc/security/limits.conf
* - nofile 65535
* - nproc 65535
vim /etc/security/limits.d/90-nproc.conf
* soft nproc unlimited
root soft nproc unlimited
配置sudo对普通用户权限进行精细管理
实例:
[root@node11 limits.d]# cat /etc/sudoers.d/permissions
### Networking
Cmnd_Alias NOPASS_NETWORKING = /sbin/route, /sbin/ifconfig, /sbin/ip, /bin/ping, /bin/ping6, /bin/traceroute, /sbin/dhclient, /usr/bin/net, /sbin/iptables, /usr/bin/rfcomm, /usr/bin/wvdial, /sbin/iwconfig, /sbin/mii-tool, /usr/bin/host, /usr/bin/nslookup, /bin/hostname, /bin/hostnamectl
Cmnd_Alias PASS_NETWORKING = /sbin/ifconfig del, /sbin/ip del, /sbin/ifup, /sbin/ifdown, /usr/sbin/brctl
### Installation and management of software
Cmnd_Alias NOPASS_SOFTWARE = /bin/rpm, /usr/bin/up2date, /usr/bin/yum, /usr/bin/make, /usr/bin/cmake, /usr/bin/ccmake, /usr/bin/pip, /usr/bin/easy_install
### Services
Cmnd_Alias NOPASS_SERVICES = /sbin/service, /sbin/chkconfig, /etc/init.d/*, /usr/bin/systemctl start, /usr/bin/systemctl stop, /usr/bin/systemctl reload, /usr/bin/systemctl restart, /usr/bin/systemctl status, /usr/bin/systemctl enable, /usr/bin/systemctl disable, /usr/bin/nohup, /bin/journalctl
### Updating the locate database
Cmnd_Alias NOPASS_LOCATE = /usr/bin/updatedb
### Storage
Cmnd_Alias NOPASS_STORAGE = /sbin/fdisk, /sbin/sfdisk, /sbin/parted, /sbin/partprobe, /bin/mount, /bin/umount
Cmnd_Alias PASS_FORMATTING = /sbin/mkfs, /sbin/mkfs.btrfs, /sbin/mkfs.cramfs, /sbin/mkfs.ext2, /sbin/mkfs.ext3, /sbin/mkfs.ext4, /sbin/mkfs.minix, /sbin/mkfs.xfs
### Delegating permissions
Cmnd_Alias NOPASS_DELEGATING = /bin/chown, /bin/chmod, /bin/chgrp, !/usr/sbin/visudo, !/usr/bin/vi *sudoer*, !/usr/bin/vim *sudoer*, /usr/bin/echo *sudoer*
### Processes
Cmnd_Alias PASS_PROCESSES = /bin/nice, /bin/kill, /usr/bin/kill, /usr/bin/killall, /usr/bin/pkill
### System Information
Cmnd_Alias NOPASS_SYSTEM_INFORMATION = /bin/uname, /bin/hostname, /usr/bin/lscpu, /usr/bin/free, /usr/sbin/iftop, /usr/sbin/iotop, /usr/bin/ionice, /usr/bin/sar, /bin/netstat, /usr/sbin/ss, /usr/bin/top, /bin/ps, /usr/bin/pstree, /bin/df, /usr/bin/iostat, /usr/bin/vmstat, /usr/bin/inxi, /usr/bin/uptime, /usr/bin/du, /usr/sbin/lsof
### Text
Cmnd_Alias NOPASS_TEXT = /bin/grep, /bin/awk, /bin/find, /usr/bin/locate, /bin/cat, /bin/tac, /usr/bin/head, /bin/more, /usr/bin/less, /usr/bin/tail, /usr/bin/tailf, /bin/cut, /bin/egrep, /bin/fgrep, /usr/bin/rename, /bin/sort, /usr/bin/tr, /usr/bin/uniq, /usr/bin/wc, /usr/bin/whatis, /usr/bin/whereis, /usr/bin/which, /bin/touch, /bin/mkdir, /usr/bin/install, /bin/ln, /bin/cp, /bin/mv, /usr/bin/dos2unix, /usr/bin/watch, /usr/bin/xargs
### Text modify
Cmnd_Alias NOPASS_TEXT_MODIFY = /bin/vi, /usr/bin/vim, /bin/rm, /bin/echo, /bin/sed
### Compression
Cmnd_Alias NOPASS_COMPRESSION = /bin/tar, /bin/gzip, /bin/gunzip, /usr/bin/zip, /usr/bin/unzip, /usr/bin/bzip2, /usr/bin/zdiff, /usr/bin/zgrep, /usr/bin/zegrep, /usr/bin/zfgrep, /usr/bin/zipgrep, /usr/bin/zless, /usr/bin/zmore, /usr/bin/xz, /usr/bin/unxz, /usr/bin/xzcat, /usr/bin/xzcmp, /usr/bin/xzdec, /usr/bin/xzdiff, /usr/bin/xzegrep, /usr/bin/xzfgrep, /usr/bin/xzgrep, /usr/bin/xzless, /usr/bin/xzmore, /usr/bin/bzcat, /usr/bin/bzcmp ,/usr/bin/bzdiff, /usr/bin/bzgrep, /usr/bin/bzip2, /usr/bin/bzless, /usr/bin/bzmore
### File push
Cmnd_Alias NOPASS_FILEPUSH = /usr/bin/rz, /usr/bin/sz, /usr/bin/scp, /usr/bin/rsync
### Create user and group
Cmnd_Alias NOPASS_CREATE_USER = /usr/sbin/useradd, ! /usr/bin/passwd root, /usr/bin/passwd, /usr/sbin/userdel, /usr/sbin/groupadd, /usr/sbin/groupdel, /usr/bin/chage, /bin/chgrp, /usr/sbin/chpasswd, /usr/bin/gpasswd ,/usr/sbin/groupmod, /usr/bin/id
### Time
Cmnd_Alias NOPASS_TIME = /sbin/clock, /usr/sbin/clockdiff, /bin/date, /sbin/hwclock, /usr/sbin/ntpdate
### Crontab
Cmnd_Alias NOPASS_CRONTAB = /usr/bin/crontab
### Diff
Cmnd_Alias NOPASS_DIFF = /usr/bin/diff, /usr/bin/vimdiff
### SHELL
Cmnd_Alias NOPASS_SHELL = /bin/sh, /usr/bin/python, /bin/usleep, /bin/sleep
### Security
Cmnd_Alias NOPASS_SECURITY = /sbin/ip6tables, /sbin/iptables, /sbin/iptunnel, /usr/sbin/setenforce, /usr/sbin/getenforce
### Capture package
Cmnd_Alias NOPASS_CAPTURE = /usr/sbin/tcpdump, /usr/sbin/tshark
### Audit
Cmnd_Alias NOPASS_AUDIT = /usr/bin/last, /usr/bin/lastlog, /usr/bin/who, /usr/bin/whoami
### Command
Cmnd_Alias NOPASS_COMMAND = /usr/bin/virsh, /usr/bin/virt-install, /usr/sbin/qemu-kvm, /usr/bin/qemu-img
### Other
Cmnd_Alias NOPASS_OTHER = /usr/bin/screen, /usr/bin/wget, /usr/bin/nc, /usr/bin/nmap, /usr/bin/curl
## Allow root to run any commands anywhere
sremanager ALL=(ALL) NOPASSWD: NOPASS_NETWORKING, NOPASS_SOFTWARE, NOPASS_SERVICES, NOPASS_LOCATE, NOPASS_STORAGE, NOPASS_DELEGATING, NOPASS_SYSTEM_INFORMATION, NOPASS_TEXT, NOPASS_TEXT_MODIFY, NOPASS_COMPRESSION, NOPASS_FILEPUSH, NOPASS_CREATE_USER, NOPASS_TIME, NOPASS_SECURITY, NOPASS_CAPTURE, NOPASS_AUDIT, NOPASS_CRONTAB, NOPASS_DIFF, NOPASS_SHELL, NOPASS_COMMAND, NOPASS_OTHER, PASSWD: PASS_NETWORKING, PASS_FORMATTING, PASS_PROCESSES
#Defaults:sremanager timestamp_timeout=5
developer ALL=(ALL) NOPASSWD: NOPASS_SYSTEM_INFORMATION, NOPASS_TEXT, NOPASS_COMPRESSION, NOPASS_FILEPUSH, NOPASS_DIFF
zabbix ALL=(ALL) NOPASSWD: NOPASS_SYSTEM_INFORMATION
禁ping(非必须)
临时禁止PING的命令为:
echo 1 >/proc/sys/net/ipv4/icmp_echo_ignore_all
永久禁ping 在/etc/sysctl.conf 中增加一行
net.ipv4.icmp_echo_ignore_all=0
关闭多余的控制台(非必须)
清除多余的系统虚拟账号(非必须)
配置防火墙、关闭selinux
防火墙默认策略drop,只开放需要的访问
grub加密码(非必须)
设置/etc/hosts.allow /etc/hosts.deny
配置yum源
使用国内的yum源
修改yum源(改为阿里源)
备份:
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
mv /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel.repo.backup
mv /etc/yum.repos.d/epel-testing.repo /etc/yum.repos.d/epel-testing.repo.backup
基本源:
CentOS 5
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-5.repo
CentOS 6
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
CentOS 7
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
epel源:
epel(RHEL 7)
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
epel(RHEL 6)
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
epel(RHEL 5)
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-5.repo
禁止键盘重启
vim /etc/init/control-alt-delete.conf
/tmp临时目录的安全
用户的密码应该复杂一些、定期更换
注销账号的时间,命令历史记录数
对所有的用户设置登录时间,超过时间将自动退出登录
vim /etc/profile
TMOUT=30
HISTSIZE=1000
# 设置历史记录的条数
对root用户设置登录时间
vim /root/.bash_profile
TMOUT=30
export TMOUT
安装系统性能监控软件
设置时间同步
使用ntpdate times.aliyun.com
操作系统磁盘分区划分优化
编写系统一键优化脚本
取消登录界面的提示信息(提示信息中包括了系统版本和内核版本)
cat /etc/issue
CentOS release 6.8 (Final)
Kernel \r on an \m
清空该文件