Bootstrap

综合实战演练1

实战要求:

1.所有机器的ssh连接端口全部更换为20022端口

2.部署服务的机器只能通过master61登陆,各个服务器之间互不通信

(设置防火墙规则,只限定ssh的服务,限制20022的流量)

3.将服务器恢复初始化快照,使用单一脚本即可将服务进行部署

4.最后确保仅通过master61机器可以登录,并进行文件实时同步测试

思路详解

windows端
1.下载安装Git-bash工具,利用linux命令在windows上操作
2.为master61设置公钥登录,并取消密码登录

master61
1.安装升级openssh、openssh-clients、openssh-server
2.通过免密设置将公钥推送到后端服务器上,使得可以通过公钥连接
3.修改后端服务器ssh配置,修改端口号为20022,并将公钥验证打开,关闭密码登录
4.在各后端服务器上添加防火墙规则,限制ssh服务的20022端口流量
5.重启ssh服务并测试后端服务器之间是否可以通过ssh互通

nfs-31
1.部署nfs服务(需要在web-7、web-8、web-9网站服务挂载共享目录,添加网站页面)
2.web-7 web-8 web-9上部署好网站且均已进行目录共享
3.部署lsyncd服务,实现实时同步,修改配置文件目录为网站共享目录,待rsync服务部署好后测试实时性

rsync-41
1.部署rsyncd数据同步服务,修改配置文件
2.创建备份用户及备份目录,修改备份目录权限
3.增加用户密码文件,将文件权限修改为600,重启rsyncd服务,并加入开机自启

web-7、web-8、web-9
1.部署网站服务,并修改访问端口为81
2.挂载共享目录,修改网页内容,测试共享和实时性

完成以上操作后,书写部署脚本并下载,恢复初始化快照,上传脚本运行后恢复即可
最终效果
- web-7可以正常挂载nfs共享目录且权限是所有用户被映射为www(uid=11111),允许读写
- web-7用户上传那文件夹后,nfs服务器数据自动同步到backup服务器。

master61

完成脚本参考命令
[root@nfs-31 ~]# sed -e "/^#permitrootlogin/Ip" -e '/^#port/Ip' -e '/^password/Ip' -e '/^#pubkey/Ip' /etc/ssh/sshd_config -n
#Port 22
#PermitRootLogin yes
#PubkeyAuthentication yes
PasswordAuthentication yes
[root@nfs-31 ~]# sed -i.ori -e "/^#permitrootlogin/Ic PermitRootLogin no" -e '/^#port/Ic Port 20022' -e '/^password/Ic PasswordAuthentication no' -e '/^#pubkey/Ic PubkeyAuthentication yes' /etc/ssh/sshd_config
[root@nfs-31 ~]# grep -Ei '^(port|permitrootlogin|pubkey|passwordauthentication)' /etc/ssh/sshd_config
Port 20022
PermitRootLogin no
PubkeyAuthentication yes
PasswordAuthentication no

查看防火墙是否生效
[root@rsync-41 ~]# yum -y install nmap
没有开启防火墙之前访问端口20022,由于端口未开启任何服务的原因
[root@rsync-41 ~]# nmap -p 20022 172.16.1.31 | awk 'NR==6{print $2}'
closed
开启防火墙规则之后
[root@rsync-41 ~]# nmap -p 20022 172.16.1.31 | awk 'NR==6{print $2}'
filtered
如果使用 nmap 扫描端口 20022 并看到状态为 filtered
这通常意味着防火墙规则阻止了扫描探测,或者网络设备过滤了流量

用master61可以连通
[root@master-61 ~]# nmap -p 20022 172.16.1.31 | awk 'NR==6{print $2}'
open
最终脚本
[root@master-61 ~]# cat master61.sh
#!/bin/sh

#定义环境变量
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
ipaddr=("$@")
port="22"
#添加颜色
RED_COLOR='\E[1;31m'
GREEN_COLOR='\E[1;32m'
YELLOW_COLOR='\E[1;33m'
BLUE_COLOR='\E[1;34m'
PINK='\E[1;35m'
SHAN='\E[31;5m'
RES='\E[0m'


#1.安装升级openssh、openssh-clients、openssh-server

package=("openssh" "openssh-clients" "openssh-server" "nmap")
for pkg in ${package[@]}
do
  rpm -q $pkg &> /tmp/create_ssh.log
  if  [ "$?" -ne "0" ];then
    echo "$pkg is not installed.Installing..."
    yum -y install $pkg
  fi
done
#2>&1 是一个重定向操作符,用于将标准错误(文件描述符 2)重定向到标准输出(文件描述符 1)。这样,标准错误和标准输出都会写入同一个目标,如文件或终端。
echo -e "${GREEN_COLOR}===========================分割线===========================${RES}"

#2.通过免密设置将公钥推送到后端服务器上,使得可以通过公钥连接

if [ ! -f /root/.ssh/id_rsa ];then
ssh-keygen -f /root/.ssh/id_rsa -N '' &> /tmp/create_ssh.log
fi
#命令的标准输出和标准错误输出都重定向到 /tmp/create_ssh.log 文件中

echo -e "${YELLOW_COLOR}秘钥对已生成,将公钥发送至主机列表${ipaddr[@]}${RES}"
for ip in ${ipaddr[@]}
do
  sshpass -p '1' ssh-copy-id -p $port [email protected].${ip} -o StrictHostKeyChecking=no &> /tmp/create_ssh.log
  if [ "$?" -ne "0" ];then
    yum -y install sshpass &>/dev/null
    sshpass -p '1' ssh-copy-id -p $port [email protected].${ip} -o StrictHostKeyChecking=no &> /tmp/create_ssh.log
  fi
done
if [ "$?" -eq "0" ];then
  echo -e "${YELLOW_COLOR}公钥已发送主机列表${ipaddr[@]}完成${RES}"
else
  echo -e "${RED_COLOR}没有完成配置,请检查${RES}"
fi
#使用sshpass工具,通过密码1自动进行SSH认证;StricHostKeyChecking=no禁止SSH客户端在连接新主机时进行主机密钥检查

#3.修改后端服务器ssh配置,修改端口号为20022,并将公钥验证打开,关闭密码登录
#-e '/^#permitrootlogin/Ic PermitRootLogin no' \

for ip in ${ipaddr[@]}
do
  echo -e "${GREEN_COLOR}##############################################################################################${RES}"
  name=`ssh -p $port [email protected].${ip} hostname`
  echo -e "${PINK}===========================$name 没有修改前配置===========================${RES}"
  ssh -p $port [email protected].${ip} "sed -e '/^#port/Ip' -e '/^password/Ip' -e '/^#listenaddress 0/Ip' -e '/^#pubkey/Ip' /etc/ssh/sshd_config -n"
  ssh -p $port [email protected].${ip} "sed -i.ori \
                                    -e '/^#port/Ic Port 20022' \
                                    -e '/^password/Ic PasswordAuthentication no' \
                                    -e '/^#listenaddress 0/Ic ListenAddress 172.16.1.${ip}' \
                                    -e '/^#pubkey/Ic PubkeyAuthentication yes' /etc/ssh/sshd_config"
  echo -e "${PINK}=================主机 $name 已修改完毕,更新后的配置如下:======================${RES}"
  ssh -p $port [email protected].${ip} "grep -Ei '^(port|pubkey|listenaddress|passwordauthentication)' /etc/ssh/sshd_config"
done
echo -e "${GREEN_COLOR}===========================分割线===========================${RES}"

#4.在各后端服务器上添加防火墙规则,限制ssh服务的20022端口流量

for ip in ${ipaddr[@]}
do
  ssh -p $port [email protected].${ip} iptables -A INPUT ! -s 172.16.1.61 -p tcp --dport 20022 -j DROP
  ssh -p $port [email protected].${ip} hostname
  echo -e "${BLUE_COLOR}防火墙规则已配置完毕,配置规则如下:${RES}"
  ssh -p $port [email protected].${ip} iptables -L | awk 'NR==3'
done
echo -e "${GREEN_COLOR}===========================分割线===========================${RES}"

#5.重启ssh服务,测试各服务之间是否仍可以使用ssh互连
echo "仅测试是否可以连通nfs-31即可"
echo -e "${YELLOW_COLOR}===========================分割线===========================${RES}"
ipa=("$@" 61)
for i in ${ipa[@]}
do
  if [ "$i" != "61" ];then
    ssh -p $port [email protected].${i} systemctl restart sshd
    name=`ssh -p 20022 [email protected].${i} hostname`
    ssh -p 20022 [email protected].${i} rpm -q nmap &> /tmp/create_ssh.log
    if [ "$?" -ne "0" ];then
      echo -e "${SHAN}$name nmap软件未下载,正在进行下载,请稍等...${RES}"
      ssh -p 20022 [email protected].${i} "yum -y install nmap" &> /tmp/create_ssh.log
    fi 
    echo "主机 $name 软件nmap已安装完成"
    guize=`ssh -p 20022 [email protected].${i} nmap -p 20022 172.16.1.31 | awk 'NR==6{print $2}'`
    result(){
    case  "$guize" in
      closed)
        echo -e "${YELLOW_COLOR}$name 没有开启对应的20022端口${RES}"
      ;;
      filtered)
        echo -e "${SHAN}$name 无法通过ssh连接到nfs-31机器 ${RES}"
      ;;
      open)
        echo -e "${GREEN_COLOR}$name 可以连接到nfs-31机器${RES}"
      ;;
      *)
        echo -e "${RED_COLOR}$name 错误的参数输出,请检查${RES}"
      ;;
    esac
    }
    result
  else
    name=`hostname`
    rpm -q nmap &> /tmp/create_ssh.log
    if [ "$?" -ne "0" ];then
      echo -e "${SHAN}$name nmap软件未下载,正在进行下载,请稍等...${RES}"
      "yum -y install nmap" &> /tmp/create_ssh.log
    fi
    echo "主机 $name 软件nmap已安装完成"
    guize=`nmap -p 20022 172.16.1.31 | awk 'NR==6{print $2}'`
    case  "$guize" in
      closed)
        echo -e "${YELLOW_COLOR}$name 没有开启对应的20022端口${RES}"
      ;;
      filtered)
        echo -e "${SHAN}$name 无法通过ssh连接到nfs-31机器 ${RES}"
      ;;
      open)
        echo -e "${GREEN_COLOR}$name 可以连接到nfs-31机器${RES}"
      ;;
      *)
        echo -e "${RED_COLOR}$name 错误的参数输出,请检查${RES}"
      ;;
    esac
  fi
done


使用方法,注意脚本用的是传参
实现效果
[root@master-61 ~]# ./master61.sh 7 31 41

nfs-31

完成脚本参考命令
需要在本级目录下所有文件夹创建同样的文件
[root@nfs-31 ~]# find /nginx-backup/ -type d | xargs -i touch {}/99.txt
[root@nfs-31 ~]# ls /nginx-backup/12
1.txt  99.txt
[root@nfs-31 ~]# find /nginx-backup/ -type d | xargs -i rm -f {}/1.txt
[root@nfs-31 ~]# ls /nginx-backup/12
99.txt

需要注意的是不可用来打包,因为他是每个文件打包一次,最后打包好的文件里只有一个文件
[root@nfs-31 ~]# find /nginx-backup/ -type f | xargs -i tar -cvzf /nginx-backup/nfs-31_172.16.1.31_2024-09-15/nginx.tgz {}
[root@nfs-31 ~]# tar xf /nginx-backup/nfs-31_172.16.1.31_2024-09-15/nginx.tgz
[root@nfs-31 nginx-backup]# ls
99.txt

#我需要备份的是本级目录下的所有文件,不包括本层目录下的目录内容,所以设置了-maxdepth 1
find /nginx-backup/ -maxdepth 1 -type f | tar -cvzf /nginx-backup/nginx.tgz -T -
确保路径 -T - 指定了文件列表,而不是每个文件单独打包。
最终脚本
[root@nfs-31 ~]# cat nfs-31.sh
#!/bin/sh
#读取环境变量
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

#1.部署nfs服务(需要在web-7、web-8、web-9网站服务挂载共享目录,添加网站页面)
#1.1下载nfs服务
packages=("rpcbind" "nfs-utils" "lsyncd")
for pkg in ${packages[@]};do
rpm -q ${pkg} &> /tmp/create_nfs.log
if [ "$?" -ne "0" ];then
  echo "${pkg} 未安装,正在进行下载请稍等..."
  yum -y install ${pkg} &> /dev/null
fi
rpm -q ${pkg} &> /tmp/create_nfs.log
if [ "$?" -ne "0" ];then
  echo "$pkg 安装失败,请检查"
else
  echo "${pkg} 已经存在"
fi
done

#1.2创建用户www及备份目录文件夹,修改配置文件,填写为你需要的共享参数即可,运行web-7 web-8 web-9可以访问,权限是读写
id nginx01 &> /tmp/create_nfs.log
if [ "$?" -ne "0" ];then
  echo "user nginx01 is creating"
  useradd nginx01 -u 1500 -M -s /sbin/nologin
fi
if  [ ! -d /nginx-backup ];then
  echo "目录/nginx-backup不存在,正在进行创建..."
  mkdir /nginx-backup
fi
echo "用户和目录均已存在"
cat > /etc/exports <<EOF
/nginx-backup web-7(rw,sync,all_squash,anonuid=1500,anongid=1500) web-8(rw,sync,all_squash,anonuid=1500,anongid=1500) web-9(rw,sync,all_squash,anonuid=1500,anongid=1500) 
EOF
echo "已修改配置文件,结果如下:"
cat /etc/exports
showmount -e
echo "开启两个rpcbind两个服务,以及nfs服务并设置开机自启"
systemctl start rpcbind.service
systemctl status rpcbind.service | awk -F '[ ]*' 'NR==3{print $3}'
systemctl start rpcbind.socket
systemctl status rpcbind.socket | awk -F '[ ]*' 'NR==3{print $3}'
systemctl start nfs
systemctl reload nfs
systemctl status nfs | awk -F '[ ]*' 'NR==5{print $3}'
systemctl enable nfs &> /tmp/create_nfs.log

#2.web-7 web-8 web-9上部署好网站且均已进行目录共享

echo "请确认web-7 web-8 web-9上部署好网站且均已进行目录共享"

#3.部署lsyncd服务,实现实时同步,修改配置文件目录为网站共享目录,待rsync服务部署好后测试实时性
#3.1下载安装lsyncd软件包,在packages数组中添加即可

#3.2修改配置文件,创建共享目录
if [ ! -f /etc/lsyncd.conf.bak ];then
  cp /etc/lsyncd.conf{,.bak}
fi
dir=`hostname`_$(ifconfig eth1 | awk -F '[ ]*' 'NR==2{print $3}')_`date +%F`
if [ ! -d /nginx-backup/$dir ];then
  mkdir /nginx-backup/$dir
fi
#3.3创建共享用户密码
if  [ ! -f /etc/rsync.nginx ];then
  echo "nginx666" > /etc/rsync.nginx
  chmod 600 /etc/rsync.nginx
fi
echo "用户密码文件如下:"
ls -ld /etc/rsync.nginx
cat /etc/rsync.nginx
cat > /etc/lsyncd.conf <<EOF
settings {
    logfile      ="/var/log/lsyncd/lsyncd.log",
    statusFile   ="/var/log/lsyncd/lsyncd.status",
    inotifyMode  = "CloseWrite",				#仅仅只定义了关闭和写入,如果文件删除不会进行同步
    maxProcesses = 8,
    }

sync {
    default.rsync,
    source    = "/nginx-backup",
    target    = "[email protected]::nginx_data",
    delete= true,
    exclude = {".*"},
    delay=1,
    rsync     = {
        binary    = "/usr/bin/rsync",
        archive   = true,
        compress  = true,
        verbose   = true,
        password_file="/etc/rsync.nginx",
        _extra={"--bwlimit=200"}
        }
    }
EOF
echo "lsyncd配置文件已修改,内容如下:"
cat /etc/lsyncd.conf
status=`systemctl status lsyncd | awk -F '[ ]*' 'NR==3{print $3}'`
if [ "$status" != "active" ];then
  echo "lsyncd服务未开启,正在启动"
  systemctl start lsyncd
  systemctl enable lsyncd &> /dev/null
else
  echo "lsyncd服务已开启,状态为:"
  echo "$status"
fi

rsync-41

最终脚本
[root@rsync-41 ~]# cat rsync-41.sh
#!/bin/sh

#读取环境变量
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

# 1.安装rsync服务
rpm -q rsync &> /dev/null
if [ "$?" -ne "0" ];then
  echo "rsync 软件未安装,正在下载安装,请稍后..."
  yum -y install rsync &> /dev/null
fi
echo "rsync 服务已存在"
# 2.写配置文件
echo "=============================分割线================================="

cat > /etc/rsyncd.conf <<EOF
uid = www
gid = www
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 600
ignore errors
read only = false
list = false
auth users = nginx01
secrets file = /etc/rsync.nginx
log file = /var/log/rsyncd.log
############################################
[nginx_data]
comment = first backup dir
path = /nginx-backup
EOF
echo "配置文件已修改,内容如下:"
cat /etc/rsyncd.conf

#3.工作用户是否已创建
id www &>/dev/null
if [ $? -ne 0 ];then
  useradd -u 1000 -M -s /sbin/nologin www
fi
id www
# 4.创建配置文件定义的信息,并赋予权限
if [ ! -d /nginx-backup ];then
  mkdir /nginx-backup
fi
chown -R www:www /nginx-backup

echo "共享目录已创建并修改权限"
ls -ld /nginx-backup
echo "=============================分割线================================="
# 4.创建用于连接的账户密码,并修改密码文件权限
echo "nginx01:nginx666" >/etc/rsync.nginx
chmod 600 /etc/rsync.nginx
cat /etc/rsync.nginx
ls -ld /etc/rsync.nginx
# 5. 重启服务
systemctl restart rsyncd
systemctl enable rsyncd
echo "rsyncd服务的运行状态"
systemctl status rsyncd | awk -F '[ ]*' 'NR==3{print $3}'

web-7/web-8/web-9

最终脚本
[root@web-7 ~]# cat web.sh
#!/bin/sh
#读取环境变量
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
packages=("nginx" "nfs-utils")

#1.下载安装nginx服务
echo "下载安装 ${packages[@]} 服务"
for pkg in ${packages[@]};do
rpm -q $pkg &> /dev/null
if [ "$?" -ne "0" ];then
  yum -y install $pkg &> /dev/null
fi
if [ "$pkg" != "nfs-utils" ];then
  status=`systemctl status $pkg | awk -F '[ ]*' 'NR==3{print $3}'`
  if  [ "$status" != "active" ];then
    systemctl start $pkg
  fi
  systemctl enable $pkg &> /tmp/create_nginx.log
else
  status=`systemctl status nfs | awk -F '[ ]*' 'NR==3{print $3}'`
  if  [ "$status" != "active" ];then
    systemctl start nfs
  fi
  systemctl enable nfs &> /tmp/create_nginx.log
fi
done

#2.修改配置文件,端口号为81
echo "修改端口号为81"
sed -i '0,/listen\s*80;/s/80/81/' /etc/nginx/nginx.conf

#3.nginx的启动用户必须是www,uid是 1500,不允许登录,重启nginx服务
id www &> /tmp/create_nginx.log
if [ "$?" -ne "0" ];then
  useradd  www -u 1500 -M -s /sbin/nologin
  id www
fi
sed -n "/^user/Ip" /etc/nginx/nginx.conf
systemctl restart nginx
echo "nginx 服务的状态:"
systemctl status nginx | awk -F '[ ]*' 'NR==3{print $3}'
echo "nfs 服务的状态"
systemctl status nfs | awk -F '[ ]*' 'NR==3{print $3}'

#4.挂载目录,需要先部署好nfs服务
mount -t nfs 172.16.1.31:/nginx-backup /usr/share/nginx/html/
df -Th | grep nginx-backup
systemctl restart nginx

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;