Linux 优化脚本
记录 Linux 优化的常用方法。
安装Linux系统后调优及安全设置
Linux 安装后常用的基础优化脚本。
关闭 selinux 功能( 需重启)
关闭SELinux及iptables(在工作场景中,如果有外部IP一般要打开iptables,高并发、高流量的服务器可能无法开启)关闭selinux,清空iptables
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
systemctl disable firewalld
精简开机项
精简并保留必要的开机自启动服务(如crond、sshd、network、rsyslog、sysstat)。
chkconfig ——list|grep "3:on"
chkconfig ——list|grep 3:on|grep -vE "crond|sshd|network| rsyslog|sysstat" |awk '{print "chkconfig " $1 " off"}'
2
更改SSH服务器端远程登录的配置
不用root登录管理系统,而以普通用户身份登录,通过sudo授权管理。更改默认的远程连接SSH服务器端口,禁止root用户远程连接,甚至更改SSH服务只监听内网IP。
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.ori
修改的内容如下:
Port 52113
PermitRootLogin no
PermitEmptyPasswords no
UseDNS no
GSSAPIAuthentication no
2
3
4
5
脚本修改:
echo "#————————sshConfig修改ssh默认登录端口,禁止root登录——————————#"
\cp /etc/ssh/sshd_config /etc/ssh/sshd_config.`date +"%F%H%M%S"`
sed -i 's%#Port 22%Port 52113%' /etc/ssh/sshd_config
sed -i 's%#PermitRootLogin yes%PermitRootLogin no%' /etc/ssh/sshd_config
sed -i 's%#PermitEmptyPasswords no%PermitEmptyPasswords no%' /etc/ssh/sshd_config
sed -i 's%#UseDNS yes%UseDNS no%' /etc/ssh/sshd_config
sed -i 's%GSSAPIAuthentication yes%GSSAPIAuthentication no%' /etc/ssh/sshd_config
egrep "UseDNS|52113|RootLogin|EmptyPass|GSSAPIAuthentication" /etc/ssh/sshd_config
systemctl restart sshd
2
3
4
5
6
7
8
9
sudo 配置
cp /etc/sudoers /etc/sudoers.ori
echo "echoxu ALL=(ALL) NOPASSWD: ALL " >>/etc/sudoers
# 检查
tail -1 /etc/sudoers
visudo -c #→直接追加内容没有语法检查,因此要单独执行语法检查命令
2
3
4
5
6
设置 linux 服务器时间同步
定时自动更新服务器的时间,使其与互联网时间同步。
/usr/sbin/ntpdate time.nist.gov
echo '#time sync by oldboy at 2010-2-1' >>/var/spool/cron/root
`echo '*/5 * * * * /usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1' >>/var/spool/cron/root`
2
3
设置 linux 的命令行历史记录数
echo 'export HISTFILESIZE=5' >>/etc/profile
调整 linux 系统文件描述符数量
调整文件描述符的数量,进程及文件的打开都会消耗文件描述符数量。
ulimit -n
echo '* - nofile 65535 ' >>/etc/security/limits.conf
2
linux 服务器内核参数优化
优化方法是执行 vi/etc/sysctl.conf
命令到文件结尾,然后拷贝如下内容并保存。
net.ipv4.tcp_fin_timeout = 2
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_keepalive_time = 600
net.ipv4.ip_local_port_range = 4000 65000
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_max_tw_buckets = 36000
net.ipv4.route.gc_timeout = 100
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_synack_retries = 1
net.core.somaxconn = 16384
net.core.netdev_max_backlog = 16384
net.ipv4.tcp_max_orphans = 16384
#以下参数是对iptables防火墙的优化,防火墙不开会提示,可以忽略不理
net.nf_conntrack_max = 25000000
net.netfilter.nf_conntrack_max = 25000000
net.netfilter.nf_conntrack_tcp_timeout_established = 180
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
执行: sysctl -p
定时清理邮件服务临时目录垃圾文件
因没有安装postfix 所以不用执行此步骤。定时自动清理邮件临时目录垃圾文件,防止磁盘的inodes数被小文件占满(注意CentOS 6和CentOS 5要清除的目录不同)。
find /var/spool/postfix/maildrop/ -type f|xargs rm -f
隐藏 linux 版本信息显示
清空/etc/issue、/etc/issue.net,去除系统及内核版本登录前的屏幕显示。
> /etc/issue
> /etc/issue.net
/etc/motd
锁定关键系统文件,防止被提权篡改
锁定关键系统文件,如/etc/passwd、/etc/shadow、/etc/group、/etc/gshadow、/etc/inittab,处理以上内容后把chattr、lsattr改名为oldboy并转移,这样就安全多了。
chattr +i /etc/passwd /etc/shadow /etc/group /etc/gshadow /etc/inittab
解锁:chattr -i /etc/passwd /etc/shadow /etc/group /etc/gshadow /etc/inittab
清除多余的系统虚拟账号
默认的绝大多数虚拟用户都可以删掉,例如:bin、adm、lp、halt、mail、uucp、operator、games、gopher、ftp、dbus、vcsa、abrt、ntp、saslauth、postfix、tcpdump
等。
这些用户本身也是无法登录的,因此,此项优化不是必须的。
配置 yum 源及必要软件安装
配置 yum、epol 更新源,从国内更新源下载安装软件包。linux生产环境若干优化实战
脚本文件:
#!/bin/sh -eux
# ----------------------- action 函数开始(shell脚本执行成功时输出带有颜色的 OK 否则输出带有颜色的 FAILED) -----------------------
BOOTUP=color
RES_COL=60
MOVE_TO_COL="echo -en \\033[${RES_COL}G"
SETCOLOR_SUCCESS="echo -en \\033[1;32m"
SETCOLOR_FAILURE="echo -en \\033[1;31m"
SETCOLOR_WARNING="echo -en \\033[1;33m"
SETCOLOR_NORMAL="echo -en \\033[0;39m"
LOGLEVEL=1
echo_success() {
[ "$BOOTUP" = "color" ] && $MOVE_TO_COL
echo -n "["
[ "$BOOTUP" = "color" ] && $SETCOLOR_SUCCESS
echo -n $" OK "
[ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL
echo -n "]"
echo -ne "\r"
return 0
}
echo_failure() {
[ "$BOOTUP" = "color" ] && $MOVE_TO_COL
echo -n "["
[ "$BOOTUP" = "color" ] && $SETCOLOR_FAILURE
echo -n $"FAILED"
[ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL
echo -n "]"
echo -ne "\r"
return 1
}
# Run some action. Log its output.
action() {
local STRING rc
STRING=$1
echo -n "$STRING "
shift
"$@" && echo_success $"$STRING" || echo_failure $"$STRING"
rc=$?
echo
return $rc
}
# ---------------------------------------------- action 函数开始结束 ----------------------------------------------
# 更改 yum 源
yumConfig(){
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
if command -v wget >/dev/null 2>&1; then
wget --no-check-certificate -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
elif command -v curl >/dev/null 2>&1; then
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
else
echo "Cannot download yum repo config";
exit 1;
fi
sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
yum makecache
echo ""
}
# 安装软件
installSoftware(){
rpm --import http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
yum -y update
# Delta RPMs disabled because /usr/bin/applydeltarpm not installed 报错,用 yum -y install deltarpm
yum -y install wget curl gcc unzip vim-enhanced lsof net-tools bash-completion
echo ""
}
# 这个函数的以前是再 ks.cfg 中
rename_eth0(){
# 修改网卡名为 eth0(以下的操作重启后生效,所以将其放在此处)
GRUB_CONFIG="/etc/default/grub"
GRUB_CMDLINE_LINUX='GRUB_CMDLINE_LINUX="crashkernel=auto net.ifnames=0 biosdevname=0"'
if grep -q -E "GRUB_CMDLINE_LINUX" "$GRUB_CONFIG"
then
sed -i "s/^\s*GRUB_CMDLINE_LINUX.*/${GRUB_CMDLINE_LINUX}/" "$GRUB_CONFIG"
else
echo "$GRUB_CMDLINE_LINUX" >>"$GRUB_CONFIG"
fi
# 设置 grub 等待时间为 1s
GRUB_TIMEOUT="GRUB_TIMEOUT=1"
if grep -q -E "GRUB_TIMEOUT" "$GRUB_CONFIG"
then
sed -i -e 's/^GRUB_TIMEOUT=[0-9]\+$/GRUB_TIMEOUT=1/' "$GRUB_CONFIG"
else
echo "$GRUB_TIMEOUT" >>"$GRUB_CONFIG"
fi
grub2-mkconfig -o /boot/grub2/grub.cfg
# 修改网卡文件名以及设备名
for ifcfg in `ls /etc/sysconfig/network-scripts/ifcfg-* |grep -v ifcfg-lo`
do
#mv $ifcfg /etc/sysconfig/network-scripts/ifcfg-eth0
sed -i -e 's/^\s*NAME.*/NAME=eth0/' /etc/sysconfig/network-scripts/ifcfg-eth0
sed -i -e 's/^\s*DEVICE.*/DEVICE=eth0/' /etc/sysconfig/network-scripts/ifcfg-eth0
done
echo ""
}
# 清除多余的系统虚拟账号
delUser(){
chattr -i /etc/passwd /etc/shadow /etc/group /etc/gshadow /etc/inittab
for user in `cat /etc/passwd |grep -vE "root|daemon|shutdown|halt|echoxu|dbus|polkitd|chrony|sshd|mail|bin" |awk -F':' '{print $1}'`
do
userdel -r $user &>/dev/null && echo "成功删除 $user" || echo "删除 $user 失败"
done
}
# 设置 echoxu 账号无密码且拥有 sudo 权限
userNOPASSWD(){
echo 'Defaults:echoxu !requiretty' > /etc/sudoers.d/echoxu
echo '%echoxu ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers.d/echoxu
chmod 440 /etc/sudoers.d/echoxu
}
# ssh 配置
configSSH(){
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.`date +%Y%m%d%H%M%S`
sed -i 's%#Port 22%Port 51888%' /etc/ssh/sshd_config
sed -i 's%#PermitRootLogin yes%PermitRootLogin no%' /etc/ssh/sshd_config
sed -i 's%#PermitEmptyPasswords no%PermitEmptyPasswords no%' /etc/ssh/sshd_config
sed -i 's%#UseDNS yes%UseDNS no%' /etc/ssh/sshd_config
sed -i 's%GSSAPIAuthentication yes%GSSAPIAuthentication no%' /etc/ssh/sshd_config
sed -i 's%#PubkeyAuthentication yes%PubkeyAuthentication yes%' /etc/ssh/sshd_config
sed -i 's%PasswordAuthentication yes%PasswordAuthentication no%' /etc/ssh/sshd_config
systemctl restart sshd
}
# 解决 DNS 连接慢的问题
fixSlowDNS(){
case "$PACKER_BUILDER_TYPE" in
virtualbox-iso|virtualbox-ovf)
# Add 'single-request-reopen' so it is included when /etc/resolv.conf is generated
# https://access.redhat.com/site/solutions/58625 (subscription required)
# http://www.linuxquestions.org/questions/showthread.php?p=4399340#post4399340
echo 'RES_OPTIONS="single-request-reopen"' >>/etc/sysconfig/network;
echo 'Slow DNS fix applied (single-request-reopen)';
;;
esac
}
# 最常用的优化操作
base(){
# 关闭 selinux 功能( 需重启)
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
# 精简开机项,与上一项可添加到 ks.cfg 中。
chkconfig ——list|grep 3:on|grep -vE "crond|sshd|network|rsyslog|sysstat" |awk '{print "chkconfig " $1 " off"}'
# 设置 linux 的命令行历史记录数
echo 'export HISTFILESIZE=5' >>/etc/profile
echo 'HISTSIZE=5' >>/etc/profile
#source /etc/profile
# 调整 linux 系统文件描述符数量
echo '* - nofile 65535 ' >>/etc/security/limits.conf
# 锁定关键系统文件,防止被提权篡改
chattr +i /etc/passwd /etc/shadow /etc/group /etc/gshadow /etc/inittab
# 防火墙配置
firewall-cmd --zone=public --add-port={51888,22}/tcp --permanent
firewall-cmd --remove-service={http,ssh} --permanent
firewall-cmd --reload
# linux 服务器内核参数优化
# 隐藏 linux 版本信息显示
# 时间同步
# 网络配置
# 日志分割
}
# 删除不需要的字体,只保留 en_US.utf8
delete_locale(){
# https://unix.stackexchange.com/questions/90006/how-do-i-reduce-the-size-of-locale-archive
localedef --delete-from-archive $(localedef --list-archive | grep -v -i en_US.utf8 | xargs)
mv -f /usr/lib/locale/locale-archive /usr/lib/locale/locale-archive.tmpl
build-locale-archive # 此命令会导致用户退出当前 shell
echo ""
}
main(){
echo ""
rename_eth0
echo "------------------------ 已修改网卡名为 eth0 并设置 grub 等待时间 -----------------------"
echo ""
yumConfig
echo "------------------------ 已将 yum 源修改为阿里云 yum 源 -----------------------"
echo ""
installSoftware
echo "-------------------------- 已完成安装常用软件(vim、wget等)操作 -------------------------"
echo ""
delUser
echo "--------------------- 已将多余用户进行删除 ------------------- "
echo ""
fixSlowDNS
echo "--------------------- 已解决 DNS 连接慢的问题 ------------------------"
echo ""
base
echo "--------------------- Linux 基础优化,包括设置:历史记录、最大文件数等操作已完成 ------------------------"
#userNOPASSWD && action "用户无密码登录脚本执行状态:" /bin/true || action "用户无密码登录脚本执行状态:" /bin/false
#echo -e "\033[36m------------------------ 已将用户添加进 sudo 并使其可无密码登录 -----------------------\033[0m"
echo ""
delete_locale # 不要移动,此函数只能放置在 shutdown -r now 命令之前
echo "------------------- 只保留 en_US.utf8 字符集, 删除不需要的字体 ------------------"
echo ""
echo "------------------- 虚拟机将重启,请不要关闭电源 ------------------"
shutdown -r now # yum update 后生成了多余的 linux-firmware、新的内核、以及 不需要的字体库,只有 重启 才能获取到它们的结果
}
main
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488