[TOC]
# 優化條目:
- 固定ip地址、網關、主機名、DNS等
- 關閉selinux,清空iptables
- 添加普通用戶并進行sudo授權管理
- 刪除非必要的用戶
- 更新yum源及必要軟件安裝
- 定時自動更新服務器時間
- 精簡開機自啟動服務
- 修改默認的ssh服務端口,使用密鑰登錄系統,禁止用戶使用密碼遠程連接
- 鎖定關鍵文件系統
- 調整文件描述符大小
- 去除系統及內核版本登錄前的屏幕顯示
- 禁止ping
- 歷史記錄
- 內核參數優化
## 1. 固定ip地址、網關、主機名、DNS等
```
[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0 #網卡名字
BOOTPROTO=static #靜態IP地址獲取狀態 如:DHCP表示自動獲取IP地址
IPADDR=192.168.1.113 #IP地址
NETMASK=255.255.255.0 #子網掩碼
ONBOOT=yes #是否開機自啟
GATEWAY=192.168.1.1
[root@localhost ~]# vi /etc/hostname #修改主機名重啟后永久生效
localhost.localdomain
[root@localhost ~]# hostname zabbix #修改主機名本次生效
[root@localhost ~]# vi /etc/resolv.conf #修改DNS信息
nameserver 114.114.114.114
nameserver 8.8.8.8
[root@localhost ~]# service network restart #重啟網卡,生效
```
## 2. 關閉selinux,清空iptables
```
[root@localhost ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config #永久關閉selinux需要重啟生效
[root@localhost ~]# setenforce 0 #臨時關閉selinux,本次生效
[root@localhost ~]# getenforce #查看selinux狀態
[root@localhost ~]# iptables -F #清空已存iptables記錄
```
## 3. 添加普通用戶并進行sudo授權管理
```
[root@localhost ~]# useradd liuw #新建賬戶
[root@localhost ~]# visudo #編輯sudoers文件,用戶重新登錄后生效
root ALL=(ALL) ALL
liuw ALL=(ALL) ALL #新增這一行,執行sudo需要輸入用戶自己的密碼
liuw ALL=(ALL) NOPASSWD:ALL #新增這一行,可無密碼執行sudo命令
```
## 4. 刪除非必要的用戶
```
可刪除的用戶:
adm,lp,sync,shutdown,halt,news,uucp,operator,games,gipher
```
## 5. 更新yum源及必要軟件安裝
```
[root@localhost ~]# ls /etc/yum.repos.d/
CentOS-Base.repo CentOS-Debuginfo.repo CentOS-Media.repo CentOS-Vault.repo
CentOS-CR.repo CentOS-fasttrack.repo CentOS-Sources.repo
[root@localhost ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo #替換官方yum源為阿里云
[root@localhost ~]# yum clean all #清空yum緩存
[root@localhost ~]# yum makecache #生成yum緩存
```
## 5. 定時同步服務器時間
```
手動修改時間
date -s "20190101 18:05:06" 或 timedatectl set-time '2019-12-08'
設置時區
timedatectl set-timezone Asia/Shanghai
同步ntp服務器時間,可搭配任務計劃
yum -y install ntp ntpdate #安裝同步工具
ntpdate 2.asia.pool.ntp.org #同步時間
編輯時間配置文件每隔2天同步一次
vi /etc/crontab
# * */48* * * ntpdate 2.asia.pool.ntp.org
將系統時間寫入硬件時間
# hwclock --systohc
```
## 6. 精簡開機自啟動服務
```
chkconfig --list #列出開機啟動的服務
chkconfig --add <name> #新增開機啟動的服務
chkconfig --del <name> #刪除開機啟動的服務
chkconfig --level 35 mysqld on #設定mysqld在等級3和5為開機運行服務
過濾出已經開啟的啟動項
systemctl list-unit-files | grep enable
auditd.service enabled 安全審計 保留
autovt@.service enabled 登錄相關 保留
crond.service enabled 定時任務 保留
dbus-org.fedoraproject.FirewallD1.service enabled
dbus-org.freedesktop.NetworkManager.service enabled
dbus-org.freedesktop.nm-dispatcher.service enabled
firewalld.service enabled 防火墻 保留
getty@.service enabled tty控制 保留
irqbalance.service enabled
kdump.service enabled 內核崩潰信息捕獲 可關閉
lvm2-monitor.service enabled
microcode.service enabled
NetworkManager-dispatcher.service enabled 網卡守護進程 關閉
NetworkManager.service enabled
postfix.service enabled 郵件服務 關閉
rsyslog.service enabled 日志服務 保留
sshd.service enabled 用于遠程訪問 保留
systemd-readahead-collect.service enabled 內核調用預讀取 保留
systemd-readahead-drop.service enabled
systemd-readahead-replay.service enabled
tuned.service enabled
dm-event.socket enabled
lvm2-lvmetad.socket enabled
lvm2-lvmpolld.socket enabled
default.target enabled 默認啟動項 multi-user.target的軟連接 保留
multi-user.target enabled 啟動用戶命令環境 保留
remote-fs.target enabled 集合遠程文件掛載點 自定
runlevel2.target enabled 集合遠程文件掛載點 自定
runlevel3.target enabled
runlevel4.target enabled
```
## 7. 修改默認的ssh服務端口,使用密鑰登錄系統,禁止用戶使用密碼遠程連接
```
修改ssh默認端口
[root@localhost ~]# vi /etc/ssh/sshd_config
#Port 22 默認22端口是缺省的
復制后刪除#
Port 11122
[root@localhost ~]# systemctl restart sshd
注意:如果是遠程修改的話,在重啟sshd前要確保新端口11122已經開放
創建使用密鑰
[root@localhost ~]# ssh-keygen -t rsa
后按2次回車,默認在/root/.ssh/下生成2個文件id_rsa id_rsa.pub
其中id_rsa為私鑰
id_rsa.pub為公鑰
登錄的一方持有私鑰,被登錄的服務器使用的是公鑰
[root@localhost ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.0.111
可以通過ssh-copy-id將生成的公鑰發送給對方服務器,發送過去后,遠程主機會產生.ssh/authorized_keys文件,權限是600,本地會多出.ssh/known_hosts文件
無法使用密鑰登錄時可以排查一下遠程主機authorized_keys的權限問題
禁止root用戶遠程登錄服務器
[root@localhost ~]# vi /etc/ssh/sshd_config
把#PermitRootLogin yes改為PermitRootLogin no禁止root遠程登錄,保存并退出
只允許密鑰登錄
[root@localhost ~]# vi /etc/ssh/sshd_config
RSAAuthentication yes
PubkeyAuthentication yes
PasswordAuthentication no
```
## 8. 鎖定關鍵文件系統
```
加鎖,不可修改加鎖文件
[root@localhost ~]# chattr +i /etc/passwd
[root@localhost ~]# lsattr /etc/passwd
----i--------e-- /etc/passwd
去鎖,可以修改文件
[root@localhost ~]# chattr -i /etc/passwd
[root@localhost ~]# lsattr /etc/passwd
-------------e-- /etc/passwd
使用chattr命令后,為了安全我們需要將其改名
mv /usr/bin/chattr /usr/bin/任意名稱
```
## 9. 調整文件描述符大小
```
查看linux服務器文件描述符設置的情況
ulimit -n 1024 默認打開的文件描述符就是1024
對于高并發業務來講,默認值肯定不夠
cat /etc/security/limits.conf 65535是最大支持的文件描述符
root soft nofile 65535
root hard nofile 65535
可以使用下面一行來替代上面
* - nofile 65535
表示對任意用戶都生效
重啟后生效
```
## 10. 去除系統及內核版本登錄前的屏幕顯示
```
[root@localhost ~]# cat /etc/issue
\S
Kernel \r on an \m
這是現有的提示,打印了內核版本
[root@localhost ~]# cat /dev/null > /etc/issue
重定向空文件后將不會有額外提示
```
## 11. 禁止ping
```
[root@localhost ~]# echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all
0 關閉 1 開啟
0 表示可以ping通
1 表示不能ping通
```
## 12. 歷史記錄
```
#修改歷史命令記錄條數
[root@localhost ~]# vi /etc/profile
HISTSIZE=1000
默認記錄1000條歷史命令
修改后執行source /etc/profile生效
# 以下都是臨時生效,默認1000不需要更改
# 設置的是閑置賬號的超時時間
export TMOUT=10 10秒后提示超時時間
# 設置終端history顯示條數
export HISTSIZE=5 只顯示最近5條信息
# 上面的終端顯示對應的是 cat ~/.bash_history
export HISTFILESIZE=5 該文件只保存5條信息
# 清空歷史記錄
history -c
# 指定條數刪除
history -d 歷史記錄條屬
```
## 13. 內核參數優化
```
[root@localhost ~]# vi /etc/sysctl.conf
```
參數名稱 | 默認值 | 建議值 | 參數描述
---|---|---|---
tcp_syn_retries | 5| 1| 對于一個新建連接,內核要發送多少個 SYN 連接請求才決定放棄。不應該大于255,默認值是5,對應于180秒左右時間。(對于大負載而物理通信良好的網絡而言,這個值偏高,可修改為2.這個值僅僅是針對對外的連接,對進來的連接,由tcp_retries1決定的)
tcp_synack_retries| 5| 1| 對于遠端的連接請求SYN,內核會發送SYN + ACK數據報,以確認收到上一個 SYN連接請求包。這是所謂的三次握手( threeway handshake)機制的第二個步驟。這里決定內核在放棄連接之前所送出的 SYN+ACK 數目。不應該大于255,默認值是5,對應于180秒左右時間。
tcp_keepalive_time| 7200| 600| TCP發送keepalive探測消息的間隔時間(秒),用于確認TCP連接是否有效。防止兩邊建立連接但不發送數據的攻擊。
tcp_keepalive_probes| 9| 3| TCP發送keepalive探測消息的間隔時間(秒),用于確認TCP連接是否有效。
tcp_keepalive_intvl| 75| 15| 探測消息未獲得響應時,重發該消息的間隔時間(秒)。默認值為75秒。 (對于普通應用來說,這個值有一些偏大,可以根據需要改小.特別是web類服務器需要改小該值,15是個比較合適的值)
tcp_retries2| 15| 5| 在丟棄激活(已建立通訊狀況)的TCP連接之前﹐需要進行多少次重試。默認值為15,根據RTO的值來決定,相當于13-30分鐘(RFC1122規定,必須大于100秒).(這個值根據目前的網絡設置,可以適當地改小,我的網絡內修改為了5)
tcp_orphan_retries| 7| 3| 在近端丟棄TCP連接之前﹐要進行多少次重試。默認值是7個﹐相當于 50秒 - 16分鐘﹐視 RTO 而定。如果您的系統是負載很大的web服務器﹐那么也許需要降低該值﹐這類 sockets 可能會耗費大量的資源。另外參的考tcp_max_orphans。(事實上做NAT的時候,降低該值也是好處顯著的,我本人的網絡環境中降低該值為3)
tcp_fin_timeout| 60| 2| 對于本端斷開的socket連接,TCP保持在FIN-WAIT-2狀態的時間。對方可能會斷開連接或一直不結束連接或不可預料的進程死亡。默認值為 60 秒。
tcp_max_tw_buckets| 180000| 36000| 系統在同時所處理的最大 timewait sockets 數目。如果超過此數的話﹐time-wait socket 會被立即砍除并且顯示警告信息。之所以要設定這個限制﹐純粹為了抵御那些簡單的 DoS 攻擊﹐不過﹐如果網絡條件需要比默認值更多﹐則可以提高它(或許還要增加內存)。(事實上做NAT的時候最好可以適當地增加該值)
tcp_tw_recycle| 0| 1| 打開快速 TIME-WAIT sockets 回收。除非得到技術專家的建議或要求﹐請不要隨意修改這個值。(做NAT的時候,建議打開它)
tcp_tw_reuse| 0| 1| 表示是否允許重新應用處于TIME-WAIT狀態的socket用于新的TCP連接(這個對快速重啟動某些服務,而啟動后提示端口已經被使用的情形非常有幫助)
tcp_max_orphans| 8192| 32768| 系統所能處理不屬于任何進程的TCP sockets最大數量。假如超過這個數量﹐那么不屬于任何進程的連接會被立即reset,并同時顯示警告信息。之所以要設定這個限制﹐純粹為了抵御那些簡單的 DoS 攻擊﹐千萬不要依賴這個或是人為的降低這個限制。如果內存大更應該增加這個值。(這個值Redhat AS版本中設置為32768,但是很多防火墻修改的時候,建議該值修改為2000)
tcp_abort_on_overflow| 0| 0| 當守護進程太忙而不能接受新的連接,就象對方發送reset消息,默認值是false。這意味著當溢出的原因是因為一個偶然的猝發,那么連接將恢復狀態。只有在你確信守護進程真的不能完成連接請求時才打開該選項,該選項會影響客戶的使用。(對待已經滿載的sendmail,apache這類服務的時候,這個可以很快讓客戶端終止連接,可以給予服務程序處理已有連接的緩沖機會,所以很多防火墻上推薦打開它)
tcp_syncookies| 0| 1| 只有在內核編譯時選擇了CONFIG_SYNCOOKIES時才會發生作用。當出現syn等候隊列出現溢出時象對方發送syncookies。目的是為了防止syn flood攻擊。
tcp_stdurg| 0| 0| 使用 TCP urg pointer 字段中的主機請求解釋功能。大部份的主機都使用老舊的 BSD解釋,因此如果您在Linux 打開它﹐或會導致不能和它們正確溝通。
tcp_max_syn_backlog| 1024| 16384| 對于那些依然還未獲得客戶端確認的連接請求﹐需要保存在隊列中最大數目。對于超過 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攻擊(事實證明)
tcp_window_scaling| 1| 1| 該文件表示設置tcp/ip會話的滑動窗口大小是否可變。參數值為布爾值,為1時表示可變,為0時表示不可變。tcp/ip通常使用的窗口最大可達到 65535 字節,對于高速網絡,該值可能太小,這時候如果啟用了該功能,可以使tcp/ip滑動窗口大小增大數個數量級,從而提高數據傳輸的能力(RFC 1323)。(對普通地百M網絡而言,關閉會降低開銷,所以如果不是高速網絡,可以考慮設置為0)
tcp_timestamps| 1| 1| Timestamps 用在其它一些東西中﹐可以防范那些偽造的sequence 號碼。一條1G的寬帶線路或許會重遇到帶out-of-line數值的舊sequence 號碼(假如它是由于上次產生的)。Timestamp 會讓它知道這是個 '舊封包'。(該文件表示是否啟用以一種比超時重發更精確的方法(RFC 1323)來啟用對 RTT 的計算;為了實現更好的性能應該啟用這個選項。)
tcp_sack| 1| 1| 使用 Selective ACK﹐它可以用來查找特定的遺失的數據報--- 因此有助于快速恢復狀態。該文件表示是否啟用有選擇的應答(Selective Acknowledgment),這可以通過有選擇地應答亂序接收到的報文來提高性能(這樣可以讓發送者只發送丟失的報文段)。(對于廣域網通信來說這個選項應該啟用,但是這會增加對 CPU 的占用。)
tcp_fack| 1| 1| 打開FACK擁塞避免和快速重傳功能。(注意,當tcp_sack設置為0的時候,這個值即使設置為1也無效)[這個是TCP連接靠譜的核心功能]
tcp_dsack| 1| 1| 允許TCP發送"兩個完全相同"的SACK。
tcp_ecn| 0| 0| TCP的直接擁塞通告功能。
tcp_reordering| 3| 6| TCP流中重排序的數據報最大數量。 (一般有看到推薦把這個數值略微調整大一些,比如5)
tcp_retrans_collapse| 1| 0| 對于某些有bug的打印機提供針對其bug的兼容性。(一般不需要這個支持,可以關閉它)
tcp_app_win| 31| 31| 時表示不需要緩沖。
tcp_adv_win_scale| 2| 2| 計算緩沖開銷
tcp_low_latency| 0| 0| 集群的時候
tcp_westwood| 0| 0| 通信來說應該啟用這個選項。
ip_forward| 0| -| 轉發支持,把該值寫
ip_local_port_range| 61000| 65000| 默認比較小,這個范圍同樣會間接用于
ip_conntrack_max| 65535| 65535| 這個值最大
名稱 |默認值| 建議值| 參數描述
---|---|---|---
ip_conntrack_max| 65536| 65536| 這個值最大
ip_conntrack_tcp_timeout_established| 432000| 180|
ip_conntrack_tcp_timeout_time_wait| 120| 120| 狀態超時時間,超過該時間就清除該連接
ip_conntrack_tcp_timeout_close_wait| 60| 60| 狀態超時時間,超過該時間就清除該連接
ip_conntrack_tcp_timeout_fin_wait| 120| 120| 狀態超時時間,超過該時間就清除該連接