[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
-
实际的物理网卡得绑定在我们的虚拟网卡上,这个是不需要配置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
-
激活我们的物理网卡,以及我们的虚拟网卡(实际上激活的是连接)
激活的时候,先激活team-slave, 然后再激活team nmcli c up team_port1 nmcli c up team_port2 nmcli c up team_conn
-
查看主备的状态
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
-
切换:自动切换(我们把一块网卡给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进行解密 拿到解密后的真实数据。
对称加密的特点:对称加密的加密强度高,很难破解。在实际应用过程中不得不面临一个棘手的问题:如何安全的保存密钥呢?
2.非对称加密:指的是有一对密钥(公钥和私钥):使用公钥对数据加密,加密之后只能私钥去解密。
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
3.认证阶段
进行SSH连接:两种方式
有一个很重要的问题就是:如何确认服务器是安全的,是你想请求的服务器。
如果有一个黑客冒充了服务器:他也会给你发送公钥, 你把自己的密码使用黑客的公钥进行加密,发送给了黑客
那黑客就使用自己的私钥进行解密。黑客就拿到了你的密码。
解决这个问题:要确保我请求的就是服务器而不是黑客,拿到就是服务器的公钥而不是黑客的公钥
基于口令的认证:
服务器把这个问题抛给客户端,让客户端去确认现在连接正确性。
无论你请求的是服务器还是黑客,它都给你返回公钥,客户端手动的去确认你是否信任这个公钥,如果信任你就去连接,如果不信任就断开连接。
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中有没有当前公钥的信息。如果有就直接进入输入密码
如果没有就提示。
客户端确认了公钥是受信任的之后:输入密码之后的流程。
基于公钥的认证:免密登录
-
客户端要首先生成一对密钥(公钥和私钥)
-
把客户端的公钥需要你手动放到服务器上面(要手动的放到服务器,首先得知道这个服务器)
这里就已经确保服务器是可信的。放到服务器的用户家目录的~/.ssh/authorized_keys
-
客户端请求服务器
-
服务器收到客户端的请求之后,先生成随机数random_server, 使用客户端放在authorized_keys这个文件中的公钥对随机数进行加密
pubkey(random_server)发送给客户端
-
客户端有公钥和私钥,客户端收到这个加密的数据pubkey(random_server), 客户端使用私钥进行解密拿到random_server
使用MD5(hash) 对random_server和sessionkey(会话密钥,在密钥交换步骤产生的)加密形成一个摘要digest1
发送给服务器
-
服务器接收到digest1, 然后服务器本身自己使用之前协商过的MD5算法,自己也知道random_server, 也知道会话密钥sessionkey
也是使用MD5算法对random_server sessionkey进行加密形成摘要digest2,最后去比较digest1 和 digest2是否相等
如果相等,登录成功,如果不相等,登录失败。
实际操作:
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
-
禁止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
-
允许特定用户登录
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