Fork me on GitHub

Linux系统初始化脚本

CentOS系统安装之后并不能立即投入生产环境使用,往往需要先经过我们运维人员的优化才行,所以为了方便省事,弄一个初始化脚本势在必行。

这里就直接贴出脚本,如不想复制粘贴的话,可直接在我的百度网盘的链接下载:
http://pan.baidu.com/s/1i5PrAz7

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
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
#!/bin/bash
# Author: CH 18201620971@163.com
# 2016-12-13
# 此脚本用于初始化 Centos6.5,其他系统请自行测试
# 定义基础配置
PASSWD=123.com
HOSTNAME=chenhao
DNS1=114.114.114.114
DNS2=8.8.8.8
SSH_PORT=22122
CHATTR=chenhao
# 此程序别名,防止他人修改关键文件
PORTS=80,22,21,8088
# 用于 iptables input 开放的端口
HISTDIR=/usr/etc/.history
# 用于记录登录过系统的用户、IP地址、shell命令以及详细操作时间
cat << EOF
+------------------------------------------------------------------+
| ********** Welcome to CentOS 6.5 System init ********** |
+------------------------------------------------------------------+
EOF
[ `whoami` != "root" ] && echo "please use root" && exit 1
function format() {
echo -e "\033[32m Success!!!\033[0m\n"
echo "#########################################################"
}
###修改root用户密码
echo "set root passwd"
echo $PASSWD | passwd root --stdin &> /dev/null
format
###修改主机名
echo "set hostname"
hostname $HOSTNAME && echo "HOSTNAME=$HOSTNAME" >> /etc/sysconfig/network
format
###配置DNS解析
echo "set DNS"
echo "" > /etc/resolv.conf
echo "nameserver $DNS1" > /etc/resolv.conf
echo "nameserver $DNS2" >> /etc/resolv.conf
ping -c 3 www.baidu.com &> /dev/null || echo "请检查网络连接,此脚本需要访问外网" || exit 3
format
###关闭Selinux服务
echo "disable selinux"
[ `getenforce` != "Disabled" ] && setenforce 0 &> /dev/null && sed -i s/"^SELINUX=.*$"/"SELINUX=disabled"/g /etc/sysconfig/selinux
format
###更新yum源为阿里云
echo "set yum mirrirs"
cd /etc/yum.repos.d/
mv CentOS-Base.repo CentOS-Base.repo.bak
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo &> /dev/null
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo &> /dev/null
yum clean all &> /dev/null && yum makecache &> /dev/null
format
###更改ssh的服务端口
echo "set sshd"
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
sed -i s/"^Port 22"/"Port $SSH_PORT"/g /etc/ssh/sshd_config
sed -i s/"^UseDNS yes"/"UseDNS no"/g /etc/ssh/sshd_config
service sshd restart &> /dev/null
format
###锁定关键文件系统($CHATTR -i可以恢复)
echo "chattr files"
chattr +i /etc/passwd
chattr +i /etc/inittab
chattr +i /etc/group
chattr +i /etc/shadow
chattr +i /etc/gshadow
chattr +i /etc/resolv.conf
chattr +i /etc/hosts
chattr +i /etc/fstab
mv /usr/bin/chattr /usr/bin/$CHATTR
format
###设置字符集为中文
echo "set LANG"
yum -y groupinstall chinese-support &> /dev/null
sed -i s/"^LANG=.*$"/"LANG=zh_CN.UTF-8"/ /etc/sysconfig/i18n
echo 'SUPPORTED="zh_CN:zh:en_US.UTF-8:en_US:en:zh_CN.GB18030"' >> /etc/sysconfig/i18n
source /etc/sysconfig/i18n
format
###自动更新服务器时间
echo "set ntptime"
ntpdate cn.pool.ntp.org &> /dev/null
echo '*/5 * * * * /usr/sbin/ntpdate cn.pool.ntp.org &>/dev/null' >> /etc/crontab
hwclock -w
format
###设置文件句柄数
echo "Set ulimit 65535"
cat << EOF > /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535
EOF
sed -i 's/65535/1024000/g' /etc/security/limits.d/90-nproc.conf
format
###系统审计和故障排查
echo "set history"
cat >> /etc/profile << EOF
USER_IP=`who -u am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g'`
if [ -z $USER_IP ]
then
USER_IP=`hostname`
fi
if [ ! -d $HISTDIR ]
then
mkdir -p $HISTDIR
chmod 777 $HISTDIR
fi
if [ ! -d $HISTDIR/${LOGNAME} ]
then
mkdir -p $HISTDIR/${LOGNAME}
chmod 300 $HISTDIR/${LOGNAME}
fi
export HISTSIZE=2000
DT=`date +%Y%m%d_%H%M%S`
export HISTFILE="$HISTDIR/${LOGNAME}/${USER_IP}.history.$DT"
export HISTTIMEFORMAT="[%Y.%m.%d %H:%M:%S] "
chmod 600 $HISTDIR/${LOGNAME}/*.history* 2>/dev/null
ulimit -SHn 65535
ulimit -SHu unlimited
ulimit -SHd unlimited
ulimit -SHm unlimited
ulimit -SHs unlimited
ulimit -SHt unlimited
ulimit -SHv unlimited
EOF
source /etc/profile
format
###设置vim
#echo "Set Vim."
#cat << EOF > ~/.vimrc
#set number
#set laststatus=2
#set shiftwidth=4
#set tabstop=4
#set noexpandtab
#set softtabstop=4
#set cmdheight=3
#set cursorline
#set formatoptions=tcrqn
#set encoding=utf-8
#syntax on
#colorscheme desert
#color ron
#set background=dark
#set ruler
#set rulerformat=%20(%2*%<%f%=\ %m%r\ %3l\ %c\ %p%%%)
#set statusline=%F%m%r%h%w\ [FORMAT=%{&ff}]\ [TYPE=%Y]\ [POS=%l,%v][%p%%]\ %{strftime(\"%d/%m/%y\ -\ %H:%M\")}
#nmap z :x<cr>
#nmap sp :set paste<cr>i
#EOF
#format
# vim设置这里我还是比较喜欢默认的,这个配置可以自行测试
###隐藏服务器系统信息
echo "mv issue"
mv /etc/issue /etc/issue.bak
mv /etc/issue.net /etc/issue.net.bak
format
###设置登录时显示的信息
#echo "Set login message."
#echo "This is chen-hao's Server" > /etc/issue
#echo "This is chen-hao's Server" > /etc/redhat-release
#format
# 以上2选1
###禁用IPV6
echo "Disable ipv6."
cat << EOF > /etc/modprobe.conf
alias net-pf-10 off
alias ipv6 off
EOF
chkconfig --level 2235 ip6tables off
format
###设置iptables
echo "set iptables"
iptables -F
iptables -A INPUT -p tcp -m multiport --dports $SSH_PORT,$PORTS -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
service iptables save &> /dev/null
format
###内核优化
echo "Set sysctl.conf"
cat > /etc/sysctl.conf << EOF
net.ipv4.ip_forward = 0
#开启路由功能
net.ipv4.conf.all.rp_filter = 1
#加强入站过滤和出站过滤
net.ipv4.conf.default.rp_filter = 1
#开启反向路径过滤
net.ipv4.conf.default.accept_source_route = 0
#处理无源路由的包
kernel.sysrq = 0
#控制系统调试内核的功能要求
kernel.core_uses_pid = 1
#用于调试多线程应用程序
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0
kernel.msgmnb = 65536
#所有在消息队列中的消息总和的最大值
kernel.msgmax = 65536
# 指定内核中消息队列中消息的最大值
kernel.shmmax = 68719476736
#于定义单个共享内存段的最大值,64位linux系统:可取的最大值为物理内存值-1byte,建议值为多于物理内存的一半,一般取值大于SGA_MAX_SIZE即可,可以取物理内存-1byte。例如,如果为64GB物理内存,可取64*1024*1024*1024-1=68719476735
kernel.shmall = 4294967296
#inux共享内存页大小为4KB,共享内存段的大小都是共享内存页大小的整数倍。一个共享内存段的最大大小是 16G,那么需要共享内存页数是16GB/4KB=16777216KB /4KB=4194304(页),也就是64Bit系统下16GB物理内存,设置kernel.shmall = 4194304才符合要求(几乎是原来设置2097152的两倍)
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv4.neigh.default.gc_stale_time = 120
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2
###内存资源使用相关设定
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 65536 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_mem = 8388608 8388608 8388608
##应对DDOS攻击,TCP连接建立设置
net.ipv4.tcp_syncookies = 1
#防止syn flood攻击
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_max_syn_backlog = 262144
#SYN队列的长度,默认为1024,加大队列长度为262144,可以容纳更多等待连接的网络连接数
##应对timewait过高,TCP连接断开设置
net.ipv4.tcp_max_tw_buckets = 10000
#默认是180000。表示系统同时保持TIME_WAIT的最大数量,如果超过这个数字,TIME_WAIT将立刻被清除并打印警告信息
net.ipv4.tcp_tw_recycle = 1
#表示开启TCP连接中TIME-WAIT sockets的快速收回功能,默认为 0 ,表示关闭。
net.ipv4.tcp_tw_reuse = 1
#表示开启重用。允许将TIME-WAIT sockets重新用于新的 TCP 连接,默认为 0 表示关闭
net.ipv4.tcp_timestamps = 0
#时间戳可以避免序列号的卷绕
net.ipv4.tcp_fin_timeout = 5
# 表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。对端可以出错并永远不关闭连接,甚至意外当机。缺省值是60 秒。2.2 内核的通常值是180 秒,3你可以按这个设置,但要记住的是,即使你的机器是一个轻载的WEB 服务器,也有因为大量的死套接字而内存溢出的风险,FIN- WAIT-2 的危险性比FIN-WAIT-1 要小,因为它最多只能吃掉1.5K 内存,但是它们的生存期长些
net.ipv4.ip_local_port_range = 4000 65000
# 表示用于向外连接的端口范围
###TCP keepalived 连接保鲜设置
net.ipv4.tcp_keepalive_time = 1200
#表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟
net.ipv4.tcp_keepalive_intvl = 15
# 当探测没有确认时,重新发送探测的频度。缺省是75
net.ipv4.tcp_keepalive_probes = 5
# 在认定连接失效之前,发送多少个TCP的keepalive探测包。缺省值是9。这个值乘以tcp_keepalive_intvl之后决定了,一个连接发送了keepalive之后可以有多少时间没有回应
###其他TCP相关调节
net.core.somaxconn = 262144
#isten(函数)的默认参数,挂起请求的最大数量限制。web 应用中listen 函数的backlog 默认会给我们内核参数的net.core.somaxconn 限制到128,而nginx 定义的NGX_LISTEN_BACKLOG 默认为511,所以有必要调整这个值
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1
EOF
sysctl -p
# 生产环境各不相同,内核优化需慎重,请一个个参数逐一测试
format
#安装系统必需软件包
echo "install pack"
yum -y install make gcc-c++ cmake bison-devel ncurses-devel net-snmp sysstat dstat iotop lrzsz flex byacc libpcap libpcap-devel nfs-utils ntp zip unzip xz wget vim lsof bison openssh-clients htop lftp &> /dev/null
format
yum -y groupinstall "Development Tools" "Server Platform Development" &> /dev/null
read -p "系统初始化完毕,是否需要重启(y/n)?" TT
if [ "$TT" == "y" ];then
reboot
elif [ "$TT" == "n" ];then
exit 4
else
echo "请输入y/n"
fi


    本文标题   :   Linux系统初始化脚本

    文章作者   :   火柴

    发布时间   :   2016年12月13日 - 15时12分

    本文链接   :   http://www.chen-hao.com.cn/Linux系统初始化脚本.html

    本文字数   :   本文一共有2,081字

    许可协议   :   Attribution-NonCommercial 4.0

    © 转载请保留以上信息,谢谢合作。