iptables
CentOS 官方iptables规则:开启ssh端口,允许icmp/ping,不接受其它连接;拒绝FORWARD转发。这是科学的,如果有需要开放的端口再做手工开启。
如果没有默认规则文件 /etc/sysconfig/iptables ,可见自行yum安装 yum install iptables-services,然后 service iptables restart 或 systemctl restart iptables 加载默认规则,通过iptables命令修改过规则后 service iptables save 保存规则。默认配置文件如下,可参考使用。
# Generated by iptables-save v1.4.7 on Sat Dec 17 10:11:38 2011 # Manual customization of this file is not recommended. *filter :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT -A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -j REJECT --reject-with icmp-host-prohibited COMMIT
sshd: 端口
ssh的服务器端,重要性不需多讲。
其主配置文件 /etc/ssh/sshd_config (注意不是 /etc/ssh/ssh_config),下面sshd相关配置都在该文件上修改
改一下监听端口,虽然刻意扫描你,还是没的跑,但起码隐藏了一点点。大概13行,Port指令,默认是注释掉的,取消注释,将其后端口号22改成你想要改的,下面以12345为例。注意不要超过65535,不要使用其它已监听端口
Port 12345
[至关重要] iptables里打开相关端口,不要断开当前连接、重启sshd 服务,保存iptables配置到磁盘(以备下次开机时自动生效)
# iptables -I INPUT 4 -m state --state NEW -p tcp --dport 12345 -j ACCEPT
再开一个ssh客户端测试连接,确保改后的端口可以连接。(即使已改过端口,当前连接也还是会保持的)
指定自定义端口的ssh连接: ssh -p 12345 username@your.host.ip
sshd: 用户白名单
限制一下允许通过ssh远程登录的用户名(白名单),可以在文件结尾增加如下一行
AllowUsers user1 user2 user3
其中的user1 user2 user3 是允许通过ssh远程登录的用户,多个用户使用空格分隔。当然,你要事先创建这些普通用户,不然下次就连不上了。
sshd: 禁止root用户直接通过ssh登录
被暴力破解root密码是一件经常遇到的事情,所以严重推荐禁止掉,尤其是使用默认22端口时。增加下一行配置
PermitRootLogin no
日期时间的自动同步
首先确保rdate已安装,使用美国授时中心服务器,加入到crontab,每周日同步一次
# crontab -e * * * * 0 rdate -s time.nist.gov
详细可参考 linux下日期时间自动同步设置(rdate,ntpdate两种方法)
yum源
开启epel源
CentOS官方yum默认包含了epel-release的yum源,直接安装即可。
yum install epel-release
排除某些rpm包
编辑yum主配置文件 /etc/yum.conf ,在[main] 节点里增加一行exclude指令。比如启用第三方内核时,运行yum更新时,若kernel*有更新,默认内核就会变成官方内核;为避免这个麻烦,可以把kernel*包从yum更新中排除掉。排除多个包可以空格隔开列在同一行,示例如下
exclude=kernel* httpd*
nginx
如果使用nginx的话,可以使用nginx的官方yum源。当然里面只有nginx,没有别的包,所以不会破坏centos原装包的依赖关系。创建/etc/yum.repos.d/nginx.repo内容如下
[nginx-stable] name=nginx stable repo baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=1 enabled=1 gpgkey=https://nginx.org/keys/nginx_signing.key [nginx-mainline] name=nginx mainline repo baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/ gpgcheck=1 enabled=0 gpgkey=https://nginx.org/keys/nginx_signing.key
详细参考nginx官方yum源说明
SELinux
这货很强悍,然而有时也很麻烦,尤其是不够熟的时候,可以考虑关闭,配置在文件 /etc/sysconfig/selinux 中设置 SELINUX=disabled 或 SELINUX=permissive
Grub 2 及第三方内核相关的设置
CentOS 7的Grub2 改变有点大,设置被拆到个文件中,比如 /boot/grub2/grub.cfg, /etc/default/grub 及/boot/grub2/grubenv 等。注意不要手工编辑grub.cfg。
如果使用的第三方内核,要注意指定默认启动的内核。默认情况下/etc/default/grub里设置了 GRUB_DEFAULT=saved ,要通过/boot/grub2/grubenv指定,但也不要手工修改该文件,而是使用 grub2-set-default 命令的设置。如下三行 1) 列出grub.cfg里的menuentry名称, 2) 设置默认项 grub2-set-default 3) 查看grubenv确认默认项saved_entry
grep "^menuentry" /boot/grub2/grub.cfg |cut -d "'" -f2 grub2-set-default "{menuentry 名称}" grub2-editenv list
Grub2 参考CentOS 官方文档: https://wiki.centos.org/zh/HowTos/Grub2
开启BBR
实体机/KVM/Xen的VPS下,使用第三方内核开启BBR
本节适用实体机或KVM、Xen虚拟化下的VPS(此方法不支持OpenVZ)。CentOS7官方内核较老,不支持BBR,可使用 ELRepo Project 预编译的内核。其中rpm包url可能会不定期更新,以官方最新为准。(另CentOS6可使用Fedora Copr上项目kernel-el6/)
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org yum install https://www.elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm yum --enablerepo=elrepo-kernel install kernel-ml -y
参考上节Grub2默认内核做设置,完成后重启,确认内核生效无误。然后再继续。这里最好。
echo 'net.core.default_qdisc=fq' | tee -a /etc/sysctl.conf echo 'net.ipv4.tcp_congestion_control=bbr' | tee -a /etc/sysctl.conf sysctl -p
完成后,下面命令确认生效
sysctl net.ipv4.tcp_available_congestion_control sysctl -n net.ipv4.tcp_congestion_control lsmod | grep bbr
其输出应该是 net.ipv4.tcp_available_congestion_control = bbr cubic reno 及 bbr 及 tcp_bbr 16384 0 (后一行输出的数字可能不同)。
至此bbr启用完成。但,强烈推荐,参考前节“排除某些rpm包”,把kernel* 包从yum更新中排除掉;否则,下次yum更新后,grub默认内核将换成centos官方内核,bbr就没了。
详细可参看 https://www.vultr.com/docs/how-to-deploy-google-bbr-on-centos-7
魔改版BBR(OpenVZ VPS下可用)
基于OpenVZ的 VPS上面方法不支持,得使用魔改版BBR,要求CentOS 7以上(事实上CentOS 6(x64)也可以,但必须升级glibc),一键安装脚本,照提示操作即可。
curl https://raw.githubusercontent.com/linhua55/lkl_study/master/get-rinetd.sh | bash
运行中会提示输入端口号,如有多个端口号用空格隔开(不支持端口段)。如需要增减端口,可修改配置文件 /etc/rinetd-bbr.conf
详细参看作者的github项目 。
MySQL-Server
配置参考 一份生产环境下MySQL服务配置优化参考样本 (请按硬件及负载酌情修改)
备份脚本,加入到crontab中,定时执行。注意其中备份存储目录、待备份数据库列表、及备份用户账号密码
#!/bin/bash # Program: # auto backup mysql database # History: # 2012/05/14 fengyqf First release #backup folder, with the last slash "/" backup_folder="/home/user/backup/mysql/" filename=`date +_%Y%m%d_%N` for db in db1 db2 db3 do mysqldump -hlocalhost --opt -e --max_allowed_packet=1048576 --net_buffer_length=16384 -uroot -pYourMysqlRootPassword $db |gzip > $backup_folder$db$filename.sql.gz done
其它置参考
ulimit, 文件描述符 http://www.path8.net/tn/archives/2024
sysctl, 内核优化 #TODO#