Linux安全加固--系统相关

一、系统相关

1、系统关键文件设置

1.1、设置文件初始权限

设置默认的umask值,增强安全性。

[root@localhost ~]# umask
0022

/etc/profile最下面添加一行:

[root@localhost ~]# vim /etc/profile
umask 027

上面的设置,即新创建的文件属主拥有读写执行权限,同组用户拥有读和执行权限,其他用户无权限。

1.2、锁定关键文件

用chattr命令防止系统中的一些关键文件被修改

+i表示文件不允许新增、删除、修改、改名、设定链接关系等。

[root@localhost ~]# chattr +i /etc/passwd
[root@localhost ~]# chattr +i /etc/inittab
[root@localhost ~]# chattr +i /etc/group
[root@localhost ~]# chattr +i /etc/shadow
[root@localhost ~]# chattr +i /etc/gshadow

如果需要修改的话,需要root用户通过chattr -i /etc/passwd来解锁。

1.3、禁止非root用户执行/etc/init.d/*的系统命令

[root@localhost ~]# chmod -R 700 /etc/rc.d/init.d/*

仅仅root可以读,写,执行上述所有script file.

Centos7以后,只有自己安装的服务启动脚本会放这里,系统默认的服务启动脚本已经不放这里了。

恢复默认:

[root@localhost ~]# chmod -R 755 /etc/rc.d/init.d/*

2、命令alias别名

2.1、命令别名

定义命令别名的作用:

1、简化一些经常使用又很长的命令。

2、设置别名变相提醒,防止误操作。

别名设置参考:https://www.jb51.net/article/143426.htm

2.2、改造rm

rm -rf命令非常容易产生误操作,很难恢复,建议设置别名。

2.2.1、方案一:(直接禁止rm)

将rm别名为一个字符串,提示用户不要使用rm,使用mv。

[root@localhost ~]# alias rm='echo "do not use rm"'

当我们使用rm删除文件的时候就会有提示如下:

[root@localhost ~]# rm -rf bb/test3 
do not use rm -rf bb/test3
[root@localhost ~]#

当然了,直接使用alias定义别名只在当前环境有效,退出就没用了。要想永久有效,可以在/etc/profile或者用户家目录的.bashrc里面加入这一行。

[root@localhost ~]# vim /etc/profile
alias rm='echo "do not use rm"'
[root@localhost ~]# source /etc/profile

注释root下的.bashrc里面的rm别名设置

[root@localhost ~]# vim /root/.bashrc
#alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

image

在定义了别名之后,还想使用rm的话,可以这样:

使用绝对路径:

[root@localhost ~]# /usr/bin/rm bb/test3 
[root@localhost ~]# ls bb/
[root@localhost ~]#

或者使用反斜杠\

[root@localhost ~]# \rm -f aa/test2

2.2.2、方案二:自定义rm删除脚本(推荐)

参考:https://blog.csdn.net/liyunlong41/article/details/77102930

思路:所以很多人建议用alias将rm替换成mv,也就是设置一个自己的垃圾桶,在rm的时候将文件移动到垃圾桶中而不是直接删除了。这样就相当于有了备份。而这个垃圾桶可以crontab设置定时任务一周清除一次,通过这种方式就可以避免手残带来的损失。

2.2.2.1、建立回收站(默认隐藏):

可以单独在家目录下创建回收站:mkdir -p ~/.trash

[root@localhost ~]# mkdir -p ~/.trash  #创建一个目录作为回收站,这里使用的是用户家目录下的.trash目录

也可以单独指定一个目录作为回收站:

[root@localhost ~]# mkdir -p /data/.trash

创建回收站,一定要注意磁盘分区大小,建议把回收站放到空间最大的那个分区。

2.2.2.2、定制trash脚本

删除脚本trash.sh

[root@localhost ~]# vim /trunkout/shellscripts/trash.sh
#!/bin/bash
date=`date +%F`                              #当前日期
#path="/data/.trash/"$date       
path="/data/.trash/" # 自定义回收站目录

if [ ! -d $path ]; then
  mkdir -p $path                            #创建回收站目录
fi

str=$1                                #第一个参数
first_char=${str:0:1}
if [ $first_char = '-' ];then          #第一个参数是-f或者-rf,略过,直接shift到第二个参数
  shift
fi

while [ $# != 0 ];                     #遍历所有的参数,mv到指定path
do
  mv -f $1 $path
  shift
done
echo "Delete success. You can find the files in $path within 7 days."

清空回收站脚本cleartrash.sh

[root@localhost ~]# vim /doubles/shellscript/cleartrash.sh
#!/bin/bash
path="/data/.trash/"
read -p "clear trash files?[y/N]" confirm
[ $confirm == 'y' ] || [ $confirm == 'Y' ]  && /usr/bin/rm -rf $path/*

很多人可能会写一个找回删除文件的脚本,如下方式:

mv -i ~/.trash/\$@ ./ 

这个方式,强烈不建议,因为它是把trash里面的所有文件移动到当前目录,如果要找回,自己去回收站单独找回即可。

2.2.2.3、定义命令别名:
[root@localhost ~]# alias rm='bash /trunkout/shellscripts/trash.sh'
[root@localhost ~]# alias cltrash='bash /trunkout/shellscripts/cleartrash.sh'

由于以上脚本都非常短,我选择直接把脚本内容跟命令别名都写进/etc/profile里面去。

[root@localhost ~]# vim /etc/profile
# trash 
trash()
{
    date=`date +%F`                              
    #path="/data/.trash/"$date       
    path="/data/.trash/"                    # 自定义回收站目录

    if [ ! -d $path ]; then
        mkdir -p $path                      # 不存在则创建
    fi

    str=$1                                
    first_char=${str:0:1}
    if [ $first_char = '-' ];then           #第一个参数是-f或者-rf,略过,直接shift到第二个参数
        shift
    fi
    while [ $# != 0 ];                      #遍历所有的参数,mv到指定path
    do
        mv -f $1 $path
        shift
    done
    echo "Delete success. You can find the files in $path within 7 days."
}
ClearTrash()
{
    path="/data/.trash/"
    read -p "clear trash files?[y/N]" confirm
    [ $confirm == 'y' ] || [ $confirm == 'Y' ]  && /usr/bin/rm -rf $path/*
}
alias rm=trash
alias lstrash='ls /data/.trash/'
alias cltrash=ClearTrash

image

设定定时任务,定时清理回收站:

[root@localhost ~]# crontab -e
0 4 * * 1 /usr/bin/rm -rf /data/.trash/*
2.2.2.4、测试

image

能支持类似于rm -f test.c 、rm -rf  dir、rm test.c、rm -f test*、rm -rf dir/*等删除命令,但是不支持参数分开写的比如 rm -f -r dir等。

文件别名:

3、防止误使用Ctrl+Alt+Del重启系统

centos6.x的系统中,

注释这一行:如下

[root@localhost ~]# vim /etc/init/control-alt-delete.conf
start on control-alt-delete
# exec /sbin/shutdown -r now "Control-Alt-Delete pressed"

Centos7.x系统中:

修改ctrl-alt-del.target文件,注释掉如下行:

[root@localhost ~]# vim /usr/lib/systemd/system/ctrl-alt-del.target
#[Unit]
#Description=Reboot
#Documentation=man:systemd.special(7)
#DefaultDependencies=no
#Requires=systemd-reboot.service
#After=systemd-reboot.service
#AllowIsolate=yes
#JobTimeoutSec=30min
#JobTimeoutAction=reboot-force
#[Install]
#Alias=ctrl-alt-del.target

4、内核参数优化

4.1、内核参数解释

参考:https://www.cnblogs.com/bodhitree/p/5756719.html

https://blog.csdn.net/sinat_38015804/article/details/72675514

https://blog.csdn.net/Rebel_Yangke/article/details/60961764

sysctl命令参数:

-w 临时改变某个指定参数的值

-a 显示所有的系统参数,可使用grep来查看设置系统默认值和修改的值是否生效

-p 从指定的文件加载系统参数,如不指定即从/etc/sysctl.conf中加载

  1 #【net】
  2 ######################## cat /proc/sys/net/ipv4/tcp_syncookies
  3 # 默认值:1
  4 # 作用:1是开启SYN Cookie功能,当出现SYN 等待队列溢出时,启用Cookies来处理,该功能可以防止部分SYN攻击
  5 net.ipv4.tcp_syncookies = 1
  6 
  7 ######################## cat /proc/sys/net/ipv4/ip_forward
  8 # 默认值:0
  9 # 作用:0表示关闭,1表示开启路由转发功能。NAT必须开启IP转发支持,把该值写1。
 10 # 默认建议关闭
 11 net.ipv4.ip_forward=0
 12 
 13 ######################## cat /proc/sys/net/ipv6/conf/all/disable_ipv6
 14 # 默认值:0
 15 # 作用:关闭ipv6
 16 net.ipv6.conf.all.disable_ipv6 = 1
 17 net.ipv6.conf.default.disable_ipv6 = 1
 18 # 禁用特定的网卡的ipv6
 19 net.ipv6.conf.ens33.disable_ipv6 = 1
 20 net.ipv6.conf.lo.disable_ipv6 = 1
 21 
 22 ############################# cat /proc/sys/net/ipv4/icmp_echo_ignore_all
 23 # 默认值:0
 24 # 作用:禁止ping
 25 net.ipv4.icmp_echo_ignore_all = 1
 26 
 27 ############################# cat /proc/sys/net/ipv4/tcp_slow_start_after_idle
 28 # 默认值:1
 29 # 作用:关闭tcp的连接传输的慢启动,一个tcp连接在空闲后不进入slow start阶段,即每次收发数据都直接使用高速通道
 30 net.ipv4.tcp_slow_start_after_idle = 0
 31 
 32 ############################# cat /proc/sys/net/ipv4/tcp_syn_retries
 33 # 默认值:6
 34 # 作用:对于一个新建连接,内核要发送多少个 SYN 连接请求才决定放弃。不应该大于255,默认值是6 ,对于大负载而物理通信良好的网络而言,这个值偏高,可修改为2.这个值仅仅是针对对外的连接,对进来的连接,是由tcp_retries1 决定的
 35 net.ipv4.tcp_syn_retries = 2
 36 
 37 ############################# cat /proc/sys/net/ipv4/tcp_synack_retries
 38 # 默认值:5
 39 # 作用:tcp_synack_retries 显示或设定 Linux 核心在回应 SYN 要求时会尝试多少次重新发送初始 SYN,ACK 封包后才决定放弃。这是三次握手 (threeway handshake) 的第二个步骤。即是说系统会尝试多少次去建立由远端启始的 TCP 连线。tcp_synack_retries 的值必须为正整数,并不能超过 255。因为每一次重新发送封包都会耗费约 30 至 40 秒去等待才决定尝试下一次重新发送或决定放弃。tcp_synack_retries 的缺省值为 5,即每一个连线要在约 180 秒 (3 分钟) 后才确定逾时。
 40 net.ipv4.tcp_synack_retries = 1
 41 
 42 ############################# cat /proc/sys/net/ipv4/tcp_retries2
 43 # 默认值:15
 44 # 作用:在丢弃激活(已建立通讯状况)的TCP连接之前﹐需要进行多少次重试。默认值为15,根据RTO的值来决定,相当于13-30分钟(RFC1122规定,必须大于100秒).(这个值根据目前的网络设置,可以适当地改小,我的网络内修改为了5)
 45 net.ipv4.tcp_retries2 = 5
 46 
 47 ############################# cat /proc/sys/net/ipv4/neigh/default/tcp_synack_retries
 48 # 默认值:60
 49 # 作用:ARP参数,检查一次相邻层记录的有效性的周期。当相邻层记录失效时,将在给它发送数据前,再解析一次。
 50 net.ipv4.neigh.default.gc_stale_time = 120
 51 net.ipv4.neigh.lo.gc_stale_time = 120
 52 net.ipv4.neigh.eth0.gc_stale_time = 120
 53 
 54 
 55 ############################ cat /proc/sys/net/ipv4/conf/all/rp_filter
 56 # 默认值:1
 57 # 作用:rp_filter(reverse-pathfiltering),反向过滤技术,系统在接收到一个IP包后,检查该IP是不是合乎要求,不合要求的IP包会被系统丢弃。该技术就称为rpfilter。
 58 怎么样的包才算不合要求呢?例如:网卡1为默认路由,用户在网卡2上收到一个IP包,检查其IP为B。然后考查:对于B这个IP,在发送时应该用哪个网口,如果在不应该接收到该包的网口上接收到该IP包,例如网卡2,丢弃该包。
 59 net.ipv4.conf.all.rp_filter = 0
 60 net.ipv4.conf.default.rp_filter = 0
 61 net.ipv4.conf.lo.rp_filter = 0
 62 net.ipv4.conf.eth0.rp_filter = 0
 63 
 64 ############################ cat /proc/sys/net/ipv4/conf/all/arp_announce
 65 # 默认值:0
 66 # 作用:对网络接口上,本地IP地址的发出的ARP回应,作出相应级别的限制, 确定不同程度的限制,宣布对来自本地源IP地址发出Arp请求的接口
 67 # 0 - (默认) 在任意网络接口(eth0,eth1,lo)上的任何本地地址
 68 # 1 -尽量避免不在该网络接口子网段的本地地址做出arp回应. 当发起ARP请求的源IP地址是被设置应该经由路由达到此网络接口的时候很有用.此时会检查来访IP是否为所有接口上的子网段内ip之一.如果该来访IP不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理.
 69 # 2 - 对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通信的本地地址.首要是选择所有的网络接口的子网中外出访问子网中包含该目标IP地址的本地地址. 如果没有合适的地址被发现,将选择当前的发送网络接口或其他的有可能接受到该ARP回应的网络接口来进行发送.
 70 net.ipv4.conf.all.arp_announce = 2
 71 net.ipv4.conf.default.arp_announce = 2
 72 net.ipv4.conf.lo.arp_announce = 2
 73 net.ipv4.conf.eth0.arp_announce = 2
 74 
 75 
 76 ######################## cat /proc/sys/net/ipv4/ip_local_port_range
 77 # 默认值:32768   61000
 78 # 作用:可用端口的范围,系统上的动态端口号范围。(表示用于向外连接的端口范围。缺省情况下很小:32768到61000  注意:这里不要将最低值设的太低,否则可能会占用掉正常的端口! )
 79 net.ipv4.ip_local_port_range = 20480  65535
 80 
 81 ######################## cat /proc/sys/net/ipv4/tcp_fin_timeout   82 # 默认值:60
 82 # 作用:TCP时间戳,表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。
 83 # SERVER由于某种原因关闭连接,如keepalive超时,这样,作为主动关闭的SERVER一方就会进入 FIN_WAIT2状态,但TCP/IP协议栈有个问题,FIN_WAIT2状态是没有超时的(不象TIME_WAIT状态),所以如果CLIENT不关闭,这个FIN_WAIT_2状态将保持到系统重新启动,越来越多的FIN_WAIT_2状态会致使内核crash。
 84 net.ipv4.tcp_fin_timeout = 2
 85 
 86 ######################## cat /proc/sys/net/ipv4/tcp_timestamps   88 # 默认值:1
 87 # 作用:TCP时间戳,时间戳可以避免序列号的卷绕。一个1Gbps 的链路肯定会遇到以前用过的序列号。该文件表示是否启用以一种比超时重发更精确的方法(RFC 1323)来启用对 RTT 的计算;为了实现更好的性能应该启用这个选项。
 88 net.ipv4.tcp_timestamps = 1
 89 
 90 ######################## cat /proc/sys/net/ipv4/tcp_tw_recycle
 91 # 默认值:0
 92 # 作用:针对TIME-WAIT,不要开启。不少文章提到同时开启tcp_tw_recycle和tcp_tw_reuse,会带来C/S在NAT方面的异常
 93 # 个人接受的做法是,开启tcp_tw_reuse,增加ip_local_port_range的范围,减小tcp_max_tw_buckets和tcp_fin_timeout的值
 94 # 参考:http://ju.outofmemory.cn/entry/91121, http://www.cnblogs.com/lulu/p/4149312.html
 95 # 解释二:表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。在nat环境中,建议关闭
 96 tw_reuse,tw_recycle 必须在客户端和服务端timestamps 开启时才管用(默认打开)
 97 # 注:它用来快速回收TIME_WAIT连接,不过如果在NAT环境下会引发问题。现在很多公司都用LVS做负载均衡,通常是前面一台LVS,后面多台后端服务器,这其实就是NAT,当请求到达LVS后,它修改地址数据后便转发给后端服务器,但不会修改时间戳数据,对于后端服务器来说,请求的源地址就是LVS的地址,加上端口会复用,所以从后端服务器的角度看,原本不同客户端的请求经过LVS的转发,就可能会被认为是同一个连接,加之不同客户端的时间可能不一致,所以就会出现时间戳错乱的现象,于是后面的数据包就被丢弃了,具体的表现通常是是客户端明明发送的SYN,但服务端就是不响应ACK,大概意思是说TCP有一种行为,可以缓存每个连接最新的时间戳,后续请求中如果时间戳小于缓存的时间戳,即视为无效,相应的数据包会被丢弃。
 98 # http://blog.csdn.net/caianye/article/details/38540867
 99 # http://www.cnblogs.com/lulu/p/4149312.html
100 # (除非得到技术专家的建议或要求﹐请不要随意修改这个值。)
101 net.ipv4.tcp_tw_recycle = 0
102 
103 ######################## cat /proc/sys/net/ipv4/tcp_tw_reuse
104 # 默认值:0
105 # 作用:开启TIME-WAIT sockets重用,做为客户端可以启用(例如,作为nginx-proxy前端代理,要访问后端的服务)表示是否允许重新应用处于TIME-WAIT状态的socket用于新的TCP连接(这个对快速重启动某些服务,而启动后提示端口已经被使用的情形非常有帮助)
106 net.ipv4.tcp_tw_reuse = 1
107 
108 ######################## cat /proc/sys/net/ipv4/tcp_max_tw_buckets  111 # 默认值:4096
109 # 作用:针对TIME-WAIT,配置其上限。如果降低这个值,可以显著的发现time-wait的数量减少,但系统日志中可能出现如下记录:
110 # kernel: TCP: time wait bucket table overflow
111 # 对应的,如果升高这个值,可以显著的发现time-wait的数量增加。
112 # 综合考虑,保持默认值。
113 net.ipv4.tcp_max_tw_buckets = 5000
114 
115 ######################## cat /proc/sys/net/ipv4/tcp_max_orphans  119 # 默认值:4096
116 # 作用:系统所能处理不属于任何进程的TCP sockets最大数量。假如超过这个数量﹐那么不属于任何进程的连接会被立即reset,并同时显示警告信息。之所以要设定这个限制﹐纯粹为了抵御那些简单的 DoS 攻击﹐千万不要依赖这个或是人为的降低这个限制。如果内存大更应该增加这个值。(这个值Redhat AS版本中设置为32768,但是很多防火墙修改的时候,建议该值修改为2000)
117 net.ipv4.tcp_max_orphans = 32768
118 
119 ######################## cat /proc/sys/net/ipv4/tcp_max_syn_backlog
120 # 默认值:1024
121 # 作用:增大SYN队列的长度,容纳更多连接。对于那些依然还未获得客户端确认的连接请求﹐需要保存在队列中最大数目。对于超过 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攻击(事实证明)
122 # (为了抵御syn攻击,我们设置大一点,建议不要超过65535)
123 net.ipv4.tcp_max_syn_backlog = 32000
124 
125 ######################## cat /proc/sys/net/ipv4/tcp_keepalive_intvl  130 # 默认值:75
126 # 作用:探测消息未获得响应时,重发该消息的间隔时间(秒)。默认值为75秒。 (对于普通应用来说,这个值有一些偏大,可以根据需要改小.特别是web类服务器需要改小该值,15是个比较合适的值)
127 net.ipv4.tcp_keepalive_intvl = 15
128 
129 ######################## cat /proc/sys/net/ipv4/tcp_keepalive_probes  135 # 默认值:9
130 # 作用:探测失败后,最多尝试探测几次。TCP发送keepalive探测以确定该连接已经断开的次数。(注意:保持连接仅在SO_KEEPALIVE套接字选项被打开是才发送.次数默认不需要修改,当然根据情形也可以适当地缩短此值.设置为5比较合适)
131 net.ipv4.tcp_keepalive_probes = 5
132 
133 ######################## cat /proc/sys/net/ipv4/tcp_keepalive_time  140 # 默认值:7200
134 # 作用:间隔多久发送1次keepalive探测包。TCP发送keepalive探测消息的间隔时间(秒),用于确认TCP连接是否有效。防止两边建立连接但不发送数据的攻击。
135 net.ipv4.tcp_keepalive_time = 600
136 
137 以下两个参数需要打开防火墙才会存在:
138 net.netfilter.nf_conntrack_tcp_timeout_established = 600
139 net.netfilter.nf_conntrack_max = 65535
140 所处目录/proc/sys/net/ipv4/netfilter/
141 ######################## cat /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_established
142 # 默认值:432000
143 # 作用:设置 conntrack tcp 状态的超时时间,如果系统出现下述异常时要考虑调整:
144 # ping: sendmsg: Operation not permitted
145 # kernel: nf_conntrack: table full, dropping packet.
146 # 参考:http://www.linuxidc.com/Linux/2012-11/75151.htm, http://blog.csdn.net/dog250/article/details/9318843
147 # 注解:已建立的tcp连接的超时时间,默认432000,也就是5天。影响:这个值过大将导致一些可能已经不用的连接常驻于内存中,占用大量链接资源,从而可能导致NAT ip_conntrack: table full的问题。建议:对于NAT负载相对本机的 NAT表大小很紧张的时候,可能需要考虑缩小这个值,以尽早清除连接,保证有可用的连接资源;如果不紧张,不必修改
148 net.netfilter.nf_conntrack_tcp_timeout_established = 600
149 
150 ######################## cat /proc/sys/net/netfilter/nf_conntrack_max
151 # 默认值:31248
152 # 作用:设置 conntrack 的上限,如果系统出现下述异常时要考虑调整:
153 # ping: sendmsg: Operation not permitted
154 # kernel: nf_conntrack: table full, dropping packet.
155 # 参考:https://blog.yorkgu.me/2012/02/09/kernel-nf_conntrack-table-full-dropping-packet/, http://www.cnblogs.com/mydomain/archive/2013/05/19/3087153.html
156 # 注解:系统支持的最大ipv4连接数,默认65536(事实上这也是理论最大值),同时这个值和你的内存大小有关,如果内存128M,这个值最大8192,1G以上内存这个值都是默认65536,这个值受/proc/sys/net/ipv4/ip_conntrack_max限制
157 net.netfilter.nf_conntrack_max = 65535
158 
159 ######################## cat /proc/sys/net/core/netdev_max_backlog
160 # 默认值:1000
161 # 作用:网卡设备将请求放入队列的长度。每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目,对重负载服务器而言,该值需要调高一点。
162 net.core.netdev_max_backlog = 65535
163 
164 ######################## cat /proc/sys/net/core/somaxconn
165 # 默认值:128
166 # 作用:已经成功建立连接的套接字将要进入队列的长度。定义了系统中每一个端口最大的监听队列的长度, 超过这个数量就会导致链接超时或者触发重传机制,这是个全局的参数,默认值为128, 限制了接收新 TCP 连接侦听队列的大小。对于一个经常处理新连接的高负载 web服务环境来说,默认的 128 太小了。大多数环境这个值建议增加到 1024 或者更多。 服务进程会自己限制侦听队列的大小(例如 sendmail(8) 或者 Apache),常常在它们的配置文件中有设置队列大小的选项。大的侦听队列对防止拒绝服务 DoS 攻击也会有所帮助。
167 net.core.somaxconn = 16384
168 
169 ######################## cat /proc/sys/net/core/rmem_default
170 # 默认值:212992
171 # 作用:默认的TCP数据接收窗口大小(字节)
172 net.core.rmem_default = 8388608
173 
174 ######################## cat /proc/sys/net/core/wmem_default
175 # 默认值:212992
176 # 作用:默认的TCP数据发送窗口大小(字节)
177 net.core.wmem_default = 8388608
178 
179 ######################## cat /proc/sys/net/core/rmem_max
180 # 默认值:212992
181 # 作用:最大的TCP数据接收窗口大小(字节)
182 net.core.rmem_max = 16777216
183 
184 ######################## cat /proc/sys/net/core/wmem_max
185 # 默认值:212992
186 # 作用:最大的TCP数据发送窗口大小(字节)
187 net.core.wmem_max = 16777216
188 
189 ######################## cat /proc/sys/net/ipv4/tcp_mem
190 # 默认值:21813   29084  43626
191 # 作用:内存使用的下限  警戒值  上限。
192 #low:当TCP使用了低于该值的内存页面数时,TCP不会考虑释放内存。即低于此值没有内存压力。(理想情况下,这个值应与指定给 tcp_wmem 的第 2 个值相匹配 - 这第 2 个值表明,最大页面大小乘以最大并发请求数除以页大小 (131072 * 300 / 4096)。 )
193 #pressure:当TCP使用了超过该值的内存页面数量时,TCP试图稳定其内存使用,进入pressure模式,当内存消耗低于low值时则退出pressure状态。(理想情况下这个值应该是 TCP 可以使用的总缓冲区大小的最大值 (204800 * 300 / 4096)。 )
194 #high:允许所有tcp sockets用于排队缓冲数据报的页面量。(如果超过这个值,TCP 连接将被拒绝,这就是为什么不要令其过于保守 (512000 * 300 / 4096) 的原因了。 在这种情况下,提供的价值很大,它能处理很多连接,是所预期的 2.5 倍;或者使现有连接能够传输 2.5 倍的数据。 我的网络里为192000 300000 732000)
195 # 一般情况下这些值是在系统启动时根据系统内存数量计算得到的。
196 net.ipv4.tcp_mem = 786432 1048576 1572864
197 
198 
199 ######################## cat /proc/sys/net/ipv4/tcp_wmem
200 # 默认值:4096    16384   4194304
201 # 作用:socket发送缓冲区内存使用的下限  警戒值  上限。
202 #min:为TCP socket预留用于发送缓冲的内存最小值。每个tcp socket都可以在建议以后都可以使用它。默认值为4096(4K)。
203 #default:为TCP socket预留用于发送缓冲的内存数量,默认情况下该值会影响其它协议使用的net.core.wmem_default 值,(该值会被wmen_default覆盖)一般要低于net.core.wmem_default的值。默认值为16384(16K)。
204 #max: 用于TCP socket发送缓冲的内存最大值。该值不会影响net.core.wmem_max,"静态"选择参数SO_SNDBUF则不受该值影响。默认值为131072(128K)。(对于服务器而言,增加这个参数的值对于发送数据很有帮助,在我的网络环境中,修改为了51200 131072 204800)(该值会被wmen_max覆盖)
205 net.ipv4.tcp_wmem = 8192 131072 16777216
206 
207 ######################## cat /proc/sys/net/ipv4/tcp_rmem
208 # 默认值:4096    87380   6291456
209 # 作用:socket接收缓冲区内存使用的下限  警戒值  上限。与tcp_wmen类似,不过它表示的是为自动调优所使用的接收缓冲区的值
210 net.ipv4.tcp_rmem = 32768 131072 16777216
211 
212 ####################################################################################################### cat /proc/sys/net/ipv4/tcp_thin_dupack
213 # 默认值:0
214 # 作用:收到dupACK时要去检查tcp stream是不是 thin ( less than 4 packets in flight) 。触发快速重传
215 net.ipv4.tcp_thin_dupack = 1
216 
217 ######################## cat /proc/sys/net/ipv4/tcp_thin_linear_timeouts
218 # 默认值:0
219 # 作用:重传超时后要去检查tcp stream是不是 thin ( less than 4 packets in flight)  230 net.ipv4.tcp_thin_linear_timeouts = 1
220 
221 ######################## cat /proc/sys/net/unix/max_dgram_qlen
222 # 默认值:10
223 # 作用:UDP队列里数据报的最大个数。如果请求量很大,需要调整此参数。系统默认为10,可以设置为100或者更大。或者增加worker进程的数量,减少单个worker进程分配的请求量。
224 net.unix.max_dgram_qlen = 30000
225 
226 ####################################################################################################### 针对lvs,关闭网卡LRO/GRO功能
227 # 现在大多数网卡都具有LRO/GRO功能,即网卡收包时将同一流的小包合并成大包 (tcpdump抓包可以看到>MTU 1500bytes的数据包)交给 内核协议栈;LVS内核模块在处理>MTU的数据包时,会丢弃;
228 # 因此,如果我们用LVS来传输大文件,很容易出现丢包,传输速度慢;
229 # 解决方法,关闭LRO/GRO功能,命令:
230 # ethtool -k eth0 查看LRO/GRO当前是否打开
231 # ethtool -K eth0 lro off 关闭GRO(默认是关闭的)
232 # ethtool -K eth0 gro off 关闭GRO
233 
234  【kernel】
235 ######################## cat /proc/sys/kernel/randomize_va_space
236 # 默认值:2
237 # 作用:内核的随机地址保护模式。Linux Kernel引入了地址空间布局随机化的概念,该概念的提出是出于安全考虑。试想如果堆栈空间的地址都是确定的,那么恶意代码就很容易
238 通过内存溢出的代码来访问堆栈空间的内容,地址空间布局随机化就是使得进程虚拟空间的布局(主要是各个部分的起始地址)位于随机的位置,以此来降低被攻击的可能性。在/proc/sys/kernel/randomize_va_space中的值如果为0则表示关闭所有的随机化,如果为1,表示打开mmap base、栈、VDSO页面随机化,如果为2则表示在1的基础上进一步打开堆地址随机化。在打开堆地址随机化之前,堆的起始位置是紧接着应用程序bss段之后的。
239 #(为了安全,不建议更改)
240 kernel.randomize_va_space = 2
241 
242 ######################## cat /proc/sys/kernel/panic
243 # 默认值:0
244 # 作用:内核panic时,1秒后自动重启。
245 kernel.panic = 1
246 
247 ######################## cat /proc/sys/kernel/core_pattern
248 # 默认值:|/usr/libexec/abrt-hook-ccpp %s %c %p %u %g %t e
249 # 作用:程序生成core时的文件名格式
250 # %p - insert pid into filename 添加pid
251 # %u - insert current uid into filename 添加当前uid
252 # %g - insert current gid into filename 添加当前gid
253 # %s - insert signal that caused the coredump into the filename 添加导致产生core的信号
254 # %t - insert UNIX time that the coredump occurred into filename 添加core文件生成时的unix时间
255 # %h - insert hostname where the coredump happened into filename 添加主机名
256 # %e - insert coredumping executable name into filename 添加命令名
257 # 格式如下:core.WorldSrv.1536975578.19309,可以添加路径。
258 kernel.core_pattern = core.%e.%t.%p
259 
260 ######################## cat /proc/sys/kernel/sysrq
261 # 默认值:16
262 # 作用:是否启用sysrq功能。SysRq代表的是Magic System Request Key。开启了这个功能以后,只要内核没有挂掉,它就会响应你要求的任何操作。但是这需要内核支持(CONFIG_MAGIC_SYSRQ选项)。使用sysrq组合键是了解系统目前运行情况, 允许按住Alt + PrtSc键打印内核信息,除非是调试,一般要关闭此功能。
263 kernel.sysrq = 0
264 
265 ######################## cat /proc/sys/kernel/msgmnb
266 # 默认值:16384
267 # 作用:每个消息队列的最大字节限制
268  kernel.msgmnb = 65536
269 
270 ######################## cat /proc/sys/kernel/msgmax
271 # 默认值:8192
272 # 作用:从一个进程发送到另一个进程的消息的最大长度(bytes)。进程间的消息传递是在内核的内存中进行的,不会交换到磁盘上,所以如果增加该值,则将增加操作系统所使用的内存数量
273 kernel.msgmax = 65536
274 
275 ######################## cat /proc/sys/kernel/shmmax
276 # 默认值:18446744073692774399
277 # 作用:表示内核所允许的最大共享内存段的大小(bytes)
278 kernel.shmmax = 68719476736
279 
280 ######################### cat /proc/sys/kernel/shmall
281 # 默认值:18446744073692774399
282 # 作用:系统上可以使用的共享内存的总量(bytes)
283 kernel.shmall = 4294967296
284 
285 
286 【vm】
287 (以下vm值谨慎修改,容易引起系统异常,没把握建议不动。)
288 ######################## cat /proc/sys/vm/min_free_kbytes
289 # 默认值:45056
290 # 作用:保留内存的最低值。该文件表示强制Linux VM最低保留多少空闲内存(Kbytes)。当可用内存低于这个参数时,系统开始回收cache内存,以释放内存,直到可用内存大于这个值。
291 #对于线上128G的内存的机器,可以考虑将min设置为512M左右。因为,太大了,可能会导致内存的浪费;当然如果只有40G的物理机,更不要考虑把min设置超过1G了,这样会导致频繁的触发内存回收;具体优化也要根据业务来看。
292 # 关键是在于调整内存的内核参数的时候! 调大的风险远大于调小的风险! 如果有人想将vm.min_free_kbytes 调大,千万要注意当前的水位,如果一旦调大vm.min_free_kbytes 立刻触发direct reclaim,可能会导致机器hang住,ping的通,ssh不上,影响业务!hang住的原因是当vm.min_free_kbytes 是512M的时候,此时 free只有1G,此时正常运行,此时如果调大vm.min_free_kbytes 到5G,将会direct reclaim失败。
293 (谨慎,修改不当容易宕机,不建议修改此值)
294 vm.min_free_kbytes=67584
295 
296 ######################## cat /proc/sys/vm/panic_on_oom
297 # 默认值:0
298 # 作用:发生oom时,自动转换为panic。
299 #默认为0开启    为1时表示关闭此功能 为2表示一定触发panic
300 #等于0时,表示当内存耗尽时,内核会触发OOM killer杀掉最耗内存的进程。
301 #当OOM Killer被启动时,通过观察进程自动计算得出各当前进程的得分 /proc/<PID>/oom_score,分值越高越容易被kill掉。
302 vm.panic_on_oom=1
303 
304 
305 ######################## cat /proc/sys/vm/swappiness
306 # 默认值:30
307 # 作用:数值(0-100)越高,越可能发生swap交换。swappiness的值的大小对如何使用swap分区是有着很大的联系的。swappiness=0的时候表示最大限度使用物理内存,然后才是 swap空间,swappiness=100的时候表示积极的使用swap分区,并且把内存上的数据及时的搬运到swap空间里面。也就是说,如果此值为30,你的内存在使用到100-30=70%的时候,就开始出现有交换分区的使用。大家知道,内存的速度会比磁盘快很多,这样子会加大系统io,同时造的成大量页的换进换出,严重影响系统的性能,所以我们在操作系统层面,要尽可能使用内存,对该参数进行调整。
308 vm.swappiness=0
309 
310  【fs】
311 ######################## cat /proc/sys/fs/inotify/max_user_watches
312 # 默认值:8192
313 # 作用:inotify的watch数量。表示同一用户同时可以添加的watch数目(watch一般是针对目录,决定了同时同一用户可以监控的目录数量)。太小容易引起too many open files错误。按照自己监控的文件数量级进行调整。(建议值:65536或者8192000)
314 fs.inotify.max_user_watches=8192000
315 
316 ######################## cat /proc/sys/fs/aio-max-nr
317 # 默认值:65536
318 # 作用:aio最大值。此参数限制并发未完成的异步请求数目,应该设置避免I/O子系统故障。
319 fs.aio-max-nr=1048576
320 
321 ######################## cat /proc/sys/fs/file-max
322 # 默认值:96124
323 # 作用:文件描述符的最大值。max-file 表示系统级别的能够打开的文件句柄的数量。是对整个系统的限制,并不是针对用户的。ulimit -n 控制进程级别能够打开的文件句柄的数量。提供对shell及其启动的进程的可用文件句柄的控制。这是进程级别的。对于服务器来说,file-max和ulimit都需要设置,否则会出现文件描述符耗尽的问题。 ulimit -n 65535。
324 fs.file-max = 1048575
325 
326 内核参数解释
327 
328 内核参数解释
内核参数解释

4.2、优化项整理

[root@localhost ~]# vim /etc/sysctl.conf 

末尾追加如下参数:

# 关闭ip路由转发
net.ipv4.ip_forward = 0

# 关闭ipv6
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1

# 禁止ping
net.ipv4.icmp_echo_ignore_all = 1

# 关闭tcp慢启动
net.ipv4.tcp_slow_start_after_idle = 0

# ARP缓存存活时间
net.ipv4.neigh.default.gc_stale_time = 120
net.ipv4.neigh.lo.gc_stale_time = 120

# 反向过滤
net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.default.rp_filter=0

# ARP回应级别
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_announce=2
net.ipv4.conf.all.arp_announce=2

# SYN设置(防DDOS)
# 启用cookie,防syn攻击
net.ipv4.tcp_syncookies = 1
# syn重传设置
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_synack_retries = 2
# 加大syn队列,缓解syn洪水攻击
net.ipv4.tcp_max_syn_backlog = 32000

# TCP/UDP协议允许使用的本地端口号(使用默认值,有需要再修改)
# net.ipv4.ip_local_port_range = 15000  65000

# 禁用所有IP源路由
net.ipv4.conf.default.accept_source_route = 0

### 应对timewait过高,tcp连接断开设置
# 启用时间戳,避免序列号卷绕
net.ipv4.tcp_timestamps = 1
# 是否启用timewait快速回收,保持默认
# net.ipv4.tcp_tw_recycle = 0
# 开启timewait sockets重用
net.ipv4.tcp_tw_reuse = 1
# 减少处于FIN-WAIT-2连接状态的时间,使系统可以处理更多的连接
net.ipv4.tcp_fin_timeout = 2
# 设置timewait值
net.ipv4.tcp_max_tw_buckets = 5000

## keepalive设置
# 间隔多久,发送一次keepalive探测
net.ipv4.tcp_keepalive_time = 600
# 探测失败后,间隔几秒发送探测
net.ipv4.tcp_keepalive_intvl = 15
# 探测失败,最多尝试几次
net.ipv4.tcp_keepalive_probes = 5

# 系统能处理的不属于任何进程的socket数量(建议>32768,可以抵御ddos)
net.ipv4.tcp_max_orphans = 3276800

# 每个端口可以监听的soket队列最大长度
net.core.somaxconn = 262144

# 网络接口比内核快时,允许队列的最大长度
net.core.netdev_max_backlog = 262144

## TCP窗口
net.core.rmem_default = 8388608
net.core.wmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
# 支持更大的TCP窗口. 如果TCP窗口最大超过65535(64K), 必须设置该数值为1
net.ipv4.tcp_window_scaling = 1 

# TCP缓冲区(根据需要设置)
# net.ipv4.tcp_wmem = 8192 131072 16777216
# net.ipv4.tcp_rmem = 32768 131072 16777216
# net.ipv4.tcp_mem = 786432 1048576 1572864

## kernel设置
# 控制core文件名是否添加pid作为扩展
kernel.core_uses_pid = 1
# 修改core文件名格式
kernel.core_pattern = core.%e.%t.%p
# 关闭Magic System Request Key调试
kernel.sysrq = 0
# 每个消息队列最大字节限制
kernel.msgmnb = 65536
# 整个系统最大消息队列数量限制
kernel.msgmax = 65536
# 单个共享内存段大小限制
kernel.shmmax = 68719476736
# 系统所有共享内存总量
kernel.shmall = 4294967296

## vm设置
# 最大限度使用物理内存
vm.swappiness = 0

## fs设置
# inotify监控的目录数量
fs.inotify.max_user_watches=8192000
# aio最大值,避免i/o异常
fs.aio-max-nr=1048576
# 系统文件描述符限制
fs.file-max = 1048575

刷新配置,立即生效

[root@localhost ~]# sysctl -p

4.3、修改系统文件描述符限制

修改文件描述符限制,可以避免因为这个值太小而引起的Too many open files 的错误。

4.3.1、用户级的文件描述符

查看LINUX默认的文件描述符:

[root@localhost ~]# ulimit -n
1024
[root@localhost ~]#

用命令修改。该值要小于系统最大限制file-max

[root@localhost ~]# ulimit -HSn 65536
[root@localhost ~]# ulimit -n
65536
[root@localhost ~]#

但这个变更只对当前的session有效当断开连接重新连接后更改就失效了

如果想永久变更需要修改/etc/security/limits.conf 文件

[root@localhost ~]# vim /etc/security/limits.conf
# 追加下面几行
root soft nofile 65535
root hard nofile 65535
* soft nofile 65535
* hard nofile 65535

保存退出后重新登录,其最大文件描述符已经被永久更改了。

这只是修改用户级的最大文件描述符限制,也就是说每一个用户登录后执行的程序占用文件描述符的总数不能超过这个限制。

4.3.2、系统级的文件描述符

查看当前系统文件描述符:

[root@localhost ~]# sysctl -a|grep file-max
fs.file-max = 387188

或者:

[root@localhost ~]# cat /proc/sys/fs/file-max
387188

它是限制所有用户打开文件描述符的总和,可以通过修改内核参数来更改该限制:

[root@localhost ~]# sysctl -w fs.file-max=1048575

或者:

[root@localhost ~]# echo "1048575" > /proc/sys/fs/file-max

两者作用是相同的,前者改内核参数,后者直接作用于内核参数在虚拟文件系统(procfs, psuedo file system)上对应的文件而已。

使用sysctl命令更改也是临时的,如果想永久更改需要在/etc/sysctl.conf添加

[root@localhost ~]# vim /etc/sysctl.conf
fs.file-max=1048575

保存退出后使用sysctl -p 命令使其生效。

[root@localhost ~]# sysctl -p

与file-max参数相对应的还有file-nr,这个参数是只读的,可以查看当前文件描述符的使用情况。

[root@localhost ~]# sysctl -a|grep file-nr
fs.file-nr = 1408 0 1048575

5、Yum源配置(ECS可不设置)

5.1、修改Yum源为国内镜像

有时候CentOS默认的yum源不一定是国内镜像,导致yum在线安装及更新速度不是很理想。这时候需要将yum源设置为国内镜像站点。国内主要开源的开源镜像站点应该是网易和阿里云了。这里我们选择阿里云的。

备份原有配置:

[root@localhost ~]# mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

下载阿里云镜像配置(针对自己系统下载对应的)

[root@localhost ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 

清空缓存

[root@localhost ~]# yum clean all

image

重新生成缓存,它会选择最快的源。

[root@localhost ~]# yum makecache

image

更新yum

[root@localhost ~]# yum -y update

image

可以看到源地址已经变成阿里云的了,等他自己更新完毕,下次yum就是使用阿里云的源了。

注意:

1、如果yum makecache的时候,出现以下错误:

[Errno 14] HTTPS Error 404 - Not Found

[Errno 14] curl#7 - "Failed connect to ftp.yzu.edu.tw:443; Connection refused"

[Errno 12] Timeout on

Trying other mirror.

是本地仓库缓存问题。

[root@localhost ~]# yum clean all
[root@localhost ~]# rpm --rebuilddb
[root@localhost ~]# yum makecache

清除缓存,重建本地仓库,然后再重新生成缓存就好了。

5.2、搭建本地Yum源

参考:https://www.cnblogs.com/nidey/p/6200685.html

有的时候,我们的环境可能是在局域网里面,没办法使用网上的yum源,那么我们可以自己搭建一个本地/局域网的yum源。

5.2.1、查看当前系统版本

[root@localhost ~]# cat /etc/redhat-release 
CentOS Linux release 7.3.1611 (Core) 
[root@localhost ~]#

可以看到,我们的系统是CentOS 7.3,我们等下也要准备一个CentOS 7.x的ISO镜像

5.2.2挂载ISO镜像

下载一个ISO镜像CentOS-7-x86_64-DVD-1611.iso

[root@localhost ~]# mkdir /mnt/yum-iso
[root@localhost ~]# mount /dev/cdrom /mnt/yum-iso/
mount: /dev/sr0 is write-protected, mounting read-only

为了避免影响ISO镜像本身,我们将其中的内容拷贝出来。

[root@localhost ~]# mkdir /yum/
[root@localhost ~]# cp -a /mnt/yum-iso/ /yum/
[root@localhost ~]# ll /yum/
total 0
drwxr-xr-x. 8 root root 254 Dec  5  2016 yum-iso
[root@localhost ~]# ll /yum/yum-iso/
total 308
-rw-r--r--. 1 root root     14 Dec  5  2016 CentOS_BuildTag
drwxr-xr-x. 3 root root     35 Dec  5  2016 EFI
-rw-r--r--. 1 root root    215 Dec 10  2015 EULA
-rw-r--r--. 1 root root  18009 Dec 10  2015 GPL
drwxr-xr-x. 3 root root     57 Dec  5  2016 images
drwxr-xr-x. 2 root root    198 Dec  5  2016 isolinux
drwxr-xr-x. 2 root root     43 Dec  5  2016 LiveOS
drwxrwxr-x. 2 root root 212992 Dec  5  2016 Packages
drwxrwxr-x. 2 root root   4096 Dec  5  2016 repodata
-rw-r--r--. 1 root root   1690 Dec 10  2015 RPM-GPG-KEY-CentOS-7
-rw-r--r--. 1 root root   1690 Dec 10  2015 RPM-GPG-KEY-CentOS-Testing-7
-r--r--r--. 1 root root   2883 Dec  5  2016 TRANS.TBL
[root@localhost ~]# 

5.2.3、备份移除其它镜像源

[root@localhost ~]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# mkdir bak
[root@localhost yum.repos.d]# mv * ./bak/
mv: cannot move ‘bak’ to a subdirectory of itself, ‘./bak/bak’
[root@localhost yum.repos.d]# ls
bak
[root@localhost yum.repos.d]# 

5.2.4、编辑本地yum源local.repo

[root@localhost yum.repos.d]# vim local.repo
[local]
name=local-media
baseurl=file:///yum/yum-iso/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

5.2.5、清除缓存

[root@localhost yum.repos.d]# yum clean all
[root@localhost yum.repos.d]# yum makecache

image

5.2.6、测试:

接下来就可以直接使用本地yum来安装软件了

image

6、时钟同步(ECS可不设置)

6.1、时间查看

查看系统当前时间,HKT表示香港时区

[root@localhost ~]# date
Thu Sep 27 18:30:53 HKT 2018

顺便查看时区,+800表示东8区

[root@localhost ~]# date -R
Thu, 27 Sep 2018 18:30:57 +0800

查看bios时间

[root@localhost ~]# hwclock
Fri 28 Sep 2018 03:29:34 AM HKT  -0.793109 seconds

查看时区

[root@localhost ~]# timedatectl 
      Local time: Thu 2018-09-27 19:32:14 HKT
  Universal time: Thu 2018-09-27 11:32:14 UTC
        RTC time: Thu 2018-09-27 19:31:51
       Time zone: Asia/Hong_Kong (HKT, +0800)
     NTP enabled: n/a
NTP synchronized: no
RTC in local TZ: no
      DST active: n/a

或者

[root@localhost ~]# date +"%Z %z"
HKT +0800

# %Z是字符时区,%z是数字时区

Centos6.x可以这样看时区

[root@localhost ~]# cat /etc/timezone 
Asia/Shanghai

看日历

[root@localhost ~]# cal
   September 2018   
Su Mo Tu We Th Fr Sa
                   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
[root@localhost ~]#

6.2、手动修改时间

6.2.1、使用date修改系统时间

(手动修改会有一点误差)

修改系统时间为20:00:00

[root@localhost ~]# date
Thu Sep 27 19:42:50 HKT 2018
[root@localhost ~]# date -s 20:00:00
Thu Sep 27 20:00:00 HKT 2018

修改系统时间为2018年9月28日

[root@localhost ~]# date -s 09/28/2018
Fri Sep 28 00:00:00 HKT 2018

修改系统时间为2018年9月28日20:00:00

[root@localhost ~]# date -s "2018-09-28 20:00:00"
Fri Sep 28 20:00:00 HKT 2018

6.2.2、修改硬件时间

系统启动的时候,会从BIOS里面读取时间,所以硬件时间是个很重要的依据。

[root@localhost ~]# hwclock -w
[root@localhost ~]# hwclock
Fri 28 Sep 2018 08:02:23 PM HKT  -0.991277 seconds

命令hwclock -w是将系统当前时间写入bios。

6.2.3、修改时区

如果服务器是为美国那边的用户服务的,那么可能就需要将时区改为美国东部那边。美国东部时区为西五区。根据需要设置。中国是东八区。

查看时区文件

[root@localhost ~]# ll /etc/localtime 
lrwxrwxrwx. 1 root root 36 Jul 26  2017 /etc/localtime -> ../usr/share/zoneinfo/Asia/Hong_Kong

方法一(修改ln指向)

这是一个链接文件,不建议直接cp覆盖,建议也用ln修改指向。

[root@localhost ~]# ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
[root@localhost ~]# ll /etc/localtime 
lrwxrwxrwx 1 root root 33 Sep 28 20:11 /etc/localtime -> /usr/share/zoneinfo/Asia/Shanghai

方法二(timedatectl修改,推荐)

[root@localhost ~]# timedatectl set-timezone Asia/Hong_Kong
[root@localhost ~]# timedatectl 
      Local time: Fri 2018-09-28 20:13:45 HKT
  Universal time: Fri 2018-09-28 12:13:45 UTC
        RTC time: Fri 2018-09-28 12:13:45
       Time zone: Asia/Hong_Kong (HKT, +0800)
     NTP enabled: n/a
NTP synchronized: no
RTC in local TZ: no
      DST active: n/a
[root@localhost ~]# ll /etc/localtime 
lrwxrwxrwx 1 root root 36 Sep 28 20:13 /etc/localtime -> ../usr/share/zoneinfo/Asia/Hong_Kong

方法三(tzselect选择,不建议)

Tzselect只是设置TZ变量的值。这是设置时区为台北的时区。

[root@localhost ~]# tzselect 
Please identify a location so that time zone rules can be set correctly.
Please select a continent or ocean.
 1) Africa
 2) Americas
 3) Antarctica
 4) Arctic Ocean
 5) Asia
 6) Atlantic Ocean
 7) Australia
 8) Europe
 9) Indian Ocean
10) Pacific Ocean
11) none - I want to specify the time zone using the Posix TZ format.
#? 5
Please select a country.
 1) Afghanistan		  18) Israel		    35) Palestine
 2) Armenia		  19) Japan		    36) Philippines
 3) Azerbaijan		  20) Jordan		    37) Qatar
 4) Bahrain		  21) Kazakhstan	    38) Russia
 5) Bangladesh		  22) Korea (North)	    39) Saudi Arabia
 6) Bhutan		  23) Korea (South)	    40) Singapore
 7) Brunei		  24) Kuwait		    41) Sri Lanka
 8) Cambodia		  25) Kyrgyzstan	    42) Syria
 9) China		  26) Laos		    43) Taiwan
10) Cyprus		  27) Lebanon		    44) Tajikistan
11) East Timor		  28) Macau		    45) Thailand
12) Georgia		  29) Malaysia		    46) Turkmenistan
13) Hong Kong		  30) Mongolia		    47) United Arab Emirates
14) India		  31) Myanmar (Burma)	    48) Uzbekistan
15) Indonesia		  32) Nepal		    49) Vietnam
16) Iran		  33) Oman		    50) Yemen
17) Iraq		  34) Pakistan
#? 43

The following information has been given:

	Taiwan

Therefore TZ='Asia/Taipei' will be used.
Local time is now:	Fri Sep 28 20:16:13 CST 2018.
Universal Time is now:	Fri Sep 28 12:16:13 UTC 2018.
Is the above information OK?
1) Yes
2) No
#? 1

You can make this change permanent for yourself by appending the line
	TZ='Asia/Taipei'; export TZ
to the file '.profile' in your home directory; then log out and log in again.

Here is that TZ value again, this time on standard output so that you
can use the /bin/tzselect command in shell scripts:
Asia/Taipei
[root@localhost ~]# ll /etc/localtime 
lrwxrwxrwx 1 root root 36 Sep 28 20:13 /etc/localtime -> ../usr/share/zoneinfo/Asia/Hong_Kong
[root@localhost ~]# TZ='Asia/Taipei'; export TZ

发现系统时区localtime等并没有变,只是$TZ值变了。

退出重新登录, 发现时间变了,而且TZ值也变了,但是timedatectl与/etc/localetime并没有改变。

image

6.3、配置时间同步

手动设置时间有误差,建议设置时间自动同步。

6.3.1、设置时区

首先,必须保证服务器上的时区是正确的。可以根据6.2上面的设置时区。

6.3.2、用ntpdate从时间服务器更新时间

使用ntpdate是进行断点更新,适用于新购买的服务器。如果服务器上已有程序在运行,并且非常依赖时间,不建议用ntpdate修改。

[root@localhost doubles]# yum install ntpdate -y
[root@localhost doubles]# date #(当前时间之前手动改过,不准的)
2018年 09月 28日 星期五 21:07:39 HKT
[root@localhost doubles]# ntpdate ntp1.aliyun.com
27 Sep 20:54:38 ntpdate[109231]: step time server 120.25.115.20 offset -87263.329116 sec
[root@localhost doubles]# cd
[root@localhost ~]# date # (与服务器上时间同步后,时间正确)
2018年 09月 27日 星期四 20:54:45 HKT
[root@localhost ~]#
加入计划任务,定时自动同步
[root@localhost ~]# crontab -e
*/10 * * * * ntpdate ntp1.aliyun.com

ntp常用服务器有:

中国国家授时中心:210.72.145.44
    NTP服务器(上海) :ntp.api.bz
    美国:time.nist.gov
    复旦:ntp.fudan.edu.cn
    微软公司授时主机(美国) :time.windows.com
    台警大授时中心(台湾):asia.pool.ntp.org

阿里云服务器:ntp1.aliyun.com

6.3.3搭建ntp时间服务器

ntpd是逐渐的调整时间。已经运行的业务建议用ntpd去调整时间。

[root@localhost doubles]# systemctl list-unit-files|grep ntp
[root@localhost doubles]# yum install ntpd -y

修改配置(可参考ecs的ntp配置。)

[root@localhost ~]# vim /etc/ntp.conf 
server ntp1.aliyun.com iburst
# 允许内网中其他机器同步时间
restrict 192.168.188.0 mask 255.255.255.0 nomodify notrap
# local clock
server 127.127.1.0
fudge  127.127.1.0 stratum 10

image

nomodify 客户端不能修改服务器时间,但是可以从服务器获取时间

notrap 客户端不能使用trap(远端事件登录功能remote event logging)

noquery 其他客户端不能从本机获取时间

server后面加prefer表示优先

默认不允许查询,不允许修改。如果需要放开作为源给其他服务器同步,则可以放开restrict权限。Server优先级默认从上到下,可以把不需要的server注释掉。

配置完就启动ntpd服务

[root@localhost ~]# systemctl start ntpd

服务器启动后,ntp就会自动去同步时间。

加入开机启动项

[root@localhost ~]# systemctl enable ntpd
Created symlink from /etc/systemd/system/multi-user.target.wants/ntpd.service to /usr/lib/systemd/system/ntpd.service.

查看ntp进程

[root@localhost ~]# netstat -anplut|grep ntpd
udp        0      0 192.168.188.128:123     0.0.0.0:*                           109969/ntpd         
udp        0      0 127.0.0.1:123           0.0.0.0:*                           109969/ntpd         
udp        0      0 0.0.0.0:123             0.0.0.0:*                           109969/ntpd         
udp6       0      0 fe80::20c:29ff:fe02:123 :::*                                109969/ntpd         
udp6       0      0 ::1:123                 :::*                                109969/ntpd         
udp6       0      0 :::123                  :::*                                109969/ntpd         
[root@localhost ~]#

确保本机123端口在防火墙是放开的,否则无法同步。

[root@localhost ~]# /sbin/iptables -I INPUT -p udp --dport 123 -j ACCEPT

查看本ntpd服务器与上游服务器的连接状态。

[root@localhost ~]# ntpq -pn
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*193.228.143.23  77.40.226.114    2 u   32   64  377  312.107  -46.633  67.015
+209.97.168.88   255.254.0.31     2 u   28   64  373  352.398  -35.452  14.016
+108.59.2.24     130.133.1.10     2 u   30   64  367  249.543  -23.319  37.869
-193.228.143.24  194.58.202.148   2 u   28   64  371  372.893   -2.522  20.685
-120.25.115.20   10.137.53.7      2 u   25   64  377    7.256  -23.520  10.701
[root@localhost ~]#

查看与上游服务器连接状态:

[root@localhost ~]# ntpstat
synchronised to NTP server (209.97.168.88) at stratum 3 # 表示在第三层
   time correct to within 1209 ms
   polling server every 64 s # 下次更新时间
[root@localhost ~]#

remote:即NTP主机的IP或主机名称。注意最左边的符号,如果由“+”则代表目前正在作用钟的上层NTP,如果是“*”则表示也有连上线,不过是作为次要联机的NTP主机。

refid:参考的上一层NTP主机的地址

st:即stratum阶层

when:几秒前曾做过时间同步更新的操作

poll:下次更新在几秒之后

reach:已经向上层NTP服务器要求更新的次数

delay:网络传输过程钟延迟的时间

offset:时间补偿的结果

jitter:Linux系统时间与BIOS硬件时间的差异时间

/etc/ntp/step-tickers是用于ntpdate同步时会查找的上源服务器,可以不设置,以ntp.conf为准。

要注意的是,ntpd 有一个自我保护设置:如果本机与上源时间相差太大(比如1000秒),ntpd 不运行。所以新设置的时间服务器一定要先ntpdate 从上源取得时间初值。然后启动ntpd 服务。

在本机服务器192.168.188.128上搭好ntp服务器后,它就可以自动去上游服务器同步时间,前提是时间差别不能太大,如果太大的话,需要用ntpdate校正。

客户端也可以去这台ntp服务器取时间

在另一台机器192.168.188.129

[root@localhost doubles]# ntpdate 192.168.188.128
27 Sep 23:34:24 ntpdate[52393]: step time server 192.168.188.128 offset -28835.317639 sec
[root@localhost ~]# crontab -e
*/10 * * * * ntpdate 192.168.188.128

同步硬件时间

ntp服务,默认只会同步系统时间。如果想要让ntp同时同步硬件时间,可以设置/etc/sysconfig/ntpd文件,在/etc/sysconfig/ntpd文件中,添加 SYNC_HWCLOCK=yes 这样,就可以让硬件时间与系统时间一起同步。

#允许BIOS与系统时间同步,也可以通过hwclock -w 命令

SYNC_HWCLOCK=yes

Ntpd与ntpdate的区别

1、ntpdate是立即调整当前时间,立即生效,容易产生时间的跃变,调整不当程序容易混乱。

2、Ntpd是进行时钟的校准,是平滑的,一点点的校准,往往需要3-4min,需要立即启动的可能也会有问题。

3、一般开机的时候才会用ntpdate去调整时间,其余都是用ntpd去同步的。

7、系统字符集设置(可不设置)

Linux默认字符集是英文,如果想要显示中文的话,就需要修改字符集。CentOS6.x字符集设置是修改/etc/sysconfig/i18n,CentOS7.x字符集设置是修改/etc/locale.conf。

查看系统当前字符集设置:

[root@localhost ~]# locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
[root@localhost ~]#

修改字符集:

临时修改字符集:

[root@localhost ~]# LANG="zh_CN.UTF-8";export=LANG

image

永久修改字符集:

[root@localhost ~]# vim /etc/locale.conf # (CentOS6.x是修改/etc/sysconfig/i18n)
#LANG="en_US.UTF-8"
LANG="zh_CN.UTF-8"
SUPPORTED="zh_CN.UTF-8:zh_CN:zh"
SYSFONT="latarcyrheb-sun16"

image

Source配置使立即生效

[root@localhost ~]# source /etc/locale.conf

Xshell终端也要设置相应的字符集

image

至此,系统字符集设置完毕。

posted @ 2018-09-28 18:08 doublexi 阅读(...) 评论(...) 编辑 收藏