RHCE笔记

[root@RHCSA network-scripts]# nmcli device
connect disconnect lldp monitor set status
delete help modify reapply show wifi
connect:连接
disconnect:断开
modify:修改
delete:删除
show:展示
status:状态
reapply:重新启动加载配置
验证环境

网络的通畅: ping www.baidu.com可以ping通

排查步骤
1.确认你的网卡是否有ip(ip, 网关,子网掩码,dns)
2.确认你当前使用网络模式(NAT) -> vmware虚拟机网络中vmnat8的网段是多少
3.确认一下你的iP是否和网段匹配
4.如果不行的话,去在你windows上重启一下vmnet8虚拟网卡

软件安装:

​ 1.在线的yum源

cd /etc/yum.repos.d
wget -O CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-8.repo
yum clean all
yum makecache

​ 2.如果网络不通,想安装软件,配置本地yum源

1.你的现有软件包,软件包从iso镜像来
  挂载iso镜像到我们文件系统的目录
  mount /dev/sr0 /mnt
2.进入/etc/yum.repos.d/
  vim redhat.repo

[base]
name=base
baseurl=file:///mnt/BaseOS
enabled=1
gpgcheck=0

[AppStream]
name=AppStream
baseurl=file:///mnt/AppStream
enabled=1
gpgcheck=0

3. yum clean all
   yum makecache

nmcli

NetworkManager: 就是管理配置网络的一个服务。使用这个服务,可以使用nmcli这个命令来对网络进行管理。

在rhel7里已经有了这个服务,rhel7以及之前的版本,都使用的network这个服务。

有一个网卡叫做ens160, 针对这个网卡可以有个多个配置(connection), 但是同一时刻只能有一个配置生效。

​ ens160:一个配置ip:192.168.233.138, 另一个配置:192.168.200.138

​ 同时只能有一个配置生效,要么是200.138, 要么是233.138

每次新建一个连接的时候:都会在/etc/sysconfig/network-scripts/目录下生成一个连接的配置文件。

ifcfg-ens160
if => interface cfg=> configuration ens160=>网卡的名字

nmcli命令

nmcli [OPTION] OBJECT {COMMAND | help}0
nmcli [OPTIONS...] {help | general | networking | radio | connection | device | agent | monitor}
             [COMMAND] [ARGUMENTS...]

这要讲OBJECT: conneciton device
connection: 知道就是连接(配置)
device: 设备(网卡: 物理网卡和虚拟网卡)

device -》 网卡
网卡上面可以有多个连接(配置)connection
在配置连接的时候,肯定是指定哪个物理网卡的。

device
nmcli device 
按两下tab键
connect     disconnect  lldp        monitor     set         status      
delete      help        modify      reapply     show        wifi    

connect: 连接, 激活当前这个网卡
disconnect: 断开连接 断开这个网卡
delete:删除
modify:修改
reapply:重新应用
show: 展示网卡信息
status: 状态

使用OBJECT: device, connection的时候可以使用简写:一个字母或者三个字母,或者全拼。
nmcli device connect ens160
nmcli device disconnect ens160
nmcli device reapply: 重新启动网卡加载配置

connection

connection:连接
nmcli connection
nmcli conn
nmcli c
多个连接,对应多个配置,同时只有一个连接生效。
例子:配置两个连接: 一个是静态IP,一个是动态IP
静态IP:固定IP,我设置的固定IP,不会变化的。
动态IP:使用DHCP协议从DHCP服务器上动态获取的IP

针对连接对象:
nmcli c 
按两下tab键:
add      delete   edit     help     load     monitor  show     
clone    down     export   import   modify   reload   up    

add: 增加一个网络连接
delete: 删除
edit: 编辑
load: 从配置文件加载
show:展示
clone: 克隆
down: 断开当前连接
export:导出
import:导入
modify:修改
reload: 重新加载
up: 激活
# 常用: add, delete, modify, reload, show, up , down
假设新建两条连接: rhce_static, rhce_auto
nmcli c add type ethernet
新建连接的时候有两个要点:连接名,使用的哪个物理网卡
con-name:连接名
ifname: 接口名字(网卡)
nmcli c add type ethernet con-name rhce_static ifname ens160
nmcli c add type ethernet con-name rhce_auto ifname ens160

具体的IP配置:ip地址,子网掩码,网关,dns,使用静态还是动态
ip地址-》:ipv4.addresses 
子网掩码:在ip地址之后/number 0-32
网关:ipv4.gateway 
dns:ipv4.dns
使用的动态还是静态:ipv4.method manual(手动) auto(自动)
如果是动态的:需不需要配置ip,网关,子网掩码
autoconnect yes: 如果开启了之后他会自动连接配置autoconnect的连接

静态的连接:nmcli c add type ethernet con-name rhce_static ifname ens160 ipv4.addresses 192.168.233.148/24 
ipv4.gateway 192.168.233.2 ipv4.dns 8.8.8.8 ipv4.method manual

# DHCP服务器提供了什么? ip, 子网掩码,网关
动态的连接: nmcli c add type ethernet con-name rhce_auto ifname ens160 ipv4.method auto


激活连接:
nmcli c up rhce_static

team多网卡绑定

多个网卡绑定在一起对外提供服务, 用户来访问的时候, 发数据包。

team组的模式:

broadcast: 广播的意思: 发过来的数据包以广播的形式,发送到每一个网卡

roundrobin: 轮询的模式:发送数据包到网卡,轮换的发送

activebackup: 主备模式: 两块网卡互为主备,当网卡是主设备,另一块不工作作为从设备, 当主设备出现问题,切换到从设备。

loadbalance:负载均衡: 两块网卡绑定为负载均衡模式,他会通过计算,让两块网卡上面收到的数据包均衡

lacp: 需要借助设备,实现高级负载均衡

可以通过nmcli命令来实现team机制的配置。

要素:

​ 多个网卡(>=2)

​ 绑定的操作:将我的多个网卡绑定在一个虚拟网卡,虚拟网卡对外提供服务(提供一个IP)

​ 但实际上数据包还是流经我们实际的物理网卡

绑定的操作:

1.首先得有一个虚拟网卡:对外提供服务,意味着它上面需要配置IP,配置IP是配置在连接上的。

如何去产生一个team的虚拟网卡,对应的上面要配置连接,连接上配置IP
直接去添加一条连接,并指定虚拟网卡:产生连接的同时,产生了一个虚拟网卡
# 和team相关的连接类型:
           ·   team
           ·   team-slave
# team-》 虚拟网卡上的连接
# team-slave: 绑定的物理网卡上的连接

config字段是用来配置team机制的模式 config json字符串
# 本身team_dev这个设备不存在,虚拟的(基于我们的type配置为team后)
# config:配置team机制的模式,json格式的
'{"runner": {"name": "activebackup", "hwaddr_policy": "by_active"}}'

nmcli c add type team con-name team_conn ifname team_dev config '{"runner": {"name": "activebackup"}}'
ipv4.addresses 192.168.233.158/24 ipv4.gateway 192.168.233.2 ipv4.dns 8.8.8.8 ipv4.method manual

配置完成后:会产生两个东西
一个是team_dev这个虚拟设备
一个是team_conn这个连接,连接是依赖于我们的虚拟的网卡team_dev
然后team_conn对外提供的ip为192.168.233.158
  1. 实际的物理网卡得绑定在我们的虚拟网卡上,这个是不需要配置IP

    两块物理网卡:ens160, ens224
    nmcli c add type team-slave con-name team_port1 ifname ens160 master team_dev
    nmcli c add type team-slave con-name team_port2 ifname ens224 master team_dev
    
  2. 激活我们的物理网卡,以及我们的虚拟网卡(实际上激活的是连接)

    激活的时候,先激活team-slave, 然后再激活team
    nmcli c up team_port1
    nmcli c up team_port2
    nmcli c up team_conn
    
  3. 查看主备的状态

    teamdctl team_dev state [view]
    
    [root@lwz-linuxprobe ~]# teamdctl team_dev state
    setup:
      runner: activebackup
    ports:
      ens160
        link watches:
          link summary: up
          instance[link_watch_0]:
            name: ethtool
            link: up
            down count: 0
      ens224
        link watches:
          link summary: up
          instance[link_watch_0]:
            name: ethtool
            link: up
            down count: 0
    runner:
      active port: ens160
    
  4. 切换:自动切换(我们把一块网卡给down掉,一块网卡不能工作了)

    down掉主用的网卡ens160
    nmcli d disconnect ens160
    
    查询状态:是切换了过来,但是window上ping不通了
            出现这个问题的原因是因为配置成功了之后,ens160,ens224,team_dev三个mac地址相同的
            执行切换的时候:ens160和ens224的mac相同,切换是切换过来的,但是它不知道使用哪个
            需要做的修正是:让它切换的时候,让我们team_dev跟随主用设备的mac地址
           
    [root@lwz-linuxprobe ~]# teamdctl team_dev state
    setup:
      runner: activebackup
    ports:
      ens224
        link watches:
          link summary: up
          instance[link_watch_0]:
            name: ethtool
            link: up
            down count: 0
    runner:
      active port: ens224
    
    

    出现问题之后去做修改:

    nmcli c modify team_conn config '{"runner": {"name": "activebackup", "hwaddr_policy": "by_active"}}'
    

    重新启动:

    nmcli c up team_port1
    nmcli c up team_port2
    nmcli c up team_conn
    

    重新验证:

    在windows上ping服务器的地址:
    ping 192.168.233.158 -t
    
    down掉主用的网卡ens160
    nmcli d disconnect ens160
    
    看一下ping
    查看一下状态:
    [root@lwz-linuxprobe ~]# teamdctl team_dev state
    setup:
      runner: activebackup
    ports:
      ens224
        link watches:
          link summary: up
          instance[link_watch_0]:
            name: ethtool
            link: up
            down count: 0
    runner:
      active port: ens224
    

    linux上的抓包tcpdump

    yum install tcpdump -y
    
    

桥接

先把之前配置的team机制的连接删除掉

配置

1.需要有一个对外的桥接的虚拟的网卡,需要有ip

nmcli c add type bridge con-name br1 ifname br1 ipv4.addresses 192.168.233.168/24 ipv4.gateway 192.168.233.2 ipv4.dns 8.8.8.8 ipv4.method manual 

2.将我们的网卡连接到虚拟桥接网卡上

nmcli c add type bridge-slave con-name br1_port1 ifname ens160 master br1
nmcli c add type bridge-slave con-name br1_port2 ifname ens224 master br1

3.启动

nmcli c up br1_port1
nmcli c up br1_port2
nmcli c up br1

4.测试: 测试我们网卡上面是不是有网桥转发过来的数据包(icmp)

tcpdump icmp -i ens160
tcpdump icmp -i ens224

在windows去ping 192.168.233.168 => 默认ping四次

那意味着:你在ens224和ens160上面都可以抓到4次icmp request数据包

[root@rhce ~]# tcpdump icmp -i ens160
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens160, link-type EN10MB (Ethernet), capture size 262144 bytes
03:43:55.800891 IP 192.168.233.1 > rhce: ICMP echo request, id 1, seq 4593, length 40
03:43:55.800926 IP rhce > 192.168.233.1: ICMP echo reply, id 1, seq 4593, length 40
03:43:56.804002 IP 192.168.233.1 > rhce: ICMP echo request, id 1, seq 4594, length 40
03:43:56.804054 IP rhce > 192.168.233.1: ICMP echo reply, id 1, seq 4594, length 40
03:43:57.810142 IP 192.168.233.1 > rhce: ICMP echo request, id 1, seq 4595, length 40
03:43:57.810175 IP rhce > 192.168.233.1: ICMP echo reply, id 1, seq 4595, length 40
03:43:58.814178 IP 192.168.233.1 > rhce: ICMP echo request, id 1, seq 4596, length 40
03:43:58.814235 IP rhce > 192.168.233.1: ICMP echo reply, id 1, seq 4596, length 40


[root@rhce ~]# tcpdump icmp -i ens224
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens224, link-type EN10MB (Ethernet), capture size 262144 bytes
03:43:55.800879 IP 192.168.233.1 > rhce: ICMP echo request, id 1, seq 4593, length 40
03:43:55.801544 IP rhce > 192.168.233.1: ICMP echo reply, id 1, seq 4593, length 40
03:43:56.804123 IP 192.168.233.1 > rhce: ICMP echo request, id 1, seq 4594, length 40
03:43:56.804131 IP rhce > 192.168.233.1: ICMP echo reply, id 1, seq 4594, length 40
03:43:57.810130 IP 192.168.233.1 > rhce: ICMP echo request, id 1, seq 4595, length 40
03:43:57.810240 IP rhce > 192.168.233.1: ICMP echo reply, id 1, seq 4595, length 40
03:43:58.814158 IP 192.168.233.1 > rhce: ICMP echo request, id 1, seq 4596, length 40
03:43:58.814361 IP rhce > 192.168.233.1: ICMP echo reply, id 1, seq 4596, length 40

SSH

简介

你们都使用过SSH,使用xshell/mobaxterm都是通过ssh协议连接到我们Linux。

能连接上主要是因为Linux系统都默认安装了ssh软件,并且启动了sshd服务:会监听22号端口

连接的时候:新建连接-》IP:port -》 用户名和密码 :基于口令的登录

远程连接到服务器之后,你输入命令:通过ssh传输到linux然后去执行,执行完成之后然后返回到远程连接工具上。

ssh: secure shell protocol 安全的壳程序协议。ssh会对我们的传输进行加密。

提供了两个服务: ssh远程登录的服务,sftp传输文件的服务

加密的方式

1.对称加密:使用同一个密钥进行加密和解密

​ 有一个密钥key,加密的数据 name=user password=123456. 使用key对name和password进行加密

​ 对方使用key对name和password进行解密 拿到解密后的真实数据。

image-20211119152457843

image-20220111095951014

对称加密的特点:对称加密的加密强度高,很难破解。在实际应用过程中不得不面临一个棘手的问题:如何安全的保存密钥呢?

2.非对称加密:指的是有一对密钥(公钥和私钥):使用公钥对数据加密,加密之后只能私钥去解密。

image-20220111100248205

1.远程Server收到Client端用户TopGun的登录请求,Server把自己的公钥发给用户。
2.Client使用这个公钥,将密码进行加密。
3.Client将加密的密码发送给Server端。
4.远程Server用自己的私钥,解密登录密码,然后验证其合法性。
5.若验证结果,给Client相应的响应。
私钥是Server端独有,这就保证了Client的登录信息即使在网络传输过程中被窃据,也没有私钥进行解密,保证了数据的安全性,这充分利用了非对称加密的特性。

ssh进行连接的时候会使用到: 加密算法,密钥交换算法,完整性校验

ssh中是如何应用的加密方式:ssh即使用了对称加密又使用了非对称加密。

​ 非对称加密时在认证用户连接的时候使用的,对称加密是在用户连接之后开始传输数据的时候加密数据的

ssh的工作流程

1.版本号协商

启动了sshd服务之后,服务会默认监听22号端口
客户端向服务发起tcp请求,请求的是22端口,然后三次握手建立连接
服务器向客户端发送第一个报文:SSH-<主协议版本号>.<次协议版本号>.<软件版本号>
#ssh主要有两个版本: ssh1和ssh2
客户端收到报文后比较版本,然后选择合适的版本
客户端回应服务器使用哪个版本

2.密钥和算法协商

服务器和客户端分别发送自己的算法协商报文:公钥算法列表,加密算法列表,MAC(消息验证码),算法列表,压缩算法列表
客户端和服务器选择都支持算法
服务器和客户端利用DH交换算法、主机密钥对等参数,生成会话密钥和会话ID(客户端和服务端各自计算出来)
# DH算法,会话密钥,会话ID  =》 重要了解的
# DH算法:客户端和服务器会利用这个算法计算出一个key,不是互相传输的
# 会话密钥: ssh连接成功之后,使用对称加密对传输的数据进行加密, 使用加密的密钥就是会话密钥。
# 会话ID: ssh断开连接,现在要恢复连接,通过会话ID来确认是不是上一次的连接

所以每一个新的ssh连接的时候,都会产生新的会话密钥和会话ID:每次是计算出来的可以保证一定的安全性。

最终的结果就是客户端和服务器都掌握了会话密钥和会话ID:进行传输数据的时候就可以使用会话密钥进行加密和解密

产生会话密钥的流程:

1.客户端去请求服务器,服务器会将自己的公钥发送给客户端。

服务器的公钥是如何产生的: 由sshd服务生成一对密钥(公钥和私钥),公钥发送给客户端,私钥服务器自己保留。

2.服务器生成会话ID,发送客户端

服务器发送了服务器的公钥以及会话的ID给客户端

3.如果客户端使第一次连接到ssh服务器,客户端会将服务器的公钥数据记录到自己家目录下./ssh/known_hosts文件。

客户端掌握了服务器端的公钥,会话ID

4.进行密钥交换:DH交换算法

DH交换算法:

通讯双方(张三、李四)需要先约定好算法参数(algorithm parameters):一个素数 p 作为模数,一个素数 g 作为基数(g 也称为“生成元”)。这两个算法参数是可以对外公开滴。
对于张三而言,需要先想好一个秘密的自然数 a 作为私钥(不能公开),然后计算 A = g^a mod p 作为自己的公钥(可以公开)。
对李四而言也类似,先想好一个秘密的自然数 b 作为私钥(不能公开),然后计算 B = g^b mod p 作为自己的公钥(可以公开)。
张三和李四互相交换各自的公钥。
然后张三计算出 k = B^a mod p,李四计算出 k = A^b mod p
好处:
张三和李四分别计算出来的 k 必定是一致的
张三和李四都无法根据已知的数来推算出对方的私钥(张三无法推算出 b,李四无法推算出 a)
对于一个旁观者(偷窥者),虽然能看到 p,g,A,B,但是无法推算出 a 和 b(就是说,旁观者无法推算出双方的私钥),自然也无法推算出 k

image-20220111105206492

3.认证阶段

进行SSH连接:两种方式

image-20220111105600579

有一个很重要的问题就是:如何确认服务器是安全的,是你想请求的服务器。

如果有一个黑客冒充了服务器:他也会给你发送公钥, 你把自己的密码使用黑客的公钥进行加密,发送给了黑客

那黑客就使用自己的私钥进行解密。黑客就拿到了你的密码。

image-20220111105804860

解决这个问题:要确保我请求的就是服务器而不是黑客,拿到就是服务器的公钥而不是黑客的公钥

基于口令的认证:

服务器把这个问题抛给客户端,让客户端去确认现在连接正确性。

无论你请求的是服务器还是黑客,它都给你返回公钥,客户端手动的去确认你是否信任这个公钥,如果信任你就去连接,如果不信任就断开连接。

The authenticity of host '192.168.233.168 (192.168.233.168)' can't be established.
# 无法确定主机“192.168.233.168(192.168.233.168)”的真实性
# ECDSA 密钥指纹是SHA256:Z7G3sGilzvwTMzHy7s6AkzzeHjUYmYCp/JD9nFvimmw.
# 没有直接返回公钥,而是对公钥进行hash,返回hash值
ECDSA key fingerprint is SHA256:Z7G3sGilzvwTMzHy7s6AkzzeHjUYmYCp/JD9nFvimmw.
# 是否确定要继续连接
Are you sure you want to continue connecting (yes/no/[fingerprint])?
如果信任这个公钥,你就输入yes
如果不信任, 你就输入 no
Warning: Permanently added '192.168.233.118' (ECDSA) to the list of known hosts.
# 警告:永久添加192.168.233.118 到已知主机列表中 ~/.ssh/known_hosts
每当客户端第一次使用ssh连接这个ssh服务器,它都会给你提示这个
如果输入yes进行连接,他会将公钥写入用户家目录./ssh/known_hosts文件中
等到下一次你连接的时候,就不会再出现上面的提示,因为会比较./ssh/known_hosts中有没有当前公钥的信息。如果有就直接进入输入密码
如果没有就提示。

客户端确认了公钥是受信任的之后:输入密码之后的流程。

image-20220111111141179

基于公钥的认证:免密登录

  1. 客户端要首先生成一对密钥(公钥和私钥)

  2. 把客户端的公钥需要你手动放到服务器上面(要手动的放到服务器,首先得知道这个服务器)

    这里就已经确保服务器是可信的。放到服务器的用户家目录的~/.ssh/authorized_keys

  3. 客户端请求服务器

  4. 服务器收到客户端的请求之后,先生成随机数random_server, 使用客户端放在authorized_keys这个文件中的公钥对随机数进行加密

    pubkey(random_server)发送给客户端

  5. 客户端有公钥和私钥,客户端收到这个加密的数据pubkey(random_server), 客户端使用私钥进行解密拿到random_server

    使用MD5(hash) 对random_server和sessionkey(会话密钥,在密钥交换步骤产生的)加密形成一个摘要digest1

    发送给服务器

  6. 服务器接收到digest1, 然后服务器本身自己使用之前协商过的MD5算法,自己也知道random_server, 也知道会话密钥sessionkey

    也是使用MD5算法对random_server sessionkey进行加密形成摘要digest2,最后去比较digest1 和 digest2是否相等

    如果相等,登录成功,如果不相等,登录失败。

img

实际操作:

1.客户端产生公钥和私钥
  当前系统上本身支持的算法:
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key
使用rsa这种算法:

产生公钥和私钥的命令: ssh-keygen => ssh key generate => 生成ssh的密钥的
ssh-keygen -t rsa/dsa/ecdsa
使用rsa
ssh-keygen -t rsa
[root@rhce ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):  #默认存储路径,不需要输入,直接回车
Enter passphrase (empty for no passphrase):  #不需要密码,直接回车
Enter same passphrase again: #直接回车
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:IKIZhQjwslma218g/E7u3OQPjogvvZtmsfoZcRtDkXQ root@rhce
The key's randomart image is:
+---[RSA 2048]----+
|*...o.E          |
|oo  .o           |
|o + o .          |
| % o . .         |
|B + =   S        |
| o.= =           |
|..oo+ +          |
|..=@ B .         |
|oBO+B +..        |
+----[SHA256]-----+

cd /root/.ssh/
[root@rhce .ssh]# pwd
/root/.ssh
[root@rhce .ssh]# ls -l
total 12
-rw-------. 1 root root 1811 Jan 10 22:38 id_rsa
-rw-r--r--. 1 root root  391 Jan 10 22:38 id_rsa.pub
-rw-r--r--. 1 root root  177 Jan 10 22:15 known_hosts

id_rsa: 客户端的私钥
id_rsa.pub: 客户端的公钥
使用公钥进行加密,使用私钥进行解密。


2.将我们的公钥存放在服务器端的authorized_keys这个文件中
公钥是id_rsa.pub,把这个公钥的内容放入服务器端authorized_keys文件中。
1)直接使用命令:ssh-copy-id 主机名
[root@rhce .ssh]# ssh-copy-id root@192.168.233.118
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.233.118's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'root@192.168.233.118'"
and check to make sure that only the key(s) you wanted were added.

2)直接将id_rsa.pub拷贝到服务器端,然后把id_rsa.pub的内容写入authorized_keys中
  将id_rsa.pub 拷贝到 服务器端
  scp id_rsa.pub 192.168.233.118:/root
  将id_rsa.pub的内容写入~/.ssh/authorized_keys
  cd /root
  cat id_rsa.pub >> ~/.ssh/authorized_keys
  
  
  
验证免密登录:
ssh root@192.168.233.118
不需要输入密码就可以登录。

4.会话请求阶段

在第三步完成之后, 认证通过后,客户端向服务器端发送会话请求

5.交互会话阶段

会话请求通过后,服务器端和客户端进行信息的交互

注意

​ ssh连接的时候,是需要指定用户的 ssh root@192.168.233.118, 可以是root用户也可以其他的普通用户。

​ 连接的产生的公钥和私钥,authorized_keys,known_hosts这些文件都存储在我们用户家目录下的~/.ssh/

​ 使用不同的用户登录,对应会在用户家目录产生.ssh这个目录

​ 如果要配置免密登录(基于公钥的认证), 需要是两台Linux机器, 一台作为客户端,一台作为服务端。

ssh的配置

​ ssh这个软件,安装系统的时候默认已经安装了。对应的服务名:sshd

​ ssh的配置文件:/etc/ssh/

[root@rhce ssh]# ls
moduli      ssh_config.d  ssh_host_ecdsa_key      ssh_host_ed25519_key      ssh_host_rsa_key
ssh_config  sshd_config   ssh_host_ecdsa_key.pub  ssh_host_ed25519_key.pub  ssh_host_rsa_key.pub

sshd_config: 主配置文件
ssh_host_ecdsa_key : 对应算法的私钥
ssh_host_ecdsa_key.pub: 公钥

私钥和公钥:安装完ssh软件之后就产生了。
客户端ssh协议连接ssh服务器,返回公钥。已经提前生成好了。

moduli:
因为启用了 diffie-hellman-group-exchange-sha256 这个密钥交换算法,还需要修改 /etc/ssh/moduli 以增强其安全性。如果有这个文件(一般安装时都会有的).

ssh_config.d: 认为额外配置文件存放的目录

ssh_config:SSH client configuration files ssh客户端的配置文件

服务器的sshd的配置sshd_config

#       $OpenBSD: sshd_config,v 1.103 2018/04/09 20:41:22 tj Exp $

# This is the sshd server system-wide configuration file.  See
# sshd_config(5) for more information.

# This sshd was compiled with PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin

# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where
# possible, but leave them commented.  Uncommented options override the
# default value.

# If you want to change the port on a SELinux system, you have to tell
# SELinux about this change.
# semanage port -a -t ssh_port_t -p tcp #PORTNUMBER
#
#Port 22    默认端口号, 可以使用多个端口号
#Port 443
#AddressFamily any   #协议家族, IPV4 or IPV6
#ListenAddress 0.0.0.0 #监听地址
#ListenAddress :: # 指明IPV6的所有地址格式
#当前版本支持的密钥认证方式
HostKey /etc/ssh/ssh_host_rsa_key #rsa私钥认证
HostKey /etc/ssh/ssh_host_ecdsa_key #ecdsa私钥认证
HostKey /etc/ssh/ssh_host_ed25519_key #ed25519私钥认证

# Ciphers and keying
#RekeyLimit default none

# System-wide Crypto policy:
# This system is following system-wide crypto policy. The changes to
# Ciphers, MACs, KexAlgoritms and GSSAPIKexAlgorithsm will not have any
# effect here. They will be overridden by command-line options passed on
# the server start up.
# To opt out, uncomment a line with redefinition of  CRYPTO_POLICY=
# variable in  /etc/sysconfig/sshd  to over write the policy.
# For more information, see manual page for update-crypto-policies(8).

# Logging #关于日志文件的信息数据放置与daemon的名称
#SyslogFacility AUTH # 有人使用SSH登录系统的时候,SSH会记录信息,记录在/var/log/secure
SyslogFacility AUTHPRIV # 默认是以AUTH来设置的。
#LogLevel INFO  # 日志等级

# Authentication: #认证
#LoginGraceTime 2m  #出现输入密码画面,多长时间没有成功连接上SSH Server就断线。
PermitRootLogin yes  # 是否允许管理员远程登录
#StrictModes yes # sshd去检查用户主目录或相关文件的权限数据, 当用户的host key改变之后,Server不接受联机
                              
#MaxAuthTries 6  # 最大尝试次数
#MaxSessions 10  # 允许最大会话数

#PubkeyAuthentication yes #是否允许Public Key

# The default is to check both .ssh/authorized_keys and .ssh/authorized_keys2
# but this is overridden so installations will only check .ssh/authorized_keys
AuthorizedKeysFile      .ssh/authorized_keys # 选择基于密钥验证时,客户端生成一对公私钥后,
                                             # 公钥放到.ssh/authorized_keys, 
                                           

#AuthorizedPrincipalsFile none  #发送欢迎词的文件,none表示不发送

#AuthorizedKeysCommand none #指定脚本查找用户的公钥文件做认证,在登录认证层面调用,可接受的参数有用户尝试登录时使用的私钥
                            #对应公钥,指纹、登录用户等变量;输出要求是 0 或多行 authorized_keys 格式的输出
#AuthorizedKeysCommandUser nobody #指定查找的用户

# For this to work you will also need host keys in /etc/ssh/ssh_known_hosts
#HostbasedAuthentication no #是否信任~/.ssh/known_hosts文件
# Change to yes if you don't trust ~/.ssh/known_hosts for
# HostbasedAuthentication
#IgnoreUserKnownHosts no #忽略用户known_hosts文件
# Don't read the user's ~/.rhosts and ~/.shosts files
#IgnoreRhosts yes #是否取消使用~/.ssh/.rhosts来作为认证。

# To disable tunneled clear text passwords, change to no here!
#PasswordAuthentication yes # 是否需要密码验证
#PermitEmptyPasswords no   # 是否允许空密码
PasswordAuthentication yes 

# Change to no to disable s/key passwords
#ChallengeResponseAuthentication yes
ChallengeResponseAuthentication no # 是否允许质疑-应答(challenge-response)认证。
                                   # 默认值是"yes",所有 login.conf中允许的认证方式都被支持。

# Kerberos options #Kerberos认证服务器的选项
#KerberosAuthentication no
#KerberosOrLocalPasswd yes
#KerberosTicketCleanup yes
#KerberosGetAFSToken no
#KerberosUseKuserok yes

# GSSAPI options #通用安全服务应用程序接口选项
GSSAPIAuthentication yes
GSSAPICleanupCredentials no
#GSSAPIStrictAcceptorCheck yes
#GSSAPIKeyExchange no
#GSSAPIEnablek5users no

# Set this to 'yes' to enable PAM authentication, account processing,
# and session processing. If this is enabled, PAM authentication will
# be allowed through the ChallengeResponseAuthentication and
# PasswordAuthentication.  Depending on your PAM configuration,
# PAM authentication via ChallengeResponseAuthentication may bypass
# the setting of "PermitRootLogin without-password".
# If you just want the PAM account and session checks to run without
# PAM authentication, then enable this but set PasswordAuthentication
# and ChallengeResponseAuthentication to 'no'.
# WARNING: 'UsePAM no' is not supported in Fedora and may cause several
# problems.
# PAM: Pluggable Authentication Modules 可插拔认证模块
UsePAM yes #使用PAM模块认证

#AllowAgentForwarding yes  # 允许经过代理转发
#AllowTcpForwarding yes    # 允许经过TCP转发
#GatewayPorts no           # 转发路径端口
X11Forwarding yes  #X-window的设置
#X11DisplayOffset 10 #x-window的设置
#X11UseLocalhost yes #x-window的设置
#PermitTTY yes  #允许tty
# It is recommended to use pam_motd in /etc/pam.d/sshd instead of PrintMotd,
# as it is more configurable and versatile than the built-in version.
PrintMotd no #登录后是否要显示信息,即使读取/etc/motd文件内容

#PrintLastLog yes #显示上次登录信息
#TCPKeepAlive yes #SSH Server会传送KeepAlive信息给Client,确保联机正常
                  #若有一方脱机后,SSh可以立即知道
#PermitUserEnvironment no
#Compression delayed #压缩延迟
#ClientAliveInterval 0 #设置空闲登录的最大时长
#ClientAliveCountMax 3 #在没收到任何数据的时候,最多向3个客户端进行keepalive检测
#ShowPatchLevel no #显示补丁级别
#UseDNS no  #开启DNS解析
#PidFile /var/run/sshd.pid #存储ssh的pid文件 
#MaxStartups 10:30:100  #最大可以保持多少个未认证的连接
#PermitTunnel no  #允许tun设备转发
#ChrootDirectory none #是否允许切换目录
#VersionAddendum none #配置附加版本

# no default banner path
#Banner none #不设置欢迎词

# Accept locale-related environment variables 接受本地相关环境变量类型
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS
#是否开启sftp服务
# override default of no subsystems
Subsystem       sftp    /usr/libexec/openssh/sftp-server

# Example of overriding settings on a per-user basis
#Match User anoncvs
#       X11Forwarding no #是否开启X11转发
#       AllowTcpForwarding no #是否允许TCP转发
#       PermitTTY no #是否允许tty
#       ForceCommand cvs server #限制命令

练习

1.修改ssh服务端口号

cd /etc/ssh/

vim sshd_config
# 配置文件带#号是被注释掉,还有有可能默认值。
增加了一行
Port 2222
修改完后保存并退出
你只是修改了配置文件, 但配置文件并没有生效。要想让配置文件生效,重启服务。
重启服务:systemctl restart sshd

# systemctl Control the systemd system and service manager 控制系统和服务的管理器
# restart: 重启的意思
# sshd: 服务名
systemctl status sshd: 查看当前这个服务的状态
journalctl -xe: 查看服务状态
# journalctl : Query the systemd journal: 查询系统日志
# -x: catalog 目录,一览表
# -e: 跳转到日志的最后的page

看到错误是selinux阻止了我们的2222端口
修正的操作:切换selinux的模式:enforcing -》 permissive 强制模式-》宽容模式
getenforce查看selinux的工作模式
setenforce 0|1:切换selinux的工作模式, 0代表的宽容模式permissive, 1代表的是强制模式:enforcing

[root@rhce ssh]# getenforce
Enforcing
[root@rhce ssh]# setenforce 0
[root@rhce ssh]# getenforce
Permissive
关闭防火墙:
[root@rhce ssh]# systemctl stop firewalld 

查看ssh日志: /var/log/secure
查看系统的日志:/var/log/messages
  1. 禁止root用户远程登录

    有一个测试的普通用户:
    [root@rhce ~]# useradd sshuser
    # passwd
    # echo "123456" | passwd --stdin sshuser
    [root@rhce ~]# echo "123456" | passwd --stdin sshuser
    Changing password for user sshuser.
    passwd: all authentication tokens updated successfully.
    
    去修改配置文件
    vim PermitRootLogin no
    
    去重启sshd服务
    systemctl restart sshd
    
  2. 允许特定用户登录

    vim sshd_config
    
    #本身配置项没有,需要手动添加
    #在配置文件最底部添加 AllowUsers 多个用户用空格隔开
    # 配置项所有单词首字母大写
    AllowUsers sshuser1 sshuser2
    #保存并退出
    #重启服务
    systemctl restart sshd
    
    # 新建用户
    [root@rhce ssh]# useradd sshuser1
    [root@rhce ssh]# useradd sshuser2
    [root@rhce ssh]# echo "123456" | passwd --stdin sshuser1
    Changing password for user sshuser1.
    passwd: all authentication tokens updated successfully.
    [root@rhce ssh]# echo "123456" | passwd --stdin sshuser2
    Changing password for user sshuser2.
    passwd: all authentication tokens updated successfully.
    
    # 去测试
    
    

sftp的用法

sftp: ssh + ftp => ssh类型的文件传输, 连接到服务器上去上传或者下载文件

# 去连接
sftp root@192.168.233.138 2222
sftp:/root>

# 在cmd中去连接:
sftp -P 2222 root@192.168.233.138
root@192.168.233.138's password:
Connected to 192.168.233.138.
sftp>
# 第一个我得知道,sftp远程到服务器访问的是服务器的哪一个目录?
pwd: 查看服务器当前目录 一般默认进入之后对应的是用户的家目录 root-> /root
lpwd:查看客户端的工作目录 local pwd => 本地
cd:  切花服务器的目录
lcd: 切换本地的目录
get: 下载
put: 上传
ls: 查看远端服务器当前工作目录下有哪些文件
lls: 查看本地
mkdir: 在远端创建目录
rmdir: 在远端删除目录
rm: 删除文件
chgrp、chown、chmod: 更改权限的
quit、exit、bye: 退出

注意:不能直接上传或下载目录

练习:

使用sftp, windows连接linux,进行文件的上传和下载

Linux例行工作

例行工作:定时任务,设定时间去执行任务

单一执行的例行工作: 任务在规定的时间只执行一次 atd

循环执行的例行工作: 按照一定周期去执行 crond

atd和crond这两个服务默认都是启动的。

单一执行的例行工作:atd

at命令操作,这是一个交互式的命令。at命令会将例行工作写入/var/spool/at目录

设置的是在未来的某个时间点去执行这个例行工作,需要等待这个设置的时间,然后取用和执行我们的例行工作。

at设置权限:设置哪些用户可以使用at进行设置例行工作, 默认只会有at.deny

​ /etc/at.allow: 设置允许的用户,默认不存在,如果要设置,需要手动建立这个文件

​ /etc/at.deny: 设置拒绝的用户

​ 读取的方式: 先去读取at.allow: 设置允许的用户,如果没有at.allow这个文件再去读取at.deny

​ 设置拒绝的用户,如果两个文件都不存在,只有root用户可以。

如何取设置例行工作:at命令

at [-mldv] TIME

-m: Send mail to the user when the job has completed even if there was no output
    当任务执行完成之后,发送邮件给用户,即使没有输出
-l:   Is an alias for atq => atq命令的别名
atq:  lists the user's pending jobs 列出待执行任务
-d: Is an alias for atrm  : atrm的别名
atrm: at rm => 删除的命令: deletes jobs, identified by their job number 删除例行工作 通过工作编号
-v: Shows the time the job will be executed before reading the job
    展示在读取工作之前工作将要被执行的时间
-c: cats the jobs listed on the command line to standard output. # 列出例行工作到标准输出
-f: file Reads the job from file rather than standard input: 从文件读取例行工作


TIME: TIME的格式
HH:MM 小时:分钟 : 在某一天的哪个时间点去执行
midnight, noon, teatime: 半夜,中午,下午4点
8AM, 4PM: 上午8点,下午4点
MMDD[CC]YY, MM/DD/[CC]YY, DD.MM.[CC]YY or [CC]YY-MM-DD
MMDDYY, MM/DD/YY DD.MM.YY YY-MM-DD
now + count time-units: now + 4 minutes 
                         单位可以有分钟(minutes),小时(hours),天(days),周(weeks)
today tomorrow
样例:
at 4pm + 3 days
at 10am Jul 31
at 1am tomorrow


使用:
at 交互式的命令
at now + 3 minutes # 按回车键
> #要输入的就是要执行例行工作
> echo "123456" > /root/at_task
> #怎么去结束crtl + d

例子:
[root@rhce etc]# echo "123" > /dev/pts/2
[root@rhce etc]# at now + 2 minutes
warning: commands will be executed using /bin/sh
at> echo "123" > /dev/pts/2
at> <EOT>
job 3 at Tue Jan 11 03:55:00 2022


  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值