集群架构核心服务
Chrony时间服务
NTP(Network Time Protocol,⽹络时间协议)是⽤来使⽹络中的各个计算机时间同步的⼀种协议。它的⽤
途是把计算机的时钟同步到世界协调时UTC,其精度在局域⽹内可达0.1ms,在互联⽹上绝⼤多数的地⽅其
精度可以达到1-50ms。
NTP服务器就是利⽤NTP协议提供时间同步服务的。
# 系统时区配置
[root@i-m60lx3hh ~]# timedatectl
Local time: Mon 2025-03-10 16:18:06 CST
Universal time: Mon 2025-03-10 08:18:06 UTC
RTC time: Mon 2025-03-10 08:18:06
Time zone: Asia/Shanghai (CST, +0800)
NTP enabled: n/a
NTP synchronized: yes
RTC in local TZ: no
DST active: n/a
// 列出可用时区
[root@i-m60lx3hh ~]# timedatectl list-timezones
//国内都需要改成上海时区
[root@i-m60lx3hh ~]# timedatectl set-timezone Asia/Shanghai # 本质上改的是/etc/localtime
# chrony配置
基础环境准备
systemctl stop firewalld # 关闭防火墙
systemctl disable firewalld # 禁止防火墙自启
setenforce 0 # 将 SELinux 的模式设置为宽松(Permissive)模式
getenforce # 查询SELinux状态
// 安装chrony服务
root@i-m60lx3hh ~]# yum install -y chrony
// 使用chrony服务同步时间
[root@i-m60lx3hh ~]# egrep -v "^#|^$" /etc/chrony.conf
server ntp1.aliyun.com iburst
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
logdir /var/log/chrony
server:指定 NTP 服务器的地址或域名,这⾥指定的是阿⾥云的 NTP 服务器地址 ntp1.aliyun.com。
iburst:表示使⽤⼀种快速同步的⽅式,即在刚开始同步时,发送⼀连串的 NTP 请求,以快速同步时间。
driftfile:指定系统时钟漂移的记录⽂件路径,这⾥指定的是 /var/lib/chrony/drift。
makestep:指定系统时间与 NTP 服务器时间差距较⼤时,是否采⽤快速调整系统时间的⽅式来同步时间。
这⾥的 1.0 表示如果时间差距⼤于 1 秒,则采⽤快速调整⽅式,3 表示最多调整 3 次。
rtcsync:表示将系统时钟与硬件时钟同步,确保系统重启后时间的准确性。
logdir:指定⽇志⽂件的存放路径,这⾥指定的是 /var/log/chrony。
//使用网络时间同步
//用于启用系统的网络时间协议(NTP)服务
[root@i-m60lx3hh ~]# timedatectl set-ntp true
//配置时间同步服务器
[root@i-m60lx3hh ~]# vim /etc/chrony.conf
//重启服务
[root@i-m60lx3hh ~]# systemctl restart chronyd
//验证服务端是否能同步时间
[root@i-m60lx3hh ~]# chronyc sources
210 Number of sources = 5
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^* 118.31.40.99 2 6 37 22 -11ms[+4228us] +/- 33ms
MS Name/IP address Stratum Poll Reach LastRx Last sample
MS:表示该服务器是主时钟源(Master Clock Source)。
Name/IP address:表示时钟源的名称或 IP 地址。
Stratum:表示时钟源的层数,Stratum 0 表示最准确的时钟源,Stratum 1 表示直接从 Stratum 0 时钟源同
步,以此类推。
Poll:表示客户端向该时钟源发起同步请求的时间间隔,单位为秒。
Reach:表示客户端与该时钟源通信的成功率,范围为 0 到 377,值越⼤表示成功率越⾼。
LastRx:表示客户端最近⼀次接收到该时钟源的时间戳。
Last sample:表示客户端最近⼀次与该时钟源同步的时间戳,以及该同步与客户端本地时钟的差异(偏差)
和偏差的标准差。
^* 118.31.40.99 2 6 37 22 -11ms[+4228us] +/- 33ms
^?:表示时钟源的状态,^ 表示该时钟源不是系统的⾸选时钟源,? 表示该时钟源的状态未知。
118.31.40.99:表示时钟源的 IP 地址。
2:表示时钟源的层数,这⾥为 Stratum 2。
6:表示客户端向该时钟源发起同步请求的时间间隔,这⾥为 64 秒。
3:表示客户端与该时钟源通信的成功率,这⾥为 3 / 8 = 37.5%。
1:表示客户端最近⼀次接收到该时钟源的时间戳,这⾥为 1 秒前。
-12.2s[ -12.2s]:表示客户端最近⼀次与该时钟源同步的时间戳,以及该同步与客户端本地时钟的差异(偏
差)和偏差的标准差,这⾥表示客户端的本地时钟⽐该时钟源快 12.2 秒。
+/- 15ms:表示时钟源的精度,这⾥为 15 毫秒。
# ntpdate同步
客户端要等⼏分钟再与新启动的ntp服务器进⾏时间同步,否则会提示 no server suitable for
synchronization found 错误。
//客户端安装ntpdate命令进⾏同步(第二种⽅式)
[root@i-m60lx3hh ~]# ntpdate -u 127.0.1.1
5 Jun 16:51:27 ntpdate[3873]: adjust time server 10.1.106.70 offset -0.000030 sec
//将同步命令写⼊计划任务。
[root@wing strace]# crontab -e
*/5 * * * * /usr/sbin/ntpdate -u 10.1.106.70 &>/dev/null
# 应⽤场景
1. 监控服务器
2. 数据库服务器
3. 集群服务器
4. ⾦融系统
5. 航空航天系统
SSH远程服务
SSH 是 Secure Shell Protocol 的简写,在进⾏数据传输之前,SSH先对联机数据包通过加密技术进⾏加密处
理,加密后在进⾏数据传输。确保了传递的数据安全。
1、SSH远程服务主要功能
提供远程连接服务器的服务
对传输的数据进⾏加密
2、远程连接⽅式有哪些
ssh 属于密⽂连接⽅式 监听在本地 22/tcp 端⼝
telnet 属于明⽂连接⽅式 监听在本地 23/tcp 端⼝
3、SSH 远程连接与 Telnet 远程连接区别
ssh 服务是加密服务协议, telnet 服务是⾮加密服务协议
ssh 服务默认⽀持 root ⽤户登录, Telnet 默认不⽀持 root ⽤户登录
案例: 使⽤ wireshark 验证 telnet 明⽂传输与 ssh 加密传输
1.安装 telnet 服务并运⾏
[root@i-m60lx3hh ~]# yum install telnet-server -y
[root@i-m60lx3hh ~]# systemctl start telnet.socket
2.过滤端口服务
[root@i-m60lx3hh ~]# netstat -lntup |egrep 23
3.使⽤ wireshark 检测 vmnet8 ⽹卡上的 telnet 流量
# ssh远程连接不上,具体排查思路
# 测试服务端口有没有开启
telnet ip 端口
nmap -p 端口 192.168.9.12 # 扫描端口
nc 192.168.9.12 22
# 模拟网络异常
iptables -I INPUT -s 192.168.9.12 -j DROP # 阻止来自 IP 地址 192.168.9.12 的所有入站流量
# 抓包分析
tcpdump -I any port 22 -nn #抓包分析所有流量22端口的 -nn 表示不将地址和端口号转换为名称
#模拟禁⽌root 和 密码登陆
echo "Wing@123" | passwd --stdin root
ssh -p5522 root@192.168.9.12
#检查服务端⼝是否存在
# ss -lntup|grep 22
# netstat -lntup
#分析检查ssh⽇志
tailf /var/log/secure
#检查防⽕墙策略 iptables firewalld selinux 关闭
#清理⽹络策略
iptables -F
#分析连接过程
ssh -vvv root@192.168.9.12
# SSH相关命令
SSH`是典型的C/S 客户端和服务端的交互模式, 客户端⼴泛的⽀持各个平台
`WIndows`有很多⼯具可以⽀持`SSH`连接功能, 建议使⽤`Xshell
#开源免费 electerm
https://github.com/electerm/electerm
# openssh 软件分析(与数据加密相关的软件--openssl)
[root@i-m60lx3hh ~]# yum provides `which ssh`
[root@i-m60lx3hh ~]# rpm -ql openssh-server
/etc/ssh/sshd_config --- ssh服务配置⽂件
/usr/sbin/sshd --- ssh服务进程启动命令
[root@backup ~]# rpm -ql openssh-clients
/usr/bin/scp --- 远程拷⻉命令
/usr/bin/sftp --- 远程⽂件传输命令
/usr/bin/slogin --- 远程登录命令
/usr/bin/ssh --- 远程连接登录命令
/usr/bin/ssh-copy-id --- 远程分发公钥命令
ssh客户端包含ssh以及像scp(远程拷⻉)、slogin(远程登陆)、sftp(安全FTP⽂件传输)等应⽤程序。
# ssh 远程登录服务器命令
ssh -p22 root@192.168.9.12[命令]
# SSH连接远程主机命令的基本语法;
# ssh 命令
# -p(⼩写), ⽤于指定远程主机端⼝,默认22端⼝可省略
# root@remotehost
# "@"前⾯为⽤户名,如果⽤当前⽤户连接,可以不指定⽤户
# "@"后⾯为要连接的服务器的IP
# scp 复制数据⾄远程主机命令(全量复制)
# SSH连接远程主机命令的基本语法;
# scp 命令
# -P(⼤写) 指定端⼝,默认22端⼝可不写
# -r 表示递归拷⻉⽬录
# -p 表示在拷⻉⽂件前后保持⽂件或⽬录属性不变
# -l 限制传输使⽤带宽(默认kb)
推:PUSH,上传
# scp -P22 -rp /tmp/demo/wing root@192.168.9.12:/tmp
# /tmp/wing为本地的⽬录。
# “@”前为⽤户名
# “@”后为要连接的服务器的IP。
# IP后的:/tmp⽬录,为远端的⽬标⽬录。
# 说明: 以上命令作⽤是把本地/tmp/demo/wing推送⾄远端服务器192.168.9.12的/tmp⽬录
拉:PULL,下载
# scp -P22 -rp root@192.168.9.12:/tmp/wing /tmp/demo/
# 还可以将远端⽬录或⽂件拉取⾄本地
结论:
1.scp通过加密进⾏远程拷⻉⽂件或⽬录的命令。
2.scp拷⻉权限为连接的⽤户对应的权限。
3.scp⽀持数据的推送和拉取,但每次都是全量拷⻉,效率低下。
# Sftp 远程数据传输命令
连接远程sftp
# sftp -P22 root@192.168.9.12
# sftp -P22 -oPort=52113 root@192.168.9.12<-sftp的特殊端⼝连接
# 下载⽂件, ⾄于本地服务器
sftp> get /tmp/wing /tmp/demo/
# 上传本地服务器⽂件, ⾄远程服务器
sftp> put /tmp/demo/wing /root/
# SSH连接⽅式
1、基于账户密码远程登录
ssh -p22 root@192.168.9.12
2、基于秘钥远程登录
默认情况下,通过 ssh 客户端登陆远程服务器, 需要提供远程系统上的帐号与密码,但为了降低密码泄露的机率和提⾼
登陆的⽅便性, 建议使⽤密钥验证⽅式.
3、在管理服务器上⽣成密钥,-t密钥类型, -C指定⽤户邮箱
[root@i-m60lx3hh ~]# ssh-keygen -t rsa -C xu@qq.com
...
//默认⼀路回⻋即可, 当然也可以根据不同需求进⾏修改
...
[root@i-m60lx3hh ~]# cd /root/.ssh/ # 私钥和公钥在这个目录下
4、将 A 服务器上的公钥推送⾄ B 服务器
A 服务器 192.168.9.12
B 服务器 10.1.106.66
//命令示例: ssh-copy-id [-i [identity_file]] [user@]machine
ssh-copy-id //命令
-i //指定下发公钥的路径
[user@] //以什么⽤户身份进⾏公钥分发(root),如果不输⼊,表示以当前系统⽤户身份分发公钥
machine //下发公钥⾄那台服务器, 填写远程主机IP地址
//秘钥分发, [会将A服务器的公钥写⼊B服务器~/.ssh/authorized_keys⽂件中]
[root@m01 ~]# ssh-copy-id -p5522 -i ~/.ssh/id_rsa.pub root@10.1.106.6
5、A 服务器通过密钥⽅式连接 B 服务器
//远程登录对端主机⽅式
[root@m01 ~]# ssh -p5522 root@10.1.106.66
//不登陆远程主机执⾏命令
[root@m01]# ssh -p5522 root@10.1.106.66 "hostname -I"
//可能遇到错误
1.no route to host 防⽕墙
2.Connection refused 防⽕墙或服务未启⽤
# SSH服务密钥分发
要求所有服务器在统⼀⽤户wing, 实现A机器从本地分发数据到B、C机器上,在分发到B、C的过程中不需要
输⼊密码验证,当然除了分发的功能, 还可以批量查看所有客户机上的CPU,LOAD,MEM,系统版本等信
息。即实现从A服务器发布数据到B、C客户端服务器以及查看信息的免密码登录验证解决⽅案
1.添加普通⽤户账号
//部署密钥之前,先分别在A、B、C服务器上添加普通⽤户并配置密码
useradd test
echo "Test@123" | passwd --stdin wing
如下操作均在A-Server服务器上操作:
//2.A服务器切换普通⽤户并⽣成密钥
su - test
# -C参数在公钥⽂件的末尾添加注释 "192.168.9.12",以标识该密钥对所属的主机。
ssh-keygen -t rsa -C 192.168.9.12
//3.A服务器分发秘钥⾄B服务器, SSH不是默认端⼝, 使⽤-P指定对应端⼝
ssh-copy-id -p5522 -i $HOME/.ssh/id_rsa.pub test ssh -p5522 wing@10.1.106.66@10.1.106.66
//4.通过A服务器登陆⾄B服务器测试
ssh -p5522 test@10.1.106.66
//5.分发A服务器秘钥⾄C服务器
ssh-copy-id -p5522 -i $HOME/.ssh/id_rsa.pub test@10.1.106.67
////6.通过A服务器登陆⾄C服务器测试
ssh -p5522 test@10.1.106.67
# 批量执⾏命令及⽂件分发
批量分发密钥
[root@i-m60lx3hh ~]# cat ssh_copy_id.sh
#!/bin/bash
# 设置需要分发密钥的服务器列表
SERVERS=(192.168.9.12 10.1.106.66 10.1.106.67 )
# 设置密钥和密码
KEY_FILE="$HOME/.ssh/id_rsa.pub"
PASSWORD="Test@123"
# 循环遍历服务器列表
for SERVER in "${SERVERS[@]}"
do
# 使⽤ expect ⾃动输⼊密码
expect -c "
spawn ssh-copy-id -p5522 -i $KEY_FILE $USER@$SERVER
expect {
\"*assword\" { send \"$PASSWORD\r\"; exp_continue }
\"yes/no\" { send \"yes\r\"; exp_continue }
eof
}
"
done
# SSH访问控制
SSH远程服务访问控制⼿段
1.更改SSH服务远程登录端⼝
2.更改SSH服务监听本地内⽹IP
3.更改SSH服务禁⽌密码登录
4.更改SSH服务禁⽌ROOT管理员登录
5.更改SSH服务密码登录认证为密钥登录
6.重要服务器尽可能不使⽤公⽹IP地址
7.使⽤防⽕墙限制来源IP地址(堡垒机/安全组限制 只有公司公⽹出⼝ip可以连接)
1.SSH服务登录防护⼿段配置⽂件 /etc/ssh/sshd_config
//1.更改SSH远程连接端⼝
Port 6666
//2.绑定本地内⽹地址
ListenAddress 192.168.9.12
//3.禁⽌Root管理员登录
PermitRootLogin no
//4.禁⽌密码登录
PasswordAuthentication no
//允许以root密钥⽅式登陆(禁⽌密码默认以root登陆)
//PermitRootLogin without-password
//5.禁⽌使⽤空密码(默认禁⽌)
PermitEmptyPasswords no
//6.关闭DNS解析,优化连接速度
UseDNS no
GSSAPIAuthentication no
添加如下配置⾄sshd配置⽂件/etc/ssh/sshd_config, 根据需求做调整
###SSH###
Port 6666
ListenAddress 192.168.9.12
PasswordAuthentication no
PermitRootLogin no
#PermitEmptyPasswords no
GSSAPIAuthentication no
UseDNS no
###END###
# SSH破解防护
fail2ban 可以监控系统⽇志,并且根据⼀定规则匹配异常IP后使⽤ Firewalld 将其屏蔽,尤其是针对⼀些爆破/
扫描等⾮常有效。
1.开启 Firewalld 防⽕墙
[root@i-m60lx3hh ~]# systemctl start firewalld
[root@i-m60lx3hh ~]# systemctl enable firewalld
[root@i-m60lx3hh ~]# systemctl status firewalld
[root@i-m60lx3hh ~]# firewall-cmd --state
running
2.修改 firewalld 规则,启⽤ Firewalld 后会禁⽌⼀些服务的传输,但默认会放⾏常⽤的22端⼝, 如果想添加更
多,以下是放⾏SSH端⼝(22)示例,供参考:
#放⾏SSHD服务端⼝
[root@i-m60lx3hh ~]# firewall-cmd --permanent --add-service=ssh --add-service=http
#重载配置
[root@i-m60lx3hh ~]# firewall-cmd --reload
#查看已放⾏端⼝
[root@i-m60lx3hh ~]# firewall-cmd --list-service
3.安装 fail2ban ,需要有 epel
[root@i-m60lx3hh ~]# yum install fail2ban fail2ban-firewalld mailx -y --nogpgcheck
4.配置 fail2ban 规则 .local 会覆盖 .conf ⽂件
[root@i-m60lx3hh ~]# cat /etc/fail2ban/jail.local
[DEFAULT]
ignoreip = 127.0.0.1/8
bantime = 86400
findtime = 600
maxretry = 5
banaction = firewallcmd-ipset
action = %(action_mwl)s
[sshd]
enabled = true
filter = sshd
port = 22
action = %(action_mwl)s
logpath = /var/log/secure
[root@i-m60lx3hh ~]# cat /etc/fail2ban/jail.local
[DEFAULT]
#忽略的IP地址或IP地址段,这些地址不会被禁⽌访问。127.0.0.1/8表示忽略本地IP地址。
ignoreip = 127.0.0.1/8
#禁⽌访问的时间,以秒为单位。禁⽌访问的时间为86400秒,即24⼩时。
bantime = 86400
#在这个时间段内,如果有超过maxretry次的登录失败尝试,就会触发禁⽌访问。findtime为600秒,即10分钟。
findtime = 600
#在findtime时间段内,如果有超过maxretry次的登录失败尝试,就会触发禁⽌访问。maxretry为5次。
maxretry = 5
#禁⽌访问时采取的动作。采取的动作是使⽤firewallcmd-ipset命令将IP地址添加到防⽕墙的IP集合中。
banaction = firewallcmd-ipset
#在禁⽌访问时采取的其他动作。采取的动作是发送电⼦邮件通知管理员。
action = %(action_mwl)s
#针对sshd服务的配置。
[sshd]
#启⽤该服务的Fail2Ban防护。
enabled = true
#⽤于匹配⽇志中的内容,以便Fail2Ban可以识别登录失败尝试。在这个例⼦中,使⽤名为sshd的过滤器。
filter = sshd
#⽤于匹配⽇志中的内容,以便Fail2Ban可以识别登录失败尝试。在这个例⼦中,使⽤名为sshd的过滤器。
port = 22
action = %(action_mwl)s
#⽇志⽂件的路径。在这个例⼦中,使⽤/var/log/secure⽂件。
logpath = /var/log/secure
5.启动服务,并检查状态
[root@i-m60lx3hh ~]# systemctl start fail2ban.service
[root@i-m60lx3hh ~]# fail2ban-client status sshd
//清除被封掉的IP地址
[root@i-m60lx3hh ~]# fail2ban-client set sshd unbanip 192.168.9.1

浙公网安备 33010602011771号