N77-Linux第三周作业

发布时间 2023-06-19 00:09:06作者: 茨格

N77-Linux第三周作业

一、 yum私有仓库的实现及博客输出

  • 关闭防火墙

    [root@Rocky8 ~]# systemctl stop firewalld
    
  • 安装http服务

    [root@Rocky8 ~]# yum install httpd -y
    
  • 开机自启动http服务

    [root@Rocky8 ~]# systemctl enable --now httpd
    
  • 安装epel源

    [root@Rocky8 ~]# yum install epel-release -y
    [root@Rocky8 ~]# yum repolist
    repo id                repo name
    appstream              Rocky Linux 8 - AppStream
    baseos                 Rocky Linux 8 - BaseOS
    epel                   Extra Packages for Enterprise Linux 8 - x86_64
    extras                 Rocky Linux 8 - Extras
    
    
  • 下载epel仓库包和mata数据至/var/www/html

    [root@Rocky8 ~]# yum reposync --repoid=epel --download-metadata -p /var/www/html
    
  • 客户端测试

二、阅读《图解TCP/IP》一书,地址:https://leon-wtf.github.io/doc/图解TCPIP.pdf,有时间的可以写下读书笔记(选做)

三、画图 TCP协议和三次握手及四次挥手,可以参考别人的,但是需要自己画一次

3.1 三次握手

所谓的三次握手(Three-way Handshake),是指建立一个TCP连接时,需要客户端和服务器总共发送3个包
三次握手的目的是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号并交换 TCP 窗口大小信息.在socket编程中,客户端执行connect()时。将触发三次握手。

Note left of 客户端: CLOSED
Note right of 服务端: CLOSED
客户端->服务端: SYN=1,seq=x
Note right of 服务端: LISTEN
服务端->客户端:SYN=1,ACK=1,seq=y,ack=x+1
Note left of 客户端: SYN-SENT
客户端->服务端:ACK=1,seq=x+1,ack=y+1
Note right of 服务端: SYN-RCVD
Note left of 客户端: ESTABLISHED
Note right of 服务端: ESTABLISHED
  • 第一次握手:建立连接时,客户端发送SYN包(seq=x)到服务器,并进入SYN_SEND状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。

  • 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(seq=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;

  • 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。

3.2 四次挥手

TCP的断开连接需要发送四个包,因此称为四次挥手(four-way handshake)。客户端或服务器均可主动发起挥手动作,在socket编程中,任何一方执行close()操作即可产生挥手操作。

Note left of 客户端: ESTABLISHED
Note right of 服务端: ESTABLISHED
客户端->服务端: FIN=1,seq=u
Note right of 服务端: CLOSE-WAIT
服务端->客户端:ACK=1,seq=v,ack=u+1 (数据传输)
Note left of 客户端: FIN-WAIT-1
Note right of 服务端: CLOSE-WAIT
服务端->客户端:FIN=1,ACK=1,seq=w,ack=u+1
Note left of 客户端: FIN-WAIT-2
客户端->服务端:ACK=1,seq=u+1,ack=w+1
Note right of 服务端: LAST-ACK
Note left of 客户端: TIME-WAIT
Note right of 服务端: CLOSED
Note left of 客户端: CLOSED
  • 第一次挥手:客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,终止标志位FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
  • 第二次挥手:服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
  • 第三次挥手: 客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。
  • 第四次挥手:客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态,至此,完成四次挥手。

四、静态配置网卡IP,centos/ubuntu实现

4.1 centos8/ubuntu18.4实现网络基本配置

4.1.1 网络配置方式

  • 静态指定:

    • ifconfig, route, netstat
    • ip: object {link, addr, route}, ss, tc
      system-config-network-tui,setup
      配置文件
  • 动态分配:

    DHCP: Dynamic Host Configuration Protocol

4.1.2 centos网络基本配置

4.1.2.1 IP、MASK、GW、DNS相关的配置文件
  • 文件路径
/etc/sysconfig/network-scripts/ifcfg-ens160
  • 文件参数说明
TYPE 接口类型;常见有的Ethernet, Bridge
NAME 此配置文件应用到的设备
DEVICE 设备名
HWADDR 对应的设备的MAC地址
UUID 设备的惟一标识
BOOTPROTO 激活此设备时使用的地址配置协议,常用的dhcp, static, none, bootp
IPADDR 指明IP地址
NETMASK 子网掩码,如:255.255.255.0
PREFIX 网络ID的位数, 如:24
GATEWAY 默认网关
DNS1 第一个DNS服务器地址
DNS2 第二个DNS服务器地址
DOMAIN 主机不完整时,自动搜索的域名后缀
ONBOOT 在系统引导时是否激活此设备
USERCTL 普通用户是否可控制此设备
PEERDNS
如果BOOTPROTO的值为“dhcp”,YES将允许dhcp server分配的dns服务
器信息直接覆盖至/etc/resolv.conf文件,NO不允许修改resolv.conf
  • 配置IP:192.168.10.128/24、网关:192.168.10.255、DNS:114.114.114.114
[root@Rocky8 ~]#vim /etc/sysconfig/network-scripts/ifcfg-ens160
[root@Rocky8 ~]#cat /etc/sysconfig/network-scripts/ifcfg-ens160
NAME=ens160
DEVICE=ens160
ONBOOT=yes
IPADDR=192.168.10.128
PREFIX=24
GATEWAY=192.168.10.255
DNS1=114.114.114.114

[root@Rocky8 ~]# nmcli con reload && nmcli con up ens160
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/2)
[root@Rocky8 ~]# hostname -I
192.168.10.128 
  • 验证配置是否成功
[root@Rocky8 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:d7:87:c7 brd ff:ff:ff:ff:ff:ff
    altname enp3s0
    inet 192.168.10.128/24 brd 192.168.10.255 scope global dynamic noprefixroute ens160
       valid_lft 1632sec preferred_lft 1632sec
    inet6 fe80::20c:29ff:fed7:87c7/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
       
[root@Rocky8 ~]# ping 114.114.114.114
PING 114.114.114.114 (114.114.114.114) 56(84) bytes of data.
64 bytes from 114.114.114.114: icmp_seq=11 ttl=128 time=41.9 ms
64 bytes from 114.114.114.114: icmp_seq=53 ttl=128 time=144 ms
64 bytes from 114.114.114.114: icmp_seq=54 ttl=128 time=144 ms

#验证DNS
[root@Rocky8 ~]# cat /etc/resolv.conf
# Generated by NetworkManager
search localdomain 5.localdomain
nameserver 114.114.114.114

4.1.3 Ubuntu网络配置

  • 说明
Ubuntu18版本之后网卡配置文件采用YAML格式,必须以/etc/netplan/XXX.yaml 
文件命名方式存放可以每个网卡对应一个单独的配置文件,也可以将所有网卡都放在一个配置文件里
yaml文件格式:列表和键值对两种,并包含从属关系,严格控制缩进区分
  • 网络配置文件
root@ubuntu2004:~# cat /etc/netplan/00-installer-config.yaml
# This is the network config written by 'subiquity'
network:
  ethernets:
    ens33:                            #网卡名
      addresses: [192.168.10.129/24]  #静态IP地址
      dhcp4: no                       #取消ipv4的dhcp
      optional: true
      gateway4: 192.168.10.255          #网关地址
      nameservers:
         addresses: [114.114.114.114] #DNS地址,多个用逗号分隔
  version: 2
  renderer: networkd
  • 修改网卡配置文件后需执行命令生效:
root@ubuntu2004:~# netplan apply
  • 验证配置结果是否生效
root@ubuntu2004:~# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.10.129  netmask 255.255.255.0  broadcast 192.168.10.255
        inet6 fe80::20c:29ff:fed4:77bc  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:d4:77:bc  txqueuelen 1000  (Ethernet)
        RX packets 866  bytes 278559 (278.5 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 617  bytes 65932 (65.9 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 100  bytes 7868 (7.8 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 100  bytes 7868 (7.8 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

五、脚本题

实现免密登陆脚本, expect登陆远程主机,将生成的密钥写入到目标主机, expect测试远程登陆。
1)通过shift读取脚本参数
2)通过select来选择功能.例如功能有

  • 安装mysql

  • 安装apache

  • 免密钥登陆主机
    当前我们只实现免密钥登陆主机

    3)通过函数封装每个功能
    4)将免密钥登陆的过程可以重复进行, while 循环实现重复,需要有退出过程。当用户输入exit时,退出免密钥功能。
    5)支持输入一批主机免密钥,使用数组 实现

#!/bin/bash
color () {
   RES_COL=60
   MOVE_TO_COL="echo -en \\033[${RES_COL}G"
   SETCOLOR_SUCCESS="echo -en \\033[1;32m"
   SETCOLOR_FAILURE="echo -en \\033[1;31m"
   SETCOLOR_WARNING="echo -en \\033[1;33m"
   SETCOLOR_NORRMAL="echo -en \033[0m"
   echo -n "$1" && $MOVE_TO_COL
   echo -n "["
   if [ $2 = "success" -o $2 = "0" ];then
      ${SETCOLOR_SUCCESS}
      echo -n $" OK "
   elif [ $2 = "failure" -o $2 = "1"];then
      ${SETCOLOR_FAILURE}
      echo -n $"FAILEO"
   else
      ${SETCOLOR_WARNING}
      echo -n $"WARNING"
   fi
      ${SETCOLOR_NORRMAL}
      echo -n "]"
      echo

}

 

#免密登录,支持一批主机免密钥
ssh_login () {
NET=10.0.0
user=root
password=123456
IDLIST=({127..200})
for ID in ${IDLIST[*]};do
  ip=$NET.$ID

  read -p "是否登录$ip?(y登录 exit退出)" answer

    [[ $answer == "y|Y" ]]&& ssh $user$ip
    [[ $answer == "exit" ]] && break

expect <<EOF
set timeout 20
spawn ssh $user@$ip
expect {
       "yes/no" { send "yes\n";exp_continue }
       "password" { send "$password\n" }
}
expect "]#" { send "exit\n"}
expect eof
EOF
done

}

 

#安装mysql
install_mysql () {
  . /etc/os-release
   if [ $ID = "rocky" -o $ID = "centos" ] ; then
      yum -y install mysql
   elif [ $ID = "ubuntu" ] ;then
      apt -y install mysql
   else
      echo "OS is not support"
   fi
 color "mysql 已安装" 0
}


#安装apache
install_httpd () {
  . /etc/os-release
   if [ $ID = "rocky" -o $ID = "centos" ];then
      yum -y install httpd

   elif [ $ID = "ubuntu" ];then
      apt -y install httpd
   else
      echo "OS is not support"
   fi
  color "httpd 已安装" 0
}

menu () {
PS3="请选择功能(1-4):"
select menu in install_mysql install_httpd ssh_login exit ;do
case $REPLY in
1)install_mysql
  ;;
2)install_httpd
  ;;
3)ssh_login
  ;;
4)exit
  ;;
*)echo "请重新输入"
  ;;
esac
done
}

menu