diff --git a/00.基础阶段/01.网络基础/01.网络基础概念.md b/00.基础阶段/01.网络基础/01.网络基础概念.md new file mode 100644 index 0000000..af0885a --- /dev/null +++ b/00.基础阶段/01.网络基础/01.网络基础概念.md @@ -0,0 +1,439 @@ +# 01.网络基础概念 + +## 1. 什么是网络 + +给各个节点之间提供信息交换的系统 + +两个节点之间连接一根网线组成了最简单的网络 + +## 2. 数据通信的类型 + +### 2.1 单播 + +一对一 + +### 2.2 广播 + +一对广播域内所有所有设备 + +如果是ffff.ffff.ffff的mac地址,表示是广播 + +如果IP的主机位全为1,表示广播 + +如果IP地址是255.255.255.255,表示在任何局域网,这个数据包都是广播 + +### 2.3 组播 + +一对所有感兴趣的组员 + +## 3. 集线器 + +![image-20200307092326426](01.网络基础概念/image-20200307092326426.png) + +将网线的铜介质直接连在一起,这样就可以多个设备之间传递信号。 + +集线器在收到一个数据之后,会发送给所有的出口。 + +不管广播,单播,组播,都是发给所有节点 + +### 3.1 优点 + +- 稳定性 +- 便宜 + +### 3.2 缺点 + +- 不安全 +- 无法提供中继 + +## 4. 交换机 + +![image-20200307093046757](01.网络基础概念/image-20200307093046757.png) + +交换机有操作系统,在收到数据之后会根据数据中的目的地址进行准确的转发。 + +单播会被准确的转发 + +广播、组播会被泛洪 + +一个交换机组成的网络,一般是一个局域网,大家可以直接互相访问 + +## 5. 路由器 + + + +![image-20200307094302877](01.网络基础概念/image-20200307094302877.png) + +路由器主要用于连接不同的网段,并且负责隔离广播域。 + +单播会被准确的转发 + +广播会被拒绝 + +组播会根据感兴趣组的注册信息,准确转发 + +## 6. 网络拓扑 + +- 逻辑拓扑 + - 标注出主要节点的连线,忽略不重要设备 + - 主要节点有可能是虚拟化的 + +- 物理拓扑 + - 标注出物理设备的连线 + - 主要用于弱点实施 + +## 7. OSI七层模型 + +![image-20200307101521932](01.网络基础概念/image-20200307101521932.png) + +OSI七层模型必须要会背,面试必问。 + +### 7.1 应用层 + +提供用户UI接入以及各种应用程序协议 + +http + +dns + +ftp + +### 7.2 表示层 + +对数据进行优化处理 + +格式化,压缩解压缩,加密与解密 + +### 7.3 会话层 + +管理不同应用的会话 + +### 7.4 传输层(段) + +数据分段和重组,提供数据传输的方式 + +1. tcp + 1. 可靠传输 + 2. 提供分段的可靠重组 +2. udp + 1. 尽力而为的传输 + +提供应用协议的区分。使用端口号,来让操作系统将数据和进程之间关联。 + +端口号范围0~65535 + +操作系统会预设一些端口号用于访问服务,比如我访问 http://www.ujs.edu.cn/ + +操作系统会根据http协议,去查找应该访问www.ujs.edu.cn地址的端口 + +查找文件为:`C:\Windows\System32\drivers\etc\services` + +面试官有可能会问一些常见服务的端口号,请务必记住 + +http:80 + +dns:53 + +ftp:20、21 + +dhcp:67、68 + +telnet:23 + +ssh:22 + +### 7.5 网络层(包) + +给数据提供远距离传输的机制 + +提供逻辑地址`IP地址` + +ip地址可以让路由器识别数据所属的局域网,然后准确的转发。 + +ip地址相当于信件上的邮编,可以让邮局分类然后运到所属地区。 + +### 7.6 数据链路层(帧) + +给提供数据在局域网中传输的机制 + +提供物理地址`mac地址` + +mac地址是在网卡出厂的时候烧录到芯片中的,不能被轻易的修改。 + +mac地址在正规厂家的网卡中是全球独一无二的,mac地址是由48位二进制数组成。 + +mac地址前24位是组织唯一标识符,由IEEE分配给各个厂家,后24位是厂家自己定义。 + +为了方便人们记忆,我们将mac地址分成6段,每段8位二进制,然后再转换为16进制。 + +物理层的数据需要成帧 + +例: + +`ipconfig /all` 可以查看windows的mac地址 + +`F0-1E-34-11-98-D5` + +### 7.7 物理层(位) + +定义传输介质的电气标准的 + +电:RJ45、RJ11、BNC + +光:LC、SC、SFP + +无线:wifi6 + +## 8. 数据的封装与解封装 + +### 8.1 传输层 + +由于需要分段和重组,以及端口号区分,所以数据必须携带上这些内容 + +由于这些信息用于控制数据的传递,并且总是加在报文的头部,所以被称为报头 + +传输层在分段之后,会在每个数据前面加上控制信息,比如源和目的端口号 + +### 8.2 网络层 + +数据想要通过路由器传递到远端的网络,就必须要提供目的IP地址,为了收到回复,还必须提供源IP地址。 + +### 8.3 数据链路层 + +当数据到达目的地所在的局域网的交换机上的时候,就需要通过mac地址来确认接收的设备网卡 + +为了收到回复,还必须提供源mac地址 + +![image-20200307112150770](01.网络基础概念/image-20200307112150770.png) + +## 9. 分析数据通信 + +1. 当我们开始访问一个地址的时候,由于并不知道怎么去往网关的MAC地址,所以使用arp协议发起广播查询MAC地址。 + +![image-20200307114246371](01.网络基础概念/image-20200307114246371.png) + +2. PC查到了网关的MAC地址之后,就记录到自己的ARP表中 + +![image-20200307114341302](01.网络基础概念/image-20200307114341302.png) + +3. 然后将数据封装起来,封装的时候加上每一层的关键信息,比如源和目的端口,源和目的IP地址,源和目的MAC地址。这边要注意,由于我们要去往的目的地是`192.168.3.2`并不是同网段。所以需要借用网关的MAC地址。 + +![image-20200307114629410](01.网络基础概念/image-20200307114629410.png) + +4. 数据从PC发出了之后被交换机收到了,交换机通过数据中Dst-MAC地址查找自己的`mac address table`知道应该从哪个接口离开。 + +![image-20200307115457201](01.网络基础概念/image-20200307115457201.png) + +5. 路由器最终收到了这个数据,首先查看目的mac地址,发现是给自己,就解开数据链路层封装,查看网络层的Dst-IP地址,然后对比自己的路由表,查找目的地应该发出的接口 + +![image-20200307115616522](01.网络基础概念/image-20200307115616522.png) + +6. 路由器会在这个数据发出去之前,将自己出接口的MAC地址作为源MAC地址,将下一跳设备的MAC地址作为目的MAC地址,重新封装数据链路层,然后发出,后面的路由器收到了之后,重复5、6两步。 + +![image-20200307115956116](01.网络基础概念/image-20200307115956116.png) + +7. 数据在这种不断的封装解封装数据链路层的过程中到达了目的地,最终web服务器收到了这个数据后,发现目的MAC地址,目的IP地址都是自己,并且目的80端口也有进程在监听,最终完成请求的过程。 + +![image-20200307120201468](01.网络基础概念/image-20200307120201468.png) + +## 10. ARP(地址解析协议) + +### 10.1 ARP地址解析协议 + +知道目的地的IP地址,请求MAC地址的协议 + +下面是请求的数据 + +![image-20200307135548122](01.网络基础概念/image-20200307135548122.png) + +下面是回复的数据 + +![image-20200307135644395](01.网络基础概念/image-20200307135644395.png) + +请求方拿到回答之后,会将结果记录在`arp表`中 + +![image-20200307135749117](01.网络基础概念/image-20200307135749117.png) + +在Cisco的路由器上,arp表中条目会有300分钟的寿命,300分钟后,就会被删除,然后重新请求。 + +### 10.2 代理ARP + +路由器**善意的谎言** + +1. 当路由器收到一个ARP请求,请求的目的地址不是自己的IP,但是自己可以去往这个地方 +2. 路由器会给请求方一个回复,回复的内容中会标注你要去往的IP地址的MAC就是我的MAC地址 +3. 然后请求方就把数据发送过来 + +注意!代理ARP并不是所有品牌的路由器都是默认开启的。并且需要路由器查询路由表,发现可以去往请求目的地址的时候,才会触发。 + +例:下图中R1去`ping 192.168.23.3`的时候,R2就会替`192.168.23.3`做出arp回应 + +![image-20200307140807857](01.网络基础概念/image-20200307140807857.png) + +![image-20200307140743214](01.网络基础概念/image-20200307140743214.png) + +### 10.3 反向ARP + +知道自己的MAC地址,但是不知道自己的IP,发起请求IP + +类似的功能,还有一种协议:apipa + +常用的场景: + +- 无盘工作站 +- PXE + + + + + +------------------ + + + + + +## 11. DoD模型 + +也叫美国国防部模型,是各种面试喜欢问的模型,我们只要背住就行 + +![image-20200307144320208](01.网络基础概念/image-20200307144320208.png) + +## 12. 传输层 + +### 12.1 端口号 + +一个IP地址可以拥有65536个端口号用于区分不同的服务 + +一般我们认为1023之前的端口号是保留的,并且运行众所周知的服务,可以查看系统的service文件 + +在发起通信的时候,正常情况下,源端口号是随机端口号,目的端口号由协议确定 + +![image-20200307150032747](01.网络基础概念/image-20200307150032747.png) + + + +### 12.2 TCP + +![image-20200307144420417](01.网络基础概念/image-20200307144420417.png) + +#### 12.2.1 TCP报文结构 + +![image-20200307144532135](01.网络基础概念/image-20200307144532135.png) + +#### 12.2.2 三次握手 + +![image-20200307144906302](01.网络基础概念/image-20200307144906302.png) + +三次握手会导致半开TCP的攻击行为 + +#### 12.2.3 四次挥手 + +![image-20200307144932736](01.网络基础概念/image-20200307144932736.png) + +#### 12.2.4 TCP有限状态机 + +http://aaronxu.eagleslab.com/index.php/archives/229.html + +#### 12.2.5 序列号与确认号 + +![image-20200307150615484](01.网络基础概念/image-20200307150615484.png) + +在传递数据的时候,TCP的序列号会加上传递数据的大小成为下一个收到数据的确认号 + +而确认号会成为下一个收到数据的序列号 + +通过这种方式保证每个数据都能有序完整的被对方接收 + +#### 12.2.6 滑动窗口 + +主要用于流量控制 + + http://aaronxu.eagleslab.com/index.php/archives/225.html + +### 12.3 UDP + +主要用于对数据的准确性没太高要求,以及对延迟低要求较高的场景 + +比如:QQ、网游、流媒体 + +## 13. IP编址 + +IP地址是32位二进制数组成,用于标识网络上唯一节点 + +为了方便人们记忆,采用点分十进制,比如IP地址是: + +> ‭11000000‬‭10101000‬0000‭1100‬00000001 +> +> 加上点之后 +> +> 11000000‬‭.10101000‬.0000‭1100.‬00000001 +> +> 变成十进制 +> +> 192.168.12.1 + +IP地址32位中,主要是网络位和主机位构成,类似于手机号码前7位是归属地,后面4位是编号 + +早期的人们为了区分网络位和主机位,对IP地址进行分类 + +A: 1.0.0.0~126.255.255.255 如果是这个段的,前8位是网络位 + +B: 128.0.0.0~191.255.255.255 如果是这个段的,前16位是网络位 + +C: 192.0.0.0~223.255.255.255 如果是这个段的,前24位是网络位 + +这样划分IP地址之后,网络位就可以被区分了,但是整个IP地址只有三档。 + +随着网络的发展,很多公司内部节点的数量,给个C类的地址,主机编号不够分,给个B类的地址,浪费。 + +后期人们保留ABC类的称呼,但是不再以此作为网络位数的判断,因为出现了子网掩码 + +### 13.1 子网掩码 + +子网掩码有32位二进制,和IP地址二进制位数一样的,并且可以和IP地址的二进制一一对应 + +我们规定子网掩码位是1,说明对应的IP位就是网络位 + +根据和之前旧的ABC类区分的方式对比,出现了VLSM(可变长子网掩码)、CIDR(地址聚合) + +实例: + +> VLSM:192.168.1.193 255.255.255.128 可以记作 192.168.1.193/25 +> +> CIDR: 192.168.1.1 255.255.0.0 可以记作192.168.1.1/16 + +### 13.2 广播地址与网络编号 + +为了方便对局域网的管理,由于需要发广播,或者对整个局域网进行统一称呼,出现了广播地址和网络编号 + +一个IP地址的主机位全为1,那么这个地址就是广播地址。(这边说的是三层的广播地址,全是ffff的那个是二层广播)。 + +一个IP地址的主机位全为0,那么这个地址就是网络编号,被用来对整个局域网统一称呼。 + +广播地址和网络编号都是保留的,不能分配给主机使用。 + +> 请问下列哪个IP地址可以被主机使用: +> +> A:172.16.1.128/30 网络编号 +> +> B:172.16.1.129/30 +> +> C:172.16.1.130/30 +> +> D:172.16.1.131/30 广播 + +### 13.3 私有IP地址 + +所有的IP地址都是由iana.org分配的,但是IPv4地址早就被分配光了 + +所以规定了私有Ip地址,可以再内网使用,但是不能与公网通信。 + +> A: 10.0.0.0~10.255.255.255 /8 +> +> B:172.16.0.0~172.31.255.255 /12 +> +> C:192.168.0.0~192.168.255.255 /16 + +当前几乎所有的企业或者家庭内网,都是使用NAT(地址转换)来实现上公网的功能。 + diff --git a/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307092326426.png b/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307092326426.png new file mode 100644 index 0000000..fc2e3df Binary files /dev/null and b/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307092326426.png differ diff --git a/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307093046757.png b/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307093046757.png new file mode 100644 index 0000000..34dccd2 Binary files /dev/null and b/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307093046757.png differ diff --git a/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307094302877.png b/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307094302877.png new file mode 100644 index 0000000..384067f Binary files /dev/null and b/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307094302877.png differ diff --git a/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307101521932.png b/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307101521932.png new file mode 100644 index 0000000..8a330b6 Binary files /dev/null and b/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307101521932.png differ diff --git a/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307112150770.png b/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307112150770.png new file mode 100644 index 0000000..32d8c1f Binary files /dev/null and b/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307112150770.png differ diff --git a/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307114246371.png b/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307114246371.png new file mode 100644 index 0000000..22a22d1 Binary files /dev/null and b/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307114246371.png differ diff --git a/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307114341302.png b/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307114341302.png new file mode 100644 index 0000000..565afc7 Binary files /dev/null and b/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307114341302.png differ diff --git a/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307114629410.png b/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307114629410.png new file mode 100644 index 0000000..f3aa8bb Binary files /dev/null and b/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307114629410.png differ diff --git a/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307115457201.png b/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307115457201.png new file mode 100644 index 0000000..3887358 Binary files /dev/null and b/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307115457201.png differ diff --git a/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307115616522.png b/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307115616522.png new file mode 100644 index 0000000..799de56 Binary files /dev/null and b/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307115616522.png differ diff --git a/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307115956116.png b/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307115956116.png new file mode 100644 index 0000000..729e0c9 Binary files /dev/null and b/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307115956116.png differ diff --git a/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307120201468.png b/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307120201468.png new file mode 100644 index 0000000..c8d4b48 Binary files /dev/null and b/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307120201468.png differ diff --git a/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307135548122.png b/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307135548122.png new file mode 100644 index 0000000..4032ead Binary files /dev/null and b/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307135548122.png differ diff --git a/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307135644395.png b/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307135644395.png new file mode 100644 index 0000000..2c61bda Binary files /dev/null and b/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307135644395.png differ diff --git a/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307135749117.png b/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307135749117.png new file mode 100644 index 0000000..f48c420 Binary files /dev/null and b/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307135749117.png differ diff --git a/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307140743214.png b/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307140743214.png new file mode 100644 index 0000000..3ce2615 Binary files /dev/null and b/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307140743214.png differ diff --git a/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307140807857.png b/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307140807857.png new file mode 100644 index 0000000..302af11 Binary files /dev/null and b/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307140807857.png differ diff --git a/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307144320208.png b/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307144320208.png new file mode 100644 index 0000000..5246834 Binary files /dev/null and b/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307144320208.png differ diff --git a/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307144420417.png b/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307144420417.png new file mode 100644 index 0000000..c3ee801 Binary files /dev/null and b/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307144420417.png differ diff --git a/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307144532135.png b/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307144532135.png new file mode 100644 index 0000000..de6c3ed Binary files /dev/null and b/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307144532135.png differ diff --git a/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307144906302.png b/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307144906302.png new file mode 100644 index 0000000..061b4de Binary files /dev/null and b/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307144906302.png differ diff --git a/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307144932736.png b/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307144932736.png new file mode 100644 index 0000000..2df05a4 Binary files /dev/null and b/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307144932736.png differ diff --git a/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307150032747.png b/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307150032747.png new file mode 100644 index 0000000..2ced982 Binary files /dev/null and b/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307150032747.png differ diff --git a/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307150615484.png b/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307150615484.png new file mode 100644 index 0000000..006d878 Binary files /dev/null and b/00.基础阶段/01.网络基础/01.网络基础概念/image-20200307150615484.png differ diff --git a/00.基础阶段/01.网络基础/02.模拟器安装.md b/00.基础阶段/01.网络基础/02.模拟器安装.md new file mode 100644 index 0000000..96b2caa --- /dev/null +++ b/00.基础阶段/01.网络基础/02.模拟器安装.md @@ -0,0 +1,327 @@ +# 02.模拟器安装 + +## 1. PNET模拟器介绍 + +### 1.1 🔧 为什么要使用 pnet 模拟器? + +1. **硬件成本高** + - 真正的 Cisco、华为等路由器/交换机设备价格昂贵,不适合学生或初学者搭建实验环境。 + - 模拟器可以“虚拟”真实设备,大幅降低学习门槛和成本。 +2. **实验环境灵活** + - pnet 支持快速部署、修改网络拓扑结构,只需拖拽点击即可完成复杂的网络环境搭建。 + - 不受物理连接限制,可随意连接任意数量的设备。 +3. **近似真实操作** + - pnet 支持运行 **真实厂商的镜像系统**(如 Cisco IOS、华为 VRP、Juniper JunOS 等),操作与真实设备几乎一致。 +4. **错误成本低** + - 实验中出错不会损坏真实设备,便于反复试验、练习命令,尤其适合初学者。 +5. **可视化与快照功能** + - 支持拓扑图形化界面,操作直观。 + - 支持快照/保存,便于回滚、记录学习进度和状态。 +6. **高扩展性** + - pnet 可以集成 Linux、Windows、Docker、Firewall(如 Palo Alto、Fortigate)等系统,满足企业级网络学习需求。 + - 支持多用户共享平台,适合教学、实验室场景。 + +## 2. 下载地址 + +百度网盘地址: https://pan.baidu.com/s/1NH2ycfp6jMg1e9VCXppOKg?pwd=6666 + +### 2.1 安装vmware + +如果之前电脑上已经安装过vmware workstation,请勿重复安装,如果需要升级版本,先正常卸载,然后再安装! + +- 双击安装包 + +![image-20250620103030182](02.模拟器安装/image-20250620103030182.png) + +- 接收许可,点击下一步 + +![image-20250620103102521](02.模拟器安装/image-20250620103102521.png) + +- 如果需要修改安装目录,请选择一个空文件夹! + +![image-20250620103218136](02.模拟器安装/image-20250620103218136.png) + +- 这两个√可以不需要 + +![image-20250620103415264](02.模拟器安装/image-20250620103415264.png) + +- 保持默认 + +![image-20250620103511243](02.模拟器安装/image-20250620103511243.png) + +- 开始安装 + +![image-20250620103552810](02.模拟器安装/image-20250620103552810.png) + +- 点击许可证 + +![image-20250620103806678](02.模拟器安装/image-20250620103806678.png) + +- 输入序列号`4C21U-2KK9Q-M8130-4V2QH-CF810` + +![image-20250620103917432](02.模拟器安装/image-20250620103917432.png) + +- 完成安装 + +![image-20250620104039641](02.模拟器安装/image-20250620104039641.png) + +### 2.2 导入pnet虚拟机 + +- 先解压!先解压! + +![image-20250620104127717](02.模拟器安装/image-20250620104127717.png) + +- 解压到一个空文件夹中,或者直接点击提取,然后再复制到对应的文件夹中 + +![image-20250620104221636](02.模拟器安装/image-20250620104221636.png) + +- 推荐在D盘中创建vm的文件夹,然后将解压后的pnet文件夹放进去 + +![image-20250620105953595](02.模拟器安装/image-20250620105953595.png) + +- 确保电脑中显示文件后缀名 + +![image-20250620110034332](02.模拟器安装/image-20250620110034332.png) + +- 双击pnet.vmx + +![image-20250620110059195](02.模拟器安装/image-20250620110059195.png) + +- 选择vmware workstation,然后点击确定 + +![image-20250620110140278](02.模拟器安装/image-20250620110140278.png) + +- 导入完成 + +![image-20250620110211746](02.模拟器安装/image-20250620110211746.png) + +## 3. PNET环境使用 + +### 3.1 初始化权限 + +- 启动pnet虚拟机,点击开启此虚拟机 + +![image-20250620110247614](02.模拟器安装/image-20250620110247614.png) + +- 启动成功界面 + +![image-20250620110822264](02.模拟器安装/image-20250620110822264.png) + +- 浏览器访问自己虚拟机的IP地址,默认用户名admin,密码pnet + +![image-20250620110955464](02.模拟器安装/image-20250620110955464.png) + +- 登录成功后,选择System中的System Setting + +![image-20250620111057423](02.模拟器安装/image-20250620111057423.png) + +- 点下图所示两个地方 + +![image-20250620111151095](02.模拟器安装/image-20250620111151095.png) + +### 3.2 创建第一个实验 + +- 新建一个实验 + +![image-20250620111230888](02.模拟器安装/image-20250620111230888.png) + +- 设置好实验名称 + +![image-20250620111303727](02.模拟器安装/image-20250620111303727.png) + +- 右键选择node + +![image-20250620111359433](02.模拟器安装/image-20250620111359433.png) + +- 此处我们添加一台网络设备,所以选择Cisco Device + +![image-20250620111440775](02.模拟器安装/image-20250620111440775.png) + +- 添加2台网络设备,点击Save + +![image-20250620111638363](02.模拟器安装/image-20250620111638363.png) + +- 连线,当鼠标停在设备上的时候,会出现一个插头,点击拖拽到另一台设备上,就可以完成连线 + +![image-20250620111803358](02.模拟器安装/image-20250620111803358.png) + +![image-20250620111814352](02.模拟器安装/image-20250620111814352.png) + +![image-20250620111839578](02.模拟器安装/image-20250620111839578.png) + +![image-20250620111849311](02.模拟器安装/image-20250620111849311.png) + +- 启动设备,鼠标框选需要启动的设备,然后右键,点击Start Selected + +![image-20250620111906364](02.模拟器安装/image-20250620111906364.png) + +![image-20250620111938183](02.模拟器安装/image-20250620111938183.png) + +![image-20250620111952918](02.模拟器安装/image-20250620111952918.png) + +- 打开设备配置界面,点击设备就可以打开,此处将两个设备都打开了,打开后可能是黑的,需要敲几个回车 + +![image-20250620112106993](02.模拟器安装/image-20250620112106993.png) + +- 我们不需要初始化向导,所以此处我们统一输入no,然后回车 + +![image-20250620112223328](02.模拟器安装/image-20250620112223328.png) + +- 输入命令尝试一下,此处命令是简写,所以看不懂,后面会教大家的,这里只是做个测试 + +``` +=====分割线:下面是R1设备上输入的命令===== +en +conf t +ho R1 +int e0/0 +ip add 192.168.12.1 255.255.255.0 +no sh +end +wr + +=====分割线:下面是R2设备上输入的命令===== +en +conf t +ho R2 +int e0/0 +ip add 192.168.12.2 255.255.255.0 +no sh +end +wr + +``` + +![image-20250620112438861](02.模拟器安装/image-20250620112438861.png) + +- 两台设备都输入完成之后,可以测试一下是不是可以`ping` 通 + +- 在R1上输入`ping 192.168.12.2`,如果出现如下的界面,说明一切正常 + +![image-20250620112615780](02.模拟器安装/image-20250620112615780.png) + +## 4. 设备初始化配置 + +1. 首先跳过设置向导 + +``` + --- System Configuration Dialog --- +Would you like to enter the initial configuration dialog? [yes/no]: no +Press RETURN to get started! +``` + +2. 从用户模式切换到特权模式(不然获得设备的完整权限) + +``` +Router>enable # 这边可以看到设备初始的名字是Router +Router# # 这边可以看到>变为#,意思是进入特权模式 +``` + +3. 如果想修改设备名之类的全局属性,需要进入全局配置模式 + +``` +Router#configure terminal +Enter configuration commands, one per line. End with CNTL/Z. +Router(config)# # 注意,()中表示的是当前的配置影响范围,如果是config,表示影响全局 +``` + +4. 修改设备名 + +``` +Router(config)#hostname R1 # 工作中设备名都是有意义的 +R1(config)# +``` + +5. 关闭域名解析(推荐) + +``` +R1(config)#no ip domain lookup # 不关闭会导致命令错误的时候,设备去尝试查找命令对应的IP +``` + +6. 配置IP地址 + +``` +R1(config)#interface e0/0 # 进入e0/0接口的配置模式 +R1(config-if)#ip address 192.168.12.1 255.255.255.0 # 注意括号变成了config-if,表示影响范围是接口 +R1(config-if)#no shutdown # 为了安全,默认所有接口出厂都自带shutdown属性,要删除这个命令,就在前面加上no +``` + +7. 优化管理接口的配置 + +``` +R1(config)#line console 0 # 进入控制台配置模式 +R1(config-line)#exec-timeout 0 # 关闭控制台会话超时 +R1(config-line)#logging synchronous # 输出同步,防止敲命令被打断 +``` + +8. 给设备加上密码 + +``` +R1(config)#enable password 密码 # 给特权模式加上密码 +R1(config)#line console 0 +R1(config-line)#password cisco # 设置控制台的密码 +R1(config-line)#login # 启用密码校验 + +User Access Verification + +Password: # 这边要输入控制台密码 +R1>enable +Password: # 这边要输入特权模式密码 +R1# +``` + +## 5. 命令行小技巧 + +### 5.1 命令提示 + +``` +R1>en? # 紧贴着字母后面输入?,可以查看这个字母开头的可用命令 +enable +R1>enable +R1#con? # 这边查询到当前有两个con开头的可用命令 +configure connect +R1#configure ? # 如果在空格后面加上?,表示查询当前命令后面能加上什么参数,以及解释 + confirm Confirm replacement of running-config with a new config + file + memory Configure from NV memory + network Configure from a TFTP network host + overwrite-network Overwrite NV memory from TFTP network host + replace Replace the running-config with a new config file + revert Parameters for reverting the configuration + terminal Configure from the terminal + # 如果出现,表示当前输入的命令已经可以直接执行了 +``` + +### 5.2 自动补全 + +``` +R1(config)#int # 在int后面加上tab键,就可以自动补全后续字母 +R1(config)#interface +R1#con # 由于con开头有两个可用命令,所以存在歧义,不可以补全 +R1#con? +configure connect +``` + +### 5.3 命令简写 + +``` +R1#conf t # 这个命令是configure terminal简写 +Enter configuration commands, one per line. End with CNTL/Z. +R1(config)#ho R1 # 这个命令是hostname R1简写 +R1(config)#int e0/0 # 这个命令是interface e0/0简写 +R1(config-if)#ip add 192.168.12.1 255.255.255.0 +R1(config-if)#no sh # 这个命令是no shutdown简写 +``` + +### 5.4 错误提示 + +``` +R1(config)#int +% Incomplete command. # 命令不完整,缺少参数 +R1(config)#s +% Ambiguous command: "s" # 未知的命令,输入错误了 +R1(config)#interfcaes e0/0 + ^ +% Invalid input detected at '^' marker. # 箭头所指的位置出现错误 +``` + diff --git a/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620103030182.png b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620103030182.png new file mode 100644 index 0000000..8dc9f24 Binary files /dev/null and b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620103030182.png differ diff --git a/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620103102521.png b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620103102521.png new file mode 100644 index 0000000..0dbf642 Binary files /dev/null and b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620103102521.png differ diff --git a/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620103218136.png b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620103218136.png new file mode 100644 index 0000000..9059a42 Binary files /dev/null and b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620103218136.png differ diff --git a/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620103415264.png b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620103415264.png new file mode 100644 index 0000000..b2ca8e8 Binary files /dev/null and b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620103415264.png differ diff --git a/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620103511243.png b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620103511243.png new file mode 100644 index 0000000..ad935f2 Binary files /dev/null and b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620103511243.png differ diff --git a/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620103551350.png b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620103551350.png new file mode 100644 index 0000000..2e5fe99 Binary files /dev/null and b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620103551350.png differ diff --git a/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620103552810.png b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620103552810.png new file mode 100644 index 0000000..2e5fe99 Binary files /dev/null and b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620103552810.png differ diff --git a/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620103806678.png b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620103806678.png new file mode 100644 index 0000000..c9acdea Binary files /dev/null and b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620103806678.png differ diff --git a/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620103917432.png b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620103917432.png new file mode 100644 index 0000000..cdd2457 Binary files /dev/null and b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620103917432.png differ diff --git a/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620104039641.png b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620104039641.png new file mode 100644 index 0000000..75720b5 Binary files /dev/null and b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620104039641.png differ diff --git a/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620104127717.png b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620104127717.png new file mode 100644 index 0000000..cd40fbd Binary files /dev/null and b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620104127717.png differ diff --git a/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620104221636.png b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620104221636.png new file mode 100644 index 0000000..05af740 Binary files /dev/null and b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620104221636.png differ diff --git a/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620105953595.png b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620105953595.png new file mode 100644 index 0000000..d078f67 Binary files /dev/null and b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620105953595.png differ diff --git a/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620110034332.png b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620110034332.png new file mode 100644 index 0000000..7dc4047 Binary files /dev/null and b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620110034332.png differ diff --git a/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620110059195.png b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620110059195.png new file mode 100644 index 0000000..164bf73 Binary files /dev/null and b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620110059195.png differ diff --git a/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620110140278.png b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620110140278.png new file mode 100644 index 0000000..19a22ff Binary files /dev/null and b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620110140278.png differ diff --git a/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620110211746.png b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620110211746.png new file mode 100644 index 0000000..3d2d3e7 Binary files /dev/null and b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620110211746.png differ diff --git a/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620110247614.png b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620110247614.png new file mode 100644 index 0000000..1ee171d Binary files /dev/null and b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620110247614.png differ diff --git a/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620110822264.png b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620110822264.png new file mode 100644 index 0000000..17577e5 Binary files /dev/null and b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620110822264.png differ diff --git a/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620110905588.png b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620110905588.png new file mode 100644 index 0000000..f1eb8c3 Binary files /dev/null and b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620110905588.png differ diff --git a/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620110955464.png b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620110955464.png new file mode 100644 index 0000000..2011915 Binary files /dev/null and b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620110955464.png differ diff --git a/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620111057423.png b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620111057423.png new file mode 100644 index 0000000..7f76ced Binary files /dev/null and b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620111057423.png differ diff --git a/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620111129338.png b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620111129338.png new file mode 100644 index 0000000..f489957 Binary files /dev/null and b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620111129338.png differ diff --git a/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620111151095.png b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620111151095.png new file mode 100644 index 0000000..f489957 Binary files /dev/null and b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620111151095.png differ diff --git a/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620111230888.png b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620111230888.png new file mode 100644 index 0000000..2161a48 Binary files /dev/null and b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620111230888.png differ diff --git a/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620111303727.png b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620111303727.png new file mode 100644 index 0000000..82fa052 Binary files /dev/null and b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620111303727.png differ diff --git a/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620111359433.png b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620111359433.png new file mode 100644 index 0000000..868e25d Binary files /dev/null and b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620111359433.png differ diff --git a/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620111440775.png b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620111440775.png new file mode 100644 index 0000000..c0be071 Binary files /dev/null and b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620111440775.png differ diff --git a/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620111527657.png b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620111527657.png new file mode 100644 index 0000000..230480d Binary files /dev/null and b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620111527657.png differ diff --git a/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620111638363.png b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620111638363.png new file mode 100644 index 0000000..1d727bf Binary files /dev/null and b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620111638363.png differ diff --git a/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620111803358.png b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620111803358.png new file mode 100644 index 0000000..ea808e4 Binary files /dev/null and b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620111803358.png differ diff --git a/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620111814352.png b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620111814352.png new file mode 100644 index 0000000..7b1ef19 Binary files /dev/null and b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620111814352.png differ diff --git a/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620111839578.png b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620111839578.png new file mode 100644 index 0000000..2aea5ce Binary files /dev/null and b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620111839578.png differ diff --git a/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620111849311.png b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620111849311.png new file mode 100644 index 0000000..5aae1cd Binary files /dev/null and b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620111849311.png differ diff --git a/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620111906364.png b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620111906364.png new file mode 100644 index 0000000..9125265 Binary files /dev/null and b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620111906364.png differ diff --git a/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620111938183.png b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620111938183.png new file mode 100644 index 0000000..ea09d2c Binary files /dev/null and b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620111938183.png differ diff --git a/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620111952918.png b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620111952918.png new file mode 100644 index 0000000..5dde6a8 Binary files /dev/null and b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620111952918.png differ diff --git a/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620112106993.png b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620112106993.png new file mode 100644 index 0000000..396218c Binary files /dev/null and b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620112106993.png differ diff --git a/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620112223328.png b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620112223328.png new file mode 100644 index 0000000..b5c7126 Binary files /dev/null and b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620112223328.png differ diff --git a/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620112438861.png b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620112438861.png new file mode 100644 index 0000000..02eaaa3 Binary files /dev/null and b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620112438861.png differ diff --git a/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620112615780.png b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620112615780.png new file mode 100644 index 0000000..767d37c Binary files /dev/null and b/00.基础阶段/01.网络基础/02.模拟器安装/image-20250620112615780.png differ diff --git a/00.基础阶段/01.网络基础/03.路由原理.md b/00.基础阶段/01.网络基础/03.路由原理.md new file mode 100644 index 0000000..9acdd23 --- /dev/null +++ b/00.基础阶段/01.网络基础/03.路由原理.md @@ -0,0 +1,134 @@ +# 03.路由原理 + +## 1. 路由原理 + +```mermaid +graph LR +A[路由器收到数据] --> B[查找路由表] +B-->C[存在匹配条目] +B-->D[不存在匹配条目] +C-->E[匹配条目中有没有出接口] +E-->F[存在出接口直接转发] +E-->G[不存在出接口,根据下一跳地址再次查找路由表] +D-->H[存在默认路由,就从默认路由标识的出口转发] +H-->G +D-->I[不存在默认路由,就丢弃] +``` + +``` +R1#show ip route # 查看路由表 +Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP + D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area + N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2 + E1 - OSPF external type 1, E2 - OSPF external type 2 + i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2 + ia - IS-IS inter area, * - candidate default, U - per-user static route + o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP + a - application route + + - replicated route, % - next hop override, p - overrides from PfR +# 以上是路由表的提示信息,标识路由条目中出现的代码意思 +Gateway of last resort is not set +# 上面这条是表示这个路由器没有默认的路由,当下面的条目与数据中目的地址一个也对不上的时候,就丢弃 +# 如果有默认路由,当下面的条目与数据中目的地址一个也对不上的时候,就从默认的路由转发 + 192.168.12.0/24 is variably subnetted, 2 subnets, 2 masks # 为了方便查看,路由表会按照ABC类IP地址进行分类,这个是分类的标题 +C 192.168.12.0/24 is directly connected, Ethernet0/0 # 前面的C,可以对照上面的codes,是直连的条目,后面的意思,可以直接从e0/0接口转发 +L 192.168.12.1/32 is directly connected, Ethernet0/0 +S 192.168.23.0/24 [1/0] via 192.168.12.2 # 前面的S,表示静态,后面并没有表示出接口,只标识了下一跳IP地址,这样就需要再次查找路由表,称为递归查找 +``` + +### 1.1 路由匹配条件 + +路由表中出现了`192.168.12.0/24`说明: + +1. 数据的目的IP地址的二进制,至少前24位要和`192.168.12.0`二进制前24位完全一致。 +2. 这边的`/24`不一定和子网掩码是一样的,因为数据包中并不携带子网掩码信息。 + +### 1.2 路由匹配原则 + +### 1.3 最长匹配原则 + +``` +R2#sh ip route + 172.16.0.0/16 is variably subnetted, 2 subnets, 2 masks +S 172.16.0.0/16 [1/0] via 192.168.12.1 +S 172.16.3.0/24 [1/0] via 192.168.23.3 + 192.168.12.0/24 is variably subnetted, 2 subnets, 2 masks +C 192.168.12.0/24 is directly connected, Ethernet0/0 +L 192.168.12.2/32 is directly connected, Ethernet0/0 + 192.168.23.0/24 is variably subnetted, 2 subnets, 2 masks +C 192.168.23.0/24 is directly connected, Ethernet0/1 +L 192.168.23.2/32 is directly connected, Ethernet0/1 +R2#ping 172.16.1.1 +Type escape sequence to abort. +Sending 5, 100-byte ICMP Echos to 172.16.1.1, timeout is 2 seconds: +!!!!! +Success rate is 100 percent (5/5), round-trip min/avg/max = 1/4/5 ms +R2#ping 172.16.3.3 +Type escape sequence to abort. +Sending 5, 100-byte ICMP Echos to 172.16.3.3, timeout is 2 seconds: +!!!!! +Success rate is 100 percent (5/5), round-trip min/avg/max = 1/3/6 ms +``` + +`ping 172.16.1.1`的时候,由于只能与第3行的条目匹配,所以数据发给了R1,最终能用通信 + +`ping 172.16.3.3`的时候,由于第3,4行条目都匹配,路由器会优选匹配最长的条目,也就是第4行,最终能通信 + +### 1.4 默认路由 + +当路由条目的匹配长度为0的时候,那么所有的IP地址都是可以匹配的上的,这个路由条目被称为缺省路由,或者默认路由 + +``` +R1(config)#ip route 0.0.0.0 0.0.0.0 192.168.12.2 +R1#sh ip route +Gateway of last resort is 192.168.12.2 to network 0.0.0.0 +S* 0.0.0.0/0 [1/0] via 192.168.12.2 # 默认路由在路由表中会带上*号 + 172.16.0.0/16 is variably subnetted, 2 subnets, 2 masks +C 172.16.1.0/24 is directly connected, Loopback0 +L 172.16.1.1/32 is directly connected, Loopback0 + 192.168.12.0/24 is variably subnetted, 2 subnets, 2 masks +C 192.168.12.0/24 is directly connected, Ethernet0/0 +L 192.168.12.1/32 is directly connected, Ethernet0/0 +S 192.168.23.0/24 [1/0] via 192.168.12.2 +R1#ping 172.16.3.3 +Type escape sequence to abort. +Sending 5, 100-byte ICMP Echos to 172.16.3.3, timeout is 2 seconds: +!!!!! +Success rate is 100 percent (5/5), round-trip min/avg/max = 1/1/1 ms +``` + +在`ping 172.16.3.3`的时候,可以和路由表中的默认路由匹配的上。 + +在`ping 192.168.23.3`的时候,根据最长匹配原则,会和第11行匹配上 + +### 1.5 路由条目的来源 + +* 直连接口 + * 必须要是双`up`状态,才能生效 +* 静态路由 + * 必须出接口或者下一跳IP地址有效 +* 动态路由学习 + * 通过各种路由协议,让路由器互相分享路由信息 + +## 2. 环回接口 + +环回接口是软件模拟出来的接口,用于测试,或者管理 + +环回接口正常情况下是不会`down`,只要操作系统可以正常开机,那么环回接口就可以正常`up` + +一台设备往往可以启动很多很多环回接口,用于模拟网络 + +``` +R1(config)#interface loopback 0 +R1(config-if)#ip add 172.16.1.1 255.255.255.0 +R1#show ip interface brief # 查看接口的IP地址和状态 +Interface IP-Address OK? Method Status Protocol +Ethernet0/0 192.168.12.1 YES manual up up +Ethernet0/1 unassigned YES unset administratively down down +Ethernet0/2 unassigned YES unset administratively down down +Ethernet0/3 unassigned YES unset administratively down down +Loopback0 172.16.1.1 YES manual up up +``` + + + diff --git a/00.基础阶段/01.网络基础/04.静态路由.md b/00.基础阶段/01.网络基础/04.静态路由.md new file mode 100644 index 0000000..a4d2de8 --- /dev/null +++ b/00.基础阶段/01.网络基础/04.静态路由.md @@ -0,0 +1,399 @@ +# 04.静态路由 + +## 1. 静态路由 + +- 在少量网段并且相对固定的时候可以使用静态路由 +- 临时测试的时候 + +## 2. 实验 + +![image-20200308133101113](04.静态路由/image-20200308133101113.png) + +### 2.1 配置IP地址 + +``` +R1 +en +conf t +int e0/0 +ip add 192.168.12.1 255.255.255.0 +no sh +end +============================ +R2 +en +conf t +int e0/0 +ip add 192.168.12.2 255.255.255.0 +no sh +int e0/1 +ip add 192.168.23.2 255.255.255.0 +no sh +end +============================= +R3 +en +conf t +int e0/0 +ip add 192.168.23.3 255.255.255.0 +no sh +end +``` + +在R2上可以检查到R1或者R3的连通性,确保IP地址配置正确 + +``` +R2#ping 192.168.12.1 +Type escape sequence to abort. +Sending 5, 100-byte ICMP Echos to 192.168.12.1, timeout is 2 seconds: +.!!!! +Success rate is 80 percent (4/5), round-trip min/avg/max = 1/3/5 ms +R2#ping 192.168.23.3 +Type escape sequence to abort. +Sending 5, 100-byte ICMP Echos to 192.168.23.3, timeout is 2 seconds: +.!!!! +Success rate is 80 percent (4/5), round-trip min/avg/max = 1/1/2 ms +``` + +如果IP地址配置不正确,出现了问题,可以再每台设备上使用如下命令检查 + +``` +R2#show ip int br +Interface IP-Address OK? Method Status Protocol +Ethernet0/0 192.168.12.2 YES manual up up +Ethernet0/1 192.168.23.2 YES manual up up +Ethernet0/2 unassigned YES unset administratively down down +Ethernet0/3 unassigned YES unset administratively down down +``` + +### 2.2 检查R1和R3的联通性 + +``` +R1#ping 192.168.23.3 +Type escape sequence to abort. +Sending 5, 100-byte ICMP Echos to 192.168.23.3, timeout is 2 seconds: +..... +Success rate is 0 percent (0/5) +``` + +检查R1的路由表 + +``` +R1#show ip route + 192.168.12.0/24 is variably subnetted, 2 subnets, 2 masks +C 192.168.12.0/24 is directly connected, Ethernet0/0 +L 192.168.12.1/32 is directly connected, Ethernet0/0 +``` + +发现`192.168.23.3`没有匹配条目 + +在R1上加上静态路由,告知R1如果想去往`192.168.23.0/24`需要从e0/0接口发出 + +``` +R1(config)#ip route 192.168.23.0 255.255.255.0 e0/0 +``` + +然而还是不通,因为R3并没有返回`192.168.12.0/24`的路由,导致R3只能收到R1的消息,但是不能回复 + +``` +R3(config)#ip route 192.168.12.0 255.255.255.0 e0/0 +``` + +现在三台路由器都知道了`192.168.12.0/24`和`192.168.23.0/24`两个网段的去法 + +``` +R1#ping 192.168.23.3 +Type escape sequence to abort. +Sending 5, 100-byte ICMP Echos to 192.168.23.3, timeout is 2 seconds: +..!!! +Success rate is 60 percent (3/5), round-trip min/avg/max = 1/1/1 ms +``` + +### 2.3 ARP在这个过程中 + +通过检查R1的arp表,我们可以发现`192.168.23.3`的arp结果和`192.168.12.2`的一样 + +``` +R1#show arp +Protocol Address Age (min) Hardware Addr Type Interface +Internet 192.168.12.1 - aabb.cc00.1000 ARPA Ethernet0/0 +Internet 192.168.12.2 5 aabb.cc00.2000 ARPA Ethernet0/0 +Internet 192.168.23.3 0 aabb.cc00.2000 ARPA Ethernet0/0 +``` + +上面这种情况是代理ARP产生的,如果R1并不是去往R3,而是作为局域网连接外网网关,那么访问的目的地址可能无数个。这种情况下,会导致ARP结果越来越多,影响效率。 + +``` +R1(config)#ip route 0.0.0.0 0.0.0.0 e0/0 # 在R1配置默认路由,模拟R1的e0/0接口是外网 +R1#ping 192.168.23.4 +Type escape sequence to abort. +Sending 5, 100-byte ICMP Echos to 192.168.23.4, timeout is 2 seconds: +.. +Success rate is 0 percent (0/2) +R1#show arp +Protocol Address Age (min) Hardware Addr Type Interface +Internet 123.123.123.123 0 aabb.cc00.2000 ARPA Ethernet0/0 +Internet 192.168.12.1 - aabb.cc00.1000 ARPA Ethernet0/0 +Internet 192.168.12.2 9 aabb.cc00.2000 ARPA Ethernet0/0 +Internet 192.168.23.3 4 aabb.cc00.2000 ARPA Ethernet0/0 +Internet 192.168.23.4 0 aabb.cc00.2000 ARPA Ethernet0/0 +``` + +发现不管去往什么地址,都会导致ARP表多出一条。 + +检查路由表 + +``` +R1#show ip route +S* 0.0.0.0/0 is directly connected, Ethernet0/0 # 发现默认路由条目一次查找,就知道出口了 + 192.168.12.0/24 is variably subnetted, 2 subnets, 2 masks +C 192.168.12.0/24 is directly connected, Ethernet0/0 +L 192.168.12.1/32 is directly connected, Ethernet0/0 +S 192.168.23.0/24 is directly connected, Ethernet0/0 +``` + +如果数据目的IP地址在路由表中直接能找到出接口,就回直接封装然后转发,如果没有MAC地址的记录,就会触发ARP。 + +如果静态路由尝试用下一跳IP地址作为出站线索,触发路由表递归查询 + +``` +R1(config)#ip route 192.168.23.0 255.255.255.0 192.168.12.2 +R1#sh ip route + 192.168.12.0/24 is variably subnetted, 2 subnets, 2 masks +C 192.168.12.0/24 is directly connected, Ethernet0/0 +L 192.168.12.1/32 is directly connected, Ethernet0/0 +S 192.168.23.0/24 [1/0] via 192.168.12.2 +R1#ping 192.168.23.3 +Type escape sequence to abort. +Sending 5, 100-byte ICMP Echos to 192.168.23.3, timeout is 2 seconds: +!!!!! +Success rate is 100 percent (5/5), round-trip min/avg/max = 1/1/1 ms +R1#sh arp +Protocol Address Age (min) Hardware Addr Type Interface +Internet 192.168.12.1 - aabb.cc00.1000 ARPA Ethernet0/0 +Internet 192.168.12.2 0 aabb.cc00.2000 ARPA Ethernet0/0 +``` + +如果静态路由配置下一跳的IP地址作为出站线索,那么就会触发路由表递归查找,而最终不仅仅是找到了出口信息,同时还找到了下一跳IP地址的MAC地址,直接会被拿来作为数据链路层的目的MAC地址。 + +### 2.4 结论 + +在配置静态路由的时候,尽量配置下一跳IP地址作为出口,这样可以避免ARP表的增大。 + +## 3. 路由汇总 + +为了测试,在R1上配置多个loopback接口,用于模拟多个网段 + +``` +R1#sh ip int br +Interface IP-Address OK? Method Status Protocol +Ethernet0/0 192.168.12.1 YES manual up up +Ethernet0/1 unassigned YES unset administratively down down +Ethernet0/2 unassigned YES unset administratively down down +Ethernet0/3 unassigned YES unset administratively down down +Loopback1 172.16.1.1 YES manual up up +Loopback2 172.16.2.1 YES manual up up +Loopback3 172.16.3.1 YES manual up up +``` + +这些地址配置的都是/24,但是我们发现前16位都是一样的,那么R2上可以写如下的汇总静态路由 + +``` +R2(config)#ip route 172.16.0.0 255.255.0.0 192.168.12.1 +``` + +汇总路由可以精简路由条目,加快了查找效率 + +但是汇总路由也会导致明细的丢失,造成不必要的路由转发 + +## 4. 路由器的配置保存与查看 + +当上面的实验做完了,检查网络状态都可以,就可以保存配置了 + +``` +R1#copy running-config startup-config # 把内存中的配置文件,保存到开机启动配置文件中 +R1#write +``` + +在配置的时候,可以查看当前的配置文件 + +``` +R1#show running-config # 然后按空格翻页,按q退出 +R1#show run int e0/0 # 查看接口e0/0下的配置 +R1#show running-config | section ip route # 查看有ip route的那一行配置 +``` + +正常情况下,`ping`,`show`,`write`等命令只能在特权模式下(#)或者用户模式下(>)使用,如果想在各种配置模式中使用这些命令,可以在命令前面加个`do`来调用 + +``` +R1(config)#show ip route + ^ +% Invalid input detected at '^' marker. + +R1(config)#do show ip route # 前面加do可以调用非配置模式下的命令 +``` + +## 5. 管理距离 + +当路由器从不同的方式学到了同一条路由条目,由于路由器只能将最佳路由放在路由表中。所以会从多个可用条目中将最佳结果放入路由表。 + +路由器使用管理距离去评判路由获得方式优劣。 + +![image-20200308140846007](04.静态路由/image-20200308140846007.png) + +注意!上表是cisco设备的管理距离,每个品牌都会有些不一样,用的时候需要去查一下。 + +这个管理距离只是设备自己这么认为,无法影响其他设备,所以必要的时候,我们可以去修改,而不用担心全网的影响。越小越优。不优的不会出现在路由表中。 + +``` +S 192.168.23.0/24 [1/0] via 192.168.12.2 +# 这个条目中[1/0]里面1是管理距离,是用来判断同一个路由的不同来源的优先级 +R1#show ip route 192.168.23.0 +Routing entry for 192.168.23.0/24 + Known via "static", distance 1, metric 0 # 管理距离是1,度量值是0 + Routing Descriptor Blocks: + * 192.168.12.2 + Route metric is 0, traffic share count is 1 +``` + +## 6. 浮动静态路由 + +浮动静态路由是通过修改管理距离的方式,让静态路由可以做到控制路径,在发生故障的时候,也能切换。 + +两个路线都正常的情况下 + +![image-20200308142512045](04.静态路由/image-20200308142512045.png) + +当下面的路线断开之后 + +![image-20200308142538843](04.静态路由/image-20200308142538843.png) + +先配置IP地址 + +``` +R1 +int e0/0 +ip add 192.168.12.1 255.255.255.0 +no sh +========================== +R2 +int e0/0 +ip add 192.168.12.2 255.255.255.0 +no sh +int e0/2 +ip add 192.168.23.2 255.255.255.0 +no sh +int e0/1 +ip add 192.168.32.2 255.255.255.0 +no sh +=========================== +R3 +int e0/0 +ip add 192.168.34.3 255.255.255.0 +no sh +int e0/2 +ip add 192.168.23.3 255.255.255.0 +no sh +int e0/1 +ip add 192.168.32.3 255.255.255.0 +no sh +========================== +R4 +int e0/0 +ip add 192.168.34.4 255.255.255.0 +no sh +``` + +配置静态路由 + +``` +R1(config)#ip route 0.0.0.0 0.0.0.0 192.168.12.2 +================================== +R2(config)#ip route 192.168.34.0 255.255.255.0 192.168.23.3 +R2(config)#ip route 192.168.34.0 255.255.255.0 192.168.32.3 2 +=================================== +R3(config)#ip route 192.168.12.0 255.255.255.0 192.168.23.2 2 +R3(config)#ip route 192.168.12.0 255.255.255.0 192.168.32.2 +================================== +R4(config)#ip route 0.0.0.0 0.0.0.0 192.168.34.3 +``` + +检查在线路正常的时候访问的路径 + +``` +R1#traceroute 192.168.34.4 +Type escape sequence to abort. +Tracing the route to 192.168.34.4 +VRF info: (vrf in name/id, vrf out name/id) + 1 192.168.12.2 1 msec 0 msec 1 msec + 2 192.168.23.3 1 msec 1 msec 0 msec + 3 192.168.34.4 1 msec * 1 msec +========================== +R4#traceroute 192.168.12.1 +Type escape sequence to abort. +Tracing the route to 192.168.12.1 +VRF info: (vrf in name/id, vrf out name/id) + 1 192.168.34.3 0 msec 1 msec 1 msec + 2 192.168.32.2 0 msec 1 msec 1 msec + 3 192.168.12.1 0 msec * 3 msec +``` + +下面关闭R2的e0/2口,来模拟线路有一个损坏,再次检查线路是否切换 + +``` +R1#traceroute 192.168.34.4 +Type escape sequence to abort. +Tracing the route to 192.168.34.4 +VRF info: (vrf in name/id, vrf out name/id) + 1 192.168.12.2 5 msec 5 msec 5 msec + 2 192.168.32.3 1 msec 5 msec 5 msec + 3 192.168.34.4 1 msec * 1 msec +``` + +## 7. 负载均衡 + +当去往同一个路由条目有多个出口的时候,并且管理距离和度量值都是一样的,也就是说路由器分辨不出来哪个路径好坏。路由器会将这些路线全部加到路由表中,进行等价负载均衡。 + +``` +R2(config)#ip route 100.0.0.0 255.0.0.0 192.168.12.1 +R2(config)#ip route 100.0.0.0 255.0.0.0 192.168.23.3 +R2(config)#do sh ip route +......... +S 100.0.0.0/8 [1/0] via 192.168.23.3 + [1/0] via 192.168.12.1 +........ +``` + +比如:100.0.0.0/8就有两个下一跳IP地址,并且都是`[1/0]`,所以全部加入了路由表,在发数据的时候,会将数据包一个IP地址发一个。可以通过如下命令查看下次往哪里走。 + +``` +R2(config)#do sh ip route 100.0.0.0 +Routing entry for 100.0.0.0/8 + Known via "static", distance 1, metric 0 + Routing Descriptor Blocks: + 192.168.23.3 + Route metric is 0, traffic share count is 1 + * 192.168.12.1 # 前面的*表示下一个IP包将发到这个地址 + Route metric is 0, traffic share count is 1 +R2#ping 100.1.1.1 repeat 1 +Type escape sequence to abort. +Sending 1, 100-byte ICMP Echos to 100.1.1.1, timeout is 2 seconds: +! # 100.1.1.1只有R1有,所以这次通了 +Success rate is 100 percent (1/1), round-trip min/avg/max = 2/2/2 ms +R2#show ip route 100.0.0.0 +Routing entry for 100.0.0.0/8 + Known via "static", distance 1, metric 0 + Routing Descriptor Blocks: + * 192.168.23.3 # 由于192.168.12.1上次才发过数据包,所以下次走192.168.23.3 + Route metric is 0, traffic share count is 1 # 这个是线路共享比例,等价负载均衡是1:1 + 192.168.12.1 + Route metric is 0, traffic share count is 1 +R2#ping 100.1.1.1 repeat 1 +Type escape sequence to abort. +Sending 1, 100-byte ICMP Echos to 100.1.1.1, timeout is 2 seconds: +U # 100.1.1.1只有R1有,所以这次不通 +Success rate is 0 percent (0/1) +``` + +负载均衡在企业的应用中非常的广泛,可以用于提升链路的可靠性,提升链路的速率。 + diff --git a/00.基础阶段/01.网络基础/04.静态路由/image-20200308133101113.png b/00.基础阶段/01.网络基础/04.静态路由/image-20200308133101113.png new file mode 100644 index 0000000..07ac077 Binary files /dev/null and b/00.基础阶段/01.网络基础/04.静态路由/image-20200308133101113.png differ diff --git a/00.基础阶段/01.网络基础/04.静态路由/image-20200308140846007.png b/00.基础阶段/01.网络基础/04.静态路由/image-20200308140846007.png new file mode 100644 index 0000000..fd94149 Binary files /dev/null and b/00.基础阶段/01.网络基础/04.静态路由/image-20200308140846007.png differ diff --git a/00.基础阶段/01.网络基础/04.静态路由/image-20200308142512045.png b/00.基础阶段/01.网络基础/04.静态路由/image-20200308142512045.png new file mode 100644 index 0000000..e57c7b6 Binary files /dev/null and b/00.基础阶段/01.网络基础/04.静态路由/image-20200308142512045.png differ diff --git a/00.基础阶段/01.网络基础/04.静态路由/image-20200308142538843.png b/00.基础阶段/01.网络基础/04.静态路由/image-20200308142538843.png new file mode 100644 index 0000000..5951f24 Binary files /dev/null and b/00.基础阶段/01.网络基础/04.静态路由/image-20200308142538843.png differ diff --git a/00.基础阶段/01.网络基础/05.ACL.md b/00.基础阶段/01.网络基础/05.ACL.md new file mode 100644 index 0000000..f0f9023 --- /dev/null +++ b/00.基础阶段/01.网络基础/05.ACL.md @@ -0,0 +1,189 @@ +# 05.ACL + +## 1. ACL(access control list) + +### 1.1 作用 + +- 对流量进行过滤 +- 对路由条目进行过滤 + +### 1.2 类型 + +- 标准访问控制列表 +- 扩展访问控制列表 + +### 1.3 标准访问控制列表 + +1. 只能对流量的源IP地址进行抓取 +2. 只能对经过本设备的流量进行过滤,如果是本设备始发的流量,就无法限制 +3. 一个访问控制列表可以写多个规则,流量按照顺序一条条匹配,如果匹配上了,就执行动作,不会继续匹配下去 +4. 访问控制列表最后会隐含一条拒绝所有,意思是,如果有流量在这个ACL中一个条件都没匹配的上,最终会被拒绝。 + +![image-20200308153117453](05.ACL/image-20200308153117453.png) + +在上图中,如果我们想拒绝R1的`192.168.12.1`去访问R3的`192.168.23.3`,那么我们可以这样设置 + +``` +R2(config)#access-list 1 deny host 192.168.12.1 +R2(config)#access-list 1 permit any # 我们针对性过滤源IP是192.168.12.1的,其他的放行 +R2#show ip access-lists # 查看访问控制列表 +Standard IP access list 1 # 访问控列表1里面的规则 + 10 deny 192.168.12.1 # 前面的10是顺序,默认以10递增,方便后续维护的时候插入规则 + 20 permit any +R2(config)#int e0/0 +R2(config-if)#ip access-group 1 in # 必须在接口上调用这个ACL,才能生效,需要注意方向in +``` + +标准访问控制列表由于只能针对IP地址做的过滤,所以越靠近源头,影响网络可达性越大,我们在真实使用的时候尽量靠近目的地。 + +注意,无法限制自己本身始发的流量。 + +### 1.4 扩展的访问控制列表 + +1. 只能对经过本设备的流量进行过滤,如果是本设备始发的流量,就无法限制 +2. 可以针对源IP目的IP进行匹配和过滤,并且还能识别不同的数据流量,做针对性的过滤 +3. 一个访问控制列表可以写多个规则,流量按照顺序一条条匹配,如果匹配上了,就执行动作,不会继续匹配下去 +4. 访问控制列表最后会隐含一条拒绝所有,意思是,如果有流量在这个ACL中一个条件都没匹配的上,最终会被拒绝。 + +![image-20200308155236805](05.ACL/image-20200308155236805.png) + +想让R1无法实现`ping 192.168.23.3`但是又可以`telnet 192.168.23.3` + +``` +R2(config)#access-list 100 deny icmp host 192.168.12.1 host 192.168.23.3 echo +# 其中icmp部分是选择协议 +# 其中host 192.168.12.1是源IP地址 +# 其中host 192.168.23.3是目的IP地址 +# 其中echo是icmp中的一种数据报文类型 +R2(config)#access-list 100 permit ip any any +R2(config)#interface Ethernet0/0 +R2(config-if)#ip access-group 100 in +``` + +因为扩展的访问控制列表可以精确的匹配源和目的IP地址,所以我们在配置的时候尽量靠近源,避免不必要的转发。 + +修改访问控制列表条目 + +``` +R2(config)#ip access-list extended 100 +R2(config-ext-nacl)#no 10 # 删除第10条规则 +R2(config-ext-nacl)#10 deny tcp 192.168.12.0 0.0.0.255 host 192.168.23.3 eq telnet +R2#sh ip access-lists +Extended IP access list 100 + 10 deny tcp 192.168.12.0 0.0.0.255 host 192.168.23.3 eq telnet + 20 permit ip any any (15 matches) +``` + +## 2. 配置设备远程访问 + +在目标主机上配置 + +``` +line vty 0 4 # 开启虚拟控制台0~4 + password cisco # 配置登录密码cisco + login # 开启密码校验 + transport input telnet # 允许telnet协议 +``` + +验证登录 + +``` +R1#telnet 192.168.23.3 +Trying 192.168.23.3 ... Open + +User Access Verification + +Password: +R3> +R3> +R3>q + +[Connection to 192.168.23.3 closed by foreign host] +``` + +telnet是一种远程终端协议,使用端口号23/tcp。 + +## 3. NAT( Network Address Translation ) + +## 4. 作用 + +- 可以让私有IP地址段的网络去访问公共网络 +- 可以充当防火墙,保护内网的安全,因为公共网络无法直接访问内部的地址 +- 解决地址冲突 +- 发布内网的服务 +- 负载均衡 + +## 5. PAT的配置 + +![image-20200308163941906](05.ACL/image-20200308163941906.png) + +### 5.1 配置PC和路由器的IP地址 + +``` +R1 +int e0/0 +ip add dhcp +no sh +int e0/1 +ip add 192.168.1.1 255.255.255.0 +no sh +================================== +R3 +int e0/0 +ip add 192.168.1.3 255.255.255.0 +no sh +no ip routing # 关闭路由功能,让路由器更好的冒充PC +=================================== +R4 +int e0/0 +ip add 192.168.1.4 255.255.255.0 +no sh +no ip routing +``` + +### 5.2 在网关路由器R1上配置pat + +``` +access-list 1 permit 192.168.1.0 0.0.0.255 +ip nat inside source list 1 interface Ethernet0/0 overload +interface Ethernet0/0 + ip nat outside +interface Ethernet0/0 + ip nat inside +``` + +### 5.3 测试 + +``` +PC1#ping 149.129.69.210 +Type escape sequence to abort. +Sending 5, 100-byte ICMP Echos to 149.129.69.210, timeout is 2 seconds: +!!!!! +Success rate is 100 percent (5/5), round-trip min/avg/max = 54/256/1063 ms +PC2#ping 149.129.69.210 +Type escape sequence to abort. +Sending 5, 100-byte ICMP Echos to 149.129.69.210, timeout is 2 seconds: +!!!!! +Success rate is 100 percent (5/5), round-trip min/avg/max = 63/65/67 ms +``` + +### 5.4 查看R1网关上的NAT表 + +``` +R1#show ip nat translations +Pro Inside global Inside local Outside local Outside global +icmp 192.168.241.142:1 192.168.1.3:1 149.129.69.210:1 149.129.69.210:1 +tcp 192.168.241.142:25695 192.168.1.3:25695 149.129.69.210:22 149.129.69.210:22 +tcp 192.168.241.142:30610 192.168.1.3:30610 149.129.69.210:22 149.129.69.210:22 +``` + +我们可以看到`192.168.1.3`最终被转换为`192.168.241.142`( 这个实验中的公网IP) + +### 5.5 NAT带来的问题 + +如果内网搭建了服务,无法提供对外访问 + +- 端口映射 +- 使用反向代理 +- p2p隧道 + diff --git a/00.基础阶段/01.网络基础/05.ACL/image-20200308153117453.png b/00.基础阶段/01.网络基础/05.ACL/image-20200308153117453.png new file mode 100644 index 0000000..772fb6a Binary files /dev/null and b/00.基础阶段/01.网络基础/05.ACL/image-20200308153117453.png differ diff --git a/00.基础阶段/01.网络基础/05.ACL/image-20200308155236805.png b/00.基础阶段/01.网络基础/05.ACL/image-20200308155236805.png new file mode 100644 index 0000000..642479a Binary files /dev/null and b/00.基础阶段/01.网络基础/05.ACL/image-20200308155236805.png differ diff --git a/00.基础阶段/01.网络基础/05.ACL/image-20200308163941906.png b/00.基础阶段/01.网络基础/05.ACL/image-20200308163941906.png new file mode 100644 index 0000000..b21bbe6 Binary files /dev/null and b/00.基础阶段/01.网络基础/05.ACL/image-20200308163941906.png differ diff --git a/00.基础阶段/01.网络基础/06.NAT.md b/00.基础阶段/01.网络基础/06.NAT.md new file mode 100644 index 0000000..5a78419 --- /dev/null +++ b/00.基础阶段/01.网络基础/06.NAT.md @@ -0,0 +1,176 @@ +# 06.NAT + +## 1. NAT技术背景 + +![image-20200313173713144](06.NAT/image-20200313173713144.png) + +- 私有IP地址的定义极大程度的缓解了IPv4地址紧缺的问题。 +- 私有IP地址可以在本地局域网、私有网络内部随意使用,但是这些地址在公网上是不可被路由的,因此私有IP地址无法直接访问公网。 +- NAT网络地址转换技术能够将数据包中的IP地址进行转换。 + +## 2. 私有IPv4地址空间 + +10.0.0.0 -10.255.255.255 + +172.16.0.0 -172.31.255.255 + +192.168.0.0 -192.168.255.255 + +## 3. NAT优缺点 + +| 优点 | 缺点 | +| :----------------------------------: | :-----------------------------------: | +| 节省IP地址空间 | 增加转发延迟 | +| 解决IP地址重叠问题 | 丧失端到端的寻址能力 | +| 增加网络的连入Internet的弹性 | 某些应用不支持NAT | +| 网络变更的时候减少IP重编址带来的麻烦 | 需要一定的内存空间支持动态存储NAT表项 | +| 对外隐藏内部地址,增加网络安全性 | 需要耗费一定CPU内存资源进行NAT操作 | + +## 4. NAT术语 + +| 术语 | 英文 | 解释 | +| -------- | -------------- | ---------------- | +| 内部本地 | inside local | 转换之前源地址 | +| 外部本地 | outside local | 转换之前目的地址 | +| 内部全局 | inside global | 转换之后源地址 | +| 内部全局 | outside global | 转换之后目的地址 | + +`inside`表示源地址,`outside`表示目的地址 + +`local`表示转换之前,`global`表示转换之后 + +![image-20200313174718881](06.NAT/image-20200313174718881.png) + +## 5. 静态NAT + +一对一映射,为每个内部的地址指定一个公网IP地址。 + +这种方法主要用在内网中存在需要对公网提供服务的服务器的场景,类似的例子有WEB服务器、邮件服务器、FTP服务器等 + +### 5.1 配置命令 + +``` +Router(config)# ip nat inside source static local-ip global-ip +Router(config-if)# ip nat inside +Router(config-if)# ip nat outside +Router# show ip nat translations +``` + +![image-20200313175949235](06.NAT/image-20200313175949235.png) + +上图所示R1作为服务器内部网络的路由器,拥有公网IP地址`100.12.12.2`,如果想要发布内部的服务到公网那么需要进行如下配置。 + +``` +int e0/0 +ip nat outside +int e0/1 +ip nat inside +ip nat inside source static 192.168.1.2 100.12.12.10 +``` + +这样配置之后,当pc访问`100.12.12.10`就相当于访问服务器,完全忽视掉路由器的存在。 + +不过这样做比较浪费IP地址,因为一台服务器占用一整个IP地址,如果服务器数量比较多,这样就需要租用多个IP地址。 + +最好的做法是端口的一对一映射,这样的做法比较常见。 + +![image-20200313180907649](06.NAT/image-20200313180907649.png) + +上图中,两台服务器其实只需要一个端口号对外提供服务即可,并不需要完整的使用一整个IP地址,所以可以在R1上进行如下配置。 + +``` +int e0/0 +ip nat outside +int e0/1 +ip nat inside +ip nat inside source static tcp 192.168.1.2 80 interface e0/0 80 +ip nat inside source static tcp 192.168.1.3 8888 interface e0/0 8888 +``` + +## 6. 基于地址池的源地址转换 + +定义一个IP地址池,里面放了多个公网IP地址,然后分配给内网需要上公网的主机用。 + +这样的做法个人认为比较土豪,而且并与下面提到的PAT比起来并没有任何优势,反而安全性有问题。容易暴露IP,造成短时间内的不安全。 + +### 6.1 配置 + +``` +Router(config)# ip nat pool namestart-ip end-ip {netmasknetmask|prefix-lengthprefix-length} +Router(config-if)# access-list acl-numpermit source[source-wildcard] +Router(config-if)# ip nat inside source list acl-numpool name +Router(config-if)# ip nat inside +Router(config-if)# ip nat outside +``` + +![image-20200313182205813](06.NAT/image-20200313182205813.png) + +上图中,内部网络的两台PC在访问服务器的时候会借用地址池里面的地址进行访问,不过当地址池的地址小于内部主机地址数量的时候,会出现后面发起访问的PC无法获取转换地址,导致无法上网。 + +R1上的核心配置如下 + +``` +ip nat pool natpool 100.12.12.100 100.12.12.102 netmask 255.255.255.0 +access-list 1 permit 192.168.1.0 0.0.0.255 +ip nat inside source list 1 pool natpool +int e0/0 +ip nat outside +int e0/1 +ip nat inside +``` + +## 7. PAT + +对数据包的源地址和端口均进行转换,通过这种转换,可以使多个内部本地地址同时共享同一个公网地址 。 + +这种NAT也是现在用的最多的,无论是企业还是家庭网络,因为成本的原因,都是一个公网IP地址需要承担内部网络众多主机的转换需求。 + +![image-20200313182952513](06.NAT/image-20200313182952513.png) + +观察PC1去访问服务器的时候地址的转换情况,我们会发现源IP地址被路由器替换为出接口的IP地址,并且端口号也有可能会被替换,具体的看你需要的端口号是不是被占用。 + +当数据到达服务器之后,服务器就可以对数据包的源IP地址进行回复了,数据包回到路由器上之后,路由器再对照之前的NAT转换记录,将数据包发回`192.168.1.2:1234`,从而完成通信。 + +``` +access-list 1 permit 192.168.1.0 0.0.0.255 +ip nat inside source list 1 interface e0/0 overload +int e0/0 +ip nat outside +int e0/1 +ip nat inside +``` + +## 8. TCP负载均衡 + +通过静态NAT部分的介绍,我们知道路由器可以承担为路由器发布服务的功能,当我们访问路由器IP的时候,路由器可以帮助我们将请求转发到内部的服务器上。 + +我们可以将内部的服务相同用于冗余的服务器地址作为地址池,这样当我们从外部访问路由器IP地址的时候,路由器就可以将池中的服务器轮流作为回应的设备,从而实现负载均衡,减少单台服务器的压力。 + +![image-20200313183829721](06.NAT/image-20200313183829721.png) + +如上图,PC第一次访问`100.12.12.2`地址的时候,是`server1`进行回应。当PC第二次访问`100.12.12.2`的时候,是`server2`回应。 + +R1的关键配置如下: + +``` +access-list 1 permit 100.12.12.2 # 用于匹配目的IP地址 +ip nat pool natpool 192.168.1.2 192.168.1.3 netmask 255.255.255.0 type rotary +# 这边设置的池类型是rotary,意思是旋转的,为了更好的看到实验效果 +# 默认的池类型是match-host,也就是同一个源IP地址,始终是同一台服务器响应 +ip nat inside destination list 1 pool natpool +``` + +## 9. NAT维护命令 + +清除所有动态NAT表项 + +``` +Router# clear ip nat translation * +``` + +清除特定的NAT表项 + +``` +Router# clear ip nat translation ? +``` + diff --git a/00.基础阶段/01.网络基础/06.NAT/image-20200313173713144.png b/00.基础阶段/01.网络基础/06.NAT/image-20200313173713144.png new file mode 100644 index 0000000..cb411a3 Binary files /dev/null and b/00.基础阶段/01.网络基础/06.NAT/image-20200313173713144.png differ diff --git a/00.基础阶段/01.网络基础/06.NAT/image-20200313174718881.png b/00.基础阶段/01.网络基础/06.NAT/image-20200313174718881.png new file mode 100644 index 0000000..154ffbc Binary files /dev/null and b/00.基础阶段/01.网络基础/06.NAT/image-20200313174718881.png differ diff --git a/00.基础阶段/01.网络基础/06.NAT/image-20200313175949235.png b/00.基础阶段/01.网络基础/06.NAT/image-20200313175949235.png new file mode 100644 index 0000000..8bee9f5 Binary files /dev/null and b/00.基础阶段/01.网络基础/06.NAT/image-20200313175949235.png differ diff --git a/00.基础阶段/01.网络基础/06.NAT/image-20200313180907649.png b/00.基础阶段/01.网络基础/06.NAT/image-20200313180907649.png new file mode 100644 index 0000000..3586f4e Binary files /dev/null and b/00.基础阶段/01.网络基础/06.NAT/image-20200313180907649.png differ diff --git a/00.基础阶段/01.网络基础/06.NAT/image-20200313182205813.png b/00.基础阶段/01.网络基础/06.NAT/image-20200313182205813.png new file mode 100644 index 0000000..099fd83 Binary files /dev/null and b/00.基础阶段/01.网络基础/06.NAT/image-20200313182205813.png differ diff --git a/00.基础阶段/01.网络基础/06.NAT/image-20200313182952513.png b/00.基础阶段/01.网络基础/06.NAT/image-20200313182952513.png new file mode 100644 index 0000000..09cf37b Binary files /dev/null and b/00.基础阶段/01.网络基础/06.NAT/image-20200313182952513.png differ diff --git a/00.基础阶段/01.网络基础/06.NAT/image-20200313183829721.png b/00.基础阶段/01.网络基础/06.NAT/image-20200313183829721.png new file mode 100644 index 0000000..504ce00 Binary files /dev/null and b/00.基础阶段/01.网络基础/06.NAT/image-20200313183829721.png differ diff --git a/00.基础阶段/01.网络基础/07.DHCP.md b/00.基础阶段/01.网络基础/07.DHCP.md new file mode 100644 index 0000000..414670f --- /dev/null +++ b/00.基础阶段/01.网络基础/07.DHCP.md @@ -0,0 +1,135 @@ +# 07.DHCP + +## 1. DHCP理论 + + DHCP (Dynamic Host configuration Protocol,动态主机配置协议 ) + +是一个局域网的网络协议,使用UDP协议工作; +主要有两个用途: + +1. 用于内部网或网络服务供应商自动分配IP地址; +2. 给用户用于内部网管理员作为对所有计算机作中央管理的手段。 + +功能简述:它主要是通过客户端发送广播数据包给整个物理网段内的所有主机,若局域网内有DHCP服务器时,才会响应客户端的IP参数要求。 + +### 1.1 DHCP服务器的需求 + +1. 拥有真实物理网卡,或者连接广播域的真实物理网卡 +2. 该接口或者该物理网卡必须有一个合理的ip地址 此IP地址最好手动配置; + +### 1.2 DHCP的服务端和客户端 + +服务端:负责在所创建的地址池中向申请地址的客户端分发地址;服务端口号67 +客户端:接收地址 服务端口号68 + +![image-20200313193625915](07.DHCP/image-20200313193625915.png) + +![image-20200313193642344](07.DHCP/image-20200313193642344.png) + +### 1.3 DHCP欺骗攻击 + + ![在这里插入图片描述](07.DHCP/20190326141113730_.png) + +### 1.4 DHCP三种分配机制 + +| 分配方式 | 说明 | +| ------------------------------------ | ------------------------------------------------------------ | +| 自动分配方式(Automatic Allocation) | DHCP服务器为主机指定一个永久性的IP地址,一旦DHCP客户端第一次成功从DHCP服务器端租用到IP地址后,就可以永久性的使用该地址。 | +| 动态分配方式(Dynamic Allocation) | DHCP服务器给主机指定一个具有时间限制的IP地址,时间到期或主机明确表示放弃该地址时,该地址可以被其他主机使用。 | +| 手工分配方式(Manual Allocation) | 客户端的IP地址是由网络管理员指定的,DHCP服务器只是将指定的IP地址告诉客户端主机。 | + +## 2. DHCP配置 + +``` +Router(config)#server dhcp +# 开启DHCP服务 +Router(config)#ip dhcp pool [pool name] +# 定义DHCP地址池,一个网段对应一个地址池 +Router(config-dhcp)#network [network address][subnet mask] +# 定义地址池关联的网段 +Router(config-dhcp)#default-router [host address] +# 定义分配给客户端的网关IP +Router(config-dhcp)#lease <天数> <小时> <分钟> +Router(config-dhcp)#dns-server <主DNS服务器> <备DNS服务器> +Router(config)#ip dhcp excluded-address 172.16.1.100 172.16.1.103 +# 将一个或多个地址排除在地址池之外(如网关IP等),以避免分配给客户端 +Router#show ip dhcp binding +# 查看dhcp已经分配出去的地址 +``` + +## 3. DHCP固定地址绑定 + +服务器或者固定在一个局域网的设备,不需要用DHCP绑定,直接在设备上设置固定IP地址更加靠谱。 + +当移动的电子设备,或者只能DHCP获取地址的设备需要固定的IP的时候,可以使用DHCP固定地址绑定。 + +### 3.1 步骤1 + +首先让设备自动获取IP地址,从而获得设备的身份认证信息,身份认证信息可能是下面的一种: + +- 客户端ID,不同的设备都会有自己的生成方式,但是都能保障局域网唯一。 +- 硬件地址,一般是MAC地址 +- 用户名,一般不用 + +``` +R2#show ip dhcp binding +Bindings from all pools not associated with VRF: +IP address Client-ID/ Lease expiration Type + Hardware address/ + User name +192.168.23.100 0063.6973.636f.2d61. Mar 14 2020 05:32 AM Automatic + 6162.622e.6363.3030. + 2e33.3030.302d.4574. + 302f.30 +# 这边我们就得到了当前192.168.23.100的客户端ID +``` + +### 3.2 步骤2 + +设置一个DHCP地址池,这个池里面就放一个IP地址,然后绑定这个客户端ID + +需要注意,在绑定之前,记得清空DHCP现有地址池 + +``` +show ip dhcp binding # 查看DHCP的绑定情况,得到设备的身份证明信息 +clear ip dhcp binding * # 不清空对应的绑定项,可能导致无法绑定 +ip dhcp pool <池的名字> +host +client-identifier <输入ID> +hardware-address <输入mac地址> # ID和MAC二选一 +dns-server <主DNS> <备用DNS> +default-route <网关IP> +``` + +### 3.3 步骤3 + +去客户端上释放DHCP地址,重新获得 + +``` +shutdown +no shutdown +``` + + + +## 4. DHCP中继问题 + +在企业中经常会出现IP地址集中管控的需求,而企业网段众多。比如,一台域控制服务器需要管理多个局域网,这个时候由于广播无法穿透路由器,就需要用到DHCP中继。 + +![image-20200314114800844](07.DHCP/image-20200314114800844.png) + +比如上图的情况,每个部门有不同的网段,但是最终需要被统一一台DHCP服务器分配,因为这台DHCP服务器同时也是域控制器等等管理服务的服务器。 + +我们可以在每个网段的网关接口上配置`help-adderss`来将广播变为单播发送,并且将收到的单播DHCP再变为广播发回局域网。从而完成DHCP中继。 + +``` +ip helper-address 100.12.12.1 # 在每个内网的路由器接口上配置帮助地址 +``` + +## 5. DHCP续租 + +DHCP分配的IP地址,只要动态分配就有一个租约时间,在Cisco路由器上这个时间默认是一天。可以手动修改。 + +![image-20200314134545655](07.DHCP/image-20200314134545655.png) + +如果续租成功了,那么从续租那一刻起重新计算租约时间。 \ No newline at end of file diff --git a/00.基础阶段/01.网络基础/07.DHCP/20190326141113730_.png b/00.基础阶段/01.网络基础/07.DHCP/20190326141113730_.png new file mode 100644 index 0000000..4a4e8ae Binary files /dev/null and b/00.基础阶段/01.网络基础/07.DHCP/20190326141113730_.png differ diff --git a/00.基础阶段/01.网络基础/07.DHCP/image-20200313193625915.png b/00.基础阶段/01.网络基础/07.DHCP/image-20200313193625915.png new file mode 100644 index 0000000..f36caaf Binary files /dev/null and b/00.基础阶段/01.网络基础/07.DHCP/image-20200313193625915.png differ diff --git a/00.基础阶段/01.网络基础/07.DHCP/image-20200313193642344.png b/00.基础阶段/01.网络基础/07.DHCP/image-20200313193642344.png new file mode 100644 index 0000000..44f9e6d Binary files /dev/null and b/00.基础阶段/01.网络基础/07.DHCP/image-20200313193642344.png differ diff --git a/00.基础阶段/01.网络基础/07.DHCP/image-20200314114800844.png b/00.基础阶段/01.网络基础/07.DHCP/image-20200314114800844.png new file mode 100644 index 0000000..940bf1a Binary files /dev/null and b/00.基础阶段/01.网络基础/07.DHCP/image-20200314114800844.png differ diff --git a/00.基础阶段/01.网络基础/07.DHCP/image-20200314134545655.png b/00.基础阶段/01.网络基础/07.DHCP/image-20200314134545655.png new file mode 100644 index 0000000..d2e1a9c Binary files /dev/null and b/00.基础阶段/01.网络基础/07.DHCP/image-20200314134545655.png differ diff --git a/00.基础阶段/01.网络基础/08.RIP.md b/00.基础阶段/01.网络基础/08.RIP.md new file mode 100644 index 0000000..6d6321b --- /dev/null +++ b/00.基础阶段/01.网络基础/08.RIP.md @@ -0,0 +1,431 @@ +# 08.RIP + +## 1. 路由协议的分类 + +### 1.1 距离矢量 + +主要的特点: + +是在更新消息的时候,发送的是自己的路由表条目,对方学习到之后,经过处理,放入自己的路由表。 + +等于每台路由器都把自己处理的结果让对方学习。 + +典型代表: + +1. rip +2. eigrp + +### 1.2 链路状态 + +主要的特点: + +更新消息的时候,会发送自己链路的状态,比如带宽、网段等等信息,对方收到之后,需要经过计算,最终处理出路由表。 + +等于每台路由器都把自己接口的信息告诉对方,让对方自己判断路由是怎样的。 + +典型代表: + +1. ospf +2. isis + +## 2. RIP(routing information protocol) + +### 2.1 实验拓扑 + +![image-20200314135810181](08.RIP/image-20200314135810181.png) + +首先配置IP地址 + +``` +略 +``` + +配置RIP + +``` +R1 +router rip +network 192.168.12.0 +network 1.0.0.0 +============================= +R2 +router rip +network 192.168.12.0 +network 2.0.0.0 +network 192.168.23.0 +============================ +R3 +router rip +network 192.168.23.0 +network 3.0.0.0 +network 192.168.34.0 +=========================== +R4 +router rip +network 192.168.34.0 +network 4.0.0.0 +``` + +检查路由表中rip的条目,确保学习到 + +``` +R1#show ip route rip +R 2.0.0.0/8 [120/1] via 192.168.12.2, 00:00:14, Ethernet0/0 +R 3.0.0.0/8 [120/2] via 192.168.12.2, 00:00:14, Ethernet0/0 +R 4.0.0.0/8 [120/3] via 192.168.12.2, 00:00:14, Ethernet0/0 +R 192.168.23.0/24 [120/1] via 192.168.12.2, 00:00:14, Ethernet0/0 +R 192.168.34.0/24 [120/2] via 192.168.12.2, 00:00:14, Ethernet0/0 +``` + +检查连通性 + +``` +R1#ping 4.4.4.4 source 1.1.1.1 +Type escape sequence to abort. +Sending 5, 100-byte ICMP Echos to 4.4.4.4, timeout is 2 seconds: +Packet sent with a source address of 1.1.1.1 +!!!!! +Success rate is 100 percent (5/5), round-trip min/avg/max = 1/1/2 ms +``` + +### 2.2 RIPv1 + +#### 2.2.1 基本概念 + +- RIP的管理距离在cisco设备上是120 +- RIP使用跳数(路由传递过程中经历的节点数量)来衡量路径好坏 +- RIP使用UDP来携带更新消息,UDP的源和目的端口号都是520 +- RIP的更新消息中直接携带了路由条目和度量值 + +![image-20200314140810387](08.RIP/image-20200314140810387.png) + +- RIPv1的更新数据内容中,没有子网掩码,所以RIPv1是不知道原始的子网掩码是多少,只能根据ABC类IP地址来判断,所以RIP是有类路由协议。 +- RIP是周期性发送路由更新消息,并且使用广播地址来发送。 +- RIP每30秒发送更新消息,接收方在收到消息之后会重置路由的计时器。 + +``` +R1#show ip protocols +Routing Protocol is "rip" + Outgoing update filter list for all interfaces is not set + Incoming update filter list for all interfaces is not set + Sending updates every 30 seconds, next due in 13 seconds + Invalid after 180 seconds, hold down 180, flushed after 240 + Redistributing: rip + Default version control: send version 1, receive any version + Interface Send Recv Triggered RIP Key-chain + Ethernet0/0 1 1 2 No none + Loopback0 1 1 2 No none + Automatic network summarization is in effect + Maximum path: 4 + Routing for Networks: + 1.0.0.0 + 192.168.12.0 + Routing Information Sources: + Gateway Distance Last Update + 192.168.12.2 120 00:00:15 + Distance: (default is 120) +``` + +![image-20200314141743163](08.RIP/image-20200314141743163.png) + +### 2.3 RIPv2 + +#### 2.3.1 和RIPv1的区别 + +- RIP是周期性发送路由更新消息,并且使用组播地址(224.0.0.9)来发送。 +- RIPv2的更新消息中比RIPv1多出来: + - Route Tag:给路由条目加上标记,方便后期对条目进行管理。 + - netmask:子网掩码,也就是RIPv2是无类路由协议,可以根据子网掩码来学习路由 + - next hop:默认都是0,也就是不携带,意思是哪里学来的条目,下一跳就指向谁 + +![image-20200314142323414](08.RIP/image-20200314142323414.png) + +### 2.4 RIP路由汇总 + +#### 2.4.1 自动汇总 + +RIP默认开启自动汇总,RIPv1不支持关闭 + +自动汇总会将VLSM的路由条目根据ABC类IP地址,将路由匹配位数写成/8,/16,/24 + +我们在R1和R3上都创建一个loopback接口,并且配置一个IP地址。 + +``` +R1 +int lo100 +ip add 100.1.1.1 255.255.255.0 +router rip +network 100.0.0.0 +==================== +R4 +int lo100 +ip add 100.4.4.4 255.255.255.0 +router rip +network 100.0.0.0 +``` + +观察R2和R3路由表中`100.0.0.0/8`的条目 + +``` +R2#sh ip route rip +R 100.0.0.0/8 [120/1] via 192.168.12.1, 00:00:25, Ethernet0/0 +============================= +R3#sh ip route rip +R 100.0.0.0/8 [120/1] via 192.168.34.4, 00:00:27, Ethernet0/1 +``` + +观察路由器到达R1和R4的情况 + +``` +R2#ping 100.1.1.1 +Type escape sequence to abort. +Sending 5, 100-byte ICMP Echos to 100.1.1.1, timeout is 2 seconds: +!!!!! +Success rate is 100 percent (5/5), round-trip min/avg/max = 1/1/1 ms +R2#ping 100.4.4.4 +Type escape sequence to abort. +Sending 5, 100-byte ICMP Echos to 100.4.4.4, timeout is 2 seconds: +U.U.U +Success rate is 0 percent (0/5) +``` + +虽然R2能够从R3和R1都收到`100.0.0.0/8`的条目,但是路由表只会使用最佳条目,对比度量值(在RIP中是跳数),发现R1传过来的是1,R3传过来的是2,所以路由表中关于`100.0.0.0/8`只有R1的方向。 + +关键的问题是在于RIP会自动将子网划分的条目去除子网,比如`100.1.1.0/24`变成`100.0.0.0/8`这么做被称为路由自动汇总。我们一般将其关闭,不然在子网众多的网络中会出现上述问题。 + +由于子网划分需要子网掩码,所以RIPv1不支持关闭自动汇总。 + +``` +R1-4 +router rip +no auto-summary # 关闭自动汇总,只有v2支持 +do clear ip route * +# RIP更新机制的原因,导致路由发生变化,更新极慢,可以用这个命令快速刷新路由表 +``` + +关闭了自动汇总以后,RIPv2会根据接口配置的子网掩码来更新路由条目。这种条目被称为明细路由。 + +#### 2.4.2 手动汇总 + +只有RIPv2支持手动汇总,在路由更新的出口方向配置,可以对下游路由器造成影响。 + +注意,配置路由汇总的那台路由器,路由表中的明细路由不会受到影响。 + +在R1上配置三个lo接口,然后我们在R2上进行汇总 + +``` +R1 +int lo1 +ip add 172.16.1.1 255.255.255.0 +int lo2 +ip add 172.16.2.1 255.255.255.0 +int lo3 +ip add 172.16.3.1 255.255.255.0 +router rip +network 172.16.0.0 +====================================== +R2 +int e0/1 +ip summary-address rip 172.16.0.0 255.255.0.0 +``` + +然后观察路由更新下游的情况 + +``` +R3 +R3#sh ip route rip +R 172.16.0.0/16 [120/2] via 192.168.23.2, 00:00:03, Ethernet0/0 +``` + +我们可以看到现在只有一条汇总路由 + +观察一下R2的路由表 + +``` +R2#sh ip route rip + 172.16.0.0/24 is subnetted, 3 subnets +R 172.16.1.0 [120/1] via 192.168.12.1, 00:00:06, Ethernet0/0 +R 172.16.2.0 [120/1] via 192.168.12.1, 00:00:06, Ethernet0/0 +R 172.16.3.0 [120/1] via 192.168.12.1, 00:00:06, Ethernet0/0 +``` + +R2的路由表没有影响到明细路由 + +路由汇总,是将明细路由抑制向下游更新,并且产生一条新的汇总条目,然后更新出去。 + +#### 2.4.3 RIP的默认路由 + +如果R1是公司网络的出口,R1还连接着运营商,那么R1就有义务向所有的RIP路由器通告一条*的路由。 + +``` +router rip + default-information originate +``` + +然后我们检查下游路由器的路由表 + +``` +R2#sh ip route rip +Gateway of last resort is 192.168.12.1 to network 0.0.0.0 +R* 0.0.0.0/0 [120/1] via 192.168.12.1, 00:00:01, Ethernet0/0 +``` + +现在内网所有的路由器都知道了如果路由表中匹配不上的条目,可以从R1走。 + +### 2.5 RIP的认证 + +只有RIPv2支持认证,也就是在更新消息中加入认证信息。 + +在CISCO设备中,可以使用`key chain`来提供认证的需要的密码。 + +``` +key chain <钥匙环名字> + key <编号> + key-string <密码> + accept-lifetime <起始时间> <结束时间> # 能够被匹配的时间 + send-lifetime <起始时间> <结束时间> # 发送的时间 +``` + +RIPv2支持明文认证和密文认证 + +明文认证就是把密码明文的发送,这样很蠢,因为抓包能直接看到密码 + +在R1上配置认证 + +``` +R1 +key chain huawei + key 1 + key-string cisco1 +int e0/0 +ip rip authentication mode text +ip rip authentication key-chain huawei +``` + +只配置R1的情况下,我们在R2上调试RIP协议,可以发现认证无效的警告 + +``` +R2#debug ip rip events +*Mar 14 07:24:25.541: RIP: ignored v2 packet from 192.168.12.1 (invalid authentication) +``` + +在R2上配置好认证,就可以正常的学习路由 + +抓包,发现明文密码。 + +![image-20200314153035435](08.RIP/image-20200314153035435.png) + +更改为密文加密 + +![image-20200314153512307](08.RIP/image-20200314153512307.png) + +### 2.6 RIP防环机制 + +#### 2.6.1 环路的产生 + +![image-20200314153744703](08.RIP/image-20200314153744703.png) + +R3会将e0/1的网段更新给R2 + +![image-20200314153830761](08.RIP/image-20200314153830761.png) + +R2收到了之后,会更新给自己相邻的路由器,然而R3直连接口是192.168.34.0管理距离是0,所以R3不会接收R2的更新。 + +![image-20200314154014478](08.RIP/image-20200314154014478.png) + +但是如果R3的e0/1接口损坏,就回导致R3开始学习R2更新的192.168.34.0的条目 + +![image-20200314154123472](08.RIP/image-20200314154123472.png) + +最终出现R3认为去往192.168.34.0/24需要走R2,而R2认为需要走R3,最终形成环路。 + +#### 2.6.2 防环机制1:最大跳数 + +RIP使用跳数去衡量一个路线的好坏,为了防止环路,规定最大跳数是15跳。 + +一个路由条目最多传递15个节点,这个也导致RIP无法用于大型网络。 + +##### 2.6.2.1 offset-list 偏移列表 + +可以用于修改距离矢量协议的度量值 + +我们在R2上修改1.1.1.0/24的跳数为13跳,然后观察R3 + +``` +R2(config)#access-list 1 permit 1.1.1.0 +R2(config-if)#router rip +R2(config-router)#offset-list 1 out 13 +==================================== +R3#sh ip route rip +R 1.1.1.0 [120/15] via 192.168.23.2, 00:00:04, Ethernet0/0 +``` + +由于在R3上已经达到15跳,最大的跳数,所以在R4的路由表中,就学习不到`1.1.1.0` + +``` +R4#sh ip route rip +R* 0.0.0.0/0 [120/3] via 192.168.34.3, 00:00:01, Ethernet0/0 + 2.0.0.0/24 is subnetted, 1 subnets +R 2.2.2.0 [120/2] via 192.168.34.3, 00:00:01, Ethernet0/0 + 3.0.0.0/24 is subnetted, 1 subnets +R 3.3.3.0 [120/1] via 192.168.34.3, 00:00:01, Ethernet0/0 + 100.0.0.0/8 is variably subnetted, 3 subnets, 2 masks +R 100.1.1.0/24 [120/3] via 192.168.34.3, 00:00:01, Ethernet0/0 +R 172.16.0.0/16 [120/3] via 192.168.34.3, 00:00:01, Ethernet0/0 +R 192.168.12.0/24 [120/2] via 192.168.34.3, 00:00:01, Ethernet0/0 +R 192.168.23.0/24 [120/1] via 192.168.34.3, 00:00:01, Ethernet0/0 +``` + +#### 2.6.3 防环机制2:水平分割 + + 路由器从某个接口学到的路由不会在发送回给邻居路由器,水平分割是默认开启的 + +比如R2给R3的更新中,就不包含从R3那边收到的条目 + +![image-20200314155023560](08.RIP/image-20200314155023560.png) + +#### 2.6.4 防环机制3: 毒性反转 + + 路由器从某个接口学到路由后,将该路由的条数设置为16跳并从原接受接口发送回给邻居路由器 + +#### 2.6.5 防环机制4: 路由毒化 + +当路由表中某个直连条目消失了,会立马发送一个该路由条目的更新,但是会将其跳数改成16跳,来让相邻路由器快速删除这个条目。 + +![image-20200314155500891](08.RIP/image-20200314155500891.png) + +#### 2.6.6 防环机制5: 触发更新 + +当路由表发生变化的时候,会立马的更新条目,而不用等到30s周期的到来 + +#### 2.6.7 防环机制6: 更新计时器 + +见基本概念里面的计时器相关内容 + +### 2.7 RIP被动接口 + +由于RIP的更新是周期性的,这就导致RIP路由器之间的链路会不停收到广播或者组播。 + +![image-20200314160046640](08.RIP/image-20200314160046640.png) + +像上图这种情况,PC会不停的收到RIP发来的无用信息,所以RIP出现被动接口功能。 + +开启了被动接口之后,RIP不会主动发出任何的广播或者组播,比如要手动指定邻居,RIP才会以单播更新条目。 + +``` +R1 +router rip + passive-interface Ethernet0/0 + neighbor 192.168.12.2 +================================= +R1 +router rip + passive-interface Ethernet0/0 + neighbor 192.168.12.1 +``` + +![image-20200314160558514](08.RIP/image-20200314160558514.png) + +之后的RIP就会以单播开始更新 + +疑问:RIP可以不直连传递路由条目么? \ No newline at end of file diff --git a/00.基础阶段/01.网络基础/08.RIP/image-20200314135810181.png b/00.基础阶段/01.网络基础/08.RIP/image-20200314135810181.png new file mode 100644 index 0000000..6c2d7d7 Binary files /dev/null and b/00.基础阶段/01.网络基础/08.RIP/image-20200314135810181.png differ diff --git a/00.基础阶段/01.网络基础/08.RIP/image-20200314140810387.png b/00.基础阶段/01.网络基础/08.RIP/image-20200314140810387.png new file mode 100644 index 0000000..f0525bf Binary files /dev/null and b/00.基础阶段/01.网络基础/08.RIP/image-20200314140810387.png differ diff --git a/00.基础阶段/01.网络基础/08.RIP/image-20200314141743163.png b/00.基础阶段/01.网络基础/08.RIP/image-20200314141743163.png new file mode 100644 index 0000000..f57b6a7 Binary files /dev/null and b/00.基础阶段/01.网络基础/08.RIP/image-20200314141743163.png differ diff --git a/00.基础阶段/01.网络基础/08.RIP/image-20200314142323414.png b/00.基础阶段/01.网络基础/08.RIP/image-20200314142323414.png new file mode 100644 index 0000000..2e0b203 Binary files /dev/null and b/00.基础阶段/01.网络基础/08.RIP/image-20200314142323414.png differ diff --git a/00.基础阶段/01.网络基础/08.RIP/image-20200314153035435.png b/00.基础阶段/01.网络基础/08.RIP/image-20200314153035435.png new file mode 100644 index 0000000..91359d2 Binary files /dev/null and b/00.基础阶段/01.网络基础/08.RIP/image-20200314153035435.png differ diff --git a/00.基础阶段/01.网络基础/08.RIP/image-20200314153512307.png b/00.基础阶段/01.网络基础/08.RIP/image-20200314153512307.png new file mode 100644 index 0000000..acb0868 Binary files /dev/null and b/00.基础阶段/01.网络基础/08.RIP/image-20200314153512307.png differ diff --git a/00.基础阶段/01.网络基础/08.RIP/image-20200314153744703.png b/00.基础阶段/01.网络基础/08.RIP/image-20200314153744703.png new file mode 100644 index 0000000..910bc90 Binary files /dev/null and b/00.基础阶段/01.网络基础/08.RIP/image-20200314153744703.png differ diff --git a/00.基础阶段/01.网络基础/08.RIP/image-20200314153830761.png b/00.基础阶段/01.网络基础/08.RIP/image-20200314153830761.png new file mode 100644 index 0000000..489b0cf Binary files /dev/null and b/00.基础阶段/01.网络基础/08.RIP/image-20200314153830761.png differ diff --git a/00.基础阶段/01.网络基础/08.RIP/image-20200314154014478.png b/00.基础阶段/01.网络基础/08.RIP/image-20200314154014478.png new file mode 100644 index 0000000..dec1005 Binary files /dev/null and b/00.基础阶段/01.网络基础/08.RIP/image-20200314154014478.png differ diff --git a/00.基础阶段/01.网络基础/08.RIP/image-20200314154123472.png b/00.基础阶段/01.网络基础/08.RIP/image-20200314154123472.png new file mode 100644 index 0000000..64313a6 Binary files /dev/null and b/00.基础阶段/01.网络基础/08.RIP/image-20200314154123472.png differ diff --git a/00.基础阶段/01.网络基础/08.RIP/image-20200314155023560.png b/00.基础阶段/01.网络基础/08.RIP/image-20200314155023560.png new file mode 100644 index 0000000..1385b46 Binary files /dev/null and b/00.基础阶段/01.网络基础/08.RIP/image-20200314155023560.png differ diff --git a/00.基础阶段/01.网络基础/08.RIP/image-20200314155500891.png b/00.基础阶段/01.网络基础/08.RIP/image-20200314155500891.png new file mode 100644 index 0000000..12b4a88 Binary files /dev/null and b/00.基础阶段/01.网络基础/08.RIP/image-20200314155500891.png differ diff --git a/00.基础阶段/01.网络基础/08.RIP/image-20200314160046640.png b/00.基础阶段/01.网络基础/08.RIP/image-20200314160046640.png new file mode 100644 index 0000000..d17017f Binary files /dev/null and b/00.基础阶段/01.网络基础/08.RIP/image-20200314160046640.png differ diff --git a/00.基础阶段/01.网络基础/08.RIP/image-20200314160558514.png b/00.基础阶段/01.网络基础/08.RIP/image-20200314160558514.png new file mode 100644 index 0000000..b349332 Binary files /dev/null and b/00.基础阶段/01.网络基础/08.RIP/image-20200314160558514.png differ diff --git a/00.基础阶段/01.网络基础/09.OSPF.md b/00.基础阶段/01.网络基础/09.OSPF.md new file mode 100644 index 0000000..e936daa --- /dev/null +++ b/00.基础阶段/01.网络基础/09.OSPF.md @@ -0,0 +1,1341 @@ +# 09.OSPF + +## 1. 实验拓扑 + +![image-20200315111449847](09.OSPF/image-20200315111449847-1584768754786.png) + +配置IP,必须在每个路由器上配置lo0 + +``` +略 +``` + +配置OSPF,把所有的接口都宣告进OSPF + +``` +R1 +router ospf 1 + network 1.1.1.0 0.0.0.255 area 0 + network 192.168.12.0 0.0.0.255 area 0 +=========================================== +R2 +R2(config)#int range e0/0 -1 , lo0 +R2(config-if-range)#ip ospf 1 area 0 +========================================= +R3 +R3(config)#int lo0 +R3(config-if)#ip ospf 1 area 0 +R3(config-if)#int e0/0 +R3(config-if)#ip ospf 1 area 0 +R3(config-if)#int e0/1 +R3(config-if)#ip ospf 1 area 0 +======================================== +R4 +R4(config)#int range lo0 , e0/0 +R4(config-if-range)#ip ospf 1 area 0 +``` + +检查,在任意路由器上,检查路由学习的状况。 + +``` +R2#show ip route ospf + 1.0.0.0/32 is subnetted, 1 subnets +O 1.1.1.1 [110/11] via 192.168.12.1, 00:02:22, Ethernet0/0 + 3.0.0.0/32 is subnetted, 1 subnets +O 3.3.3.3 [110/11] via 192.168.23.3, 00:01:16, Ethernet0/1 + 4.0.0.0/32 is subnetted, 1 subnets +O 4.4.4.4 [110/21] via 192.168.23.3, 00:00:07, Ethernet0/1 +O 192.168.34.0/24 [110/20] via 192.168.23.3, 00:00:07, Ethernet0/1 +``` + +## 2. OSPF简介 + +- OSPF在Cisco设备上的管理距离为110 +- OSPF使用cost作为度量值,计算公式是 + - 参考单位(默认是10^5^Kbit/sec)/链路更新消息入口的带宽=开销(Cost) + - OSPF计算度量值是累加每个LSA入口 + - 在计算的时候,cost没有小数,超出就进1,并且要加上IP所在的接口的开销(cost) + - 查看接口带宽信息`show int e0/0` + - 参考单位建议修改为本网络中最大的带宽,不然1Gbps和100Mbps将会都是1 + - 比如改为1Gbps,在OSPF的协议配置模式下`auto-cost reference-bandwidth 1000` +- 链路状态的工作原理 + - 首先每个路由对自己的链路状态进行描述,产生LSA(链路状态通告) + - 邻居之间互相交换自己产生和学习到的LSA,最终都存在数据库中 + - 通过数据库中链路状态的信息,开始绘画拓扑图,就像下图 + - 根据拓扑,使用SPF(最短路径优先)算法计算出每个目的地的最佳路径下一跳,然后放入路由表,完成网络收敛。 + - 网络收敛完成,指的是路由表进入稳定状态。 +- OSPF协议号为89,这个是携带在OSPF消息的IP报头中的,用于提示解封装的时候,采用89号(OSPF)结构去解析后续的二进制。 + +![image-20200315152422364](09.OSPF/image-20200315152422364-1584768754787.png) + +- 由于OSPF无法修改别人的LSA信息,每个路由器收到的都是原始信息,并且可以计算得到完整拓扑,所以不存在RIP协议中道听途说导致信息失误的可能。并且SPF算法可以保障无环路。 + +## 3. 三张表 + +### 3.1 邻居表 + +``` +R2#sh ip ospf neighbor + +Neighbor ID Pri State Dead Time Address Interface +3.3.3.3 1 FULL/DR 00:00:37 192.168.23.3 Ethernet0/1 +1.1.1.1 1 FULL/BDR 00:00:35 192.168.12.1 Ethernet0/0 +``` + +Neighbor ID:邻居的Router-ID + +Pri:优先级 + +State:邻居状态/接口的角色 + +Dead Time:死亡时间,一个40s倒计时的计时器,每次收到ospf的hello消息(10s一次)就会重置 + +Interface:建立邻居的接口 + +### 3.2 链路状态数据库 + +![image-20200321093951814](09.OSPF/image-20200321093951814-1584768754787.png) + +每个区域中的路由器都有该区域的链路状态数据库。如果是ABR,那么就有两个区域的数据库。 + +``` +R2#sh ip ospf database + + OSPF Router with ID (2.2.2.2) (Process ID 1) + + Router Link States (Area 0) + +Link ID ADV Router Age Seq# Checksum Link count +1.1.1.1 1.1.1.1 26 0x80000004 0x00718B 3 +2.2.2.2 2.2.2.2 25 0x80000003 0x0014DF 3 + + Summary Net Link States (Area 0) + +Link ID ADV Router Age Seq# Checksum +3.3.3.3 2.2.2.2 11 0x80000001 0x0031EC +192.168.23.0 2.2.2.2 44 0x80000001 0x0002A8 + + Router Link States (Area 1) + +Link ID ADV Router Age Seq# Checksum Link count +2.2.2.2 2.2.2.2 19 0x80000003 0x00C12D 2 +3.3.3.3 3.3.3.3 20 0x80000002 0x00D5F8 3 + + Summary Net Link States (Area 1) + +Link ID ADV Router Age Seq# Checksum +1.1.1.1 2.2.2.2 21 0x80000001 0x008D98 +2.2.2.2 2.2.2.2 52 0x80000001 0x00FA31 +192.168.12.0 2.2.2.2 52 0x80000001 0x007B3A +``` + +- 不同的OSPF进程,数据库也是互相之间隔离 +- 不同区域的OSPF数据库内容,也是会分开存放 +- 同一个区域的OSPF数据库内容,不同类别也是分来存放 +- 数据库中大致内容 + - Link ID + - 链路的ID,可以理解为各种目的地 + - ADV Router + - 这条数据库信息的来源路由器的Router-ID + - Age + - LSA的寿命,数据库每一条都是一个LSA信息。 + - 秒数,最大是3600秒,然后这条LSA就会被删除 + - 稳定情况下OSPF会每隔1800秒,将数据库中自己的条目更新给所有的邻居一遍,来刷新他们的数据库 + - 如果数据库发生了变化,会立即触发更新 + - Seq + - 序列号,每次收到相同Link ID 的LSA更新,就回将Seq加1 + - 序列号的范围是0x80000001~0x7fffffff + - 如果序列号变成0x7fffffff之后,再次更新条目,就变成了0x80000000,OSPF会认为这个编号是一种错误,然后就不会使用,直到下一个1800s到来,序列号变为0x80000001才会正常。 + - Checksum + - LSA的校验值 + +## 4. OSPF名词 + +- router-id + + - 运行OSPF的路由器都会互相之间转发链路状态,为了让OSPF路由器收到这些链路状态的时候,可以对节点进行标注,所以都需要产生一个唯一的Route-id,类似于路由器的名字。不过是IP地址格式的。 + - Route-id的选举顺序 + - 手动指定 + - 自动选举 + - 优先选择环回接口IP地址大的作为route-id + - 没有环回接口的情况下,优选物理接口IP地址大的作为route-id + - 为了稳定性,route-id在ospf启动的时候就被选中,并且在重启ospf进程之前,都不会变化,哪怕手动指定都不会影响route-id。 + +- DR/BDR + + - 当OSPF路由器在一个多路访问网络(MA)情况下,相互建立邻居关系,会导致频繁的重复更新链路状态信息,如下拓扑 + + - 当某台路由器链路状态信息发生变化的时候,会通告给自己所有的邻居,也就是R1会更新给R2和R3,然而R2的链路状态信息发生了变化,也会通告给自己所有的邻居,也就是更新给R3,R3也会做同样的事情。 + + - ![image-20200315134639693](09.OSPF/image-20200315134639693-1584768754787.png) + + - 在这种网络情况下,OSPF为了方式不必要的更新,选出来一个指定路由器(DR),当非指定路由器(DR other)的链路信息发生变化的时候,首先更新给DR,再由DR更新给其他的路由器。 + + - 为了防止DR故障导致更新不及时,还在这个内网选出一个作为备用指定路由器(BDR)。 + + - 虽然是说指定**路由器**,但是这个DR是接口的角色,一台路由器不同的接口可以属于不同的角色 + + - DR/BDR选举顺序 + + - 比较优先级,默认优先级是1,可以手动修改 + - 优先级无法判断出来,就根据route-id的大小来判断,最大的成为DR + - BDR是在DR选出来之后,在剩下的路由器里面按照上面两个的规则选出 + + - DR一旦被选中,除非DR故障,不然不会再变化。也就是DR和BDR角色不会被抢占。 + +``` +R3#sh ip ospf int e0/0 +---------省略------------- +Transmit Delay is 1 sec, State DR, Priority 1 +---------省略------------- +``` + + - 上面的拓扑,我们修改R1的优先级,改完之后,需要重置R3的ospf来主动放弃DR身份 + + + +``` +interface Ethernet0/0 + ip ospf priority 10 +``` + + - 如果OSPF接口优先级为0,那么将会直接放弃自己的DR或者BDR身份,并且不再参与选举,哪怕一个DR都没有,自己都不会做的DR或者BDR。 + + - 这么做完以后,R2成为DR。因为DR故障了,**一定是BDR成为DR**,然后剩下的路由器重新选举一个BDR。 + + - DR和BDR会监听`224.0.0.5`和`224.0.0.6`这两个组播地址,其他路由器只会监听`224.0.0.5`这个组播地址。 + + - 当需要更新消息的时候,会发送给`224.0.0.6`这样DR和BDR就收到更新,DR在收到之后会发送给`224.0.0.5`这个地址,之后本广播域所有的路由器都可以学习到更新。 + +## 5. 邻居建立过程 + +1. Down +2. Init + 1. 当路由器收到了对方的Hello消息,但是却没有在Hello消息中看到自己的Router-ID +3. Two-way + 1. 在收到的Hello消息中,发现了自己和邻居的Route-ID,表示对方也发现自己,建立了双向通信。 + 2. 开始选举DR和BDR,由于不能保证所有路由器启动OSPF时间一样的,所以这个状态会有一个Wait time,默认是40s。 + 3. 我们可以修改OSPF接口的网络类型,避免在点对点链路上OSPF的2way等待时间,在接口上配置`ip ospf network point-to-point` +4. Exstart + 1. 交换不携带数据的DBD消息,通过消息中router-id的大小来选择谁主导这个过程 + 2. route-id数值大的,会来主导,成为master,其他slave路由器在接下的步骤需要配合master +5. Exchange + 1. slave路由器将自己链路状态数据库的描述信息发送给master + 2. master会比对自己的链路状态数据库,然后将对方需要的内容描述信息发回去。 +6. Loading + 1. 根据上一步的摘要,开始交换完整的LSA(链路状态通告)数据库信息 +7. Full + 1. 初步数据库同步完成,进入正常的邻居状态 + 2. Hello消息维持关系 + 3. 触发更新,当链路状态数据库发生变化的时候,会更新 + +### 5.1 建立邻居的条件 + +1. 相邻两台路由器运行OSPF协议(至少是逻辑上相连) +2. 两台路由器直接连接(至少是逻辑上直接连接) +3. 在同一个自制系统(在OSPF中表现不明显,因为OSPF后面加上的是进程号,不同进程号之间是可以建立邻居) +4. Hello/Dead时间一致(这个时间会在hello包中被携带) +5. 区域ID一致 +6. 认证密码一致 +7. MTP值一致 + +## 6. 消息类型 + +| 消息类型 | 描述 | +| -------- | ------------------------------------------------------------ | +| Hello | 发现OSPF的邻居,维护邻居关系,在Hello中会携带OSPF的基本信息,
比如自己和邻居的Route-ID,区域ID,认证信息等等其他的基本信息。 | +| DBD | DataBase Description 这种消息有两种,
一个是不携带任何的数据,只有一个报头,主要用于在exstart状态的时候判断谁来主导信息交换过程
第二种是携带链路状态数据库的描述信息,可以理解为书的目录 | +| LSR | Link State Request
用于请求完整的链路状态数据信息 | +| LSU | Link State Upadte
用于发送完整的链路状态数据信息 | +| LSAck | Link State Ack
用于确认收到消息,来保障可靠传输 | + +## 7. OSPF多区域 + +由于SPF算法会消耗一定资源,如果OSPF网络过于庞大,会导致OSPF资源快速消耗,解决这个问题最好的方案就是划分区域,每个区域的路由器只需要负责计算自己这个区域的拓扑即可。 + +对于数据转发的过程来说,在本区域中可以得到全区拓扑,如果目的地不是本区域,只需要知道怎么跨越区域边界,到达目标所在区域即可,不需要知道那个区域的拓扑。 + +OSPF为了防止分区域过于零碎,导致部分区域的路由无法被其他区域学到,OSPF规定了两种区域 + +- 骨干区域:区域号必须是`0`或者`0.0.0.0`,骨干区域负责所有非骨干区域之间的数据传递。 +- 非骨干区域:区域号可以是非0的其他数字,非骨干区域必须要和骨干区域相连。 + +OSPF还规定两种不同的路由器角色: + +- 区域边界路由器: area border router(简称ABR) + - 至少有一个接口属于骨干区域,一个接口属于非骨干区域 +- 自制系统边界路由器:autonomous system boundary router(简称ASBR) + - 需要引入OSPF外部的路由条目 + +将上面的拓扑进行更改 + +![image-20200315153241671](09.OSPF/image-20200315153241671-1584768754787.png) + +``` +R2#sh ip route ospf + 1.0.0.0/32 is subnetted, 1 subnets +O 1.1.1.1 [110/11] via 192.168.12.1, 00:10:49, Ethernet0/0 + 3.0.0.0/32 is subnetted, 1 subnets +O 3.3.3.3 [110/2] via 192.168.23.3, 00:10:54, Ethernet0/1 + 4.0.0.0/32 is subnetted, 1 subnets +O IA 4.4.4.4 [110/12] via 192.168.23.3, 00:09:40, Ethernet0/1 +O IA 192.168.34.0/24 [110/11] via 192.168.23.3, 00:10:28, Ethernet0/1 +``` + +路由表中,标注了`O`的条目是本区域的,标注了`O IA`是其他区域学来的。 + +### 7.1 OSPF区域各种组合 + +如果把区域改成这样 + +![image-20200315154803816](09.OSPF/image-20200315154803816-1584768754787.png) + +查看R2和R1的路由表 + +``` +R2#sh ip route ospf + 1.0.0.0/32 is subnetted, 1 subnets +O 1.1.1.1 [110/11] via 192.168.12.1, 00:02:53, Ethernet0/0 + 3.0.0.0/32 is subnetted, 1 subnets +O 3.3.3.3 [110/2] via 192.168.23.3, 00:00:27, Ethernet0/1 + 4.0.0.0/32 is subnetted, 1 subnets +O IA 4.4.4.4 [110/12] via 192.168.23.3, 00:00:07, Ethernet0/1 +O IA 192.168.34.0/24 [110/11] via 192.168.23.3, 00:00:27, Ethernet0/1 +==================================================================== +R1#sh ip route + 1.0.0.0/8 is variably subnetted, 2 subnets, 2 masks +C 1.1.1.0/24 is directly connected, Loopback0 +L 1.1.1.1/32 is directly connected, Loopback0 + 192.168.12.0/24 is variably subnetted, 2 subnets, 2 masks +C 192.168.12.0/24 is directly connected, Ethernet0/0 +L 192.168.12.1/32 is directly connected, Ethernet0/0 +R1#sh ip ospf nei + +Neighbor ID Pri State Dead Time Address Interface +2.2.2.2 0 FULL/ - 00:00:37 192.168.12.2 Ethernet0/0 + + +``` + +观察到R1和R2的邻居关系是正常的,但是R1无法学习到其他区域的路由。 + +观察R2和R3的路由信息概述 + +``` +R2#sh ip protocols +Routing Protocol is "ospf 1" + Outgoing update filter list for all interfaces is not set + Incoming update filter list for all interfaces is not set + Router ID 2.2.2.2 + Number of areas in this router is 2. 2 normal 0 stub 0 nssa + Maximum path: 4 + Routing for Networks: + Routing on Interfaces Configured Explicitly (Area 1): + Loopback0 + Ethernet0/1 + Routing on Interfaces Configured Explicitly (Area 2): + Ethernet0/0 + Routing Information Sources: + Gateway Distance Last Update + 3.3.3.3 110 00:01:47 + 4.4.4.4 110 00:03:21 + 1.1.1.1 110 00:04:33 + Distance: (default is 110) +=================================================== +R3#sh ip protocols +---------省略---------- + It is an area border router +---------省略---------- + + +``` + +发现R2并没有成为ABR,所以R2无法帮助R1去学习其他区域的路由。 + +### 7.2 解决区域断连 + +非骨干区域如果没有和骨干区域直接相连,称为区域断连。 + +#### 7.2.1 解决方案1:虚链路 + +我们在R2和R3之间建立一个虚拟的连接,然后这个虚拟的连接属于`area 0` + +``` +R2(config)#router ospf 1 +R2(config-router)#area 1 virtual-link 3.3.3.3 + + +``` + +检查虚链路邻居关系,还有R2是否成为ABR + +``` +R2#sh ip ospf nei +Neighbor ID Pri State Dead Time Address Interface +3.3.3.3 0 FULL/ - 00:00:01 192.168.23.3 OSPF_VL0 +3.3.3.3 0 FULL/ - 00:00:32 192.168.23.3 Ethernet0/1 +1.1.1.1 0 FULL/ - 00:00:35 192.168.12.1 Ethernet0/0 +R2#show ip ospf virtual-links +Virtual Link OSPF_VL0 to router 3.3.3.3 is up +R2#show ip protocols +------省略----------- + Router ID 2.2.2.2 + It is an area border router +------省略----------- + + +``` + +再次查看R1的路由表 + +``` +R1#show ip route ospf + 2.0.0.0/32 is subnetted, 1 subnets +O IA 2.2.2.2 [110/11] via 192.168.12.2, 00:03:45, Ethernet0/0 + 3.0.0.0/32 is subnetted, 1 subnets +O IA 3.3.3.3 [110/12] via 192.168.12.2, 00:03:45, Ethernet0/0 + 4.0.0.0/32 is subnetted, 1 subnets +O IA 4.4.4.4 [110/22] via 192.168.12.2, 00:02:32, Ethernet0/0 +O IA 192.168.23.0/24 [110/11] via 192.168.12.2, 00:03:45, Ethernet0/0 +O IA 192.168.34.0/24 [110/21] via 192.168.12.2, 00:02:32, Ethernet0/0 + + +``` + +ospf通过虚链路学习到的LSA是没有老化时间的,邻居关系不需要hello来维持,所以及时一端加了认证或者发生了变动,也不能及时发现。 + +#### 7.2.2 解决方案2:VPN + +可以在R2和R3之间打通一条虚拟专用网络,这个虚拟专用网络的隧道我们加入OSPF area 0,这样R2一样成为ABR + +在R2和R3上打通一条IPIP隧道,并且加入area 0 + +``` +interface Tunnel0 + ip address 172.16.23.3 255.255.255.0 + ip ospf 1 area 0 + tunnel source Ethernet0/0 + tunnel mode ipip + tunnel destination 192.168.23.2 + + +``` + +检查邻居关系 + +``` +R2#sh ip ospf nei + +Neighbor ID Pri State Dead Time Address Interface +3.3.3.3 0 FULL/ - 00:00:38 172.16.23.3 Tunnel0 +3.3.3.3 0 FULL/ - 00:00:39 192.168.23.3 Ethernet0/1 +1.1.1.1 0 FULL/ - 00:00:36 192.168.12.1 Ethernet0/0 +R2#show ip protocols +Routing Protocol is "ospf 1" + Outgoing update filter list for all interfaces is not set + Incoming update filter list for all interfaces is not set + Router ID 2.2.2.2 + It is an area border router # R2满足了ABR的条件 + Number of areas in this router is 3. 3 normal 0 stub 0 nssa + Maximum path: 4 + Routing for Networks: + Routing on Interfaces Configured Explicitly (Area 0): # 可以看到area 0的情况 + Tunnel0 + Routing on Interfaces Configured Explicitly (Area 1): + Loopback0 + Ethernet0/1 + Routing on Interfaces Configured Explicitly (Area 2): + Ethernet0/0 + Routing Information Sources: + Gateway Distance Last Update + 3.3.3.3 110 00:00:18 + 4.4.4.4 110 00:00:18 + 1.1.1.1 110 00:00:22 + Distance: (default is 110) + + +``` + +查看R1的路由表 + +``` +R1#sh ip route ospf + 2.0.0.0/32 is subnetted, 1 subnets +O IA 2.2.2.2 [110/11] via 192.168.12.2, 00:01:04, Ethernet0/0 + 3.0.0.0/32 is subnetted, 1 subnets +O IA 3.3.3.3 [110/12] via 192.168.12.2, 00:01:04, Ethernet0/0 + 4.0.0.0/32 is subnetted, 1 subnets +O IA 4.4.4.4 [110/1021] via 192.168.12.2, 00:01:04, Ethernet0/0 + 172.16.0.0/24 is subnetted, 1 subnets +O IA 172.16.23.0 [110/1010] via 192.168.12.2, 00:01:03, Ethernet0/0 +O IA 192.168.23.0/24 [110/11] via 192.168.12.2, 00:01:04, Ethernet0/0 +O IA 192.168.34.0/24 [110/1020] via 192.168.12.2, 00:01:04, Ethernet0/0 + + +``` + +## 8. LSA类别 + +| LSA类别 | 说明 | +| ------- | -------------------------- | +| 1 | 路由器LSA | +| 2 | 网络LSA | +| 3 | 网络汇总LSA | +| 4 | ASBR汇总LSA | +| 5 | AS外部LSA | +| 6 | 组成员LSA | +| 7 | NSSA区域外部LSA | +| 8 | 外部属性LSA | +| 9 | Opaque LSA(链路本地范围) | +| 10 | Opaque LSA(本地区域范围) | +| 11 | Opaque LSA(AS范围) | + + + +### 8.1 Router Link States(type 1) + +- **每个路由器针对它所在的区域产生LSA1**,描述区域内部与路由器直连的链路的信息(包括链路类型,Cost等) + +- LSA1只允许在本区域内洪泛,不允许跨越ABR + +- LSA中会标识路由器是否是ABR(B比特置位),ASBR(E比特置位)或者是Virtual-link(V比特置位)的端点的身份信息 + +``` +R1#sh ip ospf database router 2.2.2.2 + + OSPF Router with ID (1.1.1.1) (Process ID 1) + + Router Link States (Area 0) + + LS age: 55 + Options: (No TOS-capability, DC) + LS Type: Router Links + Link State ID: 2.2.2.2 + Advertising Router: 2.2.2.2 + LS Seq Number: 80000006 + Checksum: 0x7739 + Length: 84 + Number of Links: 5 + + Link connected to: a Stub Network + (Link ID) Network/subnet number: 2.2.2.2 + (Link Data) Network Mask: 255.255.255.255 + Number of MTID metrics: 0 + TOS 0 Metrics: 1 + + Link connected to: another Router (point-to-point) + (Link ID) Neighboring Router ID: 3.3.3.3 + (Link Data) Router Interface address: 192.168.23.2 + Number of MTID metrics: 0 + TOS 0 Metrics: 10 + + Link connected to: a Stub Network + (Link ID) Network/subnet number: 192.168.23.0 + (Link Data) Network Mask: 255.255.255.0 + Number of MTID metrics: 0 + TOS 0 Metrics: 10 + + Link connected to: another Router (point-to-point) + (Link ID) Neighboring Router ID: 1.1.1.1 + (Link Data) Router Interface address: 192.168.12.2 + Number of MTID metrics: 0 + TOS 0 Metrics: 10 + + Link connected to: a Stub Network + (Link ID) Network/subnet number: 192.168.12.0 + (Link Data) Network Mask: 255.255.255.0 + Number of MTID metrics: 0 + TOS 0 Metrics: 10 + + +``` + +### 8.2 Net Link States(type 2) + +- 描述TransNet(包括Broadcast和NBMA网络)网络信息; +- **由DR生成**,描述其在该网络上连接的所有路由器以及网段掩码信息,以及这个MA所属的路由器; +- LSA类型2只在本区域Area内洪泛,不允许跨越ABR; +- Network LSA ID是DR进行宣告的那个接口的IP地址 +- Network LSA 中没有COST字段 + +``` +R1#show ip ospf database network 192.168.1.3 + + OSPF Router with ID (1.1.1.1) (Process ID 1) + + Net Link States (Area 0) + + LS age: 310 + Options: (No TOS-capability, DC) + LS Type: Network Links + Link State ID: 192.168.1.3 (address of Designated Router) + Advertising Router: 3.3.3.3 + LS Seq Number: 80000002 + Checksum: 0x8D16 + Length: 36 + Network Mask: /24 + Attached Router: 3.3.3.3 + Attached Router: 1.1.1.1 + Attached Router: 2.2.2.2 + + +``` + +### 8.3 Summary Net Link States(type 3) + +由ABR生成,实际上就是将区域内部的Type1 Type2的信息收集起来以路由子网的形式扩散出去, 这就是Summay LSA中Summay的含义(注意这里的summary与路由汇总没有关系); + +``` +R2#sh ip ospf database summary 192.168.12.0 + + OSPF Router with ID (2.2.2.2) (Process ID 1) + + Summary Net Link States (Area 1) + + LS age: 229 + Options: (No TOS-capability, DC, Upward) + LS Type: Summary Links(Network) + Link State ID: 192.168.12.0 (summary Network Number) + Advertising Router: 2.2.2.2 + LS Seq Number: 80000001 + Checksum: 0x7B3A + Length: 28 + Network Mask: /24 + MTID: 0 Metric: 10 + + +``` + +### 8.4 Summary ASB Link States(type 4) + +ASBR Summary LSA**由ABR生成**,用于描述ABR能够到达的ASBR它的链路状态ID为目的ASBR的RID。 + +``` +R3#sh ip ospf database asbr-summary 1.1.1.1 + + OSPF Router with ID (3.3.3.3) (Process ID 1) + + Summary ASB Link States (Area 1) + + LS age: 341 + Options: (No TOS-capability, DC, Upward) + LS Type: Summary Links(AS Boundary Router) + Link State ID: 1.1.1.1 (AS Boundary Router address) + Advertising Router: 2.2.2.2 + LS Seq Number: 80000001 + Checksum: 0x75B0 + Length: 28 + Network Mask: /0 + MTID: 0 Metric: 10 + + +``` + +### 8.5 Type-5 AS External Link States(type 5) + +Autonomous System External LSA**由ASBR生成**用于描述OSPF自治域系统外的目标网段信息链路状态ID是目的地址的IP网络号。 + +``` +R3#sh ip ospf database external 0.0.0.0 + + OSPF Router with ID (3.3.3.3) (Process ID 1) + + Type-5 AS External Link States + + LS age: 203 + Options: (No TOS-capability, DC, Upward) + LS Type: AS External Link + Link State ID: 0.0.0.0 (External Network Number ) + Advertising Router: 1.1.1.1 + LS Seq Number: 80000004 + Checksum: 0x7553 + Length: 36 + Network Mask: /0 + Metric Type: 1 (Comparable directly to link state metric) + MTID: 0 + Metric: 100 + Forward Address: 0.0.0.0 + External Route Tag: 1 + + +``` + +### 8.6 Type-7 AS External Link States(type 7) + +7类LSA的内容和5类LSA的内容是一样的,都是ASBR产生,用于记录外部路由条目的。 + +7类LSA的ASBR一定属于NSSA区域。 + +``` +R3#sh ip ospf database nssa-external 10.1.0.0 + + OSPF Router with ID (3.3.3.3) (Process ID 1) + + Type-7 AS External Link States (Area 1) + + LS age: 557 + Options: (No TOS-capability, Type 7/5 translation, DC, Upward) + LS Type: AS External Link + Link State ID: 10.1.0.0 (External Network Number ) + Advertising Router: 3.3.3.3 + LS Seq Number: 80000001 + Checksum: 0x172 + Length: 36 + Network Mask: /24 + Metric Type: 2 (Larger than any link state path) + MTID: 0 + Metric: 20 + Forward Address: 3.3.3.3 + External Route Tag: 0 + + +``` + +## 9. 注入默认路由 + +- 在局域网中,指引流量离开的那个地址,我们称之为网关 +- 在一个自制系统(可以想象成一个公司的内网,由很多网段组成)中,指引每个网段如何去往互联网的条目,我们称之为默认路由,或者缺省路由 + +OSPF产生默认路由的方式 + +``` +R1(config)#router ospf 1 +R1(config-router)#default-information originate [always] +# 如果不带always,那么这台路由器上必须有*的路由才能生效,加了always那么总是生效。 + + +``` + +OSPF注入的默认路由默认是O*E2,也就是2类的外部路由。 + +- 1类外部路由会累加内部开销 +- 2类外部路由不会累加内部开销 + +我们将默认路由改为1类,查看开销 + +``` +R3#sh ip route +O*E2 0.0.0.0/0 [110/1] via 192.168.23.2, 00:04:03, Ethernet0/0 +# 改为1之前,度量值始终是1,不会增加 +R1(config-router)#default-information originate always metric-type 1 metric 100 +# 下面修改为1,同时我们还能顺带改度量值 +R3#sh ip route ospf +O*E1 0.0.0.0/0 [110/120] via 192.168.23.2, 7w0d, Ethernet0/0 +# 发现由原本的100,累积到了120,说明累加内部开销 + + +``` + +## 10. 特殊区域 + +由于非骨干区域只能学到本区域的拓扑,以及骨干区域传来的其他区域和AS外部的条目,所以非骨干区域可以对路由条目进行精简 + +- 比如可以不学习AS外部的条目,只要是OSPF内部没学到的路由器统统交给骨干区域。 +- 比如可以不学习本区域以外的路由条目,反正要从骨干区域走,不如产生默认路由指向骨干。 + +对于需要进一步精简路由表,优化OSPF区域的情况,我们可以配置特殊区域。 + +**骨干区域不可以配置成特殊区域** + +### 10.1 演示拓扑 + +![image-20200321104946300](09.OSPF/image-20200321104946300-1584768754788.png) + +在R1上创建三个loopback接口,172.16.1~3.1/24,用于模拟外部注入的路由条目。 + +``` +R1 +interface Loopback1 + ip address 172.16.1.1 255.255.255.0 +interface Loopback2 + ip address 172.16.2.1 255.255.255.0 +interface Loopback3 + ip address 172.16.3.1 255.255.255.0 +router ospf 1 + redistribute connected subnets + + +``` + +在非骨干区域查看,确认学到了外部的条目 + +``` +R3#sh ip route ospf +O E2 172.16.1.0 [110/20] via 192.168.13.1, 00:00:54, Ethernet0/0 +O E2 172.16.2.0 [110/20] via 192.168.13.1, 00:00:54, Ethernet0/0 +O E2 172.16.3.0 [110/20] via 192.168.13.1, 00:00:54, Ethernet0/0 + + +``` + + + +### 10.2 stub + +stub区域用于让非骨干区域不去学习外部的路由条目,通过指向ABR的默认路由来访问外部,做到精简路由条目的目的。 + +stub区域中,没有4、5类LSA。 + +我们将area 1配置为stub,需要在所有参与area 1的路由器上配置如下命令,否则无法建立邻居 + +``` +router ospf 1 + area 1 stub + + +``` + +查看R3的链路状态数据库 + +``` +R3#sh ip ospf database + + OSPF Router with ID (3.3.3.3) (Process ID 1) + + Router Link States (Area 1) + +Link ID ADV Router Age Seq# Checksum Link count +1.1.1.1 1.1.1.1 21 0x8000000E 0x0066B1 2 +3.3.3.3 3.3.3.3 32 0x80000006 0x009767 2 +4.4.4.4 4.4.4.4 26 0x80000007 0x00C924 2 + + Net Link States (Area 1) + +Link ID ADV Router Age Seq# Checksum +192.168.13.3 3.3.3.3 27 0x80000003 0x00980C +192.168.14.4 4.4.4.4 22 0x80000003 0x008713 + + Summary Net Link States (Area 1) + +Link ID ADV Router Age Seq# Checksum +0.0.0.0 1.1.1.1 104 0x80000001 0x0093A6 # 多出来一条指向ABR的条目 +1.1.1.1 1.1.1.1 104 0x80000003 0x0061D2 +2.2.2.2 1.1.1.1 104 0x80000002 0x00998D +5.5.5.5 1.1.1.1 104 0x80000002 0x00739D +6.6.6.6 1.1.1.1 104 0x80000002 0x0045C7 +192.168.12.0 1.1.1.1 104 0x80000003 0x00B306 +192.168.25.0 1.1.1.1 104 0x80000002 0x008A19 +192.168.26.0 1.1.1.1 104 0x80000002 0x007F23 +# 原本172.16开头的5类LSA消失 + + +``` + +### 10.3 Totally stub + +完全末梢区域可以让非骨干区域不去学习其他区域的路由,也不去学习OSPF外部的路由。 + +产生一条默认路由指向ABR,也就是除了本区域内部条目以外,完全依靠骨干区域和外部通信。 + +我们将area 2配置为stub,需要在所有参与area 2的路由器上配置如下命令,否则无法建立邻居 + +``` +router ospf 1 + area 2 stub + + +``` + +为了成为`totally stub`,还需要在ABR上加上`no-summary` + +``` +router ospf 1 + area 2 stub no-summary + + +``` + +查看路由表,发现现在只能学习到本区域的条目和一条指向ABR的默认路由 + +``` +R5#sh ip route ospf +O*IA 0.0.0.0/0 [110/11] via 192.168.25.2, 00:00:16, Ethernet0/0 + 6.0.0.0/32 is subnetted, 1 subnets +O 6.6.6.6 [110/21] via 192.168.25.2, 00:00:06, Ethernet0/0 +O 192.168.26.0/24 [110/20] via 192.168.25.2, 00:00:06, Ethernet0/0 + + +``` + +查看链路状态数据库,发现4、5无法学习到,3类只剩下一条默认路由 + +``` +R5#sh ip ospf database + + OSPF Router with ID (5.5.5.5) (Process ID 1) + + Router Link States (Area 2) + +Link ID ADV Router Age Seq# Checksum Link count +2.2.2.2 2.2.2.2 61 0x8000000E 0x00B524 2 +5.5.5.5 5.5.5.5 77 0x80000007 0x00CBFD 2 +6.6.6.6 6.6.6.6 63 0x80000009 0x00FBBB 2 + + Net Link States (Area 2) + +Link ID ADV Router Age Seq# Checksum +192.168.25.5 5.5.5.5 77 0x80000003 0x003A48 +192.168.26.6 6.6.6.6 69 0x80000003 0x00294F + + Summary Net Link States (Area 2) + +Link ID ADV Router Age Seq# Checksum +0.0.0.0 2.2.2.2 114 0x80000001 0x0075C0 + + +``` + +### 10.4 NSSA(not so stub area) + +如果外部的路由是由特殊区域引入的,那么stub和t-stub两种无法满足需求,因为不允许5类LSA传递。 + +NSSA可以将OSPF外部路由以7类LSA进入特殊区域,然后再由特殊区域的ABR负责将条目转换为5类LSA转发到其他区域。 + +为了模拟这个过程,**先删除area 1的stub配置**,在R3上配置3个loopback,地址是10.1~3.0.1/24,然后引入OSPF。 + +``` +R3 +interface Loopback1 + ip address 10.1.0.1 255.255.255.0 +interface Loopback2 + ip address 10.2.0.1 255.255.255.0 +interface Loopback3 + ip address 10.3.0.1 255.255.255.0 +router ospf 1 + redistribute connected subnets + + +``` + +下面我们在每一个参与area 1的设备上配置如下命令 + +``` +router ospf 1 + area 1 nssa + + +``` + +然后我们观察,发现无法学习到其他区域引入的外部路由条目,这个和stub区域一致。 + +``` +R3#sh ip route ospf +Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP + D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area + N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2 + E1 - OSPF external type 1, E2 - OSPF external type 2 + i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2 + ia - IS-IS inter area, * - candidate default, U - per-user static route + o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP + a - application route + + - replicated route, % - next hop override, p - overrides from PfR + +Gateway of last resort is not set + + 1.0.0.0/32 is subnetted, 1 subnets +O IA 1.1.1.1 [110/11] via 192.168.13.1, 00:03:12, Ethernet0/0 + 2.0.0.0/32 is subnetted, 1 subnets +O IA 2.2.2.2 [110/21] via 192.168.13.1, 00:03:12, Ethernet0/0 + 4.0.0.0/32 is subnetted, 1 subnets +O 4.4.4.4 [110/21] via 192.168.13.1, 00:02:14, Ethernet0/0 + 5.0.0.0/32 is subnetted, 1 subnets +O IA 5.5.5.5 [110/31] via 192.168.13.1, 00:03:12, Ethernet0/0 + 6.0.0.0/32 is subnetted, 1 subnets +O IA 6.6.6.6 [110/31] via 192.168.13.1, 00:03:12, Ethernet0/0 + 172.16.0.0/24 is subnetted, 3 subnets +O N2 172.16.1.0 [110/20] via 192.168.13.1, 00:03:12, Ethernet0/0 +O N2 172.16.2.0 [110/20] via 192.168.13.1, 00:03:12, Ethernet0/0 +O N2 172.16.3.0 [110/20] via 192.168.13.1, 00:03:12, Ethernet0/0 # 这边能学到是因为R1也是area1的 +O IA 192.168.12.0/24 [110/20] via 192.168.13.1, 00:03:12, Ethernet0/0 +O 192.168.14.0/24 [110/20] via 192.168.13.1, 00:02:14, Ethernet0/0 +O IA 192.168.25.0/24 [110/30] via 192.168.13.1, 00:03:12, Ethernet0/0 +O IA 192.168.26.0/24 [110/30] via 192.168.13.1, 00:03:12, Ethernet0/0 + + +``` + +这边的O N2和O E2是一样的,都是外部路由条目,不过O N2是nssa区域特有,也就是7类LSA学来的。 + +需要注意的是,NSSA并不会产生一条默认路由,下面我查看一下。 + +``` +R3#sh ip ospf database + + OSPF Router with ID (3.3.3.3) (Process ID 1) + + Router Link States (Area 1) + +Link ID ADV Router Age Seq# Checksum Link count +1.1.1.1 1.1.1.1 212 0x80000018 0x00DF24 2 +3.3.3.3 3.3.3.3 270 0x80000010 0x0011D9 2 +4.4.4.4 4.4.4.4 213 0x8000000C 0x004799 2 + + Net Link States (Area 1) + +Link ID ADV Router Age Seq# Checksum +192.168.13.3 3.3.3.3 265 0x80000007 0x001880 +192.168.14.4 4.4.4.4 219 0x80000005 0x000B85 + + Summary Net Link States (Area 1) +# 可以去看上面stub的数据库,这边是有0.0.0.0的,而nssa没有 +Link ID ADV Router Age Seq# Checksum +1.1.1.1 1.1.1.1 271 0x80000005 0x00E445 +2.2.2.2 1.1.1.1 271 0x80000004 0x001DFF +5.5.5.5 1.1.1.1 271 0x80000003 0x00F80F +6.6.6.6 1.1.1.1 271 0x80000003 0x00CA39 +192.168.12.0 1.1.1.1 271 0x80000005 0x003778 +192.168.25.0 1.1.1.1 271 0x80000004 0x000E8B +192.168.26.0 1.1.1.1 271 0x80000004 0x000395 + + Type-7 AS External Link States (Area 1) + +Link ID ADV Router Age Seq# Checksum Tag +10.1.0.0 3.3.3.3 373 0x80000001 0x000172 0 +10.2.0.0 3.3.3.3 373 0x80000001 0x00F47D 0 +10.3.0.0 3.3.3.3 373 0x80000001 0x00E888 0 +172.16.1.0 1.1.1.1 265 0x80000001 0x001DBF 0 +172.16.2.0 1.1.1.1 265 0x80000001 0x0012C9 0 +172.16.3.0 1.1.1.1 265 0x80000001 0x0007D3 0 + + +``` + +其实在abr上添加一条命令,就可以做到与stub一样,产生默认路由 + +``` +router ospf 1 + area 1 nssa default-information-originate + + +``` + +### 10.5 Totally NSSA + +与t-stub是一样的,唯一不同的是可以在特殊区域中引入外部的路由条目 + +在nssa区域的ABR上加上如下命令就可以配置为T-NSSA + +``` +router ospf 1 + area 1 nssa no-summary + +``` + +## 11. 路由汇总 + +由于链路状态协议的特殊性,在传递的时候必须保持原本LSA的信息,不能更改别人的LSA,所以在同一个区域中,所有的路由器都知道拓扑,无法对路由条目进行操作。当然无法在同一个区域中汇总。 + +![image-20200321134602379](09.OSPF/image-20200321134602379.png) + +### 11.1 汇总OSPF区域间路由 + +在R4上配置3个loopback,地址是172.16.1~3.1/24,并且加入ospf area 2,然后我们观察汇总的特性 + +检查R3的路由表,可以看到明细路由 + +``` +R3#sh ip route ospf + 172.16.0.0/32 is subnetted, 3 subnets +O 172.16.1.1 [110/11] via 192.168.34.4, 00:01:24, Ethernet0/1 +O 172.16.2.1 [110/11] via 192.168.34.4, 00:01:24, Ethernet0/1 +O 172.16.3.1 [110/11] via 192.168.34.4, 00:01:24, Ethernet0/1 + +``` + +我们可以尝试在R4上配置汇总 + +``` +R4 +router ospf 1 + area 2 range 172.16.0.0 255.255.0.0 + +``` + +``` +R3#sh ip route ospf + 172.16.0.0/32 is subnetted, 3 subnets +O 172.16.1.1 [110/11] via 192.168.34.4, 00:02:41, Ethernet0/1 +O 172.16.2.1 [110/11] via 192.168.34.4, 00:02:41, Ethernet0/1 +O 172.16.3.1 [110/11] via 192.168.34.4, 00:02:41, Ethernet0/1 +# 在同一个区域中,OSPF是不支持汇总的 + +``` + +OSPF可以在ABR上对OSPF中的路由进行汇总,影响下游的区域。上图中,我们可以在R3上配置汇总命令 + +``` +R3 +router ospf 1 + area 2 range 172.16.0.0 255.255.0.0 +# 汇总哪个的区域路由,就写区域几,比如这条就是要汇总area 2 + +``` + +关闭R3上的汇总命令,换到R2上去配置,会发现无法汇总这个条目,原因是因为R2无法修改R3产生的LSA。 + +### 11.2 汇总OSPF外部路由 + +OSPF外部的路由由ASBR产生,所以只能由ASBR去修改或者汇总 + +在R1上配置3个环回接口10.1~3.0.1/24,然后导入到OSPF中 + +``` +R1 +interface Loopback1 + ip address 10.1.0.1 255.255.255.0 +interface Loopback2 + ip address 10.2.0.1 255.255.255.0 +interface Loopback3 + ip address 10.3.0.1 255.255.255.0 +router ospf 1 + redistribute connected subnets + +``` + +这些条目是由R1引入的,所以只能在R1上配置汇总命令 + +``` +R1 +router ospf 1 + summary-address 10.0.0.0 255.0.0.0 + +``` + +### 11.3 抑制路由条目 + +抑制路由条目的做法在汇总操作中非常常见,汇总就是将明细路由进行抑制,然后本地产生一条汇总的路由发出去。 + +抑制区域间的条目,只能在ABR上进行。 + +抑制外部路由条目,只能在ASBR上进行。 + +#### 11.3.1 区域间路由抑制更新 + +``` +R3 +router ospf 1 + area 2 range 172.16.2.1 255.255.255.255 not-advertise + +``` + +在R2上查看效果 + +``` +R2#sh ip route ospf + 172.16.0.0/32 is subnetted, 2 subnets +O IA 172.16.1.1 [110/21] via 192.168.23.3, 00:09:04, Ethernet0/1 +O IA 172.16.3.1 [110/21] via 192.168.23.3, 00:09:04, Ethernet0/1 +# 172.16.2.1消失 + +``` + +#### 11.3.2 外部路由抑制更新 + +``` +R1 +router ospf 1 + summary-address 10.2.0.0 255.255.255.0 not-advertise + +``` + +在其他路由器上看效果 + +``` +R3#sh ip route ospf + 10.0.0.0/24 is subnetted, 2 subnets +O E2 10.1.0.0 [110/20] via 192.168.23.2, 00:02:43, Ethernet0/0 +O E2 10.3.0.0 [110/20] via 192.168.23.2, 00:02:43, Ethernet0/0 + +``` + +### 11.4 抑制7类转发地址 + +![image-20200321141355951](09.OSPF/image-20200321141355951.png) + +在配置好了之后,我们在R2上抑制R1的条目 + +``` +router ospf 1 + area 1 range 1.1.1.1 255.255.255.255 not-advertise + +``` + +我们发现R3不仅仅是1.1.1.1无法学习,连10.x.0.0/24也学习不到了 + +``` +R3#sh ip route ospf + 2.0.0.0/32 is subnetted, 1 subnets +O 2.2.2.2 [110/11] via 192.168.23.2, 00:11:48, Ethernet0/0 + 4.0.0.0/32 is subnetted, 1 subnets +O 4.4.4.4 [110/11] via 192.168.34.4, 00:11:48, Ethernet0/1 + 172.16.0.0/32 is subnetted, 3 subnets +O 172.16.1.1 [110/11] via 192.168.34.4, 00:11:48, Ethernet0/1 +O 172.16.2.1 [110/11] via 192.168.34.4, 00:11:48, Ethernet0/1 +O 172.16.3.1 [110/11] via 192.168.34.4, 00:11:48, Ethernet0/1 +O IA 192.168.12.0/24 [110/20] via 192.168.23.2, 00:11:48, Ethernet0/0 + +``` + +虽然R3路由表中没有10开头的地址,但是数据库中竟然还有 + +``` +R3#sh ip ospf database +------------省略------------ + Type-5 AS External Link States + +Link ID ADV Router Age Seq# Checksum Tag +10.1.0.0 2.2.2.2 124 0x80000001 0x004F3A 0 +10.2.0.0 2.2.2.2 124 0x80000001 0x004345 0 +10.3.0.0 2.2.2.2 124 0x80000001 0x003750 0 + +``` + +查看详细内容 + +``` +R3#sh ip ospf database external 10.1.0.0 + + OSPF Router with ID (3.3.3.3) (Process ID 1) + + Type-5 AS External Link States + + LS age: 171 + Options: (No TOS-capability, DC, Upward) + LS Type: AS External Link + Link State ID: 10.1.0.0 (External Network Number ) + Advertising Router: 2.2.2.2 + LS Seq Number: 80000001 + Checksum: 0x4F3A + Length: 36 + Network Mask: /24 + Metric Type: 2 (Larger than any link state path) + MTID: 0 + Metric: 20 + Forward Address: 1.1.1.1 # 这个地址不可达,导致即使有LSA,也是无法使用的 + External Route Tag: 0 + +``` + +通过上述的实验现象,说明了OSPF学到LSA之后,还是会进行可用性的判断。 + +``` +R2 +router ospf 1 + area 1 nssa translate type7 suppress-fa +# 这条命令的意思是在翻译type7LSA的时候,将forward address改为0.0.0.0 + +``` + +下面查看R3的数据库,发现10开头的LSA已经有效了 + +``` +R3#sh ip ospf database external 10.1.0.0 + + OSPF Router with ID (3.3.3.3) (Process ID 1) + + Type-5 AS External Link States + + LS age: 32 + Options: (No TOS-capability, DC, Upward) + LS Type: AS External Link + Link State ID: 10.1.0.0 (External Network Number ) + Advertising Router: 2.2.2.2 + LS Seq Number: 80000002 + Checksum: 0x1B71 + Length: 36 + Network Mask: /24 + Metric Type: 2 (Larger than any link state path) + MTID: 0 + Metric: 20 + Forward Address: 0.0.0.0 + External Route Tag: 0 +R3#show ip route ospf + 10.0.0.0/24 is subnetted, 3 subnets +O E2 10.1.0.0 [110/20] via 192.168.23.2, 00:03:15, Ethernet0/0 +O E2 10.2.0.0 [110/20] via 192.168.23.2, 00:03:15, Ethernet0/0 +O E2 10.3.0.0 [110/20] via 192.168.23.2, 00:03:15, Ethernet0/0 +# 发现1.1.1.1没学到,但是外部的条目都可以使用了 + +``` + +## 12. 被动接口 + +![image-20200321143102904](09.OSPF/image-20200321143102904.png) + +这种情况下,想要将R1的e0/0口地址加入OSPF,但是PC或者服务器是不安全的,一旦被入侵,可能和R1建立邻居,从而破坏整个网络。 + +我们可以将R1的e0/0加入ospf之后,设置为被动接口,那么R1的e0/0接口就无法启动任何邻居。 + +``` +R1 +router ospf 1 + passive-interface Ethernet0/0 + +``` + +## 13. 身份验证 + +OSPF支持以下几种认证形式 + +> Null +> +> 简单密码身份验证 +> +> MD5身份验证 +> +> 接口认证 +> +> 区域认证 + +``` +interface Ethernet0/0 + ip ospf authentication message-digest + ip ospf message-digest-key 1 md5 [密码] +# 接口密文认证 + +``` + +``` +router ospf 1 + area 1 authentication message-digest +# 配置了上述命令后,所有area1的接口都必须加同样的密码 + +``` + +如果加了区域认证,虚链路的两端属于area 0 所以在给area 0加认证的时候,别忘了虚链路对端也是area 0。 + +### 13.1 HMAC + + HMAC是密钥相关的哈希运算消息认证码(Hash-based Message Authentication Code)的缩写 + +HMAC在OSPF中的过程大致如下 + +1. OSPF将更新消息和密码放在一起,算一下MD5的值,比如值是A +2. 然后OSPF将更新消息和A一起发给邻居,注意这个数据里面不带密码 +3. 邻居收到了之后,将更新消息和密码放在一起,算一下MD5的值,比如值是B +4. 邻居发现A=B,就通过了对方的身份认证,如果A≠B,说明对方的认证密码和自己不一样,不能建立邻居。 + +## 14. OSPF综合实验 + + + +![image-20200321150528513](09.OSPF/image-20200321150528513.png) + +需求: + +1,按照如图所示配置好路由器的接口地址。在每台路由器上必须建立loopback0接口。 + +2,配置好OSPF,区域划分如图所示,并且ospf的router-id必须为loopback0的地址。最终实现全网互联。 + +3,在R1、R2、R3、R4之间的多路访问网络里面,必须是的R1成为DR,R2成为BDR。在其余的链路里面必须保障OSPF邻居的快速建立,而不需要经过wait timer。 + +4,在R1和R2上建立loopback10,接口的地址为同样的100.1.1.1/32来模拟外网的接入。要求R1和R2都向内网通告一条缺省路由,正常的时候所有的路由器通过R1的缺省路由来访问外网,当R1无法正常工作的时候,通过R2来访问外网。(需要在R7上使用traceroute来测试路线。) + +5,area 2为特殊区域,该区域无法学习到ospf其他区域的路由。R7的loopback0的地址通过redistribute connected subnets命令进入ospf。(观察R5和R6上的7.7.7.0路由的来源,思考原因。) + +6,在R3上创建loopback1-3,地址为172.16.x.1/24(x为1-3)。并且宣告进OSPF区域1,要求在area 0只能看到一条汇总的路由172.16.0.0 + +7,area 0需要启用明文区域认证,R3和R5之间明文链路认证,R4和R6之间密文链路认证。 + +8,禁止area 2内的192.168.57.0/24和192.168.67.0/24被其他区域学习到。此刻思考区域0里面关于7.7.7.0的路由消失的原因,并且需要解决7.7.7.0消失的问题。 + diff --git a/00.基础阶段/01.网络基础/09.OSPF/image-20200315111449847-1584768754786.png b/00.基础阶段/01.网络基础/09.OSPF/image-20200315111449847-1584768754786.png new file mode 100644 index 0000000..9a41b4c Binary files /dev/null and b/00.基础阶段/01.网络基础/09.OSPF/image-20200315111449847-1584768754786.png differ diff --git a/00.基础阶段/01.网络基础/09.OSPF/image-20200315134639693-1584768754787.png b/00.基础阶段/01.网络基础/09.OSPF/image-20200315134639693-1584768754787.png new file mode 100644 index 0000000..cac64c1 Binary files /dev/null and b/00.基础阶段/01.网络基础/09.OSPF/image-20200315134639693-1584768754787.png differ diff --git a/00.基础阶段/01.网络基础/09.OSPF/image-20200315152422364-1584768754787.png b/00.基础阶段/01.网络基础/09.OSPF/image-20200315152422364-1584768754787.png new file mode 100644 index 0000000..6820662 Binary files /dev/null and b/00.基础阶段/01.网络基础/09.OSPF/image-20200315152422364-1584768754787.png differ diff --git a/00.基础阶段/01.网络基础/09.OSPF/image-20200315153241671-1584768754787.png b/00.基础阶段/01.网络基础/09.OSPF/image-20200315153241671-1584768754787.png new file mode 100644 index 0000000..022b589 Binary files /dev/null and b/00.基础阶段/01.网络基础/09.OSPF/image-20200315153241671-1584768754787.png differ diff --git a/00.基础阶段/01.网络基础/09.OSPF/image-20200315154803816-1584768754787.png b/00.基础阶段/01.网络基础/09.OSPF/image-20200315154803816-1584768754787.png new file mode 100644 index 0000000..87f0ab8 Binary files /dev/null and b/00.基础阶段/01.网络基础/09.OSPF/image-20200315154803816-1584768754787.png differ diff --git a/00.基础阶段/01.网络基础/09.OSPF/image-20200321093951814-1584768754787.png b/00.基础阶段/01.网络基础/09.OSPF/image-20200321093951814-1584768754787.png new file mode 100644 index 0000000..708e4c9 Binary files /dev/null and b/00.基础阶段/01.网络基础/09.OSPF/image-20200321093951814-1584768754787.png differ diff --git a/00.基础阶段/01.网络基础/09.OSPF/image-20200321104946300-1584768754788.png b/00.基础阶段/01.网络基础/09.OSPF/image-20200321104946300-1584768754788.png new file mode 100644 index 0000000..f26f256 Binary files /dev/null and b/00.基础阶段/01.网络基础/09.OSPF/image-20200321104946300-1584768754788.png differ diff --git a/00.基础阶段/01.网络基础/09.OSPF/image-20200321134602379.png b/00.基础阶段/01.网络基础/09.OSPF/image-20200321134602379.png new file mode 100644 index 0000000..1ed62ad Binary files /dev/null and b/00.基础阶段/01.网络基础/09.OSPF/image-20200321134602379.png differ diff --git a/00.基础阶段/01.网络基础/09.OSPF/image-20200321141355951.png b/00.基础阶段/01.网络基础/09.OSPF/image-20200321141355951.png new file mode 100644 index 0000000..bd6a7ca Binary files /dev/null and b/00.基础阶段/01.网络基础/09.OSPF/image-20200321141355951.png differ diff --git a/00.基础阶段/01.网络基础/09.OSPF/image-20200321143102904.png b/00.基础阶段/01.网络基础/09.OSPF/image-20200321143102904.png new file mode 100644 index 0000000..e778928 Binary files /dev/null and b/00.基础阶段/01.网络基础/09.OSPF/image-20200321143102904.png differ diff --git a/00.基础阶段/01.网络基础/09.OSPF/image-20200321150528513.png b/00.基础阶段/01.网络基础/09.OSPF/image-20200321150528513.png new file mode 100644 index 0000000..3a5f6a9 Binary files /dev/null and b/00.基础阶段/01.网络基础/09.OSPF/image-20200321150528513.png differ diff --git a/00.基础阶段/01.网络基础/10.交换原理.md b/00.基础阶段/01.网络基础/10.交换原理.md new file mode 100644 index 0000000..e3c9659 --- /dev/null +++ b/00.基础阶段/01.网络基础/10.交换原理.md @@ -0,0 +1,287 @@ +# 10.交换原理 + +## 1. 交换机的工作原理 + +- 交换机的主要作用是将多个节点连接至同一个广播域中 +- 广播域中的设备可以直接通信,同一个广播域建议IP地址网络号一样 + +![image-20200412101431873](10.交换原理/image-20200412101431873.png) + +如图,R1和R2属于同一个广播域,只需要有二层的数据封装就可以通信,不看三层的数据封装 + + + +R1和R2故意配置不是同一个网段的地址,看下是否可以通信 + +``` +R1(config)#int e0/0 +R1(config-if)#ip add 172.16.1.1 255.255.255.0 +R1(config-if)#no sh +R1(config-if)#ip route 0.0.0.0 0.0.0.0 e0/0 +``` + +``` +R2(config)#int e0/0 +R2(config-if)#ip add 192.168.1.1 255.255.255.0 +R2(config-if)#no sh +R2(config-if)#ip route 0.0.0.0 0.0.0.0 e0/0 +``` + +测试是否可以互相访问 + +``` +R1#ping 192.168.1.1 +Type escape sequence to abort. +Sending 5, 100-byte ICMP Echos to 192.168.1.1, timeout is 2 seconds: +.!!!! +Success rate is 80 percent (4/5), round-trip min/avg/max = 1/1/1 ms +``` + +这就说明二层的通信和三层的通信在一定程度上是隔离的,因为中间转发数据的设备不一样。 + +如果某个数据只有二层数据封装,那么只能在本广播域传递,交换机在处理的时候是不看IP地址相关信息,也就是不去查看三层数据。 + +路由器只处理IP报头中的内容,不去转发只有二层的数据,甚至如果这个数据包中二层的目的MAC地址不是路由器,路由器会直接丢弃。 + +1. 交换机收到一个数据之后,首先会将数据的源MAC地址和收到的这个接口对应关系记录到MAC地址表中 + +``` +Switch#sh mac address-table + Mac Address Table +------------------------------------------- + +Vlan Mac Address Type Ports +---- ----------- -------- ----- + 1 aabb.cc00.5000 DYNAMIC Et0/2 +Total Mac Addresses for this criterion: 1 +``` + +2. 查看目的MAC地址是否存在MAC地址表中,如果不存在,就会将这个数据复制多份,每个接口都发一份(泛洪)。比如下图,就收到了交换机泛洪过来的,不应该发送的数据包,不过只收到了一个。 + +![image-20200412104114811](10.交换原理/image-20200412104114811.png) + +3. 交换机收到了正确的设备回应,并且学习到了MAC地址和接口对应关系,所以后续的数据都不会再泛洪。 + +``` +Switch#sh mac address-table + Mac Address Table +------------------------------------------- + +Vlan Mac Address Type Ports +---- ----------- -------- ----- + 1 aabb.cc00.5000 DYNAMIC Et0/2 + 1 aabb.cc00.7000 DYNAMIC Et0/1 +Total Mac Addresses for this criterion: 2 +``` + +### 1.1 MAC泛洪攻击 + +现有市面上的交换机学习到的MAC地址都是保存在内存中的,MAC地址学习数量有限,正常一个企业级入门交换机,能学习到的MAC地址数量只有几千个。 + +比如cisco C3560交换机可以学习到的地址只有6056个,正常情况下动态学习的MAC地址,需要等待300s都没有再次通信,就会删除。 + +``` +Eagle#show mac address-table count +Mac Entries for Vlan 0: +--------------------------- +Dynamic Address Count : 21 +Static Address Count : 0 +Total Mac Addresses : 21 +Total Mac Address Space Available: 6056 +``` + +如果有用户恶意的让交换机疯狂的学习MAC地址,直到塞满MAC地址表,那么所有的数据都会泛洪,从而导致内网信息泄漏。 + +macof是dsniff套装工具集的成员,macof会发送随机mac地址的数据,让交换机瞬间塞满mac地址表,这样交换机就不得不泛洪每个数据,然后再通过dsniff分析敏感信息,比如密码。 + +![image-20200412101431873](10.交换原理/123.gif) + +没运行几秒钟,交换机的MAC地址表就学习到了一万多条 + +``` +Switch#show mac address-table count + +Mac Entries for Vlan 1: +--------------------------- +Dynamic Address Count : 11292 +Static Address Count : 0 +Total Mac Addresses : 11292 + +Total Mac Address Space Available: 209388488 +``` + +### 1.2 路由器的工作原理 + +1. 收到一个数据包之后,首先查看目的MAC地址是否是接收端口,如果不是,就丢弃,如果是广播那就处理,但是不转发。 +2. 目的MAC地址如果通过检查,就回判断目的IP地址时候可路由(也就是路由表中是否存在匹配条目),存在就转发。 +3. 要注意,不管是接收还是发送,都会进行ACL检查。 + +## 2. VLAN + +### 2.1 LAN(Local Area Network ) + +- 本地区域网络,一般指的是一个广播域,里面的节点可以直接使用数据链路层封装信息通信 +- 不同的LAN往往是隔离的,如果有通信的需要,必须要经过一台三层设备,比如防火墙、路由器、上网行为管理等等 +- 在企业中,不同的LAN之间通信需要进行安全策略,比如研发部门的内网和销售部门的内网,就应该中间隔离 + +一台交换机默认情况下,所有接口都属于一个LAN,但是有时候因为成本和部署的需要,我们想让一台交换机可以有多个LAN,这些LAN之间是逻辑上隔离的,我们称为VLAN。 + +![image-20200412134143933](10.交换原理/image-20200412134143933.png) + +如果SW的e0/0和e0/1没有配置不同的VLAN,那么R1和R2即使网段不一样,依旧可以通信。 + +将R1分配到vlan10,将R2分配到vlan20,这样就彻底隔离了。 + +``` +SW(config)#vlan 10,20 +SW(config-vlan)#int e0/0 # 要注意,真实的交换机接口是从1开始的,这边是模拟器的Bug +SW(config-if)#switchport access vlan 10 +SW(config-if)#int e0/1 +SW(config-if)#switchport access vlan 20 +SW#show vlan +VLAN Name Status Ports +---- -------------------------------- --------- ------------------------------- +1 default active Et0/2, Et0/3 +10 VLAN0010 active Et0/0 +20 VLAN0020 active Et0/1 +``` + +- 默认情况下,交换机所有的接口都属于vlan1,所以交换机插电开机就可使用,并且所有接口默认都是一个LAN +- VLAN号范围是0-4095,其中有部分是保留的,0是不可以使用的 +- 在cisco设备上,vlan信息是保存在vlan数据库中的,在NVRAM的vlan.dat文件中,并不在startup-config和running-config中,所以show run是看不到对vlan操作的命令的 + +## 3. Trunk + +如果在交换机级联的情况下(下面有介绍),各自VLAN的数据在交换机之间也需要传递。 + +![image-20200412140255963](10.交换原理/image-20200412140255963.png) + +可以多台交换机之间将不同的VLAN拿线连起来,这样就可以实现不同交换机相同VLAN可以通信,但是不同VLAN又是隔离的。 + +不过这么做,在VLAN多了之后,比如一些大型公司,VLAN就有几十个上百个之多,这样的话接口都不够,就需要有新的解决方案。 + +Trunk接口是被定义了用来区分不同VLAN流量的。 + +![image-20200412140705738](10.交换原理/image-20200412140705738.png) + +- Trunk接口不能属于任何VLAN +- Trunk接口会将流量按照802.1Q标准重新封装数据链路层,在类型字段后插入VLAN标签相关信息,标识这个流量 + +- Trunk发出去的时候会加上VLAN信息,接收的时候会去除信息,并且把流量放到对应的VLAN中 +- 如果多台交换机trunk级联,要注意,所有的交换机都必须要创建相同的VLAN号,即使某台交换机没有任何接口属于这个VLAN,也必须创建,不然这个VLAN的流量经过这台交换机的时候,就无法识别。 + +![image-20200412150537538](10.交换原理/image-20200412150537538.png) + +![image-20200412141031615](10.交换原理/image-20200412141031615.png) + +首先不去配置交换机,只是配置PC的IP地址,发现其实是会有跨网段访问的风险的。 + +![image-20200412141457560](10.交换原理/image-20200412141457560.png) + +我们开始配置VLAN + +``` +Sw1(config)#vlan 10 +Sw1(config-vlan)#name oppo +Sw1(config-vlan)#vlan 20 +Sw1(config-vlan)#name vivo +Sw1(config-vlan)#int e0/1 +Sw1(config-if)#sw ac vl 10 +Sw1(config-if)#int e0/3 +Sw1(config-if)#sw ac vl 20 +``` + +``` +Sw2(config)#vlan 10 +Sw2(config-vlan)#name oppo +Sw2(config-vlan)#vlan 20 +Sw2(config-vlan)#name vivo +Sw2(config-vlan)#int e0/1 +Sw2(config-if)#sw ac vl 10 +Sw2(config-if)#int e0/3 +Sw2(config-if)#sw ac vl 20 +``` + +配置接口支持trunk + +``` +interface Ethernet0/2 + switchport trunk encapsulation dot1q + switchport mode trunk +``` + +查看trunk是否启动 + +``` +Sw2#show interfaces trunk + +Port Mode Encapsulation Status Native vlan +Et0/2 on 802.1q trunking 1 + +Port Vlans allowed on trunk +Et0/2 1-4094 + +Port Vlans allowed and active in management domain +Et0/2 1,10,20 + +Port Vlans in spanning tree forwarding state and not pruned +Et0/2 1,10,20 +``` + +![image-20200412142212253](10.交换原理/image-20200412142212253.png) + +### 3.1 本帧VLAN + +- 修改数据链路层封装,需要破坏原始数据报头,加入新的报头,并且还需要重新计算帧尾校验序列(FCS),比较消耗性能 +- 可以交换机约定好,特定的VLAN大家都不打标签,这个就是本帧,默认本帧VLAN是vlan1 +- Trunk接口如果收到一个没打802.1Q标记的流量,就认为这个是本帧VLAN的流量 +- PC接口如果收到一个打上802.1Q标记的流量,会认为数据出错,然后丢包 +- 本帧VLAN如果配置错误,可能导致流量在错误VLAN出现,最新的Cisco交换机固件会发现这个问题,然后将接口切断,防止发生串错VLAN情况,会将接口设置为`Inconsistent`状态 + +``` +interface Ethernet0/2 + switchport trunk native vlan 10 +``` + +抓包发现没有802.1Q的信息了 + +## 4. 交换机级联 + +当交换机接口不够,或者是部署位置的需要,比如两栋楼不可能都接在同一台交换机上,这个时候就需要将多台交换机连接起来,一台接一台的做法称之为级联。 + +![image-20200412135443783](10.交换原理/image-20200412135443783.png) + +默认情况下 + +1. win_3发出了一个数据,Sw1记录下Win_3的MAC地址和e0/1接口的关系,然后泛洪,从e0/2发出。 +2. Sw2收到了之后,记录下Win_3的MAC地址和e0/2接口的对应关系,然后泛洪,从e0/1发出。 +3. Win_4收到了Win_3发来的数据,开始回复,发送给Sw2 +4. Sw2收到了之后,记录下来Win_4和e0/1的对应关系,然后查找MAC表,准确的从e0/2转发给Win_3。 +5. Sw1收到了之后,记录下Win_4和e0/1的对应关系,然后查找MAC表,准确的从e0/1转发给Win_3。 + +下面是MAC地址表 + +``` +SW1#show mac address-table + Mac Address Table +------------------------------------------- + +Vlan Mac Address Type Ports +---- ----------- -------- ----- + 1 5000.0003.0000 DYNAMIC Et0/1 + 1 5000.0004.0000 DYNAMIC Et0/2 + 1 aabb.cc00.2020 DYNAMIC Et0/2 +Total Mac Addresses for this criterion: 3 +SW2#show mac address-table + Mac Address Table +------------------------------------------- + +Vlan Mac Address Type Ports +---- ----------- -------- ----- + 1 5000.0003.0000 DYNAMIC Et0/2 + 1 5000.0004.0000 DYNAMIC Et0/1 + 1 aabb.cc00.1020 DYNAMIC Et0/2 +Total Mac Addresses for this criterion: 3 +``` + +级联可能会带来带宽瓶颈的问题 diff --git a/00.基础阶段/01.网络基础/10.交换原理/123.gif b/00.基础阶段/01.网络基础/10.交换原理/123.gif new file mode 100644 index 0000000..e98070a Binary files /dev/null and b/00.基础阶段/01.网络基础/10.交换原理/123.gif differ diff --git a/00.基础阶段/01.网络基础/10.交换原理/image-20200412101431873.png b/00.基础阶段/01.网络基础/10.交换原理/image-20200412101431873.png new file mode 100644 index 0000000..4f72645 Binary files /dev/null and b/00.基础阶段/01.网络基础/10.交换原理/image-20200412101431873.png differ diff --git a/00.基础阶段/01.网络基础/10.交换原理/image-20200412104114811.png b/00.基础阶段/01.网络基础/10.交换原理/image-20200412104114811.png new file mode 100644 index 0000000..c780de2 Binary files /dev/null and b/00.基础阶段/01.网络基础/10.交换原理/image-20200412104114811.png differ diff --git a/00.基础阶段/01.网络基础/10.交换原理/image-20200412134143933.png b/00.基础阶段/01.网络基础/10.交换原理/image-20200412134143933.png new file mode 100644 index 0000000..567c9a1 Binary files /dev/null and b/00.基础阶段/01.网络基础/10.交换原理/image-20200412134143933.png differ diff --git a/00.基础阶段/01.网络基础/10.交换原理/image-20200412135443783.png b/00.基础阶段/01.网络基础/10.交换原理/image-20200412135443783.png new file mode 100644 index 0000000..168e978 Binary files /dev/null and b/00.基础阶段/01.网络基础/10.交换原理/image-20200412135443783.png differ diff --git a/00.基础阶段/01.网络基础/10.交换原理/image-20200412140255963.png b/00.基础阶段/01.网络基础/10.交换原理/image-20200412140255963.png new file mode 100644 index 0000000..fad9699 Binary files /dev/null and b/00.基础阶段/01.网络基础/10.交换原理/image-20200412140255963.png differ diff --git a/00.基础阶段/01.网络基础/10.交换原理/image-20200412140705738.png b/00.基础阶段/01.网络基础/10.交换原理/image-20200412140705738.png new file mode 100644 index 0000000..20d7e73 Binary files /dev/null and b/00.基础阶段/01.网络基础/10.交换原理/image-20200412140705738.png differ diff --git a/00.基础阶段/01.网络基础/10.交换原理/image-20200412141031615.png b/00.基础阶段/01.网络基础/10.交换原理/image-20200412141031615.png new file mode 100644 index 0000000..b30fc13 Binary files /dev/null and b/00.基础阶段/01.网络基础/10.交换原理/image-20200412141031615.png differ diff --git a/00.基础阶段/01.网络基础/10.交换原理/image-20200412141457560.png b/00.基础阶段/01.网络基础/10.交换原理/image-20200412141457560.png new file mode 100644 index 0000000..bc7d66a Binary files /dev/null and b/00.基础阶段/01.网络基础/10.交换原理/image-20200412141457560.png differ diff --git a/00.基础阶段/01.网络基础/10.交换原理/image-20200412142212253.png b/00.基础阶段/01.网络基础/10.交换原理/image-20200412142212253.png new file mode 100644 index 0000000..6f0c690 Binary files /dev/null and b/00.基础阶段/01.网络基础/10.交换原理/image-20200412142212253.png differ diff --git a/00.基础阶段/01.网络基础/10.交换原理/image-20200412145624833.png b/00.基础阶段/01.网络基础/10.交换原理/image-20200412145624833.png new file mode 100644 index 0000000..d774f95 Binary files /dev/null and b/00.基础阶段/01.网络基础/10.交换原理/image-20200412145624833.png differ diff --git a/00.基础阶段/01.网络基础/10.交换原理/image-20200412150537538.png b/00.基础阶段/01.网络基础/10.交换原理/image-20200412150537538.png new file mode 100644 index 0000000..84d33b3 Binary files /dev/null and b/00.基础阶段/01.网络基础/10.交换原理/image-20200412150537538.png differ diff --git a/00.基础阶段/01.网络基础/11.首跳冗余协议.md b/00.基础阶段/01.网络基础/11.首跳冗余协议.md new file mode 100644 index 0000000..acd36c5 --- /dev/null +++ b/00.基础阶段/01.网络基础/11.首跳冗余协议.md @@ -0,0 +1,152 @@ +# 11.首跳冗余协议 + +一旦网络网关或关键节点出现故障,将对业务造成灾难性故障 + +而网关在大多数情况下只有一个,无法做到冗余,而本章节讨论的就是怎么对网络节点进行冗余。 + +![image-20200425151233836](11.首跳冗余协议/image-20200425151233836.png) + +## 1. HSRP + +cisco私有的 + +![image-20200425151427734](11.首跳冗余协议/image-20200425151427734.png) + +比如内网中两个节点先比较各自的IP地址,地址大的最终胜出。 + +![image-20200425151501103](11.首跳冗余协议/image-20200425151501103.png) + +胜出的路由器可以响应虚拟IP地址的请求,而对用户而言,虚拟IP地址就是业务地址。 + +![image-20200425151603957](11.首跳冗余协议/image-20200425151603957.png) + +当负责响应这个虚拟IP地址的设备发生了故障,那么另外一台设备就会及时发现,并且抢过虚拟IP地址的响应。 + +![image-20200425152021426](11.首跳冗余协议/image-20200425152021426.png) + +R1,R2,R3是内网设备,R3模拟PC,R1和R2模拟网关 + +``` +R1(config)#int lo0 +R1(config-if)#ip add 1.1.1.1 255.255.255.0 +R1(config-if)#ip ospf 1 area 0 +R1(config-if)#int e0/0 +R1(config-if)#ip add 192.168.14.1 255.255.255.0 +R1(config-if)#no sh +R1(config-if)#ip ospf 1 area 0 +R1(config-if)#int e0/1 +R1(config-if)#ip add 192.168.123.251 255.255.255.0 +R1(config-if)#no sh +================================= +R2(config)#int lo0 +R2(config-if)#ip add 2.2.2.2 255.255.255.0 +R2(config-if)#ip ospf 1 area 0 +R2(config-if)#int e0/0 +R2(config-if)#ip add 192.168.24.2 255.255.255.0 +R2(config-if)#no sh +R2(config-if)#ip ospf 1 area 0 +R2(config-if)#int e0/1 +R2(config-if)#ip add 192.168.123.252 255.255.255.0 +R2(config-if)#no sh +===================================== +R3(config)#int e0/0 +R3(config-if)#ip add 192.168.123.3 255.255.255.0 +R3(config-if)#no sh +R3(config-if)#ip route 0.0.0.0 0.0.0.0 192.168.123.254 +========================================= +R4(config)#int lo0 +R4(config-if)#ip add 4.4.4.4 255.255.255.0 +R4(config-if)#ip ospf 1 area 0 +R4(config-if)#int e0/0 +R4(config-if)#ip add 192.168.14.4 255.255.255.0 +R4(config-if)#no sh +R4(config-if)#ip ospf 1 area 0 +R4(config-if)#int e0/1 +R4(config-if)#ip add 192.168.24.4 255.255.255.0 +R4(config-if)#no sh +R4(config-if)#ip ospf 1 area 0 +``` + +配置HSRP + +``` +R1和R2 +interface Ethernet0/1 + standby 1 ip 192.168.123.254 +``` + +查看HSRP运行状态 + +``` +R1#sh standby +Ethernet0/1 - Group 1 + State is Active + 2 state changes, last state change 00:00:38 + Virtual IP address is 192.168.123.254 # 虚拟IP地址 + Active virtual MAC address is 0000.0c07.ac01 # 虚拟MAC地址,0000.0c07.ac + Local virtual MAC address is 0000.0c07.ac01 (v1 default) + Hello time 3 sec, hold time 10 sec + Next hello sent in 2.560 secs + Preemption disabled # 默认角色不会被抢占 + Active router is local + Standby router is 192.168.123.252, priority 100 (expires in 10.800 sec) + Priority 100 (default 100) # 优先级大的成为active + Group name is "hsrp-Et0/1-1" (default) +R1#show standby brief + P indicates configured to preempt. + | +Interface Grp Pri P State Active Standby Virtual IP +Et0/1 1 100 Active local 192.168.123.252 192.168.123.254 +``` + +如果优先级一样的,就比较接口IP地址,大的成为active + +``` +R1(config)#track 1 interface e0/0 line-protocol # 追踪e0/0链路协议状态 +R1(config)#int e0/1 +R1(config-if)#standby 1 preempt # 开启抢占,哪个设备优先级高,就会立即变成active +R1(config-if)#standby 1 priority 110 # 修改优先级 +R1(config-if)#standby 1 track 1 decrement 20 # 如果track1变成down,那么优先级降低20 +``` + +## 2. VRRP + +和HSRP功能一样,只是计时器和名词有些变化 + +还是上面的拓扑 + +``` +int e0/1 +vrrp 1 ip 192.168.123.254 +``` + +查看vrrp的运行状态 + +``` +R1#show vrrp +Ethernet0/1 - Group 1 + State is Backup + Virtual IP address is 192.168.123.254 + Virtual MAC address is 0000.5e00.0101 + Advertisement interval is 1.000 sec # hello间隔变为了1s + Preemption enabled # 抢占默认开启 + Priority is 100 + Master Router is 192.168.123.252, priority is 100 + Master Advertisement interval is 1.000 sec + Master Down interval is 3.609 sec (expires in 3.016 sec) # 死亡时间变为了3s +``` + +``` +R1(config-if)#vrrp 1 priority 110 +R1(config-if)#vrrp 1 preempt +R1(config-if)#vrrp 1 track 1 decrement 20 +``` + +## 3. GLBP + +协议概述 + +- 使得同一时间可使用多个网关,并且自动检测活跃网关。 +- 每组GLBP最多可以有4台作为ip默认网关的成员路由器,这些网关被称为AVF(active virtual forwarder) +- GLBP自动管理虚拟MAC地址的分配,决定谁来负责处理转发的工作,这些功能由AVG(active virtual gateway实现) +- 因此AVG负责分发虚拟MAC,AVF负责转发数据 \ No newline at end of file diff --git a/00.基础阶段/01.网络基础/11.首跳冗余协议/image-20200425151233836.png b/00.基础阶段/01.网络基础/11.首跳冗余协议/image-20200425151233836.png new file mode 100644 index 0000000..ff94335 Binary files /dev/null and b/00.基础阶段/01.网络基础/11.首跳冗余协议/image-20200425151233836.png differ diff --git a/00.基础阶段/01.网络基础/11.首跳冗余协议/image-20200425151427734.png b/00.基础阶段/01.网络基础/11.首跳冗余协议/image-20200425151427734.png new file mode 100644 index 0000000..c1f7e1e Binary files /dev/null and b/00.基础阶段/01.网络基础/11.首跳冗余协议/image-20200425151427734.png differ diff --git a/00.基础阶段/01.网络基础/11.首跳冗余协议/image-20200425151501103.png b/00.基础阶段/01.网络基础/11.首跳冗余协议/image-20200425151501103.png new file mode 100644 index 0000000..7c2c6b7 Binary files /dev/null and b/00.基础阶段/01.网络基础/11.首跳冗余协议/image-20200425151501103.png differ diff --git a/00.基础阶段/01.网络基础/11.首跳冗余协议/image-20200425151603957.png b/00.基础阶段/01.网络基础/11.首跳冗余协议/image-20200425151603957.png new file mode 100644 index 0000000..ad56dc3 Binary files /dev/null and b/00.基础阶段/01.网络基础/11.首跳冗余协议/image-20200425151603957.png differ diff --git a/00.基础阶段/01.网络基础/11.首跳冗余协议/image-20200425152021426.png b/00.基础阶段/01.网络基础/11.首跳冗余协议/image-20200425152021426.png new file mode 100644 index 0000000..7a8ba86 Binary files /dev/null and b/00.基础阶段/01.网络基础/11.首跳冗余协议/image-20200425152021426.png differ diff --git a/00.基础阶段/02.Linux基础/01.Linux基础.md b/00.基础阶段/02.Linux基础/01.Linux基础.md new file mode 100644 index 0000000..ef1dd4d --- /dev/null +++ b/00.基础阶段/02.Linux基础/01.Linux基础.md @@ -0,0 +1,85 @@ +# 01.Linux基础 + +## 01.Linux基础 + +### 1. 操作系统简介 + +世上本没有路,走的人多了,便变成了路。——鲁迅 + +这句话真的是鲁迅说的,出自鲁迅的《故乡》,我们可以理解为一个东西用的人多了,自然而然就会把这个东西的使用方式打磨完善了,人类自动获得了智慧开始就掌握了工具的使用方法。众所周知做不同的事情就需要有不同的方法,走不同的路,也就有了不同的工具。 + +一台机器往往有不同的零件组成,一台电脑也是由很多不同的硬件组成,这么多的硬件设备,就需要有一个系统去代替我们管理好,这个就是操作系统。 + +操作系统需要完成的任务很简单,就是去学习每个硬件的不同使用方法,专业的术语叫“安装驱动程序”,当操作系统学会了每个硬件的使用方法之后,就会以某种人类可以操作的方式来被人类使用,有的操作系统是图形化界面的,我们可以鼠标点击来操作,有的是命令行的,我们需要输入命令来操作,不管是哪种方式,最终都是让计算机硬件来为我们而工作。 + +![img](01.Linux基础/NqdVW2EgszsK2S8C.png!thumbnail) + +### 2. Linux操作系统 + +不同的人对计算机有不同的操作习惯,不同的使用场景对操作系统有不同的挑战,所以当前就出现了多种多样的操作系统 + +* Windows + * 收费闭源操作系统,主要用于日常办公、游戏、娱乐多一些 +* Linux + * 免费的,开源的,主要用于服务器领域,性能稳定,安全 +* Unix + * 用于封闭的硬件环境,企业的应用依赖于定制化开发 + +### 3. Linux图谱 + +Linux发展到今天出现了大量不同的分支。不同的分支都有不同的发展方向,可以扫描下面二维码,查看Linux发现分支图,或者点开[此链接](01.Linux基础/Linux-time-line.png)。 + +![img](01.Linux基础/vchYOkVRT5jjaslE.png!thumbnail) + +### 4. Linux名词 + +* Linux系统内核指的是一个由Linus Torvalds负责维护,提供硬件抽象层、硬盘及文件系统控制及多任务功能的系统核心程序。 +* Linux发行套件系统是我们常说的Linux操作系统,也即是由Linux内核与各种常用软件的集合产品 + +### 5. RedHat认证 + +redhat是目前全球最大的Linux商业公司,redhat为Linux技术工程师提供了一个考试认证,通过这个考试认证的工程师,可以获得redhat公司颁发的证书。 + +在行业内,redhat的技术证书还是占有很高的含金量的,证书的认证难度依次如下。 + +![img](01.Linux基础/C6ZHIFVnIvKcMyIJ.png!thumbnail) + +#### 5.1 RHCSA + +* 管理文件、目录、文档以及命令行环境; +* 使用分区、LVM逻辑卷管理本地存储; +* 安装、更新、维护、配置系统与核心服务; +* 熟练创建、修改、删除用户与用户组,并使用LDAP进行集中目录身份认证; +* 熟练配置防火墙以及SELinux来保障系统安全。 + +#### 5.2 RHCE + +* 熟练配置防火墙规则链与SElinux安全上下文; +* 配置iSCSI(互联网小型计算机系统接口)服务; +* 编写Shell脚本来批量创建用户、自动完成系统的维护任务; +* 配置HTTP/HTTPS网络服务; +* 配置FTP服务; +* 配置NFS服务; +* 配置SMB服务; +* 配置SMTP服务; +* 配置SSH服务; +* 配置NTP服务。 +* 自动化运维工具ansible + +#### 5.3 RHCA + +欲取得红帽RHCA认证,您必须通过以下任意5门认证考试。 + +| 考试代码 | 认证名称 | +| :------- | :--------------------------------- | +| EX210 | 红帽OpenStack 认证系统管理员考试 | +| EX220 | 红帽混合云管理专业技能证书考试 | +| EX236 | 红帽混合云存储专业技能证书考试 | +| EX248 | 红帽认证 JBoss管理员考试 | +| EX280 | 红帽平台即服务专业技能证书考试 | +| EX318 | 红帽认证虚拟化管理员考试 | +| EX401 | 红帽部署和系统管理专业技能证书考试 | +| EX413 | 红帽服务器固化专业技能证书考试 | +| EX436 | 红帽集群和存储管理专业技能证书考试 | +| EX442 | 红帽性能调优专业技能证书考试 | + diff --git a/00.基础阶段/02.Linux基础/01.Linux基础/C6ZHIFVnIvKcMyIJ.png!thumbnail b/00.基础阶段/02.Linux基础/01.Linux基础/C6ZHIFVnIvKcMyIJ.png!thumbnail new file mode 100644 index 0000000..eb274af Binary files /dev/null and b/00.基础阶段/02.Linux基础/01.Linux基础/C6ZHIFVnIvKcMyIJ.png!thumbnail differ diff --git a/00.基础阶段/02.Linux基础/01.Linux基础/NqdVW2EgszsK2S8C.png!thumbnail b/00.基础阶段/02.Linux基础/01.Linux基础/NqdVW2EgszsK2S8C.png!thumbnail new file mode 100644 index 0000000..70cc516 Binary files /dev/null and b/00.基础阶段/02.Linux基础/01.Linux基础/NqdVW2EgszsK2S8C.png!thumbnail differ diff --git a/00.基础阶段/02.Linux基础/01.Linux基础/vchYOkVRT5jjaslE.png!thumbnail b/00.基础阶段/02.Linux基础/01.Linux基础/vchYOkVRT5jjaslE.png!thumbnail new file mode 100644 index 0000000..7684eb6 Binary files /dev/null and b/00.基础阶段/02.Linux基础/01.Linux基础/vchYOkVRT5jjaslE.png!thumbnail differ diff --git a/00.基础阶段/02.Linux基础/02.Linux系统安装.md b/00.基础阶段/02.Linux基础/02.Linux系统安装.md new file mode 100644 index 0000000..4184475 --- /dev/null +++ b/00.基础阶段/02.Linux基础/02.Linux系统安装.md @@ -0,0 +1,203 @@ +# 02.Linux系统安装 + +## 02.Linux系统安装 + +RockyLinux系统在企业中一般是安装在服务器上的,但是我们学习的时候买台服务器并不方便,所以我们可以将其安装在虚拟机中(实际上很多企业也这么做) + +### 1. vmware workstation软件安装 + +双击安装包 + +![img](02.Linux系统安装/4g9Z99lb8F8T6nGf.png!thumbnail) + +![img](02.Linux系统安装/09tN5Cj17wphDZBX.png!thumbnail) + +![img](02.Linux系统安装/ToY0x4TwwuZURyeu.png!thumbnail) + +![img](02.Linux系统安装/QnBPcqVkc2xyY1OI.png!thumbnail) + +![img](02.Linux系统安装/2TmDTLtwWhihadpy.png!thumbnail) + +![img](02.Linux系统安装/krpLen55WN4aI9aq.png!thumbnail) + +#### 1.1 输入许可证 + +![img](02.Linux系统安装/tFsXBLvGstOrsg22.png!thumbnail) + +![img](02.Linux系统安装/vmXrqmcOtp3dpuE9.png!thumbnail) + +![img](02.Linux系统安装/EFvj3LuLJHa5DYJp.png!thumbnail) + +### 2. 创建RockyLinux虚拟机 + +#### 2.1 创建新的虚拟机 + +![image-20241107094733611](02.Linux系统安装/image-20241107094733611.png) + +![image-20241107094801076](02.Linux系统安装/image-20241107094801076.png) + +![image-20241107094846827](02.Linux系统安装/image-20241107094846827.png) + +![image-20241107094927380](02.Linux系统安装/image-20241107094927380.png) + +![image-20241107095020725](02.Linux系统安装/image-20241107095020725.png) + +![image-20241107095058110](02.Linux系统安装/image-20241107095058110.png) + +![image-20241107095108257](02.Linux系统安装/image-20241107095108257.png) + +**以下选项全部保持默认或者按照图片中选择** + +![image-20241107095123951](02.Linux系统安装/image-20241107095123951.png) + +![image-20241107095138985](02.Linux系统安装/image-20241107095138985.png) + +![image-20241107095225970](02.Linux系统安装/image-20241107095225970.png) + +**创建新的虚拟磁盘** + +![image-20241107095244947](02.Linux系统安装/image-20241107095244947.png) + +![image-20241107095345078](02.Linux系统安装/image-20241107095345078.png) + +完成创建 + +![image-20241107095404723](02.Linux系统安装/image-20241107095404723.png) + +#### 2.2 编辑虚拟机设置 + +![image-20241107095457139](02.Linux系统安装/image-20241107095457139.png) + +![image-20241107095634916](02.Linux系统安装/image-20241107095634916.png) + + + +### 3. 安装RockyLinux系统 + +1. 点击开启此虚拟机 + +![image-20241107095740122](02.Linux系统安装/image-20241107095740122.png) + +2. 鼠标点击进入这个黑框中,通过方向键选择**安装选项**,我们选择第一个:**Install Rocky Linux 9.4** + +![image-20241107095851533](02.Linux系统安装/image-20241107095851533.png) + +3. 依次按照图片所示,完成以下设置 + +![image-20241107100151344](02.Linux系统安装/image-20241107100151344.png) + +![image-20241107100354662](02.Linux系统安装/image-20241107100354662.png) + +4. 依次设置带有黄色感叹号的选项 + +选择安装位置: + +![image-20241107100532001](02.Linux系统安装/image-20241107100532001.png) + +选择安装的软件环境,标准安装: + +![image-20241107100628467](02.Linux系统安装/image-20241107100628467.png) + +选择网络和主机名,用于开启网络连接: + +![image-20241107100715660](02.Linux系统安装/image-20241107100715660.png) + +设置root密码,为了方便操作,我们统一设置为`2`,然后点击两次完成: + +![image-20241107100832855](02.Linux系统安装/image-20241107100832855.png) + +5. 点击开始安装,并且等待安装完成 + +![image-20241107100917153](02.Linux系统安装/image-20241107100917153.png) + +6. 安装完成以后,点击重启系统 + +![image-20241107102045501](02.Linux系统安装/image-20241107102045501.png) + +### 4. RockyLinux系统使用 + +重启之后就进入RockyLinux系统的界面,没有图形化,只有黑框框。然后我们先输入用户名`root`回车以后,在输入我们设置的密码`2`。但是输入密码的时候,是没有任何显示的,这是命令行为了保护密码的安全故意为之,我们我们输入了密码以后这直接回车即可进入系统。 + +![image-20241107102546288](02.Linux系统安装/image-20241107102546288.png) + +如果输入密码回车之后,显示`[root@localhost ~]# `那么说明我们成功进入系统 + +最好检查一下,网络有没有问题,我们可以使用命令`ping qq.com -c 4`来测试与腾讯服务器的连通性,依次来判断网络是否正常连接。 + +![image-20241107102827911](02.Linux系统安装/image-20241107102827911.png) + +如果输出的结果如图所示,说明我们系统的网络连接正常。那么接下来我们就是给这个系统拍个快照。 + +### 5. 虚拟机快照 + +快照可以理解为保存的一个当前状态的还原点,可以完整保存当前的环境及状态。当我们以后再实验中,不小心把环境弄坏了以后,我们可以通过拍摄的快照,时光回溯到现在这个状态,避免我们重新安装系统的麻烦。 + +#### 5.1 快照的创建 + +在创建快照的时候,一定要关机了以后再拍摄快照,不要在开机的状态下创建快照。 + +关机命令: + +```shell +poweroff +``` + +创建快照: + +在上方点击虚拟机,找到快照,拍摄快照,然后起个名字,最后点击拍摄快照。我们的快照就创建好了 + +![image-20241107105228110](02.Linux系统安装/image-20241107105228110.png) + +![image-20241107105035212](02.Linux系统安装/image-20241107105035212.png) + +#### 5.2 快照的使用 + +如果我们想要回复到某一个快照的时候,我们还是在上方虚拟机,快照,然后选择恢复到快照即可。 + +![image-20241107105209742](02.Linux系统安装/image-20241107105209742.png) + +### 6. 远程管理Linux服务器 + +大多数情况下Linux服务器都是安装在数据中心机房的机柜里面的,大家可以把数据中心理解为大仓库,那么机柜就是一个个货架,而管理人员都是坐在办公室当中,通过电脑远程连接服务器进行管理,所以我们在后续学习的时候,为了方便,全部使用远程连接。 + +Linux远程连接命令行工具有很多: + +- xshell + - 收费工具,有免费版,基本能满足需求,目前比较主流 +- putty + - 开源工具,功能比较简单 +- MobaXterm + - 免费工具,功能比较齐全,本次课程中推荐使用 + +首先查看虚拟机的IP地址,也就是Linux服务器的IP地址,登录进虚拟机之后输入`ip address`可以查看 + +![image-20241107110434324](02.Linux系统安装/image-20241107110434324.png) + +这边可以看到本次安装的RockyLinux操作系统获取到的IP地址是 `192.168.88.103` 每个人装的虚拟机获取的IP地址可能是不一样的,需要仔细看清楚。 + +在连接之前,我们需要在RockyLinux上设置一下,让它允许通过root用户远程连接进来,大家先照着做,后面我们都会详细学到 + +```shell +[root@localhost ~]# echo "PermitRootLogin yes" >> /etc/ssh/sshd_config +[root@localhost ~]# systemctl restart sshd +``` + +#### 6.1 MobaXterm + +解压之前下载的MobaXterm压缩包,双击程序运行 + +![img](02.Linux系统安装/lHYC6evohETd7Dpv.png!thumbnail) + +选择会话——ssh,然后填入IP地址 + +![image-20241107110734508](02.Linux系统安装/image-20241107110734508.png) + +输入密码以后,回车。如果让你保存密码,建议选择不保存 + +如下图所示,则为登录成功 + +![image-20241107111502691](02.Linux系统安装/image-20241107111502691.png) + +MobaXterm工具只是用来远程连接和管理我们的RockyLinux虚拟机,所以在使用的时候,我们必须先启动RockyLinux虚拟机。然后再次使用MobaXterm工具连接上来。并且我们在MobaXterm上面执行的命令,也都会被传递到我们的RockyLinux上面执行。 + +![image-20250620140548249](02.Linux系统安装/image-20250620140548249.png) \ No newline at end of file diff --git a/00.基础阶段/02.Linux基础/02.Linux系统安装/09tN5Cj17wphDZBX.png!thumbnail b/00.基础阶段/02.Linux基础/02.Linux系统安装/09tN5Cj17wphDZBX.png!thumbnail new file mode 100644 index 0000000..6d29bca Binary files /dev/null and b/00.基础阶段/02.Linux基础/02.Linux系统安装/09tN5Cj17wphDZBX.png!thumbnail differ diff --git a/00.基础阶段/02.Linux基础/02.Linux系统安装/2TmDTLtwWhihadpy.png!thumbnail b/00.基础阶段/02.Linux基础/02.Linux系统安装/2TmDTLtwWhihadpy.png!thumbnail new file mode 100644 index 0000000..f7ae44a Binary files /dev/null and b/00.基础阶段/02.Linux基础/02.Linux系统安装/2TmDTLtwWhihadpy.png!thumbnail differ diff --git a/00.基础阶段/02.Linux基础/02.Linux系统安装/4g9Z99lb8F8T6nGf.png!thumbnail b/00.基础阶段/02.Linux基础/02.Linux系统安装/4g9Z99lb8F8T6nGf.png!thumbnail new file mode 100644 index 0000000..e4689d1 Binary files /dev/null and b/00.基础阶段/02.Linux基础/02.Linux系统安装/4g9Z99lb8F8T6nGf.png!thumbnail differ diff --git a/00.基础阶段/02.Linux基础/02.Linux系统安装/EFvj3LuLJHa5DYJp.png!thumbnail b/00.基础阶段/02.Linux基础/02.Linux系统安装/EFvj3LuLJHa5DYJp.png!thumbnail new file mode 100644 index 0000000..28f6f7a Binary files /dev/null and b/00.基础阶段/02.Linux基础/02.Linux系统安装/EFvj3LuLJHa5DYJp.png!thumbnail differ diff --git a/00.基础阶段/02.Linux基础/02.Linux系统安装/QnBPcqVkc2xyY1OI.png!thumbnail b/00.基础阶段/02.Linux基础/02.Linux系统安装/QnBPcqVkc2xyY1OI.png!thumbnail new file mode 100644 index 0000000..34f9348 Binary files /dev/null and b/00.基础阶段/02.Linux基础/02.Linux系统安装/QnBPcqVkc2xyY1OI.png!thumbnail differ diff --git a/00.基础阶段/02.Linux基础/02.Linux系统安装/ToY0x4TwwuZURyeu.png!thumbnail b/00.基础阶段/02.Linux基础/02.Linux系统安装/ToY0x4TwwuZURyeu.png!thumbnail new file mode 100644 index 0000000..05650fe Binary files /dev/null and b/00.基础阶段/02.Linux基础/02.Linux系统安装/ToY0x4TwwuZURyeu.png!thumbnail differ diff --git a/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107094733611.png b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107094733611.png new file mode 100644 index 0000000..0056187 Binary files /dev/null and b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107094733611.png differ diff --git a/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107094801076.png b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107094801076.png new file mode 100644 index 0000000..2f5d294 Binary files /dev/null and b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107094801076.png differ diff --git a/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107094846827.png b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107094846827.png new file mode 100644 index 0000000..5ae5b92 Binary files /dev/null and b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107094846827.png differ diff --git a/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107094927380.png b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107094927380.png new file mode 100644 index 0000000..aaee7d7 Binary files /dev/null and b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107094927380.png differ diff --git a/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107095020725.png b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107095020725.png new file mode 100644 index 0000000..e8694b3 Binary files /dev/null and b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107095020725.png differ diff --git a/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107095058110.png b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107095058110.png new file mode 100644 index 0000000..8319e12 Binary files /dev/null and b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107095058110.png differ diff --git a/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107095108257.png b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107095108257.png new file mode 100644 index 0000000..d0ec2bb Binary files /dev/null and b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107095108257.png differ diff --git a/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107095123951.png b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107095123951.png new file mode 100644 index 0000000..c760ddb Binary files /dev/null and b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107095123951.png differ diff --git a/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107095138985.png b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107095138985.png new file mode 100644 index 0000000..2dc67c3 Binary files /dev/null and b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107095138985.png differ diff --git a/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107095225970.png b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107095225970.png new file mode 100644 index 0000000..d4c7c96 Binary files /dev/null and b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107095225970.png differ diff --git a/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107095244947.png b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107095244947.png new file mode 100644 index 0000000..b4f0308 Binary files /dev/null and b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107095244947.png differ diff --git a/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107095345078.png b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107095345078.png new file mode 100644 index 0000000..283b81f Binary files /dev/null and b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107095345078.png differ diff --git a/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107095404723.png b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107095404723.png new file mode 100644 index 0000000..7c7f464 Binary files /dev/null and b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107095404723.png differ diff --git a/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107095457139.png b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107095457139.png new file mode 100644 index 0000000..a9399de Binary files /dev/null and b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107095457139.png differ diff --git a/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107095634916.png b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107095634916.png new file mode 100644 index 0000000..018d21c Binary files /dev/null and b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107095634916.png differ diff --git a/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107095740122.png b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107095740122.png new file mode 100644 index 0000000..2cd4704 Binary files /dev/null and b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107095740122.png differ diff --git a/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107095851533.png b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107095851533.png new file mode 100644 index 0000000..f264853 Binary files /dev/null and b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107095851533.png differ diff --git a/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107100151344.png b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107100151344.png new file mode 100644 index 0000000..28b8392 Binary files /dev/null and b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107100151344.png differ diff --git a/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107100354662.png b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107100354662.png new file mode 100644 index 0000000..b0c25b6 Binary files /dev/null and b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107100354662.png differ diff --git a/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107100532001.png b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107100532001.png new file mode 100644 index 0000000..a5c5d53 Binary files /dev/null and b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107100532001.png differ diff --git a/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107100628467.png b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107100628467.png new file mode 100644 index 0000000..534abfe Binary files /dev/null and b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107100628467.png differ diff --git a/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107100715660.png b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107100715660.png new file mode 100644 index 0000000..ed5092e Binary files /dev/null and b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107100715660.png differ diff --git a/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107100832855.png b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107100832855.png new file mode 100644 index 0000000..4d58563 Binary files /dev/null and b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107100832855.png differ diff --git a/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107100917153.png b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107100917153.png new file mode 100644 index 0000000..a25306e Binary files /dev/null and b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107100917153.png differ diff --git a/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107102045501.png b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107102045501.png new file mode 100644 index 0000000..5b7ec86 Binary files /dev/null and b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107102045501.png differ diff --git a/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107102546288.png b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107102546288.png new file mode 100644 index 0000000..cc17d0f Binary files /dev/null and b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107102546288.png differ diff --git a/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107102827911.png b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107102827911.png new file mode 100644 index 0000000..8a3df8b Binary files /dev/null and b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107102827911.png differ diff --git a/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107105035212.png b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107105035212.png new file mode 100644 index 0000000..e497c1d Binary files /dev/null and b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107105035212.png differ diff --git a/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107105209742.png b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107105209742.png new file mode 100644 index 0000000..22e62a4 Binary files /dev/null and b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107105209742.png differ diff --git a/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107105228110.png b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107105228110.png new file mode 100644 index 0000000..96c7892 Binary files /dev/null and b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107105228110.png differ diff --git a/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107110434324.png b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107110434324.png new file mode 100644 index 0000000..7e54dc8 Binary files /dev/null and b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107110434324.png differ diff --git a/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107110734508.png b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107110734508.png new file mode 100644 index 0000000..2b3bc82 Binary files /dev/null and b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107110734508.png differ diff --git a/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107111502691.png b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107111502691.png new file mode 100644 index 0000000..dbd4571 Binary files /dev/null and b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20241107111502691.png differ diff --git a/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20250620140548249.png b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20250620140548249.png new file mode 100644 index 0000000..6695c3e Binary files /dev/null and b/00.基础阶段/02.Linux基础/02.Linux系统安装/image-20250620140548249.png differ diff --git a/00.基础阶段/02.Linux基础/02.Linux系统安装/krpLen55WN4aI9aq.png!thumbnail b/00.基础阶段/02.Linux基础/02.Linux系统安装/krpLen55WN4aI9aq.png!thumbnail new file mode 100644 index 0000000..82836fa Binary files /dev/null and b/00.基础阶段/02.Linux基础/02.Linux系统安装/krpLen55WN4aI9aq.png!thumbnail differ diff --git a/00.基础阶段/02.Linux基础/02.Linux系统安装/lHYC6evohETd7Dpv.png!thumbnail b/00.基础阶段/02.Linux基础/02.Linux系统安装/lHYC6evohETd7Dpv.png!thumbnail new file mode 100644 index 0000000..75e4a4f Binary files /dev/null and b/00.基础阶段/02.Linux基础/02.Linux系统安装/lHYC6evohETd7Dpv.png!thumbnail differ diff --git a/00.基础阶段/02.Linux基础/02.Linux系统安装/tFsXBLvGstOrsg22.png!thumbnail b/00.基础阶段/02.Linux基础/02.Linux系统安装/tFsXBLvGstOrsg22.png!thumbnail new file mode 100644 index 0000000..28763ad Binary files /dev/null and b/00.基础阶段/02.Linux基础/02.Linux系统安装/tFsXBLvGstOrsg22.png!thumbnail differ diff --git a/00.基础阶段/02.Linux基础/02.Linux系统安装/vmXrqmcOtp3dpuE9.png!thumbnail b/00.基础阶段/02.Linux基础/02.Linux系统安装/vmXrqmcOtp3dpuE9.png!thumbnail new file mode 100644 index 0000000..d439685 Binary files /dev/null and b/00.基础阶段/02.Linux基础/02.Linux系统安装/vmXrqmcOtp3dpuE9.png!thumbnail differ diff --git a/00.基础阶段/02.Linux基础/03.Linux命令.md b/00.基础阶段/02.Linux基础/03.Linux命令.md new file mode 100644 index 0000000..f8f637d --- /dev/null +++ b/00.基础阶段/02.Linux基础/03.Linux命令.md @@ -0,0 +1,553 @@ +# 03.Linux命令 + +## 03.Linux命令 + +### 1. 初识shell + +虽然我们已经安装好了系统,但是光会安装不会操作是不够的。我们还要像玩手机一样熟悉并记忆操作方法。 + +shell是系统的**用户界面**,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行。实际上shell是一个**命令解释器**,它解释用户输入的命令并且把用户的意图传达给内核。(可以理解为用户与内核之间的翻译官角色) + +![img](03.Linux命令/OZOSHbNQHEoUDF1z.png!thumbnail) + +我们可以使用shell实现对Linux系统的大部分管理,例如: + +1. 文件管理 +2. 用户管理 +3. 权限管理 +4. 磁盘管理 +5. 软件管理 +6. 网络管理 + +使用shell的两种方式 + +* 交互式命令行 + * 默认等待用户输入命令,输入一行回车后执行一行命令 + * 效率低 适合少量的工作 +* shell脚本 + * 将需要执行的命令和逻辑判断语句都写入一个文件中,一起运行 + * 效率高 适合完成复杂,重复性工作 + +### 2. bash shell提示符 + +登录Linux系统之后,默认进入交互式的命令行界面,在光标前边会出现提示符 + +```shell +[root@localhost ~]#  +[用户名@主机名 目录名]权限标识 +``` + +* 用户名 + * 当前登录的用户 +* 主机名 + * 当前这台主机的名字,默认叫`localhost` +* 目录名 + * 当前光标所在的目录 + * 当前用户家目录表示成`~` +* 权限标识 + * 超级管理员权限就表示为`#` + * 普通用户标识为`$` + +这个提示符格式被`$PS1`控制,我们可以查看这个变量 + +```shell +[root@localhost ~]# echo $PS1 +[\u@\h \W]\$ +# \u表示是用户名 \h表示的是主机名 \W表示的当前所在目录 \$是权限标识 +[root@localhost ~]# export PS1="{\u@\h}\W \$" +{root@localhost}~ $ +# 可以通过export命令修改PS1变量,让提示符可以根据你的习惯变化 + +# 修改回原来的样子 +{root@localhost}~ $ $export PS1="[\u@\h \W]\$" +``` + +### 3. shell语法 + +命令 选项 参数 + +```shell +[root@localhost ~]# cal --year -m 2024 +``` + +* 命令 + * `cal`是命令,用于查看日历 +* 选项 + * `--year`是选项,表示显示一整年,这个是一个长选项,也就是单词都拼全了,需要两条`-`符号 + * `-m`是短选项,是首字母,表示每个星期的星期一作为第一天 + * 对于有些命令而言,可以不写选项,这样命令会有个默认的行为 + * 短选项可以多个合并在一起,比如上面的命令可以写成`-ym`其中y是year简写,可以和m写在一起,而长选项不支持写在一起 +* 参数 + * `2020`是参数,参数是命令作用的对象,表示查看的是2020年的日历 + +我们也可以查看这个命令的所有选项 + +```shell +[root@localhost ~]# cal --help +用法: + cal [选项] [[[日] 月] 年] +选项: + -1, --one        只显示当前月份(默认) + -3, --three      显示上个月、当月和下个月 + -s, --sunday     周日作为一周第一天 + -m, --monday     周一用为一周第一天 + -j, --julian     输出儒略日 + -y, --year       输出整年 + -V, --version    显示版本信息并退出 + -h, --help       显示此帮助并退出 +``` + +### 4. 常用命令 + +Linux的常见命令比较多,这边只列出初学者最常用的部分命令,大家可以根据命令意思去进行练习。 + +注意Linux会准确的识别出命令的大小写,所以大家需要注意大小写的问题。命令选项和参数之间是用空格进行分隔,请大家在输入的时候注意不要缺失空格。 + +学习Linux最重要的就是以下三个方面 + + 1. 命令的积累 + 2. 原理的掌握 + 3. 大量的实战 + +下面就是开始第一步,积累基础的命令 + +#### 4.1 ls + +用于显示指定工作目录下之内容(列出目前工作目录所含之文件及子目录) + +```shell + ls [-alrtAFR] [name...] +``` + +##### 4.1.1 选项 + +* **-a**:显示所有文件及目录 (**.**开头的隐藏文件也会列出) +* **-l**:除文件名称外,亦将文件型态、权限、拥有者、文件大小等资讯详细列出r +* **-r**:将文件以相反次序显示(原定依英文字母次序) +* **-t**:将文件依建立时间之先后次序列出 +* **-A**:同 -a ,但不列出 "." (目前目录) 及 ".." (父目录) +* **-F**:在列出的文件名称后加一符号;例如可执行档则加 "*", 目录则加 "/",链接加"@" + +```shell +[root@localhost etc]# ls -F +adjtime gnupg/ modprobe.d/ sestatus.conf +aliases GREP_COLORS modules-load.d/ setroubleshoot/ +alternatives/ groff/ motd sgml/ +anacrontab group motd.d/ shadow +at.deny group- mtab@ shadow- +audit/ grub2.cfg@ nanorc shells +authselect/ grub.d/ netconfig skel/ +bash_completion.d/ gshadow NetworkManager/ smartmontools/ +bashrc gshadow- networks sos/ +bindresvport.blacklist gss/ nftables/ ssh/ +binfmt.d/ host.conf nsswitch.conf@ ssl/ +bluetooth/ hostname nsswitch.conf.bak sssd/ +chrony.conf hosts nvme/ statetab.d/ +chrony.keys inittab openldap/ subgid +cifs-utils/ inputrc opt/ subgid- +cockpit/ iproute2/ os-release@ subuid +cron.d/ issue PackageKit/ subuid- +cron.daily/ issue.d/ pam.d/ sudo.conf +cron.deny issue.net passwd sudoers +cron.hourly/ kdump/ passwd- sudoers.d/ +cron.monthly/ kdump.conf pinforc sudo-ldap.conf +crontab kernel/ pkcs11/ sysconfig/ +cron.weekly/ krb5.conf pkgconfig/ sysctl.conf +crypto-policies/ krb5.conf.d/ pki/ sysctl.d/ +crypttab ld.so.cache plymouth/ systemd/ +csh.cshrc ld.so.conf pm/ system-release@ +csh.login ld.so.conf.d/ polkit-1/ system-release-cpe +dbus-1/ libaudit.conf popt.d/ terminfo/ +dconf/ libibverbs.d/ printcap tmpfiles.d/ +debuginfod/ libnl/ profile tpm2-tss/ +default/ libreport/ profile.d/ trusted-key.key +depmod.d/ libssh/ protocols tuned/ +dhcp/ libuser.conf rc.d/ udev/ +DIR_COLORS locale.conf rc.local@ updatedb.conf +DIR_COLORS.lightbgcolor localtime@ redhat-release@ vconsole.conf +dnf/ login.defs resolv.conf vimrc +dracut.conf logrotate.conf rocky-release virc +dracut.conf.d/ logrotate.d/ rocky-release-upstream vmware-tools/ +environment lsm/ rpc wgetrc +ethertypes lvm/ rpm/ X11/ +exports machine-id rsyncd.conf xattr.conf +favicon.png@ magic rsyslog.conf xdg/ +filesystems mailcap rsyslog.d/ xml/ +firewalld/ makedumpfile.conf.sample rwtab.d/ yum/ +fonts/ man_db.conf samba/ yum.conf@ +fprintd.conf mcelog/ sasl2/ yum.repos.d/ +fstab microcode_ctl/ security/ +fuse.conf mime.types selinux/ +gcrypt/ mke2fs.conf services +``` + +* **-R**:若目录下有文件,则以下之文件亦皆依序列出 +* **-h**:将显示出来的文件大小以合适的单位显示出来 + +##### 4.1.2 **实例** + +* 查看当前目录下的文件 + +```shell +[root@localhost ~]# ls +``` + +* 查看根目录下的文件,查看/usr目录下的文件 + +```shell +[root@localhost ~]# ls / +[root@localhost ~]# ls /usr +``` + +* 查看当前目录下所有文件,包括隐藏文件 + +```shell +[root@localhost ~]# ls -a +``` + +* 查看当前目录下文件详情,包括隐藏文件 + +```shell +[root@localhost ~]# ls -lha +``` + +* 查看当前目录下的文件,并且显示出目录,文件,程序的区别 + +```shell +[root@localhost ~]# ls -F +anaconda-ks.cfg dirb/ dird/ file2 file4 ping* +dira/ dirc/ dire/ file1 file3 file5 +# 可以看到普通文件只有文件名,可执行文件后面带*,文件夹后面带/ +``` + +* 查看当前目录下的文件,如果有文件夹,那么将文件夹中的文件也显示出来 + +```shell +[root@localhost ~]# ls -FR +# dir这是一个目录,在这个目录下的文件也全部显示出来 + +[root@localhost ~]# ls -FRl +# 显示详细的信息 +``` + +##### 4.1.3 扩展知识 + +```shell +[root@localhost ~]# ls -ahl +总用量 24K +dr-xr-x---. 3 root root 139 4月 2 14:00 . +dr-xr-xr-x. 17 root root 224 6月 21 2020 .. +-rw-------. 1 root root 128 4月 2 09:37 .bash_history +-rw-r--r--. 1 root root 18 12月 29 2013 .bash_logout +-rw-r--r--. 1 root root 176 12月 29 2013 .bash_profile +-rw-r--r--. 1 root root 176 12月 29 2013 .bashrc +-rw-r--r--. 1 root root 100 12月 29 2013 .cshrc +drwxr-xr-x. 2 root root 32 4月 2 14:00 dir +-rw-r--r--. 1 root root 129 12月 29 2013 .tcshrc +-rw-r--r--. 1 root root 0 4月 2 14:00 test.txt +``` + +1. **第一列**共10位,第1位表示文档类型,`d`表示目录,`-`表示文件,`l`表示链接文件,`d`表示可随机存取的设备,如U盘等,`c`表示一次性读取设备,如鼠标、键盘等。后9位,依次对应三种身份所拥有的权限,身份顺序为:owner、group、others,权限顺序为:readable、writable、excutable。如:`-r-xr-x---`的含义为**当前文档是一个文件,拥有者可读、可执行,同一个群组下的用户,可读、可写,其他人没有任何权限**。 +2. **第二列**表示链接数,表示有多少个文件链接到inode号码。 +3. **第三列**表示拥有者 +4. **第四列**表示所属群组 +5. **第五列**表示文档容量大小,单位字节 +6. **第六列**表示文档最后修改时间,注意不是文档的创建时间哦 +7. **第七列**表示文档名称。以点(.)开头的是隐藏文档 + +#### 4.2 cd + +用于切换当前工作目录 + +```shell +cd [dirName] +``` + +##### 4.2.1 实例 + +* 跳转到`/usr/bin`目录下 + +```shell +[root@localhost ~]# cd /usr/bin +``` + +* 跳到自己的 home 目录 + +```shell +[root@localhost bin]# cd ~ +``` + +* 跳到目前目录的上一层 + +```shell +[root@localhost ~]# cd .. +``` + +#### 4.3 pwd + +显示工作目录 + +```shell +pwd [-LP] +``` + +* -L打印 $PWD 变量的值,如果它命名了当前的工作目录 +* -P 打印当前的物理路径,不带有任何的符号链接 + +```shell +[root@localhost ~]# pwd +/root +``` + +#### 4.4 clear + +用于清除屏幕 + +```shell +clear +``` + +#### 4.5 echo + +用于字符串的输出 + +```shell +echo [-neE] 字符串 +``` + +##### 4.5.1 选项 + +* **-n:**不输出行尾的换行符 +* **-e**:允许对下面列出的加反斜线转义的字符进行解释 + * \\    反斜线 + * \a    报警符(BEL) + * \b    退格符 + * \c    禁止尾随的换行符 + * \f    换页符 + * \n    换行符 + * \r    回车符 + * \t    水平制表符 + * \v    纵向制表符 +* -E 禁止对在STRINGs中的那些序列进行解释 + +##### 4.5.2 实例 + +* 显示出`hello world` + +```shell +[root@localhost ~]# echo "hello world" +``` + +* 用两行显示出`hello world` + +```shell +[root@localhost ~]# echo -e "hello\nworld" +``` + +* 输出`hello world`的时候让系统发出警报音 + +```shell +[root@localhost ~]# echo -e "hello\aworld" +``` + +### 5. 系统命令 + +#### 5.1 poweroff + +用于关闭计算器并切断电源 + +```shell +poweroff [-n] [-w] [-d] [-f] [-h] +``` + +##### 5.1.1 选项 + +* **-n**: 这个选项用于在关机时不执行文件系统的同步操作,即不调用 `sync()` 系统调用。通常,系统在关机时会自动同步所有挂载的文件系统,以确保所有挂起的磁盘写入操作都完成,从而避免数据丢失。使用 `-n` 参数可以跳过这个同步过程。 +* **-w**: 仅记录关机信息到 `/var/log/wtmp` 文件中,但并不实际执行关机操作。 +* **-d**: 不把记录写到 /var/log/wtmp 文件里 +* **-f**:强制关机。此参数会立即停止所有进程并关闭系统,而不是正常关机流程。 + +#### 5.2 reboot + +用来重新启动计算机 + +```shell +reboot [-n] [-w] [-d] [-f] +``` + +##### 5.2.1 选项 + +* **-n**: 这个选项用于在关机时不执行文件系统的同步操作,即不调用 `sync()` 系统调用。通常,系统在关机时会自动同步所有挂载的文件系统,以确保所有挂起的磁盘写入操作都完成,从而避免数据丢失。使用 `-n` 参数可以跳过这个同步过程。 +* **-w**: 仅记录重启信息到 `/var/log/wtmp` 文件中,但并不实际执行重启操作。 +* **-d**: 不把记录写到 /var/log/wtmp 档案里(-n 这个参数包含了 -d) +* **-f**: 强迫重开机,不呼叫 shutdown 这个指令 + +#### 5.3 whoami + +用于显示自身用户名称 + +```shell +[root@localhost ~]# whoami +root +``` + +### 6. 快捷键 + +| 快捷键 | 作用 | +| :----- | :----------------------- | +| ^C | 终止前台运行的程序 | +| ^D | 退出 等价exit | +| ^L | 清屏 | +| ^A | 光标移动到命令行的最前端 | +| ^E | 光标移动到命令行的后端 | +| ^U | 删除光标前所有字符 | +| ^K | 删除光标后所有字符 | +| ^R | 搜索历史命令,利用关键词 | + +### 7. 帮助命令 + +#### 7.1 history + +```shell +history [n]  n为数字,列出最近的n条命令 +``` + +##### 7.1.1 选项 + +* **-c**:将目前shell中的所有history命令消除 +* **-a**:将目前新增的命令写入histfiles, 默认写入`~/.bash_history` +* **-r**:将histfiles内容读入到目前shell的history记忆中 +* **-w**:将目前history记忆的内容写入到histfiles + +##### 7.1.2 实例 + +* 将history的内容写入一个新的文件中 + +```shell +[root@localhost ~]# history -w histfiles.txt +``` + +* 情况所有的history记录,注意并不清空`~/.bash_history`文件 + +```shell +[root@localhos t ~]# history -c +``` + +* 使用`!`执行历史命令。 +* `! number`执行第几条命令 +* `! command`从最近的命令查到以`command`开头的命令执行 +* `!!`执行上一条 + +```shell +[root@localhost ~]# history + 1 history + 2 cat .bash_history + 3 ping -c 3 baidu.com + 4 history +[root@localhost ~]# !3 +# 这里是执行第三条命令的意思 +``` + +#### 7.2 help + +显示命令的帮助信息 + +```shell +help [-dms] [内置命令] +``` + +##### 7.2.1 选项 + +* **-d**:输出每个主题的简短描述 +* **-m**:以伪 man 手册的格式显示使用方法 +* -s:为每一个匹配 PATTERN 模式的主题仅显示一个用法 + +##### 7.2.2 实例 + +* 查看echo的帮助信息 + +```shell +[root@localhost ~]# help echo +``` + +#### 7.3 man + +显示在线帮助手册页 + +```shell +man 需要帮助的命令或者文件 +``` + +##### 7.3.1 快捷键 + +| 按键 | 用途 | +| :-------- | :--------------------------------- | +| 空格键 | 向下翻一页 | +| PaGe down | 向下翻一页 | +| PaGe up | 向上翻一页 | +| home | 直接前往首页 | +| end | 直接前往尾页 | +| / | 从上至下搜索某个关键词,如“/linux” | +| ? | 从下至上搜索某个关键词,如“?linux” | +| n | 定位到下一个搜索到的关键词 | +| N | 定位到上一个搜索到的关键词 | +| q | 退出帮助文档 | + +##### 7.3.2 手册的结构 + +| 结构名称 | 代表意义 | +| :---------- | :----------------------- | +| NAME | 命令的名称 | +| SYNOPSIS | 参数的大致使用方法 | +| DESCRIPTION | 介绍说明 | +| EXAMPLES | 演示(附带简单说明) | +| OVERVIEW | 概述 | +| DEFAULTS | 默认的功能 | +| OPTIONS | 具体的可用选项(带介绍) | +| ENVIRONMENT | 环境变量 | +| FILES | 用到的文件 | +| SEE ALSO | 相关的资料 | +| HISTORY | 维护历史与联系方式 | + +#### 7.4 alias + +用于设置指令的别名 + +##### 7.4.1 实例 + +* 查看系统当前的别名 + +```shell +[root@localhost ~]# alias # 查看系统当前的别名 +alias cp='cp -i' +alias egrep='egrep --color=auto' +alias fgrep='fgrep --color=auto' +alias grep='grep --color=auto' +alias l.='ls -d .* --color=auto' +alias ll='ls -l --color=auto' +alias ls='ls --color=auto' +alias mv='mv -i' +alias rm='rm -i' +alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde' +[root@localhost ~]# ll +总用量 4 +-rw-------. 1 root root 1241 8月 22 2018 anaconda-ks.cfg +drwxr-xr-x. 2 root root 19 8月 21 12:15 home +[root@xwz ~]# type -a ls # 查看命令类型 +ls 是 `ls --color=auto' 的别名 +ls 是 /usr/bin/ls +``` + +* 修改别名,比如使用wl来查看IP地址相关信息 + +```shell +[root@localhost ~]# alias wl='ip address' +[root@localhost ~]# wl +``` + +* 为了让别名永久生效,可以讲修改别名的命令写入`bashrc`文件,这个文件中的命令会在每次登陆命令行的时候执行 + +```shell +[root@localhost ~]# echo "alias wl='ip address'" >> /etc/bashrc +``` + diff --git a/00.基础阶段/02.Linux基础/03.Linux命令/OZOSHbNQHEoUDF1z.png!thumbnail b/00.基础阶段/02.Linux基础/03.Linux命令/OZOSHbNQHEoUDF1z.png!thumbnail new file mode 100644 index 0000000..66b920e Binary files /dev/null and b/00.基础阶段/02.Linux基础/03.Linux命令/OZOSHbNQHEoUDF1z.png!thumbnail differ diff --git a/00.基础阶段/02.Linux基础/04.文件管理.md b/00.基础阶段/02.Linux基础/04.文件管理.md new file mode 100644 index 0000000..8b03062 --- /dev/null +++ b/00.基础阶段/02.Linux基础/04.文件管理.md @@ -0,0 +1,525 @@ +# 04.文件管理 + +## 04.文件管理 + +我们知道Linux的目录结构为树状结构,最顶级的目录为根目录 /。 + +其他目录通过挂载可以将它们添加到树中,通过解除挂载可以移除它们。 + +在开始本教程前我们需要先知道什么是绝对路径与相对路径。 + +* 绝对路径 + * 路径的写法,由根目录`/`写起,例如:`/usr/share/doc`这个目录 +* 相对路径 + * 路径的写法,不是由`/`写起,例如由`/usr/share/doc`要到`/usr/share/man`底下时,可以写成:`cd ../man`这就是相对路径的写法。 + +### 1. 文件管理命令 + +几个常见的处理目录的命令 + +* ls(英文全拼:list files): 列出目录及文件名 +* cd(英文全拼:change directory):切换目录 +* pwd(英文全拼:print work directory):显示目前的目录 +* mkdir(英文全拼:make directory):创建一个新的目录 +* rmdir(英文全拼:remove directory):删除一个空的目录 +* cp(英文全拼:copy file): 复制文件或目录 +* rm(英文全拼:remove): 删除文件或目录 +* mv(英文全拼:move file): 移动文件与目录,或修改文件与目录的名称 +* touch: 用于创建一个新的文件 + +#### 1.1 touch(创建新文件) + +用于修改文件或者目录的时间属性,包括存取时间和更改时间。若文件不存在,系统会建立一个新的文件。 + +```shell +touch 文件名 +``` + +##### 1.1.1 实例 + +* 创建新空白文件 + +```shell +[root@localhost ~]# touch newfile +``` + +#### 1.2 mkdir (创建新目录) + +创建新的目录的 + +```shell +mkdir [-mpv] 目录名称 +``` + +##### 1.2.1 选项 + +* **-m**:配置文件的权限,直接配置,不需要看默认权限 (umask) +* **-p**:帮助你直接将所需要的目录(包含上一级目录)递归创建起来! +* **-v**: 显示目录创建的过程 + +##### 1.2.2 实例 + +```shell +[root@localhost ~]# mkdir dir +# 创建一个新的文件夹叫dir +[root@localhost ~]# mkdir a/b/c +mkdir: 无法创建目录"a/b/c": 没有那个文件或目录 +# 无法直接创建多层目录 +[root@localhost ~]# mkdir -p a/b/c +# 加上-p选项之后可以自动创建父级目录 +[root@localhost ~]# mkdir -pv dir1/dir2 +mkdir: 已创建目录 "dir1" +mkdir: 已创建目录 "dir1/dir2" +# 显示详细的创建过程 +``` + +#### 1.3 cp (复制文件或目录) + +拷贝文件和目录 + +```shell +cp [选项]... 源文件... 目录 +``` + +##### 1.3.1 选项 + +* **-a:**相当于`-pdr `的意思,至于` pdr` 请参考下列说明;(常用) +* **-d:**如果源文件是符号链接,则复制链接本身,而不是链接指向的文件; +* **-f:**为强制(force)的意思,若目标文件已经存在且无法开启,则移除后再尝试一次; +* **-i:**若目标档(destination)已经存在时,在覆盖时会先询问动作的进行(常用) +* **-l:**复制符号链接指向的文件,而不是链接本身; +* **-p:**连同文件的属性一起复制过去,保持文件的原始属性(如时间戳、权限等)(备份常用); +* **-r:**递归持续复制,用於目录的复制行为;(常用) +* **-u:**仅在源文件比目标文件新或目标文件不存在时进行复制; +* **-v:**显示复制的详细过程 + +##### 1.3.2 实例 + +```shell +[root@localhost ~]# mkdir /home/dir{1,2} +[root@localhost ~]# touch install.log +[root@localhost ~]# cp -v install.log /home/dir1 +# 复制文件到目录下 +[root@localhost ~]# cp -v install.log /home/dir1/abc.txt +# 复制文件到目录下,并且重命名为abc.txt +[root@localhost ~]# cp -rv /etc /home/dir1 +# 复制目录 +[root@localhost ~]# cp -rv /etc/passwd /etc/hostname /home/dir2 +# 将多个文件复制到同一个目录 +[root@localhost ~]# cp -rv /etc/passwd /etc/hostname . +# 将多个文件复制到当前目录 +[root@localhost ~]# type -a cp +cp 是 `cp -i' 的别名 +cp 是 /usr/bin/cp +[root@localhost ~]# cp -rv install.log{,-old} +# 备份配置文件 +``` + +#### 1.4 mv(移动文件与目录,或修改名称) + +移动文件与目录,或修改名称 + +```shell +mv [选项]... 源文件... 目录 +``` + +##### 1.4.1 选项 + +* **-f**:force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖; +* **-i**:若目标文件 (destination) 已经存在时,就会询问是否覆盖! +* **-u**:若目标文件已经存在,且 source 比较新,才会升级 (update) +* **-v:**显示复制的详细过程 + +##### 1.4.2 实例 + +```shell +[root@localhost ~]# touch file1 +[root@localhost ~]# mv file1 /home/dir2 +# 将file1移动到/home/dir2 +[root@localhost ~]# touch file2 +[root@localhost ~]# mv file2 /home/dir2/file20 +# 将file2移动到/home/dir2,并且改名file20 +[root@localhost ~]# mv file file.txt +# 将file改名为file.txt +``` + +#### 1.5 rm (移除文件或目录) + +移除文件或目录 + +```shell +rm [选项]... 文件... +``` + +##### 1.5.1 选项 + +* **-f**:就是 force 的意思,忽略不存在的文件,不会出现警告信息; +* **-i**:互动模式,在删除前会询问使用者是否动作 +* **-r**:递归删除啊!最常用在目录的删除了!这是非常危险的选项!!! + +##### 1.5.2 实例 + +```shell +[root@localhost ~]# cd /home +[root@localhost home]# rm -rf dir1 +``` + +##### 1.5.3 禁忌命令 + +如下命令会从根目录开始删除Linux系统中所有的文件,包括系统文件。严令禁止在任何服务器上输入如下命令 + +```sh +[root@localhost ~]# rm -rf /* +``` + +### 2. 文本文件查看 + +在Linux中一切皆文件,说的就是Linux利用文本文件来保存系统所有的设置。 + +我们在Linux中想实现一个功能,不可避免的需要查看文本文件,修改文本文件。 + +#### 2.1 cat + +用于打开文本文件并显示出来 + +```shell +cat [选项]... [文件]... +``` + +##### 2.1.1 选项 + +* **-n**:由 1 开始对所有输出的行数编号 +* **-b**:和 -n 相似,只不过对于空白行不编号。 +* **-s**:当遇到有连续两行以上的空白行,就代换为一行的空白行。 +* **-A**:显示控制字符。 + +##### 2.1.2 实例 + +* 查看anaconda-ks.cfg文件 + +```shell +[root@localhost ~]# cat anaconda-ks.cfg +``` + +* 查看anaconda-ks.cfg文件,并且显示行号 + +```shell +[root@localhost ~]# cat -n anaconda-ks.cfg +``` + +#### 2.2 less + +可以随意浏览文件,支持翻页和搜索,支持向上翻页和向下翻页 + +##### 2.2.1 实例 + +```shell +[root@localhost ~]# less anaconda-ks.cfg +``` + +#### 2.3 head + +查看文件的开头部分的内容 + +```shell +head [选项]... [文件]... +``` + +##### 2.3.1 参数 + +* **-q**:隐藏文件名,默认是隐藏 +* **-v**:显示文件名 +* **-c<数目>**:显示的字节数。 +* **-n<行数>**:显示的行数。 + +##### 2.3.2 实例 + +* 查看文件的前6行 + +```shell +[root@localhost ~]# head -n 6 anaconda-ks.cfg +``` + +#### 2.4 tail + +会把文本文件里的最尾部的内容显示在屏幕上 + +```shell +tail [选项]... [文件]... +``` + +##### 2.4.1 参数 + +* **-f**:循环读取 +* **-q**:隐藏文件名,默认隐藏 +* **-v**:显示文件名 +* **-c<数目>**:显示的字节数 +* **-n<行数>**:显示文件的尾部 n 行内容 +* **-s**:与-f合用,表示在每次反复的间隔休眠S秒 + +##### 2.4.2 实例 + +* 查看文件anaconda-ks.cfg尾部的3行 + +```shell +[root@localhost ~]# tail -n 3 anaconda-ks.cfg +``` + +* 查看日志的实时更新情况 + +```shell +[root@localhost ~]# tail -f /var/log/messages  +# ctrl+c退出 +``` + +* 查看文件anaconda-ks.cfg从第10行到结尾 + +```shell +[root@localhost ~]# tail -n +10 anaconda-ks.cfg +``` + +#### 2.5 grep + +针对文件内容进行过滤,本工具属于文本三剑客,后续会详细讲解,目前只要求初学者掌握最基本的实例即可 + +##### 2.5.1 实例 + +```shell +[root@xwz ~]# grep 'root' /etc/passwd +# 在/etc/passwd的文件中找出有root的行 +[root@xwz ~]# grep '^root' /etc/passwd +# 在/etc/passwd中找出root开头的行 +[root@xwz ~]# grep 'bash$' /etc/passwd +# 在/etc/passwd中找出bash结尾的行 +``` + +### 3. 文本文件编辑 + +在Linux中只掌握文本查看是远远不够的,我们还需要掌握编辑文本文件。 + +Linux上也有图形化的文本编辑器,类似于windows的记事本,但是很多时候我们只能用命令行来管理Linux操作系统,所以必须要掌握命令行的文本编辑器软件。 + +目前常见的命令行文本编辑器 + +* **nano**:在debain系列的系统上会比较常见,但是其他的Linux发行版也都可以安装 +* **vi**:所有的 Unix Like 系统都会内建 vi 文本编辑器,其他的文本编辑器则不一定会存在。 +* **vim**:具有程序编辑的能力,可以主动的以字体颜色辨别语法的正确性,方便程序设计。 + +目前vim是使用的最多的,也是比较推荐的,下面就来讲一下vim + +#### 3.1 什么是 vim? + +Vim是从 vi 发展出来的一个文本编辑器。代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。 + +简单的来说, vi 是老式的字处理器,不过功能已经很齐全了,但是还是有可以进步的地方。 vim 则可以说是程序开发者的一项很好用的工具。 + +连 vim 的官方网站 (http://www.vim.org) 自己也说 vim 是一个程序开发工具而不是文字处理软件。 + +vim是一个纯命令行文本编辑器,很多文本编辑的功能都是通过键盘快捷键的方式完成,所以我们需要记住常用的键位,在vim官方网站上我们可以找到vim键盘图的完整版,不过对于初学者来说,我们只需要知道常用的就可以了。 + +![img](04.文件管理/VSC5sIsVH0dd5r4b.png!thumbnail) + +#### 3.2 vi/vim 的使用 + +基本上 vi/vim 共分为三种模式,分别是命令模式(Command mode),输入模式(Insert mode)和末行模式(Last line mode)。 这三种模式的作用分别是: + +##### 3.2.1 命令模式 + +用户刚刚启动 vi/vim,便进入了命令模式。 + +此状态下敲击键盘动作会被Vim识别为命令,而非输入字符。比如我们此时按下`i`,并不会输入一个字符,`i`被当作了一个命令。 + +以下是常用的几个命令: + +* **i**切换到输入模式,以输入字符。 +* **x**删除当前光标所在处的字符。 +* **:**切换到末行模式,以在最底一行输入命令。 + +若想要编辑文本:启动Vim,进入了命令模式,按下i,切换到输入模式。 + +命令模式只有一些最基本的命令,因此仍要依靠末行模式输入更多命令。 + +##### 3.2.2 输入模式 + +在命令模式下按下`i`就进入了输入模式。 + +在输入模式中,可以使用以下按键: + +* **字符按键以及Shift组合**,输入字符 +* **ENTER**,回车键,换行 +* **BACK SPACE**,退格键,删除光标前一个字符 +* **DEL**,删除键,删除光标后一个字符 +* **方向键**,在文本中移动光标 +* **HOME**/**END**,移动光标到行首/行尾 +* **Page Up**/**Page Down**,上/下翻页 +* **Insert**,切换光标为输入/替换模式,光标将变成竖线/下划线 +* **ESC**,退出输入模式,切换到命令模式 + +##### 3.2.3 末行模式 + +在命令模式下按下`:`(英文冒号)就进入了末行模式。 + +末行模式可以输入单个或多个字符的命令,可用的命令非常多。 + +在末行模式中,基本的命令有: + +* **:q**退出程序 +* **:w**保存文件 + +按ESC键可随时退出末行模式。 + +简单的说,我们可以将这三个模式的关系用下图来表示: + +![img](04.文件管理/MWU4OFLvWWa1A2ss.png!thumbnail) + +#### 3.3 vi/vim使用实例 + +有些linux发行套件上并没有安装vim,我们可以安装一下,下面提供了Rockylinux的安装命令 + +```shell +[root@localhost ~]# yum -y install vim +# yum是在线安装软件的命令,后面会有详细的介绍,这边直接使用 +``` + +vi和vim大部分的操作完全一模一样,所以会使用vim自然也会使用vi + +###### 3.3.1 编辑一个文档 + +直接输入`vim 文件名`就能够进入 vim 的命令模式了。请注意,记得 vim 后面一定要加文件名,不管该文件存在与否! + +```shell +[root@localhost ~]# vim file.txt +``` + +输入这条命令之后,会看到如下画面 + +![img](04.文件管理/42U7itSOgHyWtuqL.png!thumbnail) + +按下`i`进入输入模式(也称为编辑模式),开始编辑文字 + +在命令模式之中,只要按下`i`,`o`,`a`等字符就可以进入输入模式了! + +在编辑模式当中,你可以发现在左下角状态栏中会出现`--INSERT--`的字样,那就是可以输入任意字符的提示。 + +这个时候,键盘上除了 Esc 这个按键之外,其他的按键都可以视作为一般的输入按钮了,所以你可以进行任何的编辑。 + +![img](04.文件管理/Dq9zxTG0hFbvVxWT.png!thumbnail) + +好了,假设我已经按照上面的样式给他编辑完毕了,那么应该要如何退出呢?是的!没错!就是给他按下 Esc 这个按钮即可!马上你就会发现画面左下角`--INSERT--`的不见了! + +![img](04.文件管理/tbzxHA3IzuTWivl7.png!thumbnail) + +输入**:wq**后回车即可保存离开,注意其中的冒号必须是英文输入法下的冒号! + +![img](04.文件管理/7wuLg7WlsebgxAQn.png!thumbnail) + +现在我们就成功创建了一个文件,查看文件的内容吧 + +```shell +[root@localhost ~]# ls -lh file.txt +[root@localhost ~]# cat file.txt +``` + +#### 3.4 vi/vim按键说明 + +除了上面简易范例的 i, Esc, :wq 之外,其实 vim 还有非常多的按键可以使用。 + +下面将会列举出vim非常多的常用按键,初学者只需要浏览一遍,记住大概vim有哪些功能,等后面大量使用vim的时候,再来翻阅笔记,并且在多次使用中把这些功能记住。 + +##### 3.4.1 命令模式 + +下面的操作都是在命令模式下进行的 + +**移动光标的方法** + +| h 或 向左箭头键(←) | 光标向左移动一个字符 | +| :----------------- | :----------------------------------------------------------- | +| j 或 向下箭头键(↓) | 光标向下移动一个字符 | +| k 或 向上箭头键(↑) | 光标向上移动一个字符 | +| l 或 向右箭头键(→) | 光标向右移动一个字符 | +| [Ctrl] + [f] | 屏幕『向下』移动一页,相当于 [Page Down]按键 (常用) | +| [Ctrl] + [b] | 屏幕『向上』移动一页,相当于 [Page Up] 按键 (常用) | +| [Ctrl] + [d] | 屏幕『向下』移动半页 | +| [Ctrl] + [u] | 屏幕『向上』移动半页 | +| + | 光标移动到非空格符的下一行 | +| - | 光标移动到非空格符的上一行 | +| n<space> | 那个 n 表示『数字』,例如 20 。按下数字后再按空格键,光标会向右移动这一行的 n 个字符。例如 20<space> 则光标会向后面移动 20 个字符距离。 | +| 0 或功能键[Home] | 这是数字『 0 』:移动到这一行的最前面字符处 (常用) | +| $ 或功能键[End] | 移动到这一行的最后面字符处(常用) | +| H | 光标移动到这个屏幕的最上方那一行的第一个字符 | +| M | 光标移动到这个屏幕的中央那一行的第一个字符 | +| L | 光标移动到这个屏幕的最下方那一行的第一个字符 | +| G | 移动到这个档案的最后一行(常用) | +| nG | n 为数字。移动到这个档案的第 n 行。例如 20G 则会移动到这个档案的第 20 行(可配合 :set nu) | +| gg | 移动到这个档案的第一行,相当于 1G 啊! (常用) | +| n<Enter> | n 为数字。光标向下移动 n 行(常用) | + +**文本的搜索与替换** + +| /word | 向光标之下寻找一个名称为 word 的字符串。 (常用) | +| :----------------------------------------- | :----------------------------------------------------------- | +| ?word | 向光标之上寻找一个字符串名称为 word 的字符串。 | +| n | 这个 n 是英文按键。代表重复前一个搜寻的动作。 | +| N | 这个 N 是英文按键。与 n 刚好相反,为『反向』进行前一个搜寻动作。 | +| :n1,n2s/word1/word2/g | n1 与 n2 为数字。在第 n1 与 n2 行之间寻找 word1 这个字符串,并将该字符串取代为 word2 (常用) | +| :1,$s/word1/word2/g 或 :%s/word1/word2/g | 从第一行到最后一行寻找 word1 字符串,并将该字符串取代为 word2 !(常用) | +| :1,$s/word1/word2/gc 或 :%s/word1/word2/gc | 从第一行到最后一行寻找 word1 字符串,并将该字符串取代为 word2 !且在取代前显示提示字符给用户确认 (confirm) 是否需要取代!(常用) | + +**删除/剪切、复制与粘贴** + +| x, X | 在一行字当中,x 为向后删除一个字符 (相当于 [del] 按键), X 为向前删除一个字符(相当于 [backspace] 亦即是退格键) (常用) | +| :------- | :----------------------------------------------------------- | +| nx | n 为数字,连续向后删除 n 个字符。举例来说,我要连续删除 10 个字符, 『10x』。 | +| dd | 删除/剪切光标所在的那一整行(常用) | +| ndd | n 为数字。删除/剪切光标所在的向下 n 行,例如 20dd 则是删除 20 行 (常用) | +| d1G | 删除光标所在到第一行的所有数据 | +| dG | 删除光标所在到最后一行的所有数据 | +| d$ | 删除游标所在处,到该行的最后一个字符 | +| d0 | 那个是数字的 0 ,删除光标所在处,到该行的最前面一个字符 | +| yy | 复制游标所在的那一行(常用) | +| nyy | n 为数字。复制光标所在的向下 n 行,例如 20yy 则是复制 20 行(常用) | +| y1G | 复制游标所在行到第一行的所有数据 | +| yG | 复制游标所在行到最后一行的所有数据 | +| y0 | 复制光标所在的那个字符到该行行首的所有数据 | +| y$ | 复制光标所在的那个字符到该行行尾的所有数据 | +| p, P | p 为将已复制的数据在光标下一行贴上,P 则为贴在光标上一行! 举例来说,我目前光标在第 20 行,且已经复制了 10 行数据。则按下 p 后, 那 10 行数据会贴在原本的 20 行之后,亦即由 21 行开始贴。但如果是按下 P 呢? 那么原本的第 20 行会被推到变成 30 行。 (常用) | +| J | 将光标所在行与下一行的数据结合成同一行 | +| c | 重复删除多个数据,例如向下删除 10 行,[ 10c ] | +| u | 复原前一个动作。(常用) | +| [Ctrl]+r | 重做上一个动作。(常用) | +| . | 重复前一个动作。 如果你想要重复删除、重复贴上等等动作,按下小数点『.』就好了! (常用) | + +**进入输入或取代的编辑模式** + +| i, I | 进入输入模式(Insert mode): i 为『从目前光标所在处输入』, I 为『在目前所在行的第一个非空格符处开始输入』。 (常用) | +| :---- | :----------------------------------------------------------- | +| a, A | 进入输入模式(Insert mode): a 为『从目前光标所在的下一个字符处开始输入』, A 为『从光标所在行的最后一个字符处开始输入』。(常用) | +| o, O | 进入输入模式(Insert mode): 这是英文字母 o 的大小写。o 为在目前光标所在的下一行处输入新的一行; O 为在目前光标所在的上一行处输入新的一行!(常用) | +| r, R | 进入取代模式(Replace mode): r 只会取代光标所在的那一个字符一次;R会一直取代光标所在的文字,直到按下 ESC 为止;(常用) | +| [Esc] | 退出编辑模式,回到一般模式中(常用) | + +**末行模式下的储存、离开等指令** + +| :w | 将编辑的数据写入硬盘中(常用) | +| :------------------ | :----------------------------------------------------------- | +| :w! | 若文件属性为『只读』时,强制写入该文件。不过,到底能不能写入, 还是跟你对该文件的权限有关 | +| :q | 离开 vi (常用) | +| :q! | 若曾修改过文件,又不想储存,使用 ! 为强制离开不储存。 | +| :wq | 储存后离开,若为 :wq! 则为强制储存后离开 (常用) | +| ZZ | 这是大写的 Z 喔!如果修改过,保存当前文件,然后退出!效果等同于(保存并退出) | +| :x | 效果等同于(保存并退出) | +| :X | 大写的X,用于加密文件 | +| ZQ | 不保存,强制退出。效果等同于**:q!**。 | +| :w [filename] | 将编辑的数据储存成另一个文件(类似文件另存为) | +| :r [filename] | 在编辑的数据中,读入另一个文件的数据。亦即将 『filename』 这个文件内容加到光标所在行后面 | +| :n1,n2 w [filename] | 将 n1 到 n2 的内容储存成 filename 这个文件。 | +| :! command | 暂时离开 vi 到bash命令行下执行 command 的显示结果!例如 『:! ls /home』即可在 vi 当中察看 /home 底下以 ls 输出的文件信息! | + +**vim环境变量修改** + +| :set nu | 显示行号,设定之后,会在每一行的前缀显示该行的行号 | +| :-------- | :------------------------------------------------- | +| :set nonu | 与 set nu 相反,为取消行号! | + + + diff --git a/00.基础阶段/02.Linux基础/04.文件管理/42U7itSOgHyWtuqL.png!thumbnail b/00.基础阶段/02.Linux基础/04.文件管理/42U7itSOgHyWtuqL.png!thumbnail new file mode 100644 index 0000000..8ee07fc Binary files /dev/null and b/00.基础阶段/02.Linux基础/04.文件管理/42U7itSOgHyWtuqL.png!thumbnail differ diff --git a/00.基础阶段/02.Linux基础/04.文件管理/7wuLg7WlsebgxAQn.png!thumbnail b/00.基础阶段/02.Linux基础/04.文件管理/7wuLg7WlsebgxAQn.png!thumbnail new file mode 100644 index 0000000..d2b3d30 Binary files /dev/null and b/00.基础阶段/02.Linux基础/04.文件管理/7wuLg7WlsebgxAQn.png!thumbnail differ diff --git a/00.基础阶段/02.Linux基础/04.文件管理/Dq9zxTG0hFbvVxWT.png!thumbnail b/00.基础阶段/02.Linux基础/04.文件管理/Dq9zxTG0hFbvVxWT.png!thumbnail new file mode 100644 index 0000000..738b4fc Binary files /dev/null and b/00.基础阶段/02.Linux基础/04.文件管理/Dq9zxTG0hFbvVxWT.png!thumbnail differ diff --git a/00.基础阶段/02.Linux基础/04.文件管理/MWU4OFLvWWa1A2ss.png!thumbnail b/00.基础阶段/02.Linux基础/04.文件管理/MWU4OFLvWWa1A2ss.png!thumbnail new file mode 100644 index 0000000..f3cbdc6 Binary files /dev/null and b/00.基础阶段/02.Linux基础/04.文件管理/MWU4OFLvWWa1A2ss.png!thumbnail differ diff --git a/00.基础阶段/02.Linux基础/04.文件管理/VSC5sIsVH0dd5r4b.png!thumbnail b/00.基础阶段/02.Linux基础/04.文件管理/VSC5sIsVH0dd5r4b.png!thumbnail new file mode 100644 index 0000000..b0d0c82 Binary files /dev/null and b/00.基础阶段/02.Linux基础/04.文件管理/VSC5sIsVH0dd5r4b.png!thumbnail differ diff --git a/00.基础阶段/02.Linux基础/04.文件管理/tbzxHA3IzuTWivl7.png!thumbnail b/00.基础阶段/02.Linux基础/04.文件管理/tbzxHA3IzuTWivl7.png!thumbnail new file mode 100644 index 0000000..4699c52 Binary files /dev/null and b/00.基础阶段/02.Linux基础/04.文件管理/tbzxHA3IzuTWivl7.png!thumbnail differ diff --git a/00.基础阶段/02.Linux基础/05.文件属性与文件查找.md b/00.基础阶段/02.Linux基础/05.文件属性与文件查找.md new file mode 100644 index 0000000..9b24e24 --- /dev/null +++ b/00.基础阶段/02.Linux基础/05.文件属性与文件查找.md @@ -0,0 +1,382 @@ +# 05.文件属性与文件查找 + +## 05.文件属性与文件查找 + +### 1. 文件时间 + +任何一个操作系统都有时间的概念,时间的概念主要用于对文件和系统中发生的时间进行记录,在Linux中,可以使用stat查看Linux系统中文件的时间 + +#### 1.1 stat + +用于显示文件时间和 inode 内容,inode相关的知识会在后面的磁盘管理章节详细讲解,这边主要来看文件的时间 + +```shell +stat [选项]... 文件... +``` + +##### 1.1.1 实例 + +* stat查看文件时间,这边为了我们方便看得懂,建议改为英文系统环境 + +```shell +[root@localhost ~]# export LANG="en_US.UTF-8" +# 改回中文是LANG="zh_CN.UTF-8" +[root@localhost ~]# stat anaconda-ks.cfg  +  File: ‘anaconda-ks.cfg’ +  Size: 1241      Blocks: 8          IO Block: 4096   regular file +Device: fd00h/64768d Inode: 33574979    Links: 1 +Access: (0600/-rw-------)  Uid: (    0/    root)   Gid: (    0/    root) +Context: system_u:object_r:admin_home_t:s0 +Access: 2021-04-04 17:54:09.700844151 +0800 +Modify: 2021-04-04 16:53:30.524854041 +0800 +Change: 2021-04-04 16:53:30.524854041 +0800 + Birth: - +``` + +* **Access:访问时间,也叫atime** + * 当文件被访问的时候,这个时间就会发生改变 + * Linux文件运行的时候查看文件又频繁数量又大,如果每次atime发生变化的时候都记入硬盘,或造成很大的压力。RHEL6开始relatime,atime延迟修改,必须满足其中一个条件: + * 自上次atime修改后,已达到86400秒 + * 发生写操作时 +* **Modify:修改时间,也叫mtime** + * 当文件内容发生变化的时候,这个时间就会发生改变 +* **Change:改变时间,也叫ctime** + * 当文件状态被改变的时候,这个时间就会发生修改 + +### 2. 文件类型 + +Linux系统和Windows系统有很大的区别,Windows系统查看文件的后缀名就可以知道这个是什么类型的文件,比如:`test.jpg`这个是一个图片,如果你在windows上双击打开,就会使用支持查看图片的软件打开。 + +Linux系统就根本不看文件的后缀名,你认为这个是什么文件,你就使用什么工具打开这个文件,如果打开错误,就会报错,看下面的案例 + +```shell +[root@localhost ~]# cat file +cat: file: Is a directory +``` + +当你以为file是个文件,使用cat命令查看的时候,cat会提示你这个是个文件夹,你才反应过来,应该使用cd命令打开。 +所以在Linux中,我们需要使用和windows不一样的方法来判断这个文件的类型。 + +#### 2.1 方法一:ls + +使用ls可以查看当前目录下有哪些文件,我们会发现文件夹和文件的颜色并不一样,所以我们可以简单的通过颜色来进行判断,不过这种判断的方式并不准确,因为不同的Linux发行套件颜色的标准并不一样,不同的远程管理工具对颜色的理解也有偏差,比如可能把蓝色显示为淡蓝色,而淡蓝色又显示成其他颜色。所以最推荐的做法是通过`ls -l`查看第一个字母: + +* **-**普通文件(文本文档,二进制文件,压缩文件,电影,图片。。。) +* **d**目录文件(蓝色) +* **b**块设备文件(块设备)存储设备硬盘,U盘 /dev/sda,/dev/sda1 +* **c**字符设备文件(字符设备)打印机,终端 /dev/tty1,/dev/zero +* **s**套接字文件 +* **p**管道文件 +* **l**链接文件(淡蓝色) + +```shell +[root@localhost ~]# type ll +ll 是 `ls -l --color=auto' 的别名 +[root@localhost ~]# ll -d /etc/hosts /bin/ls /home /dev/nvme0n1 /dev/tty1 /etc/grub2.cfg /dev/log +-rwxr-xr-x. 1 root root 140872 4月 21 2024 /bin/ls +lrwxrwxrwx. 1 root root 28 11月 8 21:42 /dev/log -> /run/systemd/journal/dev-log +brw-rw----. 1 root disk 259, 0 11月 8 21:42 /dev/nvme0n1 +crw--w----. 1 root tty 4, 1 11月 8 21:42 /dev/tty1 +lrwxrwxrwx. 1 root root 22 9月 5 03:00 /etc/grub2.cfg -> ../boot/grub2/grub.cfg +-rw-r--r--. 1 root root 158 6月 23 2020 /etc/hosts +drwxr-xr-x. 10 root root 124 11月 8 09:57 /home +``` + +对于初学者而言,我们现在只要知道可以通过这样的方式查看文件的类型,并且能够知道`-`和`d`的意思即可。后面在学习的过程中,会慢慢的将所有文件类型都掌握的。 + +#### 2.2 方法二:file + +file是专门用来查看文件的类型的命令,有时候也可以使用 + +```shell +[root@localhost ~]# file /etc/hosts +/etc/hosts: ASCII text +[root@localhost ~]# file /bin/ls +/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=ceaf496f3aec08afced234f4f36330d3d13a657b, stripped +[root@localhost ~]# file /dev/nvme0n1 +/dev/nvme0n1: block special (259/0) +[root@localhost ~]# file /dev/tty1 +/dev/tty1: character special +[root@localhost ~]# file /etc/grub2.cfg  +/etc/grub2.cfg: symbolic link to `../boot/grub2/grub.cfg' +[root@localhost ~]# file /home +/home: directory +[root@localhost ~]# file /run/dmeventd-client +/run/dmeventd-client: fifo (named pipe) +``` + +#### 2.3 方法三:stat + +这个命令上面已经介绍过了,在输出结果中也是可以看到文件的类型 + +### 3. 文件查找 + +在windows中可以在文件管理器中很方便的输入文件名查找文件,然而Linux的文件查找功能更加的方便,并且功能更加的强大,现在就介绍三个用于查找文件的命令。 + +在这三种查找命令中功能最强大的是`find`命令,所以在学习的时候,`which`和`locate`需要掌握,`find`命令需要熟练掌握! + +#### 3.1 which + +用于查找文件 + +which指令会在环境变量`$PATH`设置的目录里查找符合条件的文件 + +```shell +which [文件...] +``` + +##### 3.1.1 补充知识:环境变量 + +环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:临时文件夹位置和系统文件夹位置等。 + +简单的理解就是告诉操作系统在程序运行的时候,有一些默认的设置是什么。 + +比如上面我们修改了`LANG`变量,就是一个环境变量,会影响到显示的语言是中文还是英文。 + +比如在讲解`pwd`命令的时候,我们修改了`$PWD`变量,就影响了当前所处的文件夹。 + +在我们使用shell命令行输入命令的时候,其实每个命令都是有一个可执行文件去完成我们下达的任务,这个可执行文件在操作系统中是分布在不同的文件夹中的,我们总不能每次执行的时候都要告诉操作系统这个文件在哪里,那么就算是查看一个文件,我们都需要输入如下的命令: + +```shell +[root@localhost ~]# /usr/bin/ls -lh +# 在Linux中,ls的可执行程序在/usr/bin目录下 +``` + +这样就太麻烦了,所以就指定了一个环境变量`$PATH`,这个变量中有很多的目录地址,当我们执行命令的时候,操作系统就会到这些目录中查找,是否存在你所输入的命令。如果有那么就会去执行。 + +```shell +[root@localhost ~]# echo $PATH +/root/.local/bin:/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin +``` + +如果你想让自己安装的某个软件可以在操作系统的任意位置直接输入文件名执行,那么你也可以把自定义的目录加入到这个`$PATH`中 + +##### 3.1.2 实例 + +* 查看ls命令的可执行文件在什么目录 + +```shell +[root@localhost ~]# which ls +alias ls='ls --color=auto' + /usr/bin/ls +# which会先告诉你ls其实是一个别名 +# 然后显示出来ls所在的具体位置 +``` + +**小知识**:我们在执行`ls`的时候,其实执行的是`ls --color=auto`这条命令,在显示文件的时候使用不同的颜色表示不同的文件类型,如果我们想执行`ls`本体,而不想执行别名,我们可以输入`\ls`就可以了,这样就不会有不同的颜色表示文件类型了。 + +* 查看poweroff在什么目录 + +```shell +[root@localhost ~]# which poweroff +/usr/sbin/poweroff +``` + +#### 3.2 locate + +用于查找符合条件的文件,他会去保存文件和目录名称的数据库内,查找合乎范本样式条件的文件或目录 + +在centos7的最小化安装中,并没有自带locate命令,我们需要输入如下命令进行安装。 + +```shell +[root@localhost ~]# yum -y install mlocate +# 注意,在安装的时候需要确保虚拟机有网络 +``` + +locate的使用方式如下 + +```shell +locate [选项]... [范本样式]... +``` + +在使用locate之前,需要更新一下数据库,因为locate只会在数据库中查找文件所在的位置,所以locate查找速度极快,缺点就是数据库更新并不是实时的,更新数据库有两种方式: + +* 手动更新,输入`updatedb` +* 默认情况下,`updatedb`会每天自动执行一次 + +##### 3.2.1 选项 + +* **-c**:只输出找到的数量 +* **-n**:至多显示 n个输出 +* **-i**:忽略大小写 +* **-r**:使用基本正则表达式 +* **--regex**:使用扩展正则表达式 +* **-d DBPATH**:使用 DBPATH 指定的数据库,而不是默认数据库 /var/lib/mlocate/mlocate.db + +##### 3.2.2 实例 + +* 查找passwd文件所在的位置 + +```shell +[root@localhost ~]# updatedb +# 更新数据库并不是每次查找都需要,但是建议更新数据库来保证数据是最新的 +[root@localhost ~]# locate passwd +``` + +* 查找ens33网卡配置文件所在的位置 + +```shell +[root@localhost ~]# locate -r ens160 +/etc/NetworkManager/system-connections/ens160.nmconnection +/var/lib/NetworkManager/internal-73f5c862-c736-361f-a8f7-bcb21e280e90-ens160.lease +``` + +#### 3.3 find + +实时查找工具,通过遍历指定路径下的文件系统完成文件查找 + +工作特点: + +* 查找速度略慢 +* 精确查找 +* 实时查找 +* 可以满足多种条件匹配 + +```shell +find [选项] [路径] [查找条件 + 处理动作] +查找路径:指定具体目录路径,默认是当前文件夹 +查找条件:指定的查找标准(文件名/大小/类型/权限等),默认是找出所有文件 +处理动作:对符合条件的文件做什么操作,默认输出屏幕 +``` + +##### 3.3.1 查找条件 + +* 根据文件名查找 + +```shell +[root@localhost ~]# find /etc -name "ens160.nmconnection" +[root@localhost ~]# find /etc -iname "ens160.nmconnection" # 忽略大小写 +[root@localhost ~]# find /etc -iname "ens*" +``` + +* 按文件大小 + +```shell +[root@localhost ~]# find /etc -size +5M # 大于5M +[root@localhost ~]# find /etc -size 5M # 等于5M +[root@localhost ~]# find /etc -size -5M # 小于5M +[root@localhost ~]# find /etc -size +5M -ls # 找到的处理动作-ls +``` + +* 指定查找的目录深度 + +```shell +[root@localhost ~]# find / -maxdepth 3 -a -name "ens160.nmconnection" # 最大查找深度 +# -a是同时满足,-o是或 +[root@localhost ~]# find / -mindepth 3 -a -name "ens160.nmconnection" # 最小查找深度 +``` + +* 按时间找 + +```shell +[root@localhost ~]# find /etc -mtime +5 # 修改时间超过5天 +[root@localhost ~]# find /etc -mtime 5 # 修改时间等于5天 +[root@localhost ~]# find /etc -mtime -5 # 修改时间5天以内 +``` + +* 按照文件属主、属组找,文件的属主和属组,会在下一篇详细讲解。 + +```shell +[root@localhost ~]# find /home -user xwz # 属主是xwz的文件 +[root@localhost ~]# find /home -group xwz +[root@localhost ~]# find /home -user xwz -group xwz +[root@localhost ~]# find /home -user xwz -a -group root +[root@localhost ~]# find /home -user xwz -o -group root +[root@localhost ~]# find /home -nouser # 没有属主的文件 +[root@localhost ~]# find /home -nogroup # 没有属组的文件 +``` + +* 按文件类型 + +```shell +[root@localhost ~]# find /dev -type d +``` + +* 按文件权限,文件权限会在下一篇详细讲解 + +```shell +[root@localhost ~]# find / -perm 644 -ls +[root@localhost ~]# find / -perm -644 -ls # 权限小于644的 +``` + +* 按正则表达式 + +```shell +[root@localhost ~]# find /etc -regex '.*ens[0-9][0-9][0-9].*' +# .* 任意多个字符 +# [0-9] 任意一个数字 +``` + +* 条件组合 + * **-a**:多个条件and并列 + * **-o**:多个条件or并列 + * **-not**:条件取反 + +##### 3.3.2 处理动作 + +* **‐print**:默认的处理动作,显示至屏幕 +* **‐ls**:类型于对查找到的文件执行`ls ‐l`命令 +* **‐delete**:删除查找到的文件 +* **‐fls /path/to/somefile**:查找到的所有文件的长格式信息保存至指定文件中 +* **{}**:用于引用查找到的文件名称自身 +* **-exec:**选项允许您对找到的每个文件执行一个命令 + +下面的实例大家学习完后续用户权限管理之后,就可以完全看的懂了 + +##### 3.3.3 实例 + +- 查找到root目录下面以.log结尾的文件,并且复制到/home/dir1中 + +```sh +[root@localhost ~]# find /root -name "*.log" -exec mv {} /home/dir1 \; +``` + +* 查找/var目录下属主为root,且属组为mail的所有文件或目录 + +```shell +[root@localhost ~]# find /var -user root -group mail +``` + +* 查找/usr目录下不属于root,bin或ftp用户的所有文件或目录 + +```shell +[root@localhost ~]# find /usr -not -user root -a -not -user bin -a -not -user ftp +[root@localhost ~]# find /usr -not \( -user root -o -user bin -o -user ftp \) +``` + +* 查找/etc目录下最近一周内容曾被修改过的文件或目录 + +```shell +[root@localhost ~]# find /etc -mtime -7 +``` + +* 查找当前系统上没有属主或属组,且最近一周内曾被访问过的文件或目录 + +```shell +[root@localhost ~]# find / \( -nouser -o -nogroup \) -a -atime -7 +``` + +* 查找/etc目录下大于1M且类型为普通文件的所有文件或目录 + +```shell +[root@localhost ~]# find /etc -size +1M -type f +``` + +* 查找/etc目录下所有用户都没有写权限的文件 + +```shell +[root@localhost ~]# find /etc -not -perm /222 +``` + +* 查找/etc目录下至少一类用户没有执行权限的文件 + +```shell +[root@localhost ~]# find /etc -not -perm -111 +``` + +* 查找/etc/init.d目录下,所有用户都有执行权限,且其它用户写权限的文件 + +```shell +[root@localhost ~]# find /etc/init.d -perm -113 +``` + diff --git a/00.基础阶段/02.Linux基础/06.用户权限管理.md b/00.基础阶段/02.Linux基础/06.用户权限管理.md new file mode 100644 index 0000000..373608c --- /dev/null +++ b/00.基础阶段/02.Linux基础/06.用户权限管理.md @@ -0,0 +1,649 @@ +# 06.用户权限管理 + +## 06.用户权限管理 + +Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。 + +为了更加方便的管理多个用户,就出现了用户组的概念,关于用户和用户组: + +* 系统上的每个进程(运行的程序)都是作为特定用户运行 +* 每个文件是由一个特定的用户拥有 +* 访问文件和目录受到用户的限制 +* 与正在运行的进程相关联的用户确定该进程可访问的文件和目录 + +实现用户账号的管理,要完成的工作主要有如下几个方面: + +* 用户账号的添加、删除与修改 +* 用户口令的管理 +* 用户组的管理 + +### 1. 用户和用户组查看 + +#### 1.1 id + +用于显示用户的ID,以及所属群组的ID + +id会显示用户以及所属群组的实际与有效ID。若两个ID相同,则仅显示实际ID。若仅指定用户名称,则显示目前用户的ID。 + +```shell +id [OPTION]... [USER] +``` + +* **-g**:显示用户所属群组的ID。 +* **-G**:显示用户所属附加群组的ID。 +* **-n**:显示用户,所属群组或附加群组的名称。 +* **-r**:显示用户真实ID,用户真实的uid。 +* **-u**:显示用户有效ID,可以都某些高权限用户,通过有效id限制权限。 + +##### 1.1.1 uid的约定 + +Linux操作系统会依据用户的uid数值来判定这个用户的角色,分别如下 + +* **0**:超级管理员,也就是root,在linux系统中拥有所有权力 +* **1~999**:系统用户,系统用户往往是用来约束系统中的服务的 +* **1000+**:普通用户,可以用来登陆和使用Linux操作系统 + +关于root用户 + +* uid是0 +* 拥有操作系统所有权力 +* 该用户有权力覆盖文件系统上的普通权限 +* 安装或删除软件并管理系统文件和目录 +* 大多数设备只能由root控制 + +##### 1.1.2 实例 + +* 查看当前登陆的用户信息 + +```shell +[root@localhost ~]# id +uid=0(root) gid=0(root) 组=0(root) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 +``` + +* 查看文件的拥有者 + +```shell +[root@localhost ~]# ll anaconda-ks.cfg  +-rw-------. 1 root root 1241 4月   4 16:53 anaconda-ks.cfg +``` + +![img](06.用户权限管理/Fx6dmHzgAk0fq4CO.png!thumbnail) + +* 查看运行进程的用户名,ps命令会在后面进程管理部分讲解 + +```shell +[root@localhost ~]# ps aux +USER PID %CPU %MEM    VSZ   RSS TTY STAT START   TIME COMMAND +root 2  0.0  0.0      0     0 ? S    09:06   0:00 [kthreadd] +root 3  0.0  0.0      0     0 ? S    09:06   0:01 [ksoftirqd/0] +root 4  0.1  0.0      0     0 ? R    09:06   0:09 [kworker/0:0] +root 5  0.0  0.0      0     0 ? S<   09:06   0:00 [kworker/0:0H] +``` + +#### 1.2 相关的文件 + +之前说过Linux一切皆文件,所以用户和用户组相关的信息也都是保存在文本文件中的,下面列举出相关的文件。 + +##### 1.2.1 passwd文件 + +用于保存用户的信息,一般第一行是root用户,下面都是其他用户 + +```shell +[root@localhost ~]# head -n 1 /etc/passwd +root:x:0:0:root:/root:/bin/bash +# 这个格式为用户名:密码:uid:gid:描述:家目录:登陆后执行的命令 +``` + +##### 1.2.2 shadow文件 + +格式中密码占位置太长了,所以使用x来替代,Linux系统会到shadow中查找x部分的的密码内容 + +```shell +[root@localhost ~]# head -n 1 /etc/shadow +root:$6$frokclXSnQa8EbKs$pWElbjPlmxjYh30tr8qLsTQVOhuPg7GmW9Sanm2yXAK8TNMgje1gyc/vwPgqvmSMf6VaoEvveM0gFvtETmXy/.::0:99999:7::: +# 这个格式为用户名:加密密码:最后一次修改时间:最小修改时间间隔:密码有效期:密码需要变更前的警告天数:密码过期后的宽限时间:账号失效时间:保留字段 +``` + +格式不需要大家记住,只需要知道关于这个用户的密码和有效期都在这个文件中即可。 +密码在`passwd`文件中会使用加密算法加密,所以别想知道我的密码是什么,加密算法默认是`$6`,这个类型6的加密算法是sha-512。我们也可以在man手册中看到对shadow文件的详细解释。 + +```shell +[root@localhost ~]# man 5 shadow +# man手册一个有9个章节,其中第5个章节是对文件格式的说明 +# 对man手册感兴趣的同学,也可以自己在网上查找学习man手册的更多内容 +``` + +##### 1.2.3 group文件 + +用户和组的对应关系,会保存在group文件中 + +```shell +[root@localhost ~]# head -n 1 /etc/group +root:x:0: +# 这个格式是组名:口令:组标识号:组内用户列表 +``` + +### 2. 用户组管理 + +#### 2.1 添加用户组:groupadd + +groupadd 命令用于创建一个新的工作组,新工作组的信息将被添加到系统文件中 + +```shell +groupadd [选项] 组 +``` + +##### 2.1.1 选项 + +* **-g**:指定新建工作组的 id; +* **-r**:创建系统工作组,系统工作组的组ID小于 500; +* **-K**:覆盖配置文件`/etc/login.defs` +* **-o**:允许添加组 ID 号不唯一的工作组。 +* **-f**:如果指定的组已经存在,此选项将失明了仅以成功状态退出。当与 -g 一起使用,并且指定的GID_MIN已经存在时,选择另一个唯一的GID(即-g关闭)。 + +##### 2.1.2 实例 + +* 按照下图创建组,并且指定gid,并且检查是否成功 + +![img](06.用户权限管理/uMr1eOHxTqG6CmoS.png!thumbnail) + +```shell +[root@localhost ~]# groupadd hr -g 1000 +[root@localhost ~]# groupadd sale -g 2000 +[root@localhost ~]# groupadd it -g 3000 +[root@localhost ~]# groupadd fd -g 4000 +[root@localhost ~]# tail -n 4 /etc/group +hr:x:1000: +sale:x:2000: +it:x:3000: +fd:x:4000: +``` + +#### 2.2 修改用户组:groupmod + +groupmod命令用于更改群组识别码或名称 + +```shell +groupmod [选项] 组 +``` + +##### 2.2.1 选项 + +* **-g**:将组 ID 改为 GID +* **-n**:改名为 NEW_GROUP +* **-o**:允许使用重复的 GID + +##### 2.2.2 实例 + +* 修改fd组的名字为finance + +```shell +[root@localhost ~]# groupmod -n finance fd +[root@localhost ~]# tail -n 1 /etc/group +finance:x:4000: +``` + +#### 2.3 删除用户组:groupdel + +groupdel命令用于删除群组 + +需要从系统上删除群组时,可用groupdel(group delete)指令来完成这项工作。倘若该群组中仍包括某些用户,则必须先删除这些用户后,方能删除群组。 + +```shell +groupdel [组名] +``` + +##### 2.3.1 实例 + +* 删除一个用户组 + +```shell +[root@localhost ~]# groupadd test +[root@localhost ~]# groupdel test +``` + +#### 2.4 用户组成员管理:gpasswd + +gpasswd 是 Linux 下工作组文件 /etc/group 和 /etc/gshadow 管理工具,用于将一个用户添加到组或者从组中删除 + +```shell +gpasswd [选项] 组 +``` + +##### 2.4.1 选项 + +* **-a**:添加用户到组; +* **-d**:从组删除用户; +* **-A**:指定管理员,可以执行添加或者删除组员; +* **-M**:替换组中的全部用户列表,不包含在内的用户将会从组中删除; +* **-R**:限制用户登入组,只有组中的成员才可以用newgrp加入该组。 + +##### 2.4.2 实例 + +* 创建用户itadmin,并且将其加入it组 + +```shell +[root@localhost ~]# useradd itadmin +[root@localhost ~]# gpasswd -a itadmin it +正在将用户“itadmin”加入到“it”组中 +[root@localhost ~]# cat /etc/group |grep it: +it:x:3000:itadmin +# 在组文件中,可以看到这个组的成员 +[root@localhost ~]# id itadmin +uid=6667(itadmin) gid=6667(itadmin) 组=6667(itadmin),3000(it) +# 在用户的信息中,可以看到这个用户的所属组 +``` + +### 3. 用户管理 + +#### 3.1 添加用户:useradd + +useradd可以用来添加新的用户账号 + +```shell +useradd [选项] 用户名 +``` + +##### 3.1.1 选项 + +* **-c comment**:指定一段注释性描述。 +* **-d 目录**:指定用户主目录,如果此目录不存在,则同时使用-m选项,可以创建主目录。 +* **-m**:创建用户的主目录 +* **-g 用户组**:指定用户所属的用户组,默认会创建一个和用户名同名的用户组。 +* **-G 用户组**:用户组 指定用户所属的附加组,一个用户可以属于多个附加组。 +* **-s Shell文件**:指定用户的登录Shell。 +* **-u 用户号**:指定用户的用户号,如果同时有-o选项,则可以重复使用其他用户的标识号。 + +##### 3.1.2 实例 + +* 添加一般用户 + +```shell +[root@localhost ~]# useradd user01 +``` + +* 为添加的用户指定相应的用户组 + +```shell +[root@localhost ~]# useradd -g root user02 +``` + +* 为新添加的用户指定home目录 + +```shell +[root@localhost ~]# useradd -d /home/test user03 +``` + +* 建立一个不给登录的用户 + +```shell +[root@localhost ~]# useradd -s /sbin/nologin user04 +``` + +- 查看用户描述信息 + +```bash +[root@localhost ~]# useradd -c "this is python_developmer user" python-developmer +[root@localhost ~]# cat /etc/passwd |grep python-developmer +python-developmer:x:1005:1005:this is python_developmer user:/home/python-developmer:/bin/bash +``` + +#### 3.2 切换用户:su + +su命令用户Linux系统中的用户切换 + +##### 3.2.1 用法: + +```BASH +su [选项] 用户名 +``` + +##### 3.2.2 常用选项: + +- `-`:以目标用户的环境变量启动新会话。这将模拟用户完全登录到新用户账户,包括其家目录、环境变量等。 +- `-c 命令`:执行指定的命令,并在执行完毕后返回原始用户。 +- `-s shell`:使用指定的 shell 替代目标用户的默认 shell。 + +#### 3.3 修改用户:usermod + +usermod命令用于修改用户帐号 + +usermod可用来修改用户帐号的各项设定 + +```shell +usermod [选项] 登录 +``` + +##### 3.3.1 选项 + +* **-c<备注>**:修改用户帐号的备注文字。 +* **-a**:追加,默认的修改是覆盖 +* **-d登入目录>**:修改用户登入时的目录。 +* **-e<有效期限>**:修改帐号的有效期限。 +* **-f<缓冲天数>**:修改在密码过期后多少天即关闭该帐号。 +* **-g<群组>**:修改用户所属的群组。 +* **-G<群组>**:修改用户所属的附加群组。 +* **-l<帐号名称>**:修改用户帐号名称。 +* **-L**:锁定用户密码,使密码无效。 +* **-s**:修改用户登入后所使用的shell。 +* **-u**:修改用户ID。 +* **-U**:解除密码锁定。 + +##### 3.3.2 实例 + +* 更改登录的目录 + +```shell +[root@localhost ~]# usermod -d /home user01 +[root@localhost ~]# su - user01 +[user01@localhost ~]$ pwd +/home +``` + +* 改变用户的uid + +```shell +[root@localhost ~]# usermod -u 6666 user02 +``` + +#### 3.4 删除用户:userdel + +userdel命令用于删除用户帐号 + +userdel可删除用户帐号与相关的文件。若不加参数,则仅删除用户帐号,而不删除相关文件 + +```shell +userdel [-r][用户帐号] +``` + +##### 3.4.1 选项 + +* **-r**:删除用户登入目录以及目录中所有文件 + +##### 3.4.2 实例 + +* 删除用户账号 + +```shell + [root@localhost ~]# userdel user04 +``` + +* 删除用户账户和家目录 + +```shell +[root@localhost ~]# userdel -r user03 +``` + +### 4. passwd文件中的shell + +查看`/etc/passwd`文件会发现在每行的最后是登录成功之后执行的命令,有两种是使用最为频繁的: + +* /bin/bash:这个是Linux的命令行工具,我们正常登陆之后默认就是进入命令行 +* /sbin/nologin:如果写成nologin,那么用户将无法登录,有些用户是作为进程权限管理而存在的,不需要登录。如果提供登录的功能反而不安全,所以写成nologin + +```shell +[root@localhost ~]# cat /etc/passwd +root:x:0:0:root:/root:/bin/bash +bin:x:1:1:bin:/bin:/sbin/nologin +daemon:x:2:2:daemon:/sbin:/sbin/nologin +adm:x:3:4:adm:/var/adm:/sbin/nologin +lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin +``` + +我们可以新建一个用户,然后尝试自定义登录成功之后执行的命令,用来加深印象。 + +```shell +[root@localhost ~]# useradd test01 +[root@localhost ~]# tail -n 1 /etc/passwd +test01:x:1000:1000::/home/test01:/bin/vi +``` + +切换到test01用户,会发现自动进入vi的界面,说明最后的这个段内容就是用户登录之后会运行的程序 + +![img](06.用户权限管理/xAgZdlGg8OXMi9mn.png!thumbnail) + +### 5. 用户密码管理 + +root用户可以直接设置普通用户密码,普通用户必须要提供原密码,才可以修改自己密码。 + +#### 5.1 passwd + +passwd命令用来更改使用者的密码 + +```shell +passwd [选项...] <帐号名称> +``` + +##### 5.1.1 选项 + +* **-k**:保持身份验证令牌不过期 +* **-d**:删除已命名帐号的密码(只有根用户才能进行此操作) +* **-l**:锁定指名帐户的密码(仅限 root 用户) +* **-u**:解锁指名账户的密码(仅限 root 用户) +* **-x**:密码的最长有效时限(只有根用户才能进行此操作) +* **-n**:密码的最短有效时限(只有根用户才能进行此操作) +* **-w**:在密码过期前多少天开始提醒用户(只有根用户才能进行此操作) +* **-i**:当密码过期后经过多少天该帐号会被禁用(只有根用户才能进行此操作) +* **-S**:报告已命名帐号的密码状态(只有根用户才能进行此操作) +* **--stdin**:从标准输入读取令牌(只有根用户才能进行此操作) + +##### 5.1.2 实例 + +* 修改test01用户密码 + +```shell +[root@localhost ~]# passwd test01 +更改用户 test01 的密码 。 +新的 密码: +重新输入新的 密码: +passwd:所有的身份验证令牌已经成功更新。 +``` + +* 使用管道符设置用户密码 + +```shell +[root@localhost ~]# echo 123456 | passwd --stdin test01 +更改用户 test01 的密码 。 +passwd:所有的身份验证令牌已经成功更新。 +``` + +#### 5.2 login.defs文件 + +`/etc/login.defs`文件是用来创建用户时进行一定的限制,但是优先级低于`/etc/passwd`和`/etc/shadow`,如果有冲突的地方,系统会以`/etc/passwd`和`/etc/shadow`为准 + +下面是这个文件的内容,egrep命令我们后续会讲到,这边可以理解为不看文件的注释和空行。 + +```shell +[root@localhost ~]# egrep -v '^[ ]*$|^#' /etc/login.defs +MAIL_DIR /var/spool/mail # 系统消息(邮件)文件夹 +PASS_MAX_DAYS 99999 # 密码有效最大天数  +PASS_MIN_DAYS 0 # 密码有效最小天数 +PASS_MIN_LEN 5 # 密码长度 +PASS_WARN_AGE 7 # 密码失效警告倒计时 +UID_MIN                  1000 # 用户UID最小1000 +UID_MAX                 60000 # 用户UID最大60000 +SYS_UID_MIN               201 # 系统用户UID最小201 +SYS_UID_MAX               999 # 系统用户UID最大999 +GID_MIN                  1000 # 用户组GID最小1000 +GID_MAX                 60000 # 用户组GID最大60000 +SYS_GID_MIN               201 +SYS_GID_MAX               999 +CREATE_HOME yes # 创建家目录 +UMASK           077 # 创建文件/目录的权限掩码 +USERGROUPS_ENAB yes # 创建用户时同时生成组是  如果此处是no 创建的用户 会是gid=100(users)groups=100(users)  +ENCRYPT_METHOD SHA512 # 加密  方法  sha 512 这个方法生成的密码在/etc/shadow里面的第二列会以$6$开头 +``` + +#### 5.3 chage + +chage是用于更改用户密码过期信息 + +```shell +chage [选项] 登录 +``` + +##### 5.3.1 选项 + +* **-d**:设置密码的最后更改日期 +* **-E 过期日期**:设置账号的过期日期 +* **-I INACITVE**:设置密码过期后若未更改,多少天后用户账号被禁用。 +* **-l**:显示用户账号的密码过期信息。 +* **-m 最小天数**:设置两次改变密码之间相距的最小天数 +* **-M 最大天数**:设置将两次改变密码之间相距的最大天数 +* **-W 警告天数**:设置密码过期前的警告天数 + +##### 5.3.2 实例 + +* 强制用户在下次登录的时候换密码 + +```shell +[root@localhost ~]# chage -d 0 test01 +[root@localhost ~]# logout +You must change your password now and login again! +更改用户 test01 的密码 。 +为 test01 更改 STRESS 密码。 +(当前)UNIX 密码: + +[root@localhost ~]# chage -l root +最近一次密码修改时间 :从不 +密码过期时间 :从不 +密码失效时间 :从不 +帐户过期时间 :从不 +两次改变密码之间相距的最小天数 :0 +两次改变密码之间相距的最大天数 :99999 +在密码过期之前警告的天数 :7 + +# 设置用户 user01 的密码过期前7天提醒用户修改密码 +[root@localhost ~]# chage -W 7 user01 + +# 设置用户 user01 的密码最短使用天数为7天,即密码修改后7天内不能再次修改 +[root@localhost ~]# chage -m 7 user01 +[root@localhost ~]# chage -l user01 +最近一次密码修改时间 :11月 08, 2024 +密码过期时间 :从不 +密码失效时间 :从不 +帐户过期时间 :从不 +两次改变密码之间相距的最小天数 :7 +两次改变密码之间相距的最大天数 :99999 +在密码过期之前警告的天数 :7 +``` + +**小知识:**当你新建用户的时候,用户的home目录下会有一些默认的隐藏文件,这些隐藏文件是在创建用户的时候从`/etc/skel/`中复制过去的。 + +### 6. sudoers + +Linux是多用户多任务的操作系统, 共享该系统的用户往往不只一个。出于安全性考虑, 有必要通过useradd创建一些非root用户, 只让它们拥有不完全的权限; 如有必要,再来提升权限执行。 + +sudo就是来解决这个需求的: 这些非root用户不需要知道root的密码,就可以提权到root,执行一些root才能执行的命令。 + +```shell +sudo [选项] [用户名] [命令] +``` + +#### 6.1 sudo命令执行过程 + +1. 当用户执行sudo时,系统会主动寻找`/etc/sudoers`文件,判断该用户是否有执行sudo的权限 +2. 确认用户具有可执行sudo的权限后,让用户输入用户自己的密码确认 +3. 若密码输入成功,则开始执行sudo后续的命令 + +#### 6.2 赋予用户sudo操作的权限 + +通过useradd添加的用户,并不具备sudo权限。在ubuntu/centos/RockyLinux等系统下, 需要将用户加入admin组或者wheel组或者sudo组。以root用户身份执行如下命令, 将用户加入wheel/admin/sudo组。 + +```shell +usermod -a -G wheel <用户名> +``` + +如果提示wheel组不存在, 则还需要先创建该组 + +```shell +groupadd wheel +``` + +#### 6.3 配置文件 + +sudo的权限控制可以在`/etc/sudoers`文件中查看到。一般来说,通过cat /etc/sudoers指令来查看该文件, 会看到如下几行代码。 + +```shell +[root@localhost ~]# egrep -v '^[ ]*$|^#' /etc/sudoers +=====省略===== +root ALL=(ALL) ALL +%wheel ALL=(ALL) ALL +``` + +对/etc/sudoers文件进行编辑的代码公式可以概括为 + +```shell +授权用户/组 主机=[(切换到哪些用户或组)] [是否需要输入密码验证] 命令1,命令2,... +字段1 字段2 =[(字段3)] [字段4] 字段5 +``` + +凡是[ ]中的内容, 都能省略; 命令和命令之间用`,`号分隔,字段3、字段4,是可以省略的。 + +* "字段1"不以%号开头的表示"将要授权的用户",以%号开头的表示"将要授权的组"。 +* "字段2"表示允许登录的主机, ALL表示所有,;如果该字段不为ALL,表示授权用户只能在某些机器上登录本服务器来执行sudo命令 +* "字段3"如果省略, 相当于(root:root),表示可以通过sudo提权到root,如果为(ALL)或者(ALL:ALL), 表示能够提权到(任意用户:任意用户组)。 +* "字段4"的可能取值是NOPASSWD:。请注意NOPASSWD后面带有冒号:。表示执行sudo时可以不需要输入密码。 + * 比如:`lucy ALL=(ALL) NOPASSWD: /bin/useradd`表示: 普通用户lucy可以在任何主机上, 通过sudo执行/bin/useradd命令, 并且不需要输入密码 + * 比如:`peter ALL=(ALL) NOPASSWD: ALL`,表示: 普通用户peter可以在任何主机上, 通过sudo执行任何命令, 并且不需要输入密码。 +* "字段5"是使用逗号分开一系列命令,这些命令就是授权给用户的操作; ALL表示允许所有操作。命令都是使用绝对路径, 这是为了避免目录下有同名命令被执行,从而造成安全隐患。 + * 如果你将授权写成如下安全性欠妥的格式:`lucy ALL=(ALL) chown,chmod,useradd`那么用户就有可能创建一个他自己的程序, 也命名为userad, 然后放在它的本地路径中, 如此一来他就能够使用root来执行这个"名为useradd的程序"。这是相当危险的! + +#### 6.4 编辑配置文件 + +在实践中,去编辑`/etc/sudoers`文件,系统提示我没权限,这是因为`/etc/sudoers`的内容如此敏感,以至于该文件是只读的。所以,编辑该文件前,请确认清楚你知道自己正在做什么。 + +强烈建议通过`visudo`命令来修改该文件,通过`visudo`修改,如果配置出错,会有提示。 + +官方文档推荐的做法,不是直接修改`/etc/sudoers`文件,而是将修改写在`/etc/sudoers.d/`目录下的文件中。如果使用这种方式修改sudoers,需要在`/etc/sudoers`文件的最后行,加上`#includedir /etc/sudoers.d`一行(默认已有)。需要注意,这个`#includedir /etc/sudoers.d`中的`#`并不是注释,请勿修改。 + +#### 6.5 sudo选项 + +* **-u**:以指定用户或 ID 运行命令(或编辑文件) +* **-l**:显示出自己(执行 sudo 的使用者)的权限 +* **-b**:将要执行的指令放在后台执行 +* **-i**: 以目标用户身份运行一个登录 shell;可同时指定一条命令。相当于切换到root,不过只需要用户自己的密码即可。 + +#### 6.6 实例 + +* 以管理员身份查看shadow文件 + +```shell +[root@localhost ~]# useradd user +[root@localhost ~]# echo 123456 | passwd --stdin user +[root@localhost ~]# usermod -a -G wheel user +[root@localhost ~]# su - user +[user@localhost ~]$ cat /etc/shadow +cat: /etc/shadow: 权限不够 +[user@localhost ~]$ sudo -u root cat /etc/shadow +[sudo] user 的密码: +[user@localhost ~]$ sudo cat /etc/shadow +# sudo -u root用的比较多,可以被精简为sudo +``` + +* 查看下列示例 + +```shell +papi ALL=(root) NOPASSWD: /bin/chown,/usr/sbin/useradd +``` + + * 表示: 用户papi能在所有可能出现的主机上, 提权到root下执行`/bin/chown`, 不必输入密码; 但运行`/usr/sbin/useradd`命令时需要密码 + * 在具有sudo操作的用户下, 执行`sudo -l`可以查看到该用户被允许和被禁止运行的命令 + +* 查看下列示例 + +```shell +papi ALL=/usr/sbin/,/sbin/,!/usr/sbin/fdisk +``` + + * 命令前面加上!号表示取消该命令 + * 用户papi在所有可能出现的主机上, 能够运行目录/usr/sbin和/sbin下所有的程序, 但fdisk除外。 + +* 默认情况下输入一次sudo可以保持15分钟不再要求输入密码,如果想要延长这个时间,可以修改配置文件 + +```shell +[root@localhost ~]# visudo +Defaults env_reset,pwfeedback,timestamp_timeout=60 +# 这个是改成60分钟才会需要再次输入密码,并且输入密码的时候会显示*号 +``` + diff --git a/00.基础阶段/02.Linux基础/06.用户权限管理/Fx6dmHzgAk0fq4CO.png!thumbnail b/00.基础阶段/02.Linux基础/06.用户权限管理/Fx6dmHzgAk0fq4CO.png!thumbnail new file mode 100644 index 0000000..405108e Binary files /dev/null and b/00.基础阶段/02.Linux基础/06.用户权限管理/Fx6dmHzgAk0fq4CO.png!thumbnail differ diff --git a/00.基础阶段/02.Linux基础/06.用户权限管理/uMr1eOHxTqG6CmoS.png!thumbnail b/00.基础阶段/02.Linux基础/06.用户权限管理/uMr1eOHxTqG6CmoS.png!thumbnail new file mode 100644 index 0000000..0fc55ed Binary files /dev/null and b/00.基础阶段/02.Linux基础/06.用户权限管理/uMr1eOHxTqG6CmoS.png!thumbnail differ diff --git a/00.基础阶段/02.Linux基础/06.用户权限管理/xAgZdlGg8OXMi9mn.png!thumbnail b/00.基础阶段/02.Linux基础/06.用户权限管理/xAgZdlGg8OXMi9mn.png!thumbnail new file mode 100644 index 0000000..a478e2a Binary files /dev/null and b/00.基础阶段/02.Linux基础/06.用户权限管理/xAgZdlGg8OXMi9mn.png!thumbnail differ diff --git a/00.基础阶段/02.Linux基础/07.文件权限管理.md b/00.基础阶段/02.Linux基础/07.文件权限管理.md new file mode 100644 index 0000000..05cffb8 --- /dev/null +++ b/00.基础阶段/02.Linux基础/07.文件权限管理.md @@ -0,0 +1,547 @@ +# 07.文件权限管理 + +## 07.文件权限管理 + +### 1. 文件权限 + +文件权限设置:可以赋予某个用户或组,能够以何种方式,访问某个文件 + +Linux 系统是一种典型的多用户系统,不同的用户处于不同的地位,拥有不同的权限。 + +为了保护系统的安全性,Linux 系统对不同的用户访问同一文件(包括目录文件)的权限做了不同的规定。 + +在 Linux 中我们通常使用以下两个命令来修改文件或目录的所属用户与权限: + +* chown (change ownerp) : 修改所属用户与组。 +* chmod (change mode) : 修改用户的权限。 + +在 Linux 中我们可以使用 ll 或者 ls –l 命令来显示一个文件的属性以及文件所属的用户和组 + +![img](07.文件权限管理/wIaB0yxCbDLgvDTt.png!thumbnail) + +每个文件的属性由左边第一部分的 10 个字符来确定(如下图)。 + +![img](07.文件权限管理/QnuyL16CH36SIyYr.png!thumbnail) + +从左至右用 0-9 这些数字来表示。 + +* 第 0 位确定文件类型,第 1-3 位确定属主(该文件的所有者)拥有该文件的权限。 +* 第4-6位确定属组(所有者的同组用户)拥有该文件的权限,第7-9位确定其他用户拥有该文件的权限。 +* 其中,第 1、4、7 位表示读权限,如果用`r`字符表示,则有读权限,如果用`-`字符表示,则没有读权限; +* 第 2、5、8 位表示写权限,如果用`w`字符表示,则有写权限,如果用`-`字符表示没有写权限;第 3、6、9 位表示可执行权限,如果用`x`字符表示,则有执行权限,如果用`-`字符表示,则没有执行权限。 + +### 2. 修改文件属主chown + +chown用于设置文件所有者和文件关联组的命令 + +chown 需要超级用户`root`的权限才能执行此命令 + +```shell +chown [选项]... [所有者][:[组]] 文件... +``` + +#### 2.1 选项 + +* **-R**: 处理指定目录以及其子目录下的所有文件 +* **-v**: 显示详细的处理信息 + +#### 2.2 实例 + +* 设置所有者为root + +```shell +[root@localhost ~]# chown root anaconda-ks.cfg +``` + +* 将文件的拥有者设置为user01,允许使用的组设置为it + +```shell +[root@localhost ~]# chown user01:it file.txt +``` + +* 将目录下的所有文件拥有者设置为user01,允许使用的组设置为it + +```shell +[root@localhost ~]# chown -R user01:it dir/* +``` + +### 3. 修改文件权限chmod + +chmod是控制用户对文件的权限的命令 + +```shell +chmod [选项]... 模式[,模式]... 文件... +``` + +#### 3.1 模式 + +mode : 权限设定字串,格式如下 : + +```shell +[ugoa...][[+-=][rwx]...][,...] +``` + +* `u`表示该文件的拥有者,`g`表示与该文件的拥有者属于同一个群体(group)者,`o`表示其他以外的人,`a`表示这三者皆是。 +* `+`表示增加权限、`-`表示取消权限、`=`表示唯一设定权限。 +* `r`表示可读取,`w`表示可写入,`x`表示可执行 +* `r``w``x`权限对文件和目录的意义 + +| 权限 | 对文件的影响 | 对目录的影响 | +| :-------- | :------------------- | :--------------------------------------------------------- | +| r(读取) | 可以读取文件的内容 | 可以列出目录的内容(文件名),可以使用ls命令 | +| w(写入) | 可以更改文件的内容 | 可以创建或删除目录中的任一文件,可以使用touch、rm命令 | +| x(可执行) | 可以作为命令执行文件 | 可以访问目录的内容(取决于目录中文件的权限),可以使用cd命令 | + +#### 3.2 八进制语法 + +chmod命令可以使用八进制数来指定权限。文件或目录的权限位是由9个权限位来控制,每三位为一组,它们分别是文件所有者(User)的读、写、执行,用户组(Group)的读、写、执行以及其它用户(Other)的读、写、执行。历史上,文件权限被放在一个比特掩码中,掩码中指定的比特位设为1,用来说明一个类具有相应的优先级。 + +| # | 权限 | rwx | 二进制 | +| :--- | :------------- | :--- | :----- | +| 7 | 读 + 写 + 执行 | rwx | 111 | +| 6 | 读 + 写 | rw- | 110 | +| 5 | 读 + 执行 | r-x | 101 | +| 4 | 只读 | r-- | 100 | +| 3 | 写 + 执行 | -wx | 011 | +| 2 | 只写 | -w- | 010 | +| 1 | 只执行 | --x | 001 | +| 0 | 无 | --- | 000 | + +例如, 765 将这样解释: + +* 所有者的权限用数字表达:属主的那三个权限位的数字加起来的总和。如 rwx ,也就是 4+2+1 ,应该是 7。 +* 用户组的权限用数字表达:属组的那个权限位数字的相加的总和。如 rw- ,也就是 4+2+0 ,应该是 6。 +* 其它用户的权限数字表达:其它用户权限位的数字相加的总和。如 r-x ,也就是 4+0+1 ,应该是 5。 + +#### 3.3 选项 + +* **-f**: 若该文件权限无法被更改也不要显示错误讯息 +* **-v**: 显示权限变更的详细资料 +* **-R**: 对目前目录下的所有文件与子目录进行相同的权限变更(即以递归的方式逐个变更) + +#### 3.4 实例 + +* 限制用户user1对`file`文件的写入 + +```shell +[root@localhost ~]# chmod a-w /home/user1/file  +[root@localhost ~]# ls -lh /home/user1/file  +-r--r--r--. 1 user1 user1 0 4月  13 10:56 /home/user1/file +[root@localhost ~]# su - user1 +上一次登录:二 4月 13 10:47:41 CST 2021pts/1 上 +[user1@localhost ~]$ echo "hello world" >> file  +-bash: file: 权限不够 +``` + +* 限制所有用户删除dir目录下的文件 + +```shell +[root@localhost ~]# chmod a-w /home/user1/dir/ +[root@localhost ~]# ls -lhd /home/user1/dir +dr-xr-xr-x. 2 user1 user1 18 4月  13 10:58 /home/user1/dir +[root@localhost ~]# su - user1 +上一次登录:二 4月 13 10:57:11 CST 2021pts/1 上 +[user1@localhost ~]$ cd dir/ +[user1@localhost dir]$ rm -rf test  +rm: 无法删除"test": 权限不够 +``` + +### 4. 文件访问控制列表 + +文件访问控制列表(Access Control Lists,ACL)是Linux开的一套新的文件系统权限管理方法。 + +传统的Linux文件系统的权限控制是通过user、group、other与r(读)、w(写)、x(执行)的不同组合来实现的。随着应用的发展,这些权限组合已不能适应现时复杂的文件系统权限控制要求。例如,我们可能需把一个文件的读权限和写权限分别赋予两个不同的用户或一个用户和一个组这样的组合。传统的权限管理设置起来就力不从心了。 + +文件访问控制列表可以针对文件单独设置某个用户或者用户组队文件的管理权限。 + +#### 4.1 getfacl命名 + +获取文件访问控制列表的详细内容 + +```shell +getfacl [-aceEsRLPtpndvh] file ... +``` + +##### 4.1.1 选项 + +* **-a**:仅显示文件访问控制列表 +* **-d**:仅显示默认的访问控制列表 +* **-c**:不显示注释表头 +* **-e**:显示所有的有效权限 +* **-E**:显示无效权限 +* **-R**:递归显示子目录 +* **-t**:使用制表符分隔的输出格式 + +##### 4.1.2 实例 + +* 查看acl权限列表 + +```shell +[root@localhost ~]# getfacl anaconda-ks.cfg  +# file: anaconda-ks.cfg +# owner: root +# group: root +user::rwx +group::r-x +other::r-x +``` + +* 查看acl权限列表,不显示注释表头 + +```shell +[root@localhost ~]# getfacl -c anaconda-ks.cfg  +user::rwx +group::r-x +other::r-x +``` + +#### 4.2 setfacl命令 + +用来设置更精确的文件权限 + +```shell +setfacl [-bkndRLP] { -m|-M|-x|-X ... } file ... +``` + +##### 4.2.1 选项 + +* **-m**:更改文件的访问控制列表 +* **-M**:从文件读取访问控制列表条目更改 +* **-x**:根据文件中访问控制列表移除条目 +* **-X**:从文件读取访问控制列表条目并删除 +* **-b**:删除所有扩展访问控制列表条目 +* **-k**:移除默认访问控制列表 +* **-d**:应用到默认访问控制列表的操作 +* **-R**:递归操作子目录 + +##### 4.2.2 实例 + +* 给指定用户添加acl权限 +* 首先用户user1是没有`/workdir`的权限的 + +```shell +[root@localhost ~]# groupadd worker +[root@localhost ~]# mkdir /workdir +[root@localhost ~]# chown root:worker /workdir +[root@localhost ~]# chmod 770 /workdir # 不允许其他用户对目录的权限 +[root@localhost ~]# ll -d /workdir/ +drwxrwx---. 2 root worker 6 4月  14 09:14 /workdir/ +[root@localhost ~]# su - user1 +[user1@localhost ~]$ cd /workdir/ +-bash: cd: /workdir/: 权限不够 +``` + +* 单独给予user1的可读和可进入权限 + +```shell +[root@localhost ~]# setfacl -m u:user1:rx /workdir/ +[root@localhost ~]# getfacl -c /workdir +user::rwx +user:user1:r-x # 成功添加user1对workdir的权限 +group::rwx +mask::rwx +other::--- +[root@localhost ~]# su - user1 +[user1@localhost ~]$ cd /workdir/ +[user1@localhost workdir]$ ll -d +drwxrwx---+ 2 root worker 6 4月  14 09:14 . # 权限位后面多了一个"+",表示存在ACL权限 +[user1@localhost workdir]$ touch file +touch: 无法创建"file": 权限不够 +``` + +* 移除user1的访问控制列表权限 + +```shell +[root@localhost ~]# setfacl -x u:user1 /workdir/ +[root@localhost ~]# getfacl -c /workdir/ +user::rwx +group::rwx +mask::rwx +other::--- +``` + +* 创建worker2组,然后给这个组访问acl的权限,将user1加入worker2组验证是否成功 + +```shell +[root@localhost ~]# groupadd worker2 +[root@localhost ~]# setfacl -m g:worker2:rwx /workdir +[root@localhost ~]# usermod -aG worker2 user1 +[root@localhost ~]# su - user1 +[user1@localhost ~]$ cd /workdir/ +[user1@localhost workdir]$ touch file +``` + +* 对workdir设置的acl权限并不会被之后在workdir下创建的子文件和子目录继承,可以设置默认ACL权限,来让目录下面的新建文件和文件夹都继承父目录的权限 + +```shell +[root@localhost ~]# setfacl -b /workdir +[root@localhost ~]# setfacl -m d:u:user1:rx /workdir +# 在前面加上一个d,就可以设置默认facl权限 +[root@localhost ~]# getfacl -c /workdir +user::rwx +group::rwx +other::--- +default:user::rwx # 前面多出来了default +default:user:user1:r-x +default:group::rwx +default:mask::rwx +default:other::--- +[root@localhost ~]# touch /workdir/newfile +[root@localhost ~]# getfacl -c /workdir/newfile  +user::rw- +user:user1:r-x #effective:r-- # 新建的文件会自动继承 +group::rwx #effective:rw- +mask::rw- +other::--- +``` + +### 5. mask有效权限 + +mask 权限,指的是用户或群组能拥有的最大 ACL 权限,也就是说,给用户或群组设定的 ACL 权限不能超过 mask 规定的权限范围,超出部分做无效处理。 + +注意上面的案例,在newfile的facl中,有一个mask权限是`rw-`,所以我们即使给了user1`r-x`权限,在实际生效的时候,`x`也不会有的,注意后面的提示`#effective:r--`表示`x`权限并没有赋予。 + +#### 5.1 实例 + +* 修改上面案例中的newfile的mask权限 + +```shell +[root@localhost ~]# setfacl -m m::rwx /workdir/newfile  +[root@localhost ~]# getfacl -c /workdir/newfile  +user::rw- +user:user1:r-x +group::rwx +mask::rwx +other::--- +``` + +### 6. 特殊权限 + +文件除了上述的`r`,`w`,`x`权限以外,还有三个特殊权限:suid,sgid,sticky + +#### 6.1 suid + +suid 属性只能运用在可执行文件上,含义是开放文件所有者的权限给其他用户,即当用户执行该执行文件时,会拥有该执行文件所有者的权限。如果给一个非二进制文件文件附加suid权限,则会显示大写S,属于无效。 + +普通用户能够执行`passwd`命令修改自己的密码,修改密码其实就是修改`/etc/shadow`这个文件,查看`/etc/passwd`这个文件的权限,发现除了`root`其他人没有写权限,但是普通用户能够成功执行`passwd`,其原因就在于`passwd`这个命令的权限是`-rwsr-xr-x`,其中`s`的作用就是让执行命令的人具有和该命令拥有者相同的权限。 + +```shell +[root@localhost ~]# ll /usr/bin/passwd +-rwsr-xr-x. 1 root root 32656 May 15 2022 /usr/bin/passwd +``` + +##### 6.1.1 实例 + +* 切换成普通用户输入修改密码命令 + +```shell +[root@localhost ~]# su - user1 +[user1@localhost ~]$ passwd +更改用户 user1 的密码 。 +为 user1 更改 STRESS 密码。 +(当前)UNIX 密码: +``` + +* 保持这个会话别端口,新建一个ssh会话,查看系统进程,可以看到当前是调用root用户执行的passwd命令 + +```shell +[root@localhost ~]# ps -aux |grep passwd +root 2031 0.0 0.3 14904 6656 pts/2 S+ 22:30 0:00 passwd +root 2034 0.0 0.1 3876 2048 pts/1 S+ 22:31 0:00 grep --color=auto passwd +``` + +* 如果想某个文件添加suid权限,可以输入下面两个命令 + +```shell +chmod u+s file +chmod 4765 file +``` + +要设置特殊权限,可以使用`chmod`命令的4位数字表示法,其中第一位用于特殊权限,后三位分别代表所有者、组和其他用户的权限。特殊权限的设置如下: + +\- `4`: 设置setuid。 +\- `2`: 设置setgid。 +\- `1`: 设置sticky bit。 + +以下是一些设置特殊权限的例子: + +\- 设置setuid: `chmod u+s file` +\- 设置setgid: `chmod g+s file` +\- 设置sticky bit: `chmod o+t /dir` + +如果你想要将特殊权限与其他权限组合使用,可以这样: + +\- 设置文件的setuid和可读可执行权限:`chmod 4555 file` +\- 设置目录的setgid和可读可执行可进入权限:`chmod 2775 /dir` + +请注意,特殊权限的设置需要谨慎,因为它们可能会影响系统的安全性和文件的访问控制。通常,只有系统管理员或有经验的用户才会设置这些权限。 + +#### 6.2 sgid + +sgid 属性可运用于二进制文件或者目录,运用在文件的含义是开放文件所属组的权限给其他用户,即当用户执行该执行文件时,会拥有该执行文件所属组用户的权限。如果给一个非二进制文件文件附加sgid权限,则会显示大写S,属于无效。 + +运用在目录上的含义是,在该目录下所有用户创建的文件或者目录的所属组都和其一样。即如果`/home/user1`目录具有sgid权限,且所属组是`user1`,则任何用户在`/home/user1`下创建的子目录或者文件的所属组都是`user1`。 + +##### 6.2.1 实例 + +* 设置sgid,让用户在workdir下创建的文件都属于worker组 + +```shell +[root@localhost ~]# mkdir /workdir +[root@localhost ~]# groupadd worker +[root@localhost ~]# chown .worker /workdir/ +[root@localhost ~]# ll -d /workdir/ +drwxr-xr-x. 2 root worker 6 Nov 15 22:42 /workdir/ +[root@localhost ~]# chmod g+s /workdir/ +[root@localhost ~]# cd /workdir/ +[root@localhost workdir]# touch file +[root@localhost workdir]# ll +total 0 +-rw-r--r--. 1 root worker 0 Nov 15 22:44 file +``` + +#### 6.3 sticky + +sticky 权限只能运用于目录上,含义是该目录下所有的文件和子目录只能由所属者删除,即使其的权限是777或者其他。一个公共目录,每个人都可以创建文件,删除自己的文件,但不能删除别人的文件(仅对目录有效)。 + +##### 6.3.1 实例 + +* 设置sticky,让普通用户只能创建文件,不能删除文件 + +```shell +[root@localhost ~]# mkdir /workdir +[root@localhost ~]# chmod 1777 /workdir/ +[root@localhost ~]# ll -d /workdir/ +drwxrwxrwt. 2 root root 6 Nov 15 22:47 /workdir/ +[root@localhost ~]# su - user1 +[user1@localhost ~]$ cd /workdir/ +[user1@localhost workdir]$ touch user1file +[user1@localhost workdir]$ exit +logout +[root@localhost ~]# useradd user2 +[root@localhost ~]# su - user2 +[user2@localhost ~]$ cd /workdir/ +[user2@localhost workdir]$ rm -rf user1file # 不能删除别人的创建的文件 +rm: cannot remove 'user1file': Operation not permitted +[user2@localhost workdir]$ touch user2file +[user2@localhost workdir]$ rm -rf user2file # 只能删除自己创建的文件 +[user2@localhost workdir]$ ll +total 0 +-rw-r--r--. 1 user1 user1 0 Nov 15 22:48 user1file +``` + +### 7. chattr文件属性 + +chattr命令用于改变文件属性。 + +这项指令可改变存放在文件或目录属性,这些属性共有以下8种模式: + +* **a**:让文件或目录仅供追加用途 +* **b**:不更新文件或目录的最后存取时间 +* **c**:将文件或目录压缩后存放 +* **i**:不得任意更动文件或目录 +* **s**:保密性删除文件或目录 +* **S**:即时更新文件或目录 +* **u**:预防意外删除 + +```shell +chattr [-RV][+/-/=<属性>][文件或目录...] +``` + +#### 7.1 选项 + +* **-R**:递归处理,将指定目录下的所有文件及子目录一并处理 +* **-v <版本编号>**:设置文件或目录版本 +* **-V**:显示指令执行过程 +* **+ <属性>**:开启文件或目录的该项属性 +* **- <属性>**:关闭文件或目录的该项属性 +* **= <属性>**:指定文件或目录的该项属性 + +#### 7.2 实例 + +* 用chattr命令防止系统中某个关键文件被修改 + +```shell +[root@localhost ~]# chattr +i /etc/resolv.conf +[root@localhost ~]# lsattr /etc/resolv.conf  +----i----------- /etc/resolv.conf +[root@localhost ~]# echo test >> /etc/resolv.conf +-bash: /etc/resolv.conf: 权限不够 +``` + +* 让某个文件只能往里面追加数据,但不能删除,适用于各种日志文件 + +```shell +[root@localhost ~]# chattr +a /var/log/messages  +[root@localhost ~]# lsattr /var/log/messages  +-----a---------- /var/log/messages +[root@localhost ~]# echo > /var/log/messages  # 不允许清空日志 +-bash: /var/log/messages: 不允许的操作 +``` + +### 8. umask + +umask命令指定在建立文件时预设的权限掩码,进程、新建文件、目录的默认权限会收到umask的影响,umask表示要减掉得到权限。 + +umask可用来设定[权限掩码]。[权限掩码]是由3个八进制的数字所组成,将现有的存取权限减掉权限掩码后,即可产生建立文件时预设的权限。 + +```shell +umask [选项][权限掩码] +``` + +#### 8.1 选项 + +* **-S**:以文字的方式来表示权限掩码 + +#### 8.2 实例 + +* 查看当前用户的umask权限 + +```shell +[root@localhost ~]# umask +0022 +``` + +* 查看最终有的权限 + +```shell +[root@localhost ~]# umask -S +u=rwx,g=rx,o=rx +``` + +* 修改umask的数值(临时) + +```shell +[root@localhost ~]# umask 0000 +[root@localhost ~]# mkdir dir +[root@localhost ~]# ll +总用量 4 +drwxrwxrwx. 2 root root    6 4月  14 11:25 dir +-rw-rw-rw-. 1 root root    0 4月  14 11:25 file +``` + +* 修改umask的数值(永久) + +```shell +[root@localhost ~]# vim /etc/profile +-------------- + 59 if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then + 60     umask 002 + 61 else + 62     umask 022 + 63 fi +--------------- +[root@localhost ~]# source /etc/profile        # 立即在当前shell中生效 +``` + +* 通过umask决定新建用户`HOME`目录的权限 + +```shell +[root@localhost ~]# vim /etc/login.defs +----------------- + 61 # The permission mask is initialized to this value. If not specified, + 62 # the permission mask will be initialized to 022. + 63 UMASK 077 +------------------ +``` + diff --git a/00.基础阶段/02.Linux基础/07.文件权限管理/QnuyL16CH36SIyYr.png!thumbnail b/00.基础阶段/02.Linux基础/07.文件权限管理/QnuyL16CH36SIyYr.png!thumbnail new file mode 100644 index 0000000..4b1c755 Binary files /dev/null and b/00.基础阶段/02.Linux基础/07.文件权限管理/QnuyL16CH36SIyYr.png!thumbnail differ diff --git a/00.基础阶段/02.Linux基础/07.文件权限管理/wIaB0yxCbDLgvDTt.png!thumbnail b/00.基础阶段/02.Linux基础/07.文件权限管理/wIaB0yxCbDLgvDTt.png!thumbnail new file mode 100644 index 0000000..f8f5b8a Binary files /dev/null and b/00.基础阶段/02.Linux基础/07.文件权限管理/wIaB0yxCbDLgvDTt.png!thumbnail differ diff --git a/00.基础阶段/02.Linux基础/08.Linux网络管理.md b/00.基础阶段/02.Linux基础/08.Linux网络管理.md new file mode 100644 index 0000000..153f394 --- /dev/null +++ b/00.基础阶段/02.Linux基础/08.Linux网络管理.md @@ -0,0 +1,454 @@ +# 08.Linux网络管理 + +## 08.Linux网络管理 + +### 1. 数据通信基础 + +- 数据从产生到传递到目的地的过程中会经历好几个过程,每个过程都负责加工自己这部分的内容,类似于工厂流水线 +- 目前我们只需要有个最基本的概念: + - IP地址是用来标识网络中位置的,比如你在江苏省xxx市xxx路xxx号 + - MAC地址是每个网络设备的唯一ID,比如你的身份证号码 + - 如果想要发送数据,必须(暂且认为必须)同时拥有IP和MAC地址 + - Linux的网络管理基础部分就是需要大家掌握IP地址的配置 + +![image-20200614103051567](08.Linux网络管理/image-20200614103051567.png) + +#### 1.1 IP地址 + +- 在IP网络中,通信节点需要有一个唯一的IP地址 +- IP地址用于IP报文的寻址以及标识一个节点 +- IPv4地址一共32bits,使用点分十进制的形式表示 + +![image-20200614132903507](08.Linux网络管理/image-20200614132903507.png) + +- IPv4地址由网络位和主机位组成 + - 网络位一致表示在同一个广播域中,可以直接通信 + - 主机位用于在同一个局域网中标识唯一节点 + +##### 1.1.1 早期IP地址的划分 + +![image-20200614133037272](08.Linux网络管理/image-20200614133037272.png) + +- 早期参与互联网的设备不多,所以仅仅使用ABC类地址分配给用户即可 +- 随着网络用户的增多,ABC类分配地址过于浪费,于是出现子网掩码方式划分网络位和主机位 + +##### 1.1.2 IP网络通信类型 + +- 单播(Unicast) +- 广播(Broadcast) +- 组播(Multicast) + +##### 1.1.3 子网掩码(Netmask) + +- 网络掩码与IP地址搭配使用,用于描述一个IP地址中的网络部分及主机部分 +- 网络掩码32bits,与32bits的IP地址一一对应,掩码中为1的位对应IP地址中的网络位,掩码中为0的位对应IP地址中的主机位 + +![image-20200614133243651](08.Linux网络管理/image-20200614133243651.png) + +- 减少一个局域网中的设备数量可以有效降低广播报文消耗资源 + +- 可变长子网掩码可以将一个局域网中的主机地址分配的更加小 + +![image-20200614133433026](08.Linux网络管理/image-20200614133433026.png) + +##### 1.1.4 广播地址与网络号 + +- 在局域网中经常会有广播的需要(比如,mac地址查询,地址冲突检测等等),所以将主机位全为1的地址做为本局域网的广播地址(注意!广播并不能跨越不同的局域网) +- 在网络中需要表示整个局域网,就像邮政编码表示一个大的区域一样,所以将主机位全为0的地址作为本局域网的网络号,用来代指整个网段 +- 综上所述,计算产生的子网及每个子网的主机数量公式如下: + +![image-20200614133755889](08.Linux网络管理/image-20200614133755889.png) + +##### 1.1.5 私有IP地址 + +- 如果要取得互联网合法地址用于通信,必须要找iana.org组织分配 +- 很多企业内部都有大量的网络设备,大多数时候这些设备只需要内部通信即可 +- 企业的网络管理员可以从如下网段中自行分配地址 + +![image-20200614134206448](08.Linux网络管理/image-20200614134206448.png) + +- 私有IP地址空间中的地址不需要申请,随意使用,但是不能在互联网上与合法地址通信(因为对方没法回复你这个地址,因为世界上私有IP地址段无数个重复的,怎么知道回到谁那里呢) +- 而我们明明用的私有IP地址,也可以上网,因为我们需要先把自己的上网请求提交给网络中的网关(就是你家的出口路由器),再由网关代替我们去获取内容转交给我们的电脑手机,而网关往往能从运营商那里得到一个合法的公有IP地址 + + + +### 2. DHCP + +DHCP(动态主机配置协议),主要用于给设备自动的分配IP地址以及网络信息,以便网络设备能够连接到网络并进行通信 + +DHCP给设备提供的信息如下: + +- IP地址 +- 子网掩码 +- 网关地址 +- DNS服务器地址 +- 租约时间 + + + +#### 2.1 DHCP工作过程 + +1. 客户端启动时发送 DHCP 发现(DHCPDISCOVER)广播消息,寻找 DHCP 服务器。 +2. DHCP 服务器收到广播消息后,会提供一个未被使用的 IP 地址以及其他网络配置信息(如子网掩码、默认网关、DNS 服务器等),并发送 DHCP 提供(DHCPOFFER)消息给客户端。 +3. 客户端收到一个或多个 DHCP 提供消息后,会选择其中一个 DHCP 服务器提供的 IP 地址,并发送 DHCP 请求(DHCPREQUEST)消息确认。 +4. DHCP 服务器收到客户端的 DHCP 请求消息后,会将该 IP 地址分配给客户端,并发送 DHCP 确认(DHCPACK)消息给客户端。 +5. 客户端收到 DHCP 确认消息后,就可以使用分配到的 IP 地址和其他网络配置参数连接到网络了。 + +`dhclient` + +我们可以通过抓包软件,捕捉到主机通过DHCP方式获取ip的过程,一共有4个数据包: + +![image-20200616170847279](08.Linux网络管理/image-20200616170847279.png) + +其中每个数据包的作用如下: + +1. `Discover`消息是用于客户端向整个内网发送广播,期待DHCP服务器进行回应 + 1. 这个数据包中的重要内容就是:消息类型,客户端ID,主机名,请求获得的信息 +2. `Offer`消息是DHCP服务器对客户的回应 + 1. 这个消息中会回复对方所需要的所有信息 +3. `Request`这个是客户端确认DHCP服务器的消息 + 1. 这个消息和第一个消息差不多,但是消息类别变为`Request`,并且会携带请求的IP地址 +4. `ACK`DHCP服务器给客户端的最终确认 + 1. 这个消息和第二个消息差不多,但是消息类型变为`ACK` + +#### 2.2 DHCP续租 + +DHCP分配的信息是有有效期的,再租约时间快到的时候,如果我们想要继续使用这个地址信息,就需要向DHCP服务器续租 + +这也是大家虚拟机上IP地址经常发生变化的原因,这是因为虚拟机上默认就是以DHCP的方式获得IP地址的 + +我们可以查看Linux上的网络配置信息,该信息位于`/etc/NetworkManager/system-connections/ens160.nmconnection` + +```bash +[root@localhost ~]# cat /etc/NetworkManager/system-connections/ens160.nmconnection +[connection] +id=ens160 +uuid=dfea55d8-6ddc-3229-8152-cb9e261de181 +type=ethernet +autoconnect-priority=-999 +interface-name=ens160 +timestamp=1731149277 + +[ethernet] + +[ipv4] +method=auto + +[ipv6] +addr-gen-mode=eui64 +method=auto + +[proxy] + + +# 可以看到配置中的method字段是以dhcp来获得IP地址的。 +``` + +同样从VMware的虚拟网络设置中,也可以看到租约时间相关的内容 + +![image-20240524145622911](08.Linux网络管理/image-20240524145622911.png) + + + +### 3. DNS(域名解析) + +DNS(Domain Name System) 是一套从域名到IP的映射的协议 + +在网络世界中,如果我们想要给某个机器,或者是某个网站去发送一个数据,都需要通过IP地址来找到对方,比如我们想要使用百度来搜索东西,就需要知道百度的IP地址,换句话说只要知道了百度的IP地址,我们就可以访问到百度 + +但是IP地址不易记忆,不可能记住每一个网站的IP地址是什么,于是早期的搞IT的那帮人研发出一个叫做主机名的东西。 + +最开始人们把IP和主机名的的对应关系记录在本地,这个文件目前在windows系统的`C:\Windows\System32\drivers\etc\hosts`中。但是后面发现并不好用,而且需要经常手动更新这个文件。类似于黄历 + + + +随着主机名越来越多,hosts文件不易维护,所以后来改用**域名解析系统DNS**: + +- 一个组织的系统管理机构,维护系统内的每个主机的`IP和主机名`的对应关系 +- 如果新计算机接入网络,将这个信息注册到`数据库`中 +- 用户输入域名的时候,会自动查询`DNS`服务器,由`DNS服务器`检索数据库, 得到对应的IP地址。 + +#### 3.1 域名 + +主域名是用来识别主机名称和主机所属的组织机构的一种分层结构的名称。 +例如:http://www.baidu.com(域名使用.连接) + +- com: 一级域名,表示这是一个企业域名。同级的还有 "net"(网络提供商),"org"(非盈利组织) 等。 +- baidu: 二级域名, 公司名。 +- www: 只是一种习惯用法,并不是每个域名都支持。 +- http:// : 要使用什么协议来连接这个主机名。 + +#### 3.2 常见的域名解析服务器 + +- 114dns + +​ 114.114.114.114 + +​ 114.114.115.115 + +​ 这是国内用户量数一数二的 dns 服务器,该 dns 一直标榜高速、稳定、无劫持、防钓鱼。 + +- Google DNS + +​ 8.8.8.8 + +​ 8.8.4.4 + +​ ...... + +可以理解为由这些服务器帮我们记录的域名和IP的对应关系,我们访问域名的时候去找这些dns服务器询问该域名对应的IP地址,当然,除了上述提到的这些dns服务器,三大运营商也提供了dns解析服务 + +#### 3.3 域名解析的过程 + +1. 浏览器发起域名解析,首先查询浏览器缓存,如果没有,就查询hosts文件,如果没有就提出域名解析请求 +2. 客户机提出域名解析请求,并将该请求发送给本地的域名服务器。 +3. 当本地的域名服务器收到请求后,就先查询本地的缓存,如果有该纪录项,则本地的域名服务器就直接把查询的结果返回。 +4. 如果本地的缓存中没有该纪录,则本地域名服务器就直接把请求发给根域名服务器,然后根域名服务器再返回给本地域名服务器一个所查询域(根的子域)的主域名服务器的地址。 +5. 本地服务器再向上一步返回的域名服务器发送请求,然后接受请求的服务器查询自己的缓存,如果没有该纪录,则返回相关的下级的域名服务器的地址。 +6. 重复第四步,直到找到正确的纪录。 +7. 本地域名服务器把返回的结果保存到缓存,以备下一次使用,同时还将结果返回给客户机 + + + +### 4. 配置网络服务 + +#### 4.1 图形化配置网络 + +使用nmtui命令来配置网络 + +```bash +[root@localhost ~]# nmtui +# 可以将环境变量改成中文 +[root@localhost ~]# yum install -y langpacks-zh_CN # 安装中文包支持 +[root@localhost ~]# export LANG=zh_CN.UTF-8 +# 改回英文是LANG=en_US.UTF-8 +``` + +![image-20241122171056057](08.Linux网络管理/image-20241122171056057.png) + +![image-20241122171126506](08.Linux网络管理/image-20241122171126506.png) + +![image-20241122171159047](08.Linux网络管理/image-20241122171159047.png) + +![image-20241122171305718](08.Linux网络管理/image-20241122171305718.png) + +![image-20241122171325905](08.Linux网络管理/image-20241122171325905.png) + +##### 4.1.1 重新加载网络配置 + +```sh +[root@localhost ~]# systemctl restart NetworkManager + +# 或者先禁用再启用网卡 +[root@localhost ~]# yum install -y NetworkManager-initscripts-updown-1:1.48.10-2.el9_5.noarch +[root@localhost ~]# ifdown ens160 # 禁用网卡 +[root@localhost ~]# ifup ens160 # 启用网卡 +``` + +#### 4.2 命令行配置网络 + +```bash +# 修改网卡配置文件 +[root@localhost ~]# cat /etc/NetworkManager/system-connections/ens160.nmconnection +[connection] +id=ens160 +uuid=dfea55d8-6ddc-3229-8152-cb9e261de181 +type=ethernet +autoconnect-priority=-999 +interface-name=ens160 +timestamp=1732264040 + +[ethernet] + +[ipv4] +address1=192.168.88.110/24,192.168.88.2 +dns=114.114.114.114;114.114.115.115; +method=manual + +[ipv6] +addr-gen-mode=eui64 +method=auto + +[proxy] +``` + +当修改完Linux系统中的服务配置文件后,并不会对服务程序立即产生效果。要想让服务程序获取到最新的配置文件,需要手动重启相应的服务,之后就可以看到网络畅通了 + +```bash +[root@localhost ~]# systemctl restart NetworkManager +[root@localhost ~]# ping -c 4 www.baidu.com +PING www.a.shifen.com (180.101.50.242) 56(84) bytes of data. +64 bytes from 180.101.50.242 (180.101.50.242): icmp_seq=1 ttl=128 time=11.3 ms +64 bytes from 180.101.50.242 (180.101.50.242): icmp_seq=2 ttl=128 time=8.70 ms +64 bytes from 180.101.50.242 (180.101.50.242): icmp_seq=3 ttl=128 time=13.5 ms +64 bytes from 180.101.50.242 (180.101.50.242): icmp_seq=4 ttl=128 time=9.95 ms + +--- www.a.shifen.com ping statistics --- +4 packets transmitted, 4 received, 0% packet loss, time 3005ms +rtt min/avg/max/mdev = 8.703/10.882/13.535/1.793 ms +``` + +##### 4.2.1 网卡配置文件参数 + +| **节** | **参数** | **描述** | +| -------------- | ---------------------- | ------------------------------------------------------------ | +| `[connection]` | `id` | 连接的名称,这里是 `ens160`。 | +| | `uuid` | 连接的唯一标识符(UUID),用于唯一识别此连接。 | +| | `type` | 连接的类型,`ethernet` 表示这是一个以太网连接。 | +| | `autoconnect-priority` | 自动连接优先级,数值越小优先级越低。这里设置为 `-999`,表示极低的优先级。 | +| | `interface-name` | 连接对应的网络接口名称,这里是 `ens160`。 | +| | `timestamp` | 连接的时间戳,表示最后修改的时间。 | +| `[ethernet]` | - | 此节用于配置以太网特定的设置,当前没有额外参数。 | +| `[ipv4]` | `address1` | 静态 IPv4 地址及其子网掩码,格式为 `IP地址/子网掩码` 和网关,例:`192.168.88.110/24,192.168.88.2`。 | +| | `dns` | DNS 服务器地址,多个地址用分号分隔,这里是 `114.114.114.114;114.114.115.115;`。 | +| | `method` | IPv4 地址配置方法,这里设置为 `manual`,表示使用手动配置。 | +| `[ipv6]` | `addr-gen-mode` | 地址生成模式,`eui64` 表示使用 EUI-64 地址生成方式。 | +| | `method` | IPv6 地址配置方法,这里设置为 `auto`,表示自动获取 IPv6 地址。 | +| `[proxy]` | - | 此节用于配置代理设置,当前没有额外参数。 | + +#### 4.3 nmcli 工具详解 + +nmcli命令是redhat7或者centos7之后的命令,该命令可以完成网卡上所有的配置工作,并且可以写入 配置文件,永久生效 + +- 查看接口状态 + +```bash +[root@localhost ~]# nmcli device status +DEVICE TYPE STATE CONNECTION +ens160 ethernet connected ens160 +lo loopback connected (externally) lo +``` + +- 查看链接信息 + +```bash +[root@localhost ~]# nmcli connection show +NAME UUID TYPE DEVICE +ens160 dfea55d8-6ddc-3229-8152-cb9e261de181 ethernet ens160 +lo 529b2eed-2755-4cce-af3c-999beb49882d loopback lo +``` + +- 配置IP等网络信息 + +```bash +[root@localhost ~]# nmcli con mod "ens160" ipv4.addresses 192.168.88.140/24 ipv4.gateway 192.168.88.2 ipv4.dns "8.8.8.8,8.8.4.4" ipv4.method manual +``` + +- 启动/停止接口 + +```bash +[root@localhost ~]# nmcli connection down ens160 +[root@localhost ~]# nmcli connection up ens160 +``` + +- 创建链接 + +```bash +[root@localhost ~]# nmcli connection add type ethernet ifname ens160 con-name dhcp_ens160 +# 激活链接 +[root@localhost ~]# nmcli connection up dhcp_ens160 +``` + +- 删除链接 + +```bash +[root@localhost ~]# nmcli connection delete dhcp_ens160 +成功删除连接 'dhcp_ens160'(37adadf4-419d-47f0-a0f6-af849160a4f7)。 +``` + + + +### 5. ifconfig + +- ifconfig 命令用于显示或设置网络设备。 + +**安装:**`yum install -y net-tools` + +#### 5.1 语法 + +```bash +ifconfig [network_interface] + [down|up] + [add
] + [del
] + [hw ] + [io_addr ] + [irq ] + [media ] + [mem_start ] + [metric ] + [mtu ] + [netmask ] + [tunnel
] + [-broadcast
] + [-pointopoint
] + [] +``` + +#### 5.2 选项说明 + +- `down`/`up`: 禁用/启用网络接口 +- `add
`/`del
`: 添加或删除 IP 地址 +- `hw `: 设置硬件地址 (MAC 地址) +- `io_addr `: 设置 I/O 地址 +- `irq `: 设置中断请求 +- `media `: 设置网络媒体类型 +- `mem_start `: 设置内存起始地址 +- `metric `: 设置路由度量值 +- `mtu `: 设置 MTU 值 +- `netmask `: 设置子网掩码 +- `tunnel
`: 设置隧道地址 +- `-broadcast
`: 设置广播地址 +- `-pointopoint
`: 设置点对点地址 +- ``: 设置 IP 地址 + +#### 5.3 实例 + +- 显示网络设备信息 + +```bash +[root@localhost cmatrix-1.2a]# ifconfig +ens33: flags=4163 mtu 1500 + inet 192.168.88.136 netmask 255.255.255.0 broadcast 192.168.88.255 + inet6 fe80::a49c:12c9:1ebd:8fb2 prefixlen 64 scopeid 0x20 + ether 00:0c:29:cb:d5:1a txqueuelen 1000 (Ethernet) + RX packets 122441 bytes 178564616 (170.2 MiB) + RX errors 0 dropped 0 overruns 0 frame 0 + TX packets 13762 bytes 1315614 (1.2 MiB) + TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 + +lo: flags=73 mtu 65536 + inet 127.0.0.1 netmask 255.0.0.0 + inet6 ::1 prefixlen 128 scopeid 0x10 + loop txqueuelen 1000 (Local Loopback) + RX packets 0 bytes 0 (0.0 B) + RX errors 0 dropped 0 overruns 0 frame 0 + TX packets 0 bytes 0 (0.0 B) + TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 +``` + +- 启动关闭指定网卡 + +```bash +[root@localhost ~]# ifconfig ens33 down +[root@localhost ~]# ifconfig ens33 up +``` + +- 配置IP地址 + +```bash +[root@localhost ~]# ifconfig eth0 192.168.1.56 +//给eth0网卡配置IP地址 +[root@localhost ~]# ifconfig eth0 192.168.1.56 netmask 255.255.255.0 +// 给eth0网卡配置IP地址,并加上子掩码 +[root@localhost ~]# ifconfig eth0 192.168.1.56 netmask 255.255.255.0 broadcast 192.168.1.255 +// 给eth0网卡配置IP地址,加上子掩码,加上个广播地址 +``` + +- 设置最大传输单元 + +```bash +[root@localhost ~]# ifconfig eth0 mtu 1500 +//设置能通过的最大数据包大小为 1500 bytes +``` + diff --git a/00.基础阶段/02.Linux基础/08.Linux网络管理/image-20200614103051567.png b/00.基础阶段/02.Linux基础/08.Linux网络管理/image-20200614103051567.png new file mode 100644 index 0000000..32d8c1f Binary files /dev/null and b/00.基础阶段/02.Linux基础/08.Linux网络管理/image-20200614103051567.png differ diff --git a/00.基础阶段/02.Linux基础/08.Linux网络管理/image-20200614132903507.png b/00.基础阶段/02.Linux基础/08.Linux网络管理/image-20200614132903507.png new file mode 100644 index 0000000..7fc7b27 Binary files /dev/null and b/00.基础阶段/02.Linux基础/08.Linux网络管理/image-20200614132903507.png differ diff --git a/00.基础阶段/02.Linux基础/08.Linux网络管理/image-20200614133037272.png b/00.基础阶段/02.Linux基础/08.Linux网络管理/image-20200614133037272.png new file mode 100644 index 0000000..64dc746 Binary files /dev/null and b/00.基础阶段/02.Linux基础/08.Linux网络管理/image-20200614133037272.png differ diff --git a/00.基础阶段/02.Linux基础/08.Linux网络管理/image-20200614133243651.png b/00.基础阶段/02.Linux基础/08.Linux网络管理/image-20200614133243651.png new file mode 100644 index 0000000..305ec9d Binary files /dev/null and b/00.基础阶段/02.Linux基础/08.Linux网络管理/image-20200614133243651.png differ diff --git a/00.基础阶段/02.Linux基础/08.Linux网络管理/image-20200614133433026.png b/00.基础阶段/02.Linux基础/08.Linux网络管理/image-20200614133433026.png new file mode 100644 index 0000000..627f128 Binary files /dev/null and b/00.基础阶段/02.Linux基础/08.Linux网络管理/image-20200614133433026.png differ diff --git a/00.基础阶段/02.Linux基础/08.Linux网络管理/image-20200614133755889.png b/00.基础阶段/02.Linux基础/08.Linux网络管理/image-20200614133755889.png new file mode 100644 index 0000000..2b3a674 Binary files /dev/null and b/00.基础阶段/02.Linux基础/08.Linux网络管理/image-20200614133755889.png differ diff --git a/00.基础阶段/02.Linux基础/08.Linux网络管理/image-20200614134206448.png b/00.基础阶段/02.Linux基础/08.Linux网络管理/image-20200614134206448.png new file mode 100644 index 0000000..50e6708 Binary files /dev/null and b/00.基础阶段/02.Linux基础/08.Linux网络管理/image-20200614134206448.png differ diff --git a/00.基础阶段/02.Linux基础/08.Linux网络管理/image-20200616170847279.png b/00.基础阶段/02.Linux基础/08.Linux网络管理/image-20200616170847279.png new file mode 100644 index 0000000..5e98d87 Binary files /dev/null and b/00.基础阶段/02.Linux基础/08.Linux网络管理/image-20200616170847279.png differ diff --git a/00.基础阶段/02.Linux基础/08.Linux网络管理/image-20240524145622911.png b/00.基础阶段/02.Linux基础/08.Linux网络管理/image-20240524145622911.png new file mode 100644 index 0000000..cdfff2b Binary files /dev/null and b/00.基础阶段/02.Linux基础/08.Linux网络管理/image-20240524145622911.png differ diff --git a/00.基础阶段/02.Linux基础/08.Linux网络管理/image-20241122171056057.png b/00.基础阶段/02.Linux基础/08.Linux网络管理/image-20241122171056057.png new file mode 100644 index 0000000..bddad65 Binary files /dev/null and b/00.基础阶段/02.Linux基础/08.Linux网络管理/image-20241122171056057.png differ diff --git a/00.基础阶段/02.Linux基础/08.Linux网络管理/image-20241122171126506.png b/00.基础阶段/02.Linux基础/08.Linux网络管理/image-20241122171126506.png new file mode 100644 index 0000000..627b997 Binary files /dev/null and b/00.基础阶段/02.Linux基础/08.Linux网络管理/image-20241122171126506.png differ diff --git a/00.基础阶段/02.Linux基础/08.Linux网络管理/image-20241122171159047.png b/00.基础阶段/02.Linux基础/08.Linux网络管理/image-20241122171159047.png new file mode 100644 index 0000000..aa53e0b Binary files /dev/null and b/00.基础阶段/02.Linux基础/08.Linux网络管理/image-20241122171159047.png differ diff --git a/00.基础阶段/02.Linux基础/08.Linux网络管理/image-20241122171305718.png b/00.基础阶段/02.Linux基础/08.Linux网络管理/image-20241122171305718.png new file mode 100644 index 0000000..9dd8176 Binary files /dev/null and b/00.基础阶段/02.Linux基础/08.Linux网络管理/image-20241122171305718.png differ diff --git a/00.基础阶段/02.Linux基础/08.Linux网络管理/image-20241122171325905.png b/00.基础阶段/02.Linux基础/08.Linux网络管理/image-20241122171325905.png new file mode 100644 index 0000000..2a7028d Binary files /dev/null and b/00.基础阶段/02.Linux基础/08.Linux网络管理/image-20241122171325905.png differ diff --git a/00.基础阶段/02.Linux基础/09.防火墙与selinux.md b/00.基础阶段/02.Linux基础/09.防火墙与selinux.md new file mode 100644 index 0000000..9b75235 --- /dev/null +++ b/00.基础阶段/02.Linux基础/09.防火墙与selinux.md @@ -0,0 +1,1372 @@ +# 09.防火墙与selinux + +## 09.防火墙与selinux + +### 1. 防火墙相关概念 + +主要作用:保护内部的网络、主机、服务的安全等 + +我们常听到的防火墙有很多不同的类型,从大的角度来看,主要是分为硬件防火墙和软件防火墙。 + +**硬件防火墙:** + +![image-20240522113032125](09.防火墙与selinux/image-20240522113032125.png) + +**软件防火墙:** + +软件防火墙就是通过软件来对数据包,流量请求进行过滤等,属于从软件层面保护系统的安全。如我们熟知的360,金山毒霸,火绒安全等等。 + +当然防火墙除了软件及硬件的分类,也可以对数据封包的取得方式来分类,可分为**代理服务器(Proxy)**及**封包过滤机制(IP Filter)**。 + +- 代理服务 + + - 是一种网络服务,通常就架设在路由上面,可完整的掌控局域网的对外连接。 + +- IP Filter + + - 这种方式可以直接分析最底层的封包表头数据来进行过滤,所以包括 MAC地址, IP, TCP, UDP, ICMP 等封包的信息都可以进行过滤分析的功能,用途非常广泛。 + + 相较于企业内网,外部的公网环境更加恶劣,罪恶丛生。在公网与企业内网之间充当保护屏障的防火墙虽然有软件或硬件之分,但主要功能都是依据策略对穿越防火墙自身的流量进行过滤。防火墙策略可以基于流量的源目地址、端口号、协议、应用等信息来定制,然后防火墙使用预先定制的策略规则监控出入的流量,若流量与某一条策略规则相匹配,则执行相应的处理,反之则丢弃。这样一来,就可以保证仅有合法的流量在企业内网和外部公网之间流动了 + +### 2. RHEL/Centos系统 + +对于RHEL、Centos等红帽系Linux操作系统,我们常用到的防火墙软件主要有**iptables和firewalld** + +- iptables: + - iptables 是 Linux 默认的防火墙管理工具,它是基于命令行的。 + - iptables 使用规则表(tables)和规则链(chains)的方式来控制网络数据包的流向和处理。 + - iptables 提供了强大的灵活性和细粒度的控制,可以根据数据包的各种属性进行复杂的过滤和转发操作。 + - iptables 的配置相对比较复杂,需要对防火墙的工作原理有一定的了解。 +- firewalld: + - firewalld 是 RHEL/CentOS 7 及以后版本中引入的动态防火墙管理工具。 + - firewalld 采用区域(zones)和服务(services)的概念来管理防火墙规则,相比 iptables 更加简单和易用。 + - firewalld 支持动态更新防火墙规则,无需重启服务即可生效,这对于需要经常调整防火墙的场景很有帮助。 + - firewalld 提供了图形化的管理界面,方便管理员进行配置和管理。 + + + +**不过,对于Linux而言,其实Iptables和firewalld服务不是真正的防火墙,只是用来定义防火墙规则功能的"防火墙管理工具",将定义好的规则交由内核中的netfilter即网络过滤器来读取,从而真正实现防火墙功能。** + + + +### 3. iptables + +iptables过滤数据包的方式: + +- 允许/拒绝让 Internet 的封包进入 Linux 主机的某些 port + +- 允许/拒绝让某些来源 IP 的封包进入 + +- 允许/拒绝让带有某些特殊标志( flag )的封包进入 + +- 分析硬件地址(MAC)来提供服务 + +#### 3.1 五链 + +iptables命令中设置数据过滤或处理数据包的策略叫做规则,将多个规则合成一个链,叫规则链。 +规则链则依据处理数据包的位置不同分类: + +- PREROUTING + - 在进行路由判断之前所要进行的规则(DNAT/REDIRECT) +- INPUT + - 处理入站的数据包 +- OUTPUT + - 处理出站的数据包 +- FORWARD + - 处理转发的数据包 +- POSTROUTING + - 在进行路由判断之后所要进行的规则(SNAT/MASQUERADE) + + + +#### 3.2 四表 + +iptables中的规则表是用于容纳规则链,规则表默认是允许状态的,那么规则链就是设置被禁止的规则,而反之如果规则表是禁止状态的,那么规则链就是设置被允许的规则。 + +- raw表 + - 确定是否对该数据包进行状态跟踪 +- mangle表 + - 为数据包设置标记(较少使用) +- nat表 + - 修改数据包中的源、目标IP地址或端口 +- filter表 + - 确定是否放行该数据包(过滤) + + ![img](09.防火墙与selinux/1387124-20180606225916717-862172332-16448038271021.png) + + **规则表的先后顺序:0000 + +规则链的先后顺序: + +- 入站顺序 + - PREROUTING→INPUT +- 出站顺序 + - OUTPUT→POSTROUTING +- 转发顺序 + - PREROUTING→FORWARD→POSTROUTING + +![image-20200503111419946](09.防火墙与selinux/image-20200503111419946-16448038271032.png) + +#### 3.3 基本选项和用法 + +##### 3.3.1 选项 + +| 参数 | 作用 | +| ------------ | ----------------------------------------------------------- | +| -P | 设置默认策略:iptables -P INPUT (DROP\|ACCEPT)类似于黑白名单 | +| -F | 清空规则链 | +| -L | 查看规则链 | +| -A | 在规则链的末尾加入新规则 | +| -I num | 在规则链的头部加入新规则 | +| -D num | 删除某一条规则 | +| -s | 匹配来源地址IP/MASK,加叹号"!"表示除这个IP外。 | +| -d | 匹配目标地址 | +| -i 网卡名称 | 匹配从这块网卡流入的数据 | +| -o 网卡名称 | 匹配从这块网卡流出的数据 | +| -p | 匹配协议,如tcp,udp,icmp | +| --dports num | 匹配目标端口号 | +| --sports num | 匹配来源端口号 | + + + +为了防止firewalld与iptables的冲突,建议在学习iptables的时候,先关闭firewalld + + + +##### 3.3.2 简单用法(初体验) + +案例:现在有一个web服务提供网站访问,默认情况下是允许被我们的主机访问的,我们可以尝试通过设置iptables的策略,来禁止别人访问该网站 + +- 为了防止firewalld对iptables的影响,我们学习iptables的时候应该关闭firewalld + +```bash +[root@localhost ~]# systemctl stop firewalld +``` + +- 网站部署: + +```bash +[root@localhost ~]# yum install -y epel-release +# 安装扩展源,以便安装下面的web服务器nginx +[root@localhost ~]# yum install -y nginx +# 安装web服务器 +[root@localhost ~]# systemctl start nginx +# 启动web服务器 +``` + +- 访问测试: + +打开浏览器访问你的**IP地址**,可以看到有一个网站(nginx提供的默认页面) + +![image-20240522222025959](09.防火墙与selinux/image-20240522222025959.png) + +- 接下来通过iptables进行访问控制 + +```bash +[root@localhost ~]# iptables -A INPUT -p tcp --dport 80 -j DROP +# 对INPUT链上增加一个策略,丢弃掉来自80端口tcp协议的请求报文 +``` + +- 再次访问发现,这个网站已经打不开了,提示回应超时! + +![image-20240522222326150](09.防火墙与selinux/image-20240522222326150.png) + +- 在Linux上查看刚刚添加的过滤规则 + +```bash +[root@localhost ~]# iptables -vnL INPUT --line-numbers +Chain INPUT (policy ACCEPT 62 packets, 4776 bytes) +num pkts bytes target prot opt in out source destination +1 75 3900 DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 +``` + +#### 3.4 iptables规则说明 + +- 规则:根据指定的匹配条件来尝试匹配每个经流“关卡”的报文,一旦匹配成功,则由规则后面指定的处理动作进行处理 +- 匹配条件 + - 基本匹配条件:sip、dip + - 扩展匹配条件:sport、dport + - 扩展条件也是条件的一部分,只不过使用的时候需要用`-m`参数声明对应的模块 +- 处理动作 + - accept:接受 + - drop:丢弃 + - reject:拒绝 + - snat:源地址转换,解决内网用户同一个公网地址上上网的问题 + - masquerade:是snat的一种特殊形式,使用动态的、临时会变的ip上 + - dnat:目标地址转换 + - redirect:在本机作端口映射 + - log:记录日志,/var/log/messages文件记录日志信息,然后将数据包传递给下一条规则 + + + +#### 3.5 iptables高级用法 + +![未命名绘图](09.防火墙与selinux/未命名绘图.png) + + + +- `-t table`指定表 + - raw + - mangle + - nat + - filter 默认 +- `-A`:添加规则,后面更上你要添加到哪个链上 +- `-j`:设置处理策略 + - accept:接受 + - drop:丢弃 + - reject:拒绝 +- `-s`:指定数据包的来源地址 +- `-p`:指定数据包协议类型 + - tcp + - udp + - icmp + - ...... + +##### 3.5.1 增加规则 + +**案例一:**屏蔽来自其他主机上的ping包 + +```bash +# 正常通过cmd去ping我们的虚拟机的IP地址 +C:\Users\Atopos>ping 192.168.88.136 + +正在 Ping 192.168.88.136 具有 32 字节的数据: +来自 192.168.88.136 的回复: 字节=32 时间<1ms TTL=64 +来自 192.168.88.136 的回复: 字节=32 时间<1ms TTL=64 +来自 192.168.88.136 的回复: 字节=32 时间<1ms TTL=64 +来自 192.168.88.136 的回复: 字节=32 时间<1ms TTL=64 + +192.168.88.136 的 Ping 统计信息: + 数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失), +往返行程的估计时间(以毫秒为单位): + 最短 = 0ms,最长 = 0ms,平均 = 0ms + + +# 在虚拟机上屏蔽来自我们物理机的ping包,注意物理机的IP的地址为:192.168.xxx.1 +# ping命令是基于icmp协议的,所以这里对类型为icmp协议的数据包进行丢弃 +[root@localhost ~]# iptables -A INPUT -s 192.168.88.1 -p icmp -j DROP + +# 丢弃以后ping测试: +C:\Users\Atopos>ping 192.168.88.136 + +正在 Ping 192.168.88.136 具有 32 字节的数据: +请求超时。 + +# 注意,DROP和REJECT有一定的区别,DROP为丢弃数据包,不给予对方回应,所以对方就会一直等待。REJECT是拒绝对方,会将拒绝的数据包发给对方,对方就会知道我们拒绝的访问。 +# 如果改成REJECT现象是: +C:\Users\Atopos>ping 192.168.88.136 + +正在 Ping 192.168.88.136 具有 32 字节的数据: +来自 192.168.88.136 的回复: 无法连到端口。 +来自 192.168.88.136 的回复: 无法连到端口。 +来自 192.168.88.136 的回复: 无法连到端口。 +来自 192.168.88.136 的回复: 无法连到端口。 + +192.168.88.136 的 Ping 统计信息: + 数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失), + + +`其他用法` +[root@localhost ~]# iptables -A INPUT -s 192.168.88.100 -j ACCEPT +# 目标来自 192.168.88.100 这个 IP 的封包都予以接受 +[root@localhost ~]# iptables -A INPUT -s 192.168.88.0/24 -j ACCEPT +[root@localhost ~]# iptables -A INPUT -s 192.168.88.10 -j DROP +# 192.168.88.0/24 可接受,但 192.168.88.10 丢弃 +``` + +**案例二:**屏蔽Linux系统中的远程链接服务(sshd),使得我们无法通过MobaXterm连接到虚拟机上 + +```bash +[root@localhost ~]# iptables -A INPUT -p tcp --dport 22 -j REJECT +# ssh服务所用的协议类型为tcp协议,端口号为22 +# 所以我们将来自22端口上的tcp协议数据包给拒绝 +``` + +当敲完这个命令以后,你的远程连接就会中断了,可以在VMware中的虚拟机终端上删除这个规则,就恢复了 + +删除命令:`iptables -D INPUT -p tcp --dport 22 -j REJECT` + + + +##### 3.5.2 查看规则 + +```bash +[root@localhost ~]# iptables [-t tables] [-L] [-nv] +参数: +-t 后面接table,例如nat或filter,如果省略,默认显示filter +-L 列出目前的table的规则 +-n 不进行IP与主机名的反查,显示信息的速度会快很多 +-v 列出更多的信息,包括封包数,相关网络接口等 +--line-numbers 显示规则的序号 +``` + +- 查看具体每个表的规则 + + - policy:当前链的默认策略,当所有规则都没有匹配成功时执行的策略 + - packets:当前链默认策略匹配到的包的数量 + - bytes:当前链默认策略匹配到的包的大小 + - pkts:对应规则匹配到的包数量 + - bytes:对应规则匹配到的包大小 + - target:对应规则执行的动作 + - prot:对应的协议,是否针对某些协议应用此规则 + - opt:规则对应的选项 + - in:数据包由哪个接口流入 + - out:数据包由哪个接口流出 + - source:源ip地址 + - distination:目的ip地址 + +```bash +[root@localhost ~]# iptables -vnL INPUT -t filter --line-numbers +[root@localhost ~]# iptables -nL -t nat +[root@localhost ~]# iptables -nL -t mangle +[root@localhost ~]# iptables -nL -t raw +``` + + + +##### 3.5.3 删除规则 + +通过上面学习的查看规则的方法,先查找到你想要删除的规则 + +```bash +# 举例 +# 查看nat表上所有链的规则 +[root@localhost ~]# iptables -t nat -nL --line-numbers +# 查看filter(默认表)上所有链的规则 +[root@localhost ~]# iptables -nL --line-numbers +``` + +- 通过num序号进行删除 + +```bash +删除input链上num为1的规则 +[root@localhost ~]# iptables -D INPUT 1 +``` + +- 通过规则匹配删除 + +```bash +[root@localhost ~]# iptables -D INPUT -p tcp --dport 80 -j DROP +``` + +- 清空所有的规则 + +```bash +[root@localhost ~]# iptables -F +``` + + + +##### 3.5.4 修改规则 + +方案一:通过`iptables -D`删除原有的规则后添加新的规则 + +方案二:通过`iptables -R`可以对具体某一个num的规则进行修改 + +```bash +# 修改端口的为8080 +[root@localhost ~]# iptables -R INPUT 1 -p tcp --dport 8080 -j ACCEPT + +# 针对具体的某一个表和链进行修改 +# 将8080修改回80 +[root@localhost ~]# iptables -t filter -R INPUT 1 -p tcp --dport 80 -j ACCEPT +``` + + + +#### 3.6 自定义链 + +iptables中除了系统自带的五个链之外,还可以自定义链,来实现将规则进行分组,重复调用的目的 + +具体方法见如下案例: + +案例一:我们自定义一个WEB_CHAIN链,专门管理跟web网站相关的规则策略 + +```bash +# 1. 先查看我们现有的系统链 +[root@localhost ~]# iptables -L +Chain INPUT (policy ACCEPT) +target prot opt source destination +Chain FORWARD (policy ACCEPT) +target prot opt source destination +Chain OUTPUT (policy ACCEPT) +target prot opt source destination + +# 2. 添加WEB_CHAIN自定义链,并且查看 +[root@localhost ~]# iptables -t filter -N web_chain +[root@localhost ~]# iptables -L +.......... +Chain web_chain (0 references) +target prot opt source destination + +# 3. 可以通过-E参数修改自定义链 +[root@localhost ~]# iptables -t filter -E web_chain WEB_CHAIN +[root@localhost ~]# iptables -L +......... +Chain WEB_CHAIN (0 references) +target prot opt source destination +# 可以看到名字已经发生变化了 + +# 4. 向我们创建的自定义链中添加规则,开放80端口上的服务 +[root@localhost ~]# iptables -t filter -A WEB_CHAIN -p tcp -m multiport --dports 80,443 -j ACCEPT + +# 5. 将自定义链关联到系统链上才能使用 +# 因为数据包只会经过上面讲过的五个系统链,不会经过我们的自定义链,所以需要把自定义链关联到某个系统链上 + +# 我们允许来自IP:192.168.88.1的访问,随后拒绝其他所有的访问,这样,只有192.168.88.1的主机可以访问这个网站 +[root@localhost ~]# iptables -t filter -A INPUT -s 192.168.88.1 -j WEB_CHAIN +[root@localhost ~]# iptables -t filter -A INPUT -p tcp -m multiport --dports 80,443 -j DROP +[root@localhost ~]# iptables -L +Chain INPUT (policy ACCEPT) +target prot opt source destination +WEB_CHAIN all -- 192.168.88.1 anywhere +Chain FORWARD (policy ACCEPT) +target prot opt source destination +Chain OUTPUT (policy ACCEPT) +target prot opt source destination +Chain WEB_CHAIN (1 references) +target prot opt source destination +ACCEPT tcp -- anywhere anywhere tcp dpt:http + +``` + +访问测试: + +- windows本身可以访问我们的网站 +- 但是其他主机无法访问 + +![image-20240523103827080](09.防火墙与selinux/image-20240523103827080.png) + +```bash +- 删除自定义链 + +# 先清空自定义链上的规则 +[root@localhost ~]# iptables -t filter -F WEB_CHAIN +# 然后通过-X选项删除自定义链 +[root@localhost ~]# iptables -t filter -X WEB_CHAIN +``` + + + +#### 3.7 其他用法(模块) + +- tcp/udp + - --dport:指定目的端口 + - --sport:指定源端口 + +- iprange:匹配报文的源/目的地址所在范围 + - --src-range + - --dst-range + +```bash +[root@localhost ~]# iptables -A INPUT -d 172.16.1.100 -p tcp --dport 80 -m iprange --src-range 172.16.1.5-172.16.1.10 -j DROP +``` + +- string:指定匹配报文中的字符串 + - --algo:指定匹配算法,可以是bm/kmp + - bm:Boyer-Moore + + - kmp:Knuth-Pratt-Morris + - --string:指定需要匹配的字符串 + - --from offset:开始偏移 + - --to offset:结束偏移 + +```bash +[root@localhost ~]# iptables -A OUTPUT -p tcp --sport 80 -m string --algo bm --from 62 --string "google" -j REJECT +``` + +**案例:** + +```shell +[root@localhost ~]# yum -y install httpd +[root@localhost ~]# systemctl start httpd +[root@localhost ~]# systemctl enable httpd +[root@localhost ~]# echo "

hello world

" > /var/www/html/index.html +[root@localhost ~]# iptables -A OUTPUT -p tcp --sport 80 -m string --algo bm --string "world" -j REJECT +#用浏览器刷新页面发现打不开 +[root@localhost ~]# iptables -nL +Chain INPUT (policy ACCEPT) +target prot opt source destination +Chain FORWARD (policy ACCEPT) +target prot opt source destination +Chain OUTPUT (policy ACCEPT) +target prot opt source destination +REJECT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spt:80 STRING match "world" ALGO name bm TO 65535 reject-with icmp-port-unreachable + +[root@localhost ~]# echo "

hello XHZ

" > /var/www/html/index.html +# 此时浏览器打开成功 +``` + + + +- time:指定匹配报文的时间 + - --timestart + - --timestop + - --weekdays + - --monthdays + - --datestart + - --datestop + +```bash +[root@localhost ~]# iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.10 -p tcp --dport 80 -m time --timestart 14:30 --timestop 18:30 --weekdays Sat,Sun -j DROP + +-m time --timestart 14:30 --timestop 18:30 --weekdays Sat,Sun:在指定的时间范围内生效,即从周六到周日的14:30到18:30之间。这表示该规则只在这个时间段内生效 + +- 该规则的作用是在指定时间范围内,阻止来自172.16.0.0/16网段源IP地址、目标IP地址为172.16.100.10、目标端口为80的TCP数据包进入系统 +``` + + + +- connlimit:限制每个ip连接到server端的数量,不需要指定ip默认就是针对每个ip地址,可防止Dos(Denial of Service,拒绝服务)攻击 + - --connlimit-above:最大连接数 + +```bash +[root@localhost ~]# iptables -A INPUT -d 172.16.100.10 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT + +-m connlimit --connlimit-above 2:使用连接限制模块,限制连接数超过2的数据包。这表示如果同一源IP地址的连接数超过2个,将匹配到该规则 + +- 该规则的作用是限制目标IP地址为172.16.100.10、目标端口为22的数据包,如果同一源IP地址的连接数超过2个,则拒绝回复该数据包。这个规则可以用于防止对SSH服务的暴力破解攻击,限制来自同一IP地址的并发连接数 +``` + +**案例:** + +```shell +[root@localhost ~]# iptables -A INPUT -s 192.168.88.0/24 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT + +#此时登第三个终端,会登不上 +[root@localhost ~]# iptables -nL --line-numbers +Chain INPUT (policy ACCEPT) +num target prot opt source destination +1 DROP tcp -- 172.16.0.0/16 172.16.100.10 tcp dpt:80 TIME from 14:30:00 to 18:30:00 on Sat,Sun UTC +2 REJECT tcp -- 192.168.88.0/24 0.0.0.0/0 tcp dpt:22 #conn src/32 > 2 reject-with icmp-port-unreachable + +[root@Centos7-VM-1 ~]# iptables -D INPUT 2 +``` + + + +- limit:对报文到达的速率继续限制,限制包数量 + - 10/second + - 10/minute + - 10/hour + - 10/day + - --limit-burst:空闲时可放行的包数量,默认为5,前多少个包不限制 + + +```bash +iptables -A INPUT -p icmp -m limit --limit-burst 10 --limit 20/minute -j ACCEPT +iptables -A INPUT -p icmp -j REJECT + +--limit-burst 10:设置允许的初始突发量为10个数据包。 +--limit 20/minute:设置平均速率为20个数据包/分钟,即每分钟允许通过的ICMP数据包数量为20个。 + +- 该规则的作用是限制ICMP数据包的速率,允许初始突发量为10个数据包,以后每分钟最多允许通过20个ICMP数据包。匹配到的ICMP数据包将被接受,其他超出限制的数据包将被丢弃。这个规则可以用于控制对系统的ICMP流量,以避免过多的ICMP请求对系统造成负载过大的影响 +``` + + + +- 指定TCP匹配扩展 + +```bash +使用 --tcp-flags 选项可以根据tcp包的标志位进行过滤。 +[root@localhost ~]# iptables -A INPUT -p tcp --tcp-flags SYN,FIN,ACK SYN +[root@localhost ~]# iptables -A FROWARD -p tcp --tcp-flags ALL SYN,ACK +上实例中第一个表示SYN、ACK、FIN的标志都检查,但是只有SYN匹配。第二个表示ALL(SYN,ACK,FIN,RST,URG,PSH)的标志都检查,但是只有设置了SYN和ACK的匹配。 +[root@localhost ~]# iptables -A FORWARD -p tcp --syn +选项--syn相当于"--tcp-flags SYN,RST,ACK SYN"的简写。 +``` + + + +- state模块:用于针对tcp连接进行限制,较耗资源 + +```bash +[root@localhost ~]# iptables -A INPUT -m 模块名 --state 状态 +参数: +-m iptables的模块 + state: 状态检查 + mac:网卡硬件地址 +--state 连接追踪中的状态: + NEW: 新建立一个会话 + ESTABLISHED:已建立的连接 + RELATED: 有关联关系的连接 + INVALID: 无法识别的连接 +[root@localhost ~]# iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT +-m state --state NEW:使用状态模块,匹配数据包的连接状态为NEW,即新建的连接。 +- 该规则的作用是允许进入系统的TCP数据包,目标端口为22(SSH服务),且连接状态为NEW(新建的连接)。这个规则用于允许建立新的SSH连接,而拒绝已经建立的或结束的连接 + +[root@localhost ~]# iptables -A INPUT -m mac --mac-source 00:0C:29:56:A6:A2 -j ACCEPT +-m mac --mac-source 00:0C:29:56:A6:A2:使用MAC模块,匹配源MAC地址为00:0C:29:56:A6:A2的数据包 +- 该规则的作用是允许源MAC地址为00:0C:29:56:A6:A2的数据包进入系统。这个规则可以用于根据MAC地址限制网络访问,只允许特定的MAC地址通过防火墙进入系统 +``` + +#### 3.8 规则的保存与恢复 + +- 用规则文件保存各规则,开机后导入该规则文件中的规则 + +```bash +# 保存到文件中 +[root@localhost ~]# iptables-save > /etc/sysconfig/iptables-config +# 从文件中导入规则 +[root@localhost ~]# iptables-restore < /etc/sysconfig/iptables-config +``` + + +- 安装`iptables-services`,在centos7和centos8上,通过该服务来帮助我们自动管理iptables规则。 + +```bash +[root@localhost ~]# yum -y install iptables-services +[root@localhost ~]# systemctl start iptables.service +[root@localhost ~]# systemctl enable iptables.service +``` + + + +#### 3.9 NAT(地址转换协议) + +​ 网络地址转换 NAT(Network Address Translation),被广泛应用于各种类型 Internet 接入方式和各种类型的网络中。原因很简单,NAT 不仅完美地解决了 IP 地址不足的问题,而且还能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机。默认情况下,内部 IP 地址是无法被路由到外网的,内部主机 10.1.1.1 要与外部 Internet通信,IP 包到达 NAT 路由器时,IP 包头的源地址 10.1.1.1 被替换成一个合法的外网 IP,并在 NAT 转发表中保存这条记录。当外部主机发送一个应答到内网时,NAT 路由器收到后,查看当前 NAT 转换表,用 10.1.1.1 替换掉这个外网地址。NAT 将网络划分为内部网络和外部网络两部分,局域网主机利用 NAT 访问网络时,是将局域网内部的本地地址转换为全局地址(互联网合法的 IP 地址)后转发数据包; + + + +##### 3.9.1 案例一:内网数据代理及服务映射 + +背景:现在有两个服务器server1和server2,server1是可以上网的,server2是不可以上网的,我们需要在server1上配置NAT来让server2通过server1去访问外网,同样我们也可以通过server1来访问位于server2服务器上的内部网站 + +![image-20240523153004845](09.防火墙与selinux/image-20240523153004845.png) + +**环境准备:** + +两台虚拟机,可以克隆一个出来,然后server1添加一张仅主机的网卡。为了模拟server2不能上网的情况,将server2上原有的网卡改成仅主机模式。 + +由于server2的网卡修改成仅主机以后无法通过yum部署httpd,所以我们先在server2上部署一个Web网站 + +```bash +[root@localhost ~]# yum install -y httpd +[root@localhost ~]# systemctl enable --now httpd +# 确保关闭了firewalld,防止firewalld造成干扰 +[root@localhost ~]# systemctl disable --now firewalld + +# 检查80端口是否启动 +[root@localhost ~]# ss -nlt +State Recv-Q Send-Q Local Address:Port Peer Address:Port Process +LISTEN 0 128 0.0.0.0:22 0.0.0.0:* +LISTEN 0 128 [::]:22 [::]:* +LISTEN 0 511 *:80 *:* +``` + + + +**server1:** + +![image-20240523135432942](09.防火墙与selinux/image-20240523135432942.png) + +**server2:** + +![image-20240523135536379](09.防火墙与selinux/image-20240523135536379.png) + + + +第一步:配置仅主机模式网卡的IP地址,其中: + +**server1:** + +​ IP:192.168.12.1/24 + +**server2:** + +​ IP:192.168.12.2/24 + +​ 网关:192.168.12.1 # 网关指向server1的地址 + +​ dns:114.114.114.114 + +第二步:在server1的Linux内核中开启数据转发功能 + +```bash +- 开启数据转发 +[root@localhost ~]# echo "net.ipv4.ip_forward=1" >> /usr/lib/sysctl.d/50-default.conf +[root@localhost ~]# sysctl -w net.ipv4.ip_forward=1 +[root@localhost ~]# sysctl -p + +或者: +[root@localhost ~]# echo 1 > /proc/sys/net/ipv4/ip_forward + +禁止数据转发: +[root@localhost ~]# echo 0 > /proc/sys/net/ipv4/ip_forward +``` + +第三步:访问测试 + +- server2访问外网测试 + + `ping www.baidu.com` + +- Windows访问server2上的网站测试 + +##### 3.9.2 配置SNAT让server2能够网上冲浪 + +server1上操作: + +```bash +[root@localhost ~]# iptables -t nat -A POSTROUTING -s 192.168.12.0/24 -j SNAT --to-source 192.168.88.136 + +- POSTROUTING:数据包出口链 +- SNAT:将源地址进行转发 + +也可以使用如下写法(PAT): +[root@localhost ~]# iptables -t nat -A POSTROUTING -s 192.168.12.0/24 -j MASQUERADE +``` + +server2上测试网络连通性: + +`ping www.baidu.com` + +并且通过对Vmnet 8网卡抓包查看,虽然我们是用server去ping百度。但是却能抓到server1的ens160网卡发往百度的ping包 + +![image-20241126142129043](09.防火墙与selinux/image-20241126142129043.png) + +##### 3.9.3 配置DNAT使得可以访问server2中的内部网站 + +```bash +[root@localhost ~]# iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.12.2:80 + +# 在PREROUTING链上将来自8080端口上的访问转发到内网中的192.168.88.12.2上的80端口 + +`访问测试:` +浏览器中输入:192.168.88.136:8080 + +- 扩展案例: +- 配置DNAT来映射server2上的ssh服务 +[root@localhost ~]# iptables -t nat -A PREROUTING -p tcp --dport 3322 -j DNAT --to-destination 192.168.12.2:22 + +`连接测试:` +ssh root@192.168.88.136 -p 3322 +``` + + + +#### 3.10 案例二:转发本地端口 + +```bash +[root@localhost ~]# iptables -t nat -A PREROUTING -p tcp --dport 6666 -j REDIRECT --to-port 22 +# 此时连接6666端口,iptables会帮我们转发到22端口 +``` + + + +### 4. firewalld + +firewalld是CentOS 7.0新推出的管理netfilter的用户空间软件工具 + +并且支持划分区域zone,每个zone可以设置独立的防火墙规则 + +- 流量的规则匹配顺序 + - 先根据数据包中源地址,将其纳为某个zone + - 纳为网络接口所属zone + - 纳入默认zone,默认为public zone,管理员可以改为其它zone + +- firewalld中常用的区域名称及策略规则 + +| 区域 | 默认策略规则 | +| -------- | ------------------------------------------------------------ | +| public | 默认区域,对应普通网络环境。允许选定的连接,拒绝其他连接 | +| drop | 所有传入的网络包都会被直接丢弃,不会发送任何响应 | +| block | 所有传入的网络包会被拒绝,并发送拒绝信息 | +| external | 用于路由/NAT流量的外部网络环境。与public类似,更适用于网关、路由器等处理外部网络流量的设备 | +| dmz | 隔离区域,只允许选定的连接,适用于部署公开服务的网络区域,如 Web 服务器,可以最大限度地降低内部网络的风险 | +| work | 适用于工作环境,开放更多服务,如远程桌面、文件共享等。比 public 区域更加信任 | +| home | 适用于家庭环境,开放更多服务,比如默认情况下会开放一些如:3074端口(Xbox)、媒体、游戏数据等待 | +| trusted | 信任区域,允许所有连接 | + +#### 4.1 管理工具-firewall-cmd + +- firewall-cmd命令常用的选项 + +| 参数 | 作用 | +| ----------------------------- | ---------------------------------------------------- | +| --get-default-zone | 查询默认的区域名称 | +| --set-default-zone=<区域名称> | 设置默认的区域,使其永久生效 | +| --get-zones | 显示可用的区域 | +| --get-services | 显示预先定义的服务 | +| --get-active-zones | 显示当前正在使用的区域与网卡名称 | +| --add-source= | 将源自此IP或子网的流量导向指定的区域 | +| --remove-source= | 不再将源自此IP或子网的流量导向某个指定区域 | +| --add-interface=<网卡名称> | 将源自该网卡的所有流量都导向某个指定区域 | +| --change-interface=<网卡名称> | 将某个网卡与区域进行关联 | +| --list-all | 显示当前区域的网卡配置参数、资源、端口以及服务等信息 | +| --list-all-zones | 显示所有区域的网卡配置参数、资源、端口以及服务等信息 | +| --add-service=<服务名> | 设置默认区域允许该服务的流量 | +| --add-port=<端口号/协议> | 设置默认区域允许该端口的流量 | +| --remove-service=<服务名> | 设置默认区域不再允许该服务的流量 | +| --remove-port=<端口号/协议> | 设置默认区域不再允许该端口的流量 | +| --reload | 让“永久生效”的配置规则立即生效,并覆盖当前的配置规则 | +| --panic-on | 开启应急状况模式 | +| --panic-off | 关闭应急状况模式 | +| --permanent | 设定的当前规则保存到本地,下次重启生效 | + + + +#### 4.2 简单用法(初体验) + +为了防止之前配置过的iptables规则导致与firewalld策略冲突,建议恢复快照后再开始练习 + +通过web服务部署一个网站,然后访问测试 + +```bash +[root@localhost ~]# yum -y install httpd +[root@localhost ~]# systemctl start httpd +``` + +在浏览器中输入`192.168.88.136`访问测试发现,我们无法访问此网站,这是因为默认情况下,firewalld是出于开启的状态,并且默认区域为public。在public区域中,除了部分系统服务,其他服务的流量一律是禁止的。 + +```bash +# 查看firewalld是否启用,可以看到当前是出于actice的状态 +[root@localhost ~]# systemctl status firewalld +● firewalld.service - firewalld - dynamic firewall daemon + Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled) + Active: active (running) since 四 2024-05-23 15:39:56 CST; 28min ago + Docs: man:firewalld(1) + Main PID: 6264 (firewalld) + CGroup: /system.slice/firewalld.service + └─6264 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid + +# 查看当前所在的区域 +[root@localhost ~]# firewall-cmd --get-default-zone +public +# 查看当前网卡所在的区域 +[root@localhost ~]# firewall-cmd --get-zone-of-interface=ens160 +public + +# 查询public区域是否允许请求SSH或者HTTP协议的流量 +[root@localhost ~]# firewall-cmd --zone=public --query-service=ssh +yes +[root@localhost ~]# firewall-cmd --zone=public --query-service=http +no + +`可以看出,在public区域中,默认是禁止来自http协议的请求数据包的` + +``` + +修改firewalld策略,使得我们可以访问到刚刚部署的网站 + +```bash +- 方法一:针对服务协议类型进行放行 +# 临时放行 +[root@localhost ~]# firewall-cmd --zone=public --add-service=http +# 可以加上--permanent实现永久放行 +[root@localhost ~]# firewall-cmd --permanent --zone=public --add-service=http + +- 方法二:针对服务具体访问请求的端口号进行放行 +[root@localhost ~]# firewall-cmd --zone=public --add-port=80/tcp +success +# 同样也可以加上--permanent实现永久放行 +``` + +以上方法二选一,然后访问测试 + +![image-20240523161850854](09.防火墙与selinux/image-20240523161850854.png) + +取消放行 + +```bash +[root@localhost ~]# firewall-cmd --zone=public --remove-service=http --permanent +success +``` + + + +#### 4.3 其他用法 + +- 把firewalld服务的当前默认区域设置为public + +```bash +[root@localhost ~]# firewall-cmd --set-default-zone=public +Warning: ZONE_ALREADY_SET: public +success +[root@localhost ~]# firewall-cmd --get-default-zone +public +``` + +- 查看某个区域的详细配置 + +```bash +[root@localhost ~]# firewall-cmd --zone=public --list-all +public (active) + target: default + icmp-block-inversion: no + interfaces: ens33 + sources: + services: ssh dhcpv6-client + ports: 80/tcp + protocols: + masquerade: no + forward-ports: + source-ports: + icmp-blocks: + rich rules: +``` + +- 将firewalld 切换到紧急模式(panic mode)。这种模式下,firewalld 会采取一种非常严格的防护策略: + 1. 所有传入的网络连接都会被拒绝,除了 ssh 和 ICMP 回送(ping)请求。 + 2. 所有区域的防火墙规则都会被重置为默认的严格策略。 + 3. 所有区域的默认策略都会被设置为 DROP + +```bash +[root@localhost ~]# firewall-cmd --panic-on +# 取消紧急模式 +[root@localhost ~]# firewall-cmd --panic-off +``` + +- 临时生效/永久生效 + +```bash +# 临时生效 +[root@localhost ~]# firewall-cmd --zone=public --add-service=http +success +# 永久生效,加了--permanent所进行的更改,会被写入到配置文件中,下次开机任然生效 +[root@localhost ~]# firewall-cmd --permanent --zone=public --add-service=http +success +# 使得最近对防火墙规则变更或者所作的修改生效 +[root@localhost ~]# firewall-cmd --reload +success +[root@localhost ~]# firewall-cmd --zone=public --query-service=http +yes + +-配置文件路径 +/etc/firewalld/zones/public.xml +/etc/firewalld/direct.xml +/etc/firewalld/firewalld.conf +``` + +- 把firewalld服务中请求HTTPS协议的流量设置为永久拒绝,并立即生效 + +```bash +[root@localhost ~]# firewall-cmd --zone=public --remove-service=https --permanent +success +[root@localhost ~]# firewall-cmd --reload +success +``` + +- 把在firewalld服务中访问8080和8081端口的流量策略设置为允许,当前生效 + +```bash +# 可以指定要开放端口的范围 +[root@localhost ~]# firewall-cmd --zone=public --add-port=8080-8081/tcp +success +[root@localhost ~]# firewall-cmd --zone=public --list-ports +8080-8081/tcp +``` + +#### 4.4 端口转发 + +通过firewalld,将用户访问服务器上6666端口的流量转发到22端口上,实现本地端口映射。我们就可以使用6666端口来远程连接到服务器 + +```bash +[root@localhost ~]# firewall-cmd --permanent --add-forward-port=port=6666:proto=tcp:toport=22 +success +[root@localhost ~]# firewall-cmd --reload +``` + +连接测试: + +```bash +C:\Users\Atopos>ssh root@192.168.88.136 -p 6666 +root@192.168.88.136's password: +Last login: Thu May 23 21:20:38 2024 from 192.168.88.1 +[root@localhost ~]# +可以看到我们通过6666端口成功连接到我们的虚拟机 +``` + +![image-20240523212533600](09.防火墙与selinux/image-20240523212533600.png) + + + +#### 4.5 firewalld富规则 + +富规则是 firewalld 提供的一种灵活且强大的防火墙规则配置方式。与简单的端口和服务规则不同,富规则支持更复杂的匹配条件和操作。 + +使用富规则,可以实现复杂的防火墙策略,例如: + +- 允许特定 IP 地址访问某个端口 +- 拒绝特定 IP 地址访问某个服务 +- 限制某个网段的连接频率 +- 转发某个端口到另一个端口 + +**富规则的配置方法:** + +`firewall-cmd --permanent --add-rich-rule=''` + +需要注意的是,富规则的语法比较复杂,使用时务必仔细检查,以免引入安全隐患。同时,在修改完成后记得执行 `firewall-cmd --reload` 命令,让更改生效 + +其中rule部分的语法如下: + +```bash +rule [family=""] [source address="
"][source port=""] [destination address="
"][destination port=""] [protocol value=""] [icmp-block-inversion][forward-port port="" protocol="" to-port=""][masquerade][log [prefix=""] [level=""] [limit value=""] [accept][reject][drop] +``` + +其中各个选项的含义如下: + +- `family`: 指定地址族,可以是 `ipv4` 或 `ipv6` +- `source`/`destination`: 指定源/目标地址 +- `port`: 指定端口号 +- `protocol`: 指定协议,如 `tcp`、`udp` 等 +- `icmp-block-inversion`: 反转 ICMP 阻止规则 +- `forward-port`: 端口转发规则 +- `masquerade`: 启用地址伪装 +- `log`: 日志记录规则,可指定前缀、日志级别、限速 +- `accept`/`reject`/`drop`: 动作,分别表示允许、拒绝、丢弃 + + + +由于firewalld中的富规则比较复杂,我们从以下几个案例中来简单学习富规则的一些用法即可 + +**案例一:**允许某个IP地址访问系统中的Web网站服务 + +```bash +[root@localhost ~]# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.88.1" port port="80" protocol="tcp" accept' +[root@localhost ~]# firewall-cmd --reload +``` + +这条规则允许来自 192.168.88.1 的 IPv4 流量访问 80 端口的 Web 服务 + +**案例二:**限制某个区域内的 SSH 连接次数 + +```bash +[root@localhost ~]# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.88.0/24" port port="22" protocol="tcp" limit value="3/m" accept' +[root@localhost ~]# firewall-cmd --reload +``` + +这条规则允许 192.168.88.0/24 网段内的 IPv4 流量访问 22 端口的 SSH 服务,但是限制每分钟最多 3 次连接 + +**案例三:**使用富规则配置将6666端口上的访问转发到22端口上 + +```bash +[root@localhost ~]# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" forward-port port="6666" protocol="tcp" to-port="22"' +[root@localhost ~]# firewall-cmd --reload +``` + +这条规则将 6666 端口的 TCP 流量转发到 22 端口 + + + +**注意:**富规则的语法比较复杂,但是可以让您更精细地控制防火墙规则。通过组合不同的条件,您可以实现更复杂的防火墙策略。使用富规则时,请务必仔细检查语法和规则是否符合您的需求,以免引入安全隐患 + + + +### 5. 服务访问控制 TCP Wrappers + +TCP Wrappers是一种用于网络服务访问控制的工具,它使用配置文件中的规则来决定是否允许或拒绝对特定网络服务的访问。控制列表由两个主要文件组成:/etc/hosts.allow和/etc/hosts.deny。这些文件包含服务和客户端的规则,用于控制服务的访问权限 + +**TCP Wrapperes在最新的RockyLinux 9系统中默认已经不适用。通过上述讲到的iptables和firewalld来进行服务访问控制即可。** + +TCP Wrappers服务的控制列表文件中常用的参数 + +| 客户端类型 | 示例 | 满足示例的客户端列表 | +| -------------- | -------------------------- | --------------------------------- | +| 单一主机 | 192.168.10.10 | IP地址为192.168.10.10的主机 | +| 指定网段 | 192.168.10. | IP段为192.168.10.0/24的主机 | +| 指定网段 | 192.168.10.0/255.255.255.0 | IP段为192.168.10.0/24的主机 | +| 指定主机名称 | www.eagleslab.com | 主机名称为www.eagleslab.com的主机 | +| 指定所有客户端 | ALL,* | 所有主机全部包括在内 | + +在配置TCP Wrappers服务时需要遵循两个原则: + +- 编写拒绝策略规则时,填写的是服务名称,而非协议名称; +- 建议先编写拒绝策略规则,再编写允许策略规则,以便直观地看到相应的效果。 + +**/etc/hosts.deny:**该文件包含拒绝访问网络服务的规则。如果没有在hosts.allow文件中找到允许访问的规则,TCP Wrappers将检查hosts.deny文件以确定是否拒绝访问。以下规则拒绝所有客户端访问SSH服务: + +```bash +[root@localhost ~]# vim /etc/hosts.deny +# +# hosts.deny This file contains access rules which are used to +# deny connections to network services that either use +# the tcp_wrappers library or that have been +# started through a tcp_wrappers-enabled xinetd. +# +# The rules in this file can also be set up in +# /etc/hosts.allow with a 'deny' option instead. +# +# See 'man 5 hosts_options' and 'man 5 hosts_access' +# for information on rule syntax. +# See 'man tcpd' for information on tcp_wrappers +# +# +sshd:* +``` + +```bash +[c:\~]$ ssh root@192.168.88.136 + + +Connecting to 192.168.88.136:22... +Connection established. +To escape to local shell, press 'Ctrl+Alt+]'. +Connection closing...Socket close. + +Connection closed by foreign host. + +Disconnected from remote host(192.168.88.136:22) at 16:35:31. +``` + +**/etc/hosts.allow:**该文件包含允许访问网络服务的规则。每个规则占据一行,有两个主要部分:服务和允许访问的客户端。例如,以下规则允许192.168.88.0/24网段访问SSH服务: + +```bash +[root@localhost ~]# vim /etc/hosts.allow +# +# hosts.allow This file contains access rules which are used to +# allow or deny connections to network services that +# either use the tcp_wrappers library or that have been +# started through a tcp_wrappers-enabled xinetd. +# +# See 'man 5 hosts_options' and 'man 5 hosts_access' +# for information on rule syntax. +# See 'man tcpd' for information on tcp_wrappers +# +sshd:192.168.136. +``` + +### 6. SELinux安全子系统 + +SELinux 是一个强大的访问控制机制,它建立在 Linux 内核之上,为系统提供了更细粒度的安全策略控制。与传统的基于用户/组的访问控制不同,SELinux 采用基于角色(role)和类型(type)的强制访问控制(Mandatory Access Control, MAC)。简单来讲,SELinux 主要作用就是最大限度地减小系统中服务进程可访问的资源(最小权限原则) + +SELinux 的主要特点包括: + +1. 基于策略的安全访问控制:SELinux 通过预先定义的安全策略来控制系统进程和资源的访问权限,而不是依赖于用户/组的身份 +2. 最小特权原则:SELinux 遵循"最小特权"的安全原则,即只授予程序运行所需的最小权限,大大降低了系统被攻击者利用的风险 +3. 灵活的策略配置:SELinux 提供了丰富的策略配置选项,可以根据系统的具体需求进行定制和调整 +4. 审计能力:SELinux 内置了强大的审计日志记录功能,可以帮助管理员快速发现和分析系统安全事件 + +SELinux 的主要工作模式包括: + +- Enforcing 模式:完全执行 SELinux 策略,阻止任何未经授权的访问行为 +- Permissive 模式:只记录违反 SELinux 策略的行为,但不会阻止它们 +- Disabled 模式:完全关闭 SELinux 功能 + +#### 6.1 调整SELinux的模式 + +**临时调整:** + +```bash +# 查看当前SELinux的模式 +[root@localhost ~]# getenforce +Enforcing + +# 临时调整为Permissive +[root@localhost ~]# setenforce 0 +[root@localhost ~]# getenforce +Permissive +[0]为Permissive模式,只记录行为,不阻止 +[1]为Enforcing模式 +``` + +临时调整只在当前状态有效,如果系统重启,将会恢复为默认的Enforcing模式 + +**永久调整:** + +通过编辑配置文件`/etc/selinux/config`中的SELINUX字段来更改SELinux的模式 + +```bash +[root@localhost ~]# vim /etc/selinux/config +# This file controls the state of SELinux on the system. +# SELINUX= can take one of these three values: +# enforcing - SELinux security policy is enforced. +# permissive - SELinux prints warnings instead of enforcing. +# disabled - No SELinux policy is loaded. +SELINUX=enforcing +# SELINUXTYPE= can take one of three values: +# targeted - Targeted processes are protected, +# minimum - Modification of targeted policy. Only selected processes are protected. +# mls - Multi Level Security protection. +SELINUXTYPE=targeted +``` + +#### 6.2 自主访问控制(DAC) + +在没有使用 SELinux 的操作系统中,决定一个资源是否能被访问的因素是:某个资源是否拥有对应用户的权限(读、写、执行) + +只要访问这个资源的进程符合以上的条件就可以被访问 + +而最致命问题是,root 用户不受任何管制,系统上任何资源都可以无限制地访问 + +这种权限管理机制的主体是用户,也称为自主访问控制(DAC) + +#### 6.3 强制访问控制(MAC) + +在使用了 SELinux 的操作系统中,决定一个资源是否能被访问的因素除了上述因素之外,还需要判断每一类进程是否拥有对某一类资源的访问权限 + +这样一来,即使进程是以 root 身份运行的,也需要判断这个进程的类型以及允许访问的资源类型才能决定是否允许访问某个资源。进程的活动空间也可以被压缩到最小 + +即使是以 root 身份运行的服务进程,一般也只能访问到它所需要的资源。即使程序出了漏洞,影响范围也只有在其允许访问的资源范围内。安全性大大增加 + +这种权限管理机制的主体是进程,也称为强制访问控制(MAC) + +#### 6.4 案例说明: + +假设您有一个 Web 服务器,运行着 Apache 服务。默认情况下,Apache 需要访问一些系统资源,比如网页文件、日志文件等。如果没有 SELinux 的保护,任何程序都可以访问这些资源,这可能会带来安全隐患。 + +但是如果开启了 SELinux,情况就不一样了。SELinux 会为 Apache 进程设置专门的安全上下文(context),限制它只能访问特定的资源。比如: + +- Apache 进程的安全上下文是 `httpd_t` +- Apache 网页文件的安全上下文是 `httpd_sys_content_t` +- Apache 日志文件的安全上下文是 `httpd_log_t` + +这样一来,即使 Apache 进程被黑客利用,它也只能访问预先授权的资源,无法对系统造成更大的破坏 + +我们比较一下自己创建的acpache目录和原本的目录的安全上下文 + +```bash +# 安装Apache服务,使其产生/var/www/html/ +[root@localhost ~]# yum install -y httpd +[root@localhost ~]# systemctl start httpd +[root@localhost ~]# mkdir /html # 新建一个目录做为对比 + +# 查看Apache服务创建的工作目录和自己手动创建的目录的区别 +[root@localhost ~]# ls -Zd /var/www/html/ +system_u:object_r:httpd_sys_content_t:s0 /var/www/html/ +[root@localhost ~]# ls -Zd /html/ +unconfined_u:object_r:default_t:s0 /html/ + +- 会发现由Apache创建的工作目录 /var/www/html 具有一个httpd_sys_content_t的标签,这样,SELinux就可以通过在内核中对于这个带有这个标签的文件进行限制了 + +``` + +**字段解释:** + +普通目录:unconfined_u:object_r:user_home_dir_t:s0 + +- 用户身份(user): `unconfined_u` +- 角色(role): `object_r` +- 类型(type): `user_home_dir_t` +- 敏感度级别(sensitivity level): `s0` + +Apache工作目录:system_u:object_r:httpd_sys_content_t:s0 + +- 用户身份(user): `system_u` +- 角色(role): `object_r` +- 类型(type): `httpd_sys_content_t` +- 敏感度级别(sensitivity level): `s0` + +#### 6.5 semanage + +用于管理SELinux策略的一个工具 + +如果系统中没有这个命令的话,可以通过以下命令安装一下该工具 + +```bash +[root@localhost ~]# yum install -y policycoreutils-python-utils-3.6-2.1.el9.noarch +``` + +**用法:** + +`semanage [选项] [文件]` + +**基本选项:** + +- -l:参数用于查询; +- -a:参数用于添加; +- -m:参数用于修改; +- -d:参数用于删除。 + +##### 6.5.1 **案例:** + +更改httpd网站的默认工作目录,检查能否访问,如果不能访问,则为其添加`httpd_sys_content_t`策略再次访问测试: + +```bash +1. 部署httpd + +2. 更改httpd的配置文件,将工作目录变成/html +[root@localhost ~]# vim /etc/httpd/conf/httpd.conf +...... +DocumentRoot "/html" + +# +# Relax access to content within /var/www. +# + + AllowOverride None + # Allow open access: + Require all granted + + +# Further relax access to the default document root: + + +3. 在工作目录中添加一个index.html文件做为网站首页 +[root@localhost ~]# echo "

hello world

" > /html/test.html + +4. 浏览完访问192.168.88.10/test.html测试,发现访问被拒绝,提示403Forbidden +- 这是因为新工作目录/html 没有携带httpd_sys_content_t标签,所以httpd进程受到SELinux限制,无法访问该资源 + + +4. 可以向网站新的工作目录中新添加一条SELinux安全上下文,让这个目录以及里面的所有文件能够被httpd服务程序所访问到 +[root@localhost ~]# semanage fcontext -a -t httpd_sys_content_t /html +[root@localhost ~]# semanage fcontext -a -t httpd_sys_content_t /html/* + +#使用restorecon命令来检查SELinux上下文并且递归更新 +[root@localhost ~]# restorecon -Rv /html +restorecon reset /data/html context unconfined_u:object_r:default_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0 +restorecon reset /data/html/index.html context unconfined_u:object_r:default_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0 + + +5. 再次访问测试 + +Hello world +``` + + + +##### 6.5.2 查看跟Apache(httpd)服务相关的所有标签 + +使用getsebool命令查询并过滤出所有与HTTP协议相关的安全策略。其中,off为禁止状态,on为允许状态。 + +```bash +[root@localhost ~]# getsebool -a | grep http +httpd_anon_write --> off +httpd_builtin_scripting --> on +httpd_can_check_spam --> off +httpd_can_connect_ftp --> off +httpd_can_connect_ldap --> off +httpd_can_connect_mythtv --> off +httpd_can_connect_zabbix --> off +httpd_can_network_connect --> off +httpd_can_network_connect_cobbler --> off +httpd_can_network_connect_db --> off +httpd_can_network_memcache --> off +httpd_can_network_relay --> off +httpd_can_sendmail --> off +httpd_dbus_avahi --> off +httpd_dbus_sssd --> off +httpd_dontaudit_search_dirs --> off +httpd_enable_cgi --> on +httpd_enable_ftp_server --> off +httpd_enable_homedirs --> off +httpd_execmem --> off +httpd_graceful_shutdown --> on +httpd_manage_ipa --> off +httpd_mod_auth_ntlm_winbind --> off +httpd_mod_auth_pam --> off +httpd_read_user_content --> off +httpd_run_ipa --> off +httpd_run_preupgrade --> off +httpd_run_stickshift --> off +httpd_serve_cobbler_files --> off +httpd_setrlimit --> off +httpd_ssi_exec --> off +httpd_sys_script_anon_write --> off +httpd_tmp_exec --> off +httpd_tty_comm --> off +httpd_unified --> on +httpd_use_cifs --> off +httpd_use_fusefs --> off +httpd_use_gpg --> off +httpd_use_nfs --> off +httpd_use_openstack --> off +httpd_use_sasl --> off +httpd_verify_dns --> off +named_tcp_bind_http_port --> off +prosody_bind_http_port --> off +[root@localhost ~]# setsebool -P httpd_enable_homedirs=on +``` + +面对如此多的`SELinux`域安全策略规则,实在没有必要逐个理解它们,我们只要能通过名字大致猜测出相关的策略用途就足够了。比如,想要开启`httpd`服务的个人用户主页功能,那么用到的`SELinux`域安全策略是`httpd_enable_homedir` \ No newline at end of file diff --git a/00.基础阶段/02.Linux基础/09.防火墙与selinux/1387124-20180606225916717-862172332-16448038271021.png b/00.基础阶段/02.Linux基础/09.防火墙与selinux/1387124-20180606225916717-862172332-16448038271021.png new file mode 100644 index 0000000..7508c1e Binary files /dev/null and b/00.基础阶段/02.Linux基础/09.防火墙与selinux/1387124-20180606225916717-862172332-16448038271021.png differ diff --git a/00.基础阶段/02.Linux基础/09.防火墙与selinux/image-20200503111419946-16448038271032.png b/00.基础阶段/02.Linux基础/09.防火墙与selinux/image-20200503111419946-16448038271032.png new file mode 100644 index 0000000..f04b601 Binary files /dev/null and b/00.基础阶段/02.Linux基础/09.防火墙与selinux/image-20200503111419946-16448038271032.png differ diff --git a/00.基础阶段/02.Linux基础/09.防火墙与selinux/image-20240522113032125.png b/00.基础阶段/02.Linux基础/09.防火墙与selinux/image-20240522113032125.png new file mode 100644 index 0000000..980bd09 Binary files /dev/null and b/00.基础阶段/02.Linux基础/09.防火墙与selinux/image-20240522113032125.png differ diff --git a/00.基础阶段/02.Linux基础/09.防火墙与selinux/image-20240522222025959.png b/00.基础阶段/02.Linux基础/09.防火墙与selinux/image-20240522222025959.png new file mode 100644 index 0000000..1f9822e Binary files /dev/null and b/00.基础阶段/02.Linux基础/09.防火墙与selinux/image-20240522222025959.png differ diff --git a/00.基础阶段/02.Linux基础/09.防火墙与selinux/image-20240522222326150.png b/00.基础阶段/02.Linux基础/09.防火墙与selinux/image-20240522222326150.png new file mode 100644 index 0000000..8f8e010 Binary files /dev/null and b/00.基础阶段/02.Linux基础/09.防火墙与selinux/image-20240522222326150.png differ diff --git a/00.基础阶段/02.Linux基础/09.防火墙与selinux/image-20240523103827080.png b/00.基础阶段/02.Linux基础/09.防火墙与selinux/image-20240523103827080.png new file mode 100644 index 0000000..144c233 Binary files /dev/null and b/00.基础阶段/02.Linux基础/09.防火墙与selinux/image-20240523103827080.png differ diff --git a/00.基础阶段/02.Linux基础/09.防火墙与selinux/image-20240523135432942.png b/00.基础阶段/02.Linux基础/09.防火墙与selinux/image-20240523135432942.png new file mode 100644 index 0000000..9ed49f0 Binary files /dev/null and b/00.基础阶段/02.Linux基础/09.防火墙与selinux/image-20240523135432942.png differ diff --git a/00.基础阶段/02.Linux基础/09.防火墙与selinux/image-20240523135536379.png b/00.基础阶段/02.Linux基础/09.防火墙与selinux/image-20240523135536379.png new file mode 100644 index 0000000..25cec6d Binary files /dev/null and b/00.基础阶段/02.Linux基础/09.防火墙与selinux/image-20240523135536379.png differ diff --git a/00.基础阶段/02.Linux基础/09.防火墙与selinux/image-20240523153004845.png b/00.基础阶段/02.Linux基础/09.防火墙与selinux/image-20240523153004845.png new file mode 100644 index 0000000..5f328da Binary files /dev/null and b/00.基础阶段/02.Linux基础/09.防火墙与selinux/image-20240523153004845.png differ diff --git a/00.基础阶段/02.Linux基础/09.防火墙与selinux/image-20240523161850854.png b/00.基础阶段/02.Linux基础/09.防火墙与selinux/image-20240523161850854.png new file mode 100644 index 0000000..c36843d Binary files /dev/null and b/00.基础阶段/02.Linux基础/09.防火墙与selinux/image-20240523161850854.png differ diff --git a/00.基础阶段/02.Linux基础/09.防火墙与selinux/image-20240523212533600.png b/00.基础阶段/02.Linux基础/09.防火墙与selinux/image-20240523212533600.png new file mode 100644 index 0000000..8bfdd32 Binary files /dev/null and b/00.基础阶段/02.Linux基础/09.防火墙与selinux/image-20240523212533600.png differ diff --git a/00.基础阶段/02.Linux基础/09.防火墙与selinux/image-20241126142129043.png b/00.基础阶段/02.Linux基础/09.防火墙与selinux/image-20241126142129043.png new file mode 100644 index 0000000..c949e5a Binary files /dev/null and b/00.基础阶段/02.Linux基础/09.防火墙与selinux/image-20241126142129043.png differ diff --git a/00.基础阶段/02.Linux基础/09.防火墙与selinux/未命名绘图.png b/00.基础阶段/02.Linux基础/09.防火墙与selinux/未命名绘图.png new file mode 100644 index 0000000..db4059a Binary files /dev/null and b/00.基础阶段/02.Linux基础/09.防火墙与selinux/未命名绘图.png differ diff --git a/00.基础阶段/02.Linux基础/10.ssh远程管理.md b/00.基础阶段/02.Linux基础/10.ssh远程管理.md new file mode 100644 index 0000000..df14833 --- /dev/null +++ b/00.基础阶段/02.Linux基础/10.ssh远程管理.md @@ -0,0 +1,284 @@ +# 10.ssh远程管理 + +## 10.ssh远程管理 + +### 1. SSH协议/OpenSSH服务 + +SSH(Secure Shell)协议是一种网络协议,用于加密方式远程登录到服务器。它提供了一种安全的方法来传输数据,防止数据在传输过程中被窃听或篡改。SSH协议不仅用于远程登录,还可用于远程执行命令、文件传输(SFTP)、端口转发等。 + +OpenSSH是SSH协议的一个开源实现工具,由OpenBSD项目开发和维护。它是大多数Unix和类Unix操作系统中默认的SSH实现,包括Linux、macOS和FreeBSD等。 + +OpenSSH提供了服务端程序(openssh-server)和客户端工具(openssh-client) + +* Mac和Linux中默认已安装ssh客户端,可直接在终端中使用ssh命令 +* Windows需手动安装ssh客户端,较常用的Windows SSH客户端有PuTTY和XShell + +**SSH能够提供两种安全验证的方法:** + +* 基于**口令**的验证—用账户和密码来验证登录 +* 基于**密钥**的验证—需要在本地生成密钥对,然后把密钥对中的公钥上传至服务器,并与服务器中的公钥进行比较;该方式相较来说更安全 + +### 2. SSH客户端使用 + +OpenSSH服务提供我们SSH工具,该工具采用SSH协议来连接到远程主机上。 + +#### 2.1 SSH常用操作 + +1. 通过SSH协议登录远程主机 + +```bash +[root@localhost ~]# ssh root@192.168.88.20 # root@表示登录到root用户 +root@192.168.88.20's password: # 输入远程主机的密码 +Activate the web console with: systemctl enable --now cockpit.socket + +Last login: Tue Dec 24 15:42:36 2024 from 192.168.88.1 +``` + +2. 指定连接远程主机的端口号(SSH默认连接的端口号为22,如果修改过端口号,可以通过以下方式连接) + +```bash +[root@localhost ~]# ssh root@192.168.88.20 -P22 +root@192.168.88.20's password: +Activate the web console with: systemctl enable --now cockpit.socket + +Last login: Tue Dec 24 15:43:18 2024 from 192.168.88.10 +``` + +3. 不登陆到远程主机中,仅仅执行某个命令并返回结果 + +```bash +[root@localhost ~]# ssh root@192.168.88.20 ls -lah /etc +root@192.168.88.20's password: +total 1.2M +drwxr-xr-x. 95 root root 8.0K Dec 24 15:41 . +dr-xr-xr-x. 18 root root 235 Nov 9 10:51 .. +-rw-------. 1 root root 0 Nov 9 10:51 .pwd.lock +-rw-r--r--. 1 root root 208 Nov 9 10:51 .updated +-rw-r--r--. 1 root root 4.6K Apr 21 2024 DIR_COLORS +-rw-r--r--. 1 root root 4.7K Apr 21 2024 DIR_COLORS.lightbgcolor +-rw-r--r--. 1 root root 94 May 16 2022 GREP_COLORS +drwxr-xr-x. 7 root root 134 Nov 9 10:52 NetworkManager +drwxr-xr-x. 2 root root 48 Nov 9 10:52 PackageKit +drwxr-xr-x. 6 root root 70 Nov 9 10:56 X11 +...... +``` + +4. 查看已经连接过主机的记录(会看到ssh客户端产生的公钥信息) + +```bash +[root@localhost ~]# cat .ssh/known_hosts +192.168.88.20 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOThT7fdh7wxANOIlTBGdcF+m2sVH/N56HKSJGANz19u +192.168.88.20 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCmVQz5ziwIu9Ue3tUT2BGSr81+t7E3dpJBGuydoBnVeD6S7PVVkyf8RxsbYd1D0PhxlIb5qJzxybla8ua47J1RqKEZjNA0CITV4oFCcdTt38hqZzE1JxNqcV3TyqPt0uFetB09bYckk2T/HascnKAm2G7Sl+BIbs27oeFPhkSph/wfOLxh9nn6Yk3NwqPXrpUmn7w4A8P8UdeSXD4YvK/TNjPz9/eI0a2joxNpzyS0glcBhWfEb2UiplDGJlKoVl0NPxYhhYcwDLtzNhfgmre2wcgA9v3phdTUvsH1QWExE4qhpIisNa7jUhrB8Gg6ki3sI143MJnvdD56BILbv2U7UPOjIR5bTRx2yuDp2Z3d5lK+8gowyXAjmp59gVfUO8vaLVZ5oBiuzPBBntWqBrfYfWmd2CqoYFHXjCf+6quPNx2hVASIfHvUWXQuYzo8NOgaR0niMzzanADam3B87Tqlvo9psUQ1TQ1zdJlvo8FL+TkYyn6+Bc5lGJ3/un4Ip6s= +192.168.88.20 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBGHvrjmizdqObHoyK1gJ59yIDGBfTNbLec0KzXZyAWrPwCdeQkaNRfmS9nb8W2jJCbZvciH1z3OPU8tMD5CdN3c= +``` + +#### 2.2 SCP远程文件传输 + +除了连接到远程主机之外,我们也可以用附带的小工具**SCP**来进行远程文件传输和下载 + +1. 将本地文件复制给远程主机,-r递归复制整个目录,-p保留源文件的时间和权限属性 + +```bash +[root@localhost ~]# touch file +[root@localhost ~]# echo "I am server1" > file +[root@localhost ~]# scp -P22 -r -p /root/file root@192.168.88.20:/tmp +root@192.168.88.20's password: +file 100% 13 12.2KB/s 00:00 +``` + +2. 将远程主机上的文件下载到本地 + +```bash +[root@localhost ~]# scp -P22 -r -p root@192.168.88.20:/tmp/file /root/ +``` + +3. SSH客户端自带SFTP功能,可以直接通过FTP协议进行文件传递 + +```bash +[root@localhost ~]# sftp -oPort=22 root@192.168.88.20 +root@192.168.88.20's password: +Connected to 192.168.88.20. +sftp> ls +anaconda-ks.cfg +sftp> get /tmp/file +Fetching /tmp/file to file +file 100% 13 6.8KB/s 00:00 +sftp> exit +[root@localhost ~]# ls +anaconda-ks.cfg file +[root@localhost ~]# cat file +I am server1 +``` + +### 3. SSH配置文件 + +* sshd服务的配置信息保存在`/etc/ssh/sshd_config`文件中。运维人员一般会把保存着最主要配置信息的文件称为主配置文件,而配置文件中有许多以井号开头的注释行,要想让这些配置参数生效,需要在修改参数后再去掉前面的井号 +* sshd服务配置文件中包含的参数以及作用 + +| 参数 | 作用 | +| :-------------------------------- | :---------------------------------- | +| Port 22 | 默认的sshd服务端口 | +| ListenAddress 0.0.0.0 | 设定sshd服务器监听的IP地址 | +| Protocol 2 | SSH协议的版本号 | +| HostKey /etc/ssh/ssh_host_key | SSH协议版本为1时,DES私钥存放的位置 | +| HostKey /etc/ssh/ssh_host_rsa_key | SSH协议版本为2时,RSA私钥存放的位置 | +| HostKey /etc/ssh/ssh_host_dsa_key | SSH协议版本为2时,DSA私钥存放的位置 | +| PermitRootLogin yes | 设定是否允许root管理员直接登录 | +| StrictModes yes | 当远程用户的私钥改变时直接拒绝连接 | +| MaxAuthTries 6 | 最大密码尝试次数 | +| MaxSessions 10 | 最大终端数 | +| PasswordAuthentication yes | 是否允许密码验证 | +| PubkeyAuthentication yes | 是否允许使用公钥进行身份验证 | + +### 4. 安全密钥验证 + +上面讲到,ssh远程连接,除了使用密码的方式登录,还可以使用密钥对(公钥和私钥)进行登录。相比于密码等于而言,密钥登录会更加的安全 + +如果使用公钥和私钥进行加密,那么我们称之为是一种非堆成加密的方式进行加密,那同样的还有对称加密,不过对称加密我们到后面HTTPS协议中再详细讲解。 + +非对称加密是一种加密方式,它涉及到两个密钥:一个公钥和一个私钥。公钥可以公开给任何人,而私钥则必须保密,只有密钥的拥有者才知道。这种加密方式的特点是使用公钥加密的数据只能通过对应的私钥来解密,反之亦然,使用私钥加密的数据只能通过对应的公钥来解密。 + +#### 4.1 非对称加密 + +1. **密钥生成**:首先生成一对密钥,一个公钥和一个私钥。这两个密钥是数学上相关的,但即使知道其中一个,也很难计算出另一个。 +2. **加密**:发送方使用接收方的公钥来加密信息。这个过程是可逆的,但只有拥有正确私钥的人才能解密。 +3. **解密**:接收方使用自己的私钥来解密信息。这个过程确保了只有拥有私钥的接收方才能阅读信息。 + +我们可以想象一下,你有一个非常特别的邮箱,这个邮箱有一个特点:它有两个锁。一个锁是公开的,任何人都可以往里投信,但只有你知道如何打开它(私钥)。另一个锁是私有的,只有你知道它在哪里,而且只有你拥有打开它的钥匙(公钥)。 + +- **公钥(锁)**:你把这个特别的锁(公钥)放在一个公共的地方,比如你的家门口。任何人都可以给你写信,他们只需要用这个锁把你的信锁起来,然后投进你的邮箱。因为只有你知道如何打开这个锁,所以你的信件在运输过程中是安全的。 +- **私钥(钥匙)**:你把打开这个锁的钥匙(私钥)藏在家里一个安全的地方。当信件到达时,你可以用你的私钥打开锁,取出信件阅读。 +- **安全性**:即使有人试图复制这个锁(公钥),他们也无法制造出能打开它的钥匙(私钥),因为这两个是数学上相关的,但计算其中一个从另一个是几乎不可能的。 + +#### 4.2 SSH密钥对口令验证 + +1. 在客户端主机中生成`密钥对` + +```shell +[root@localhost ~]# ssh-keygen +Generating public/private rsa key pair. +Enter file in which to save the key (/root/.ssh/id_rsa): # 选择密钥存放的位置,默认是/root/.ssh/目录 +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:+LY6jvJ6Azxw9avB5eMKOMBrzvryMVG1nHjszJI22lk root@localhost.localdomain +The key's randomart image is: ++---[RSA 3072]----+ +| . | +| .= o | +| .o.* | +|o .. *o. | +|.=..=oE.S | +|..==o=+. | +|oo=oo+ .o | +|=..++.o. . | +|o*+=++oo. | ++----[SHA256]-----+ + +# 查看/root/.ssh目录中,是否存在id_rsa(私钥)和id_rsa.pub(公钥) +[root@localhost ~]# ls -al /root/.ssh/ +total 16 +drwx------. 2 root root 80 Dec 25 09:24 . +dr-xr-x---. 3 root root 159 Dec 24 15:58 .. +-rw-------. 1 root root 2610 Dec 25 09:24 id_rsa +-rw-r--r--. 1 root root 580 Dec 25 09:24 id_rsa.pub +-rw-------. 1 root root 837 Dec 24 15:43 known_hosts +-rw-r--r--. 1 root root 95 Dec 24 15:43 known_hosts.old +``` + +2. 把客户端主机中生成的公钥文件传送至远程主机 + +```shell +# 使用ssh-copy-id这个工具,可以自动的将公钥发送给目标主机的/root/.ssh/目录下面 +[root@localhost ~]# ssh-copy-id 192.168.88.20 +/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.88.20's password: + +Number of key(s) added: 1 + +Now try logging into the machine, with: "ssh '192.168.88.20'" +and check to make sure that only the key(s) you wanted were added. + +# 检查server2中,是否成功接收到公钥 +# server2中查看 +[root@localhost ~]# ls -al /root/.ssh/ +total 12 +drwx------. 2 root root 71 Dec 25 09:29 . +dr-xr-x---. 3 root root 163 Nov 24 11:04 .. +-rw-------. 1 root root 580 Dec 25 09:29 authorized_keys +-rw-------. 1 root root 837 Dec 24 15:54 known_hosts +-rw-r--r--. 1 root root 95 Dec 24 15:54 known_hosts.old + +# 公钥发送过来以后,名称会默认的改变为authorized_keys。我们可以查看这个文件中的内容,就是我们的公钥,与id_rsa.pub一致 +[root@localhost ~]# cat /root/.ssh/authorized_keys +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDpPlj0cTuje/LHClQ+InIzTSdC2AViBWD3hb77ZcFpC1rfem7A9fuOJEZlNNALeHyAVjVvlVujhWDO8e7mbSJ0k/ECUVvq82r5bf9g8nJKuyWmKQ8DWHXhe4+WnMKHRDPsDM7blr/tnaUb86FPql0MUW1VOEQkP3ZN+NDomfH2DAuMzX5EKhYkcvVuekELeevXlEwWHA/mmizkxBqFKuoBdSpiQ7xjVC+FxAjAnrQwD1jmdrf+25x8DYm9J2S+led6fy3s6QPYRlawAR91M2Xf8+W1RHndcnZGhReCtZBJsIs6OCC3NqxCeZIVgwZzeAtPClWDyh1YhuvEL5mM1hjHICWhHCLqo15R7A0e/zCqhf3wxfelnQ21aNAbzALDYAjkquxm7nLbmRq07Na0XdASfJHpiuDG/aYzNTWaiQzcgZQmz13FUNfI+dikRupwL3XW57eNfo3qHNhZn9TxIQOueJ6N7vbSoYdiN34xvc8g1ZRPRFONftMg1HYBcZAYgMk= root@localhost.localdomain +``` + +3. 对远程主机(server2)进行设置,使其只允许密钥验证,拒绝传统的口令验证方式。记得在修改配置文件后保存并重启sshd服务程序 + +```shell +[root@localhost ~]# vim /etc/ssh/sshd_config +.................. +65 PasswordAuthentication no +PubkeyAuthentication yes +................... +[root@localhost ~]# systemctl restart sshd +``` + +4. 在客户端尝试登录到服务器,此时无须输入密码也可成功登录 + +```shell +[root@localhost ~]# ssh root@192.168.88.20 +Activate the web console with: systemctl enable --now cockpit.socket + +Last login: Wed Dec 25 09:11:48 2024 from 192.168.88.1 + + +# 并且检查server2中的secure日志中,也可以看到我们是通过公钥登录到server2中 +[root@localhost ~]# cat /var/log/secure |grep publickey +Dec 25 09:40:27 localhost sshd[2392]: Accepted publickey for root from 192.168.88.10 port 40652 ssh2: RSA SHA256:+LY6jvJ6Azxw9avB5eMKOMBrzvryMVG1nHjszJI22lk +``` + +### 5. mobaxterm生成密钥登录 + +通过mobaxterm我们也可以生成密钥对,从而通过密钥对进行登录 + +1. 在工具选项中找到ssh密钥生成器 + +![image-20241225095837131](10.ssh远程管理/image-20241225095837131-17364951629947.png) + +2. 选择生成的密钥对类型以及点击Generator生成 + +![image-20241225100003857](10.ssh远程管理/image-20241225100003857-17364951629948.png) + +3. 生成密钥对并且保存公钥和私钥 + +生成的时候,要鼠标不断移动,该工具会根据鼠标移动的坐标,来生成随机的密钥 + +![image-20241225100209895](10.ssh远程管理/image-20241225100209895-17364951629949.png) + + + +三、linux .ssh目录下新建文件`authorized_keys`,将上面生成的密钥粘进去 + +![image-20241225104817789](10.ssh远程管理/image-20241225104817789-17364951629926.png) + +四、但是大概率会连接失败,原因是由于我们通过mobaxterm生成的密钥文件权限不满足要求,并且在windows上修改权限的话非常麻烦。所以我们可以考虑通过在cmd命令行中使用ssh-keygen工具来生成密钥文件 + +![image-20250114105202083](10.ssh远程管理/image-20250114105202083.png) + +可以看到生成的公钥和私钥 + +![image-20250114105137753](10.ssh远程管理/image-20250114105137753.png) + +打开公钥文件,复制其中的内容,在Linux中的/root.ssh/authorized_keys文件中粘贴 + +然后继续通过cmd连接测试: + +![image-20250114105438117](10.ssh远程管理/image-20250114105438117.png) + +也可以尝试使用Mobaxterm工具,选择私钥进行连接。但是Mobaxterm连接的时候也可能会遇到报错的问题。这个是受不同工具的影响。如果通过cmd能够连接成功的话。就说明我们的密钥和配置是正常的。 \ No newline at end of file diff --git a/00.基础阶段/02.Linux基础/10.ssh远程管理/image-20241225095837131-17364951629947.png b/00.基础阶段/02.Linux基础/10.ssh远程管理/image-20241225095837131-17364951629947.png new file mode 100644 index 0000000..ca8c919 Binary files /dev/null and b/00.基础阶段/02.Linux基础/10.ssh远程管理/image-20241225095837131-17364951629947.png differ diff --git a/00.基础阶段/02.Linux基础/10.ssh远程管理/image-20241225100003857-17364951629948.png b/00.基础阶段/02.Linux基础/10.ssh远程管理/image-20241225100003857-17364951629948.png new file mode 100644 index 0000000..b27e61d Binary files /dev/null and b/00.基础阶段/02.Linux基础/10.ssh远程管理/image-20241225100003857-17364951629948.png differ diff --git a/00.基础阶段/02.Linux基础/10.ssh远程管理/image-20241225100209895-17364951629949.png b/00.基础阶段/02.Linux基础/10.ssh远程管理/image-20241225100209895-17364951629949.png new file mode 100644 index 0000000..5547228 Binary files /dev/null and b/00.基础阶段/02.Linux基础/10.ssh远程管理/image-20241225100209895-17364951629949.png differ diff --git a/00.基础阶段/02.Linux基础/10.ssh远程管理/image-20241225104817789-17364951629926.png b/00.基础阶段/02.Linux基础/10.ssh远程管理/image-20241225104817789-17364951629926.png new file mode 100644 index 0000000..4f9964d Binary files /dev/null and b/00.基础阶段/02.Linux基础/10.ssh远程管理/image-20241225104817789-17364951629926.png differ diff --git a/00.基础阶段/02.Linux基础/10.ssh远程管理/image-20250114105137753.png b/00.基础阶段/02.Linux基础/10.ssh远程管理/image-20250114105137753.png new file mode 100644 index 0000000..92e08c1 Binary files /dev/null and b/00.基础阶段/02.Linux基础/10.ssh远程管理/image-20250114105137753.png differ diff --git a/00.基础阶段/02.Linux基础/10.ssh远程管理/image-20250114105202083.png b/00.基础阶段/02.Linux基础/10.ssh远程管理/image-20250114105202083.png new file mode 100644 index 0000000..4d5eaba Binary files /dev/null and b/00.基础阶段/02.Linux基础/10.ssh远程管理/image-20250114105202083.png differ diff --git a/00.基础阶段/02.Linux基础/10.ssh远程管理/image-20250114105438117.png b/00.基础阶段/02.Linux基础/10.ssh远程管理/image-20250114105438117.png new file mode 100644 index 0000000..efa4430 Binary files /dev/null and b/00.基础阶段/02.Linux基础/10.ssh远程管理/image-20250114105438117.png differ diff --git a/00.基础阶段/02.Linux基础/11.samba文件管理.md b/00.基础阶段/02.Linux基础/11.samba文件管理.md new file mode 100644 index 0000000..d2c46d4 --- /dev/null +++ b/00.基础阶段/02.Linux基础/11.samba文件管理.md @@ -0,0 +1,480 @@ +# 11.samba文件管理 + +## 11.samba文件管理 + +### 1. Samba文件共享 + +#### 1.1 什么是Samba + +Samba 是一个开源软件套件,允许 Linux/Unix 系统与 Windows 系统之间实现文件共享和打印服务。Samba 使用 SMB(Server Message Block)/CIFS(Common Internet File System)协议,这些协议是 Windows 系统共享资源的基础。 + +#### 1.2 发展历程 + +**1992 年**:Samba 项目由 Andrew Tridgell 发起,最初作为一个简单工具来查看 DOS 文件共享。 + +**1994 年**:Samba 正式命名,支持 SMB 协议。 + +**1996 年**:开始支持 Windows NT 域。 + +**2003 年**:引入 LDAP 集成,支持 Active Directory。 + +**2012 年**:Samba 4 发布,完全实现了 Active Directory 的功能。 + +**现在**:Samba 成为企业级跨平台文件共享的核心工具之一。 + +#### 1.3 Samba用途 + +**文件共享**:允许用户在不同操作系统之间共享文件。 + +**打印服务**:提供跨平台的打印服务和在线编辑。 + +**域控制器**:Samba 可以用作 Windows 网络的域控制器。 + +**认证与授权**:支持用户认证、访问控制和权限管理。 + +**跨平台互操作性**:让 Linux/Unix 系统与 Windows 系统无缝协作。 + +Windows计算机网络管理模式: + +* 工作组WORKGROUP:计算机对等关系,帐号信息各自管理 +* 域DOMAIN:C/S结构,帐号信息集中管理,DC,AD + +#### 1.4 Samba相关软件包介绍 + +在 Rocky Linux 中,Samba 的核心组件包含以下软件包: + +- **samba**:Samba 的主包,包括核心服务和工具。 +- **samba-client**:提供客户端工具,用于访问远程的 SMB/CIFS 共享。 +- **samba-common**:共享的配置文件和库。 +- **samba-libs**:Samba 运行所需的库。 +- **samba-common-tools**:包含测试和管理工具,例如 `smbstatus`。 +- **smbclient**:命令行工具,用于访问 SMB/CIFS 共享。 +- **cifs-utils**:提供挂载 SMB 文件系统的工具(如 `mount.cifs`)。 + +#### 1.5 相关服务进程 + +**smbd**:提供文件共享和打印服务,TCP:139、445。 + +**nmbd**:负责 NetBIOS 名称解析和浏览功能,UDP:137、138。 + +**winbindd**:用于与 Windows 域集成,支持用户和组的认证。 + +**samba-ad-dc**:Samba 4 中的域控制器服务。 + +#### 1.6 Samba主配置文件 + +主配置文件:/etc/samba/smb.conf 帮助参看:man smb.conf + +语法检查: testparm [-v] [/etc/samba/smb.conf] + +```bash +[global] + workgroup = WORKGROUP # 工作组名称 + server string = Samba Server # 服务器描述 + security = user # 认证模式 + log file = /var/log/samba/log.%m # 日志文件路径 + max log size = 50 # 最大日志文件大小(KB) + dns proxy = no # 禁用 DNS 代理 + +[shared] + path = /srv/samba/shared # 共享路径 + browseable = yes # 是否可浏览 + writable = yes # 是否可写 + valid users = @smbgroup # 允许访问的用户/组 +``` + +##### 1.6.1 全局设置([global]) + +- `workgroup`:指定工作组名称,默认是 `WORKGROUP`。 +- security: + - `user`:用户级认证(常用)。 + - `share`:共享级认证(不推荐)。 + - `domain`:域级认证。 + - `ads`:Active Directory 服务。 +- `log file`:日志文件路径。 +- `max log size`:限制日志文件大小。 + +##### 1.6.2 共享设置([共享名]) + +- `path`:共享目录的路径。 +- `browseable`:决定共享是否可被浏览。 +- `writable`:是否允许写入。 +- `valid users`:指定允许访问的用户或组。 + +### 2. 快速开始 + +#### 2.1 安装Samba服务 + +```bash +[root@localhost ~]# yum -y install samba +[root@localhost ~]# yum -y install samba-client +[root@localhost ~]# systemctl enable --now smb +[root@localhost ~]# systemctl enable --now nmb +[root@localhost ~]# ss -nlt +State Recv-Q Send-Q Local Address:Port Peer Address:Port Process +LISTEN 0 50 0.0.0.0:445 0.0.0.0:* +LISTEN 0 50 0.0.0.0:139 0.0.0.0:* +LISTEN 0 128 0.0.0.0:22 0.0.0.0:* +LISTEN 0 50 [::]:445 [::]:* +LISTEN 0 50 [::]:139 [::]:* +LISTEN 0 128 [::]:22 [::]:* +``` + +在`ss`命令的输出中,`Recv-Q`和`Send-Q`是与TCP连接相关的两个队列的大小。 + +- `Recv-Q`表示接收队列的大小。它指示了尚未被应用程序(进程)接收的来自网络的数据的数量。当接收队列的大小超过一定限制时,可能会发生数据丢失。 +- `Send-Q`表示发送队列的大小。它指示了应用程序(进程)等待发送到网络的数据的数量。当发送队列的大小超过一定限制时,可能会导致发送缓冲区已满,从而阻塞应用程序发送更多的数据。 + +#### 2.2 配置Samba用户 + +* 包:samba-common-tools +* 工具:smbpasswd pdbedit +* 用户数据库:/var/lib/samba/private/passdb.tdb + +说明:samba用户须是Linux用户,建议使用/sbin/nologin + +一、创建系统用户 + +```bash +[root@localhost ~]# useradd -s /sbin/nologin smbuser +[root@localhost ~]# echo 123 | passwd --stdin smbuser +Changing password for user smbuser. +passwd: all authentication tokens updated successfully. +``` + +二、创建Samba用户 + +```bash +[root@localhost ~]# smbpasswd -a smbuser +New SMB password: +Retype new SMB password: +Added user smbuser. +[root@localhost ~]# smbpasswd -e smbuser # 启用用户 +Enabled user smbuser. +``` + +三、添加用户到指定组 + +```bash +[root@localhost ~]# groupadd smbgroup +[root@localhost ~]# usermod -aG smbgroup smbuser +``` + +四、其他操作(视具体情况而使用) + +* 如果已经存在,想修改密码 + +```shell +[root@localhost ~]# smbpasswd smb1 +``` + +* 想要删除用户和密码 + +```shell +[root@localhost ~]# smbpasswd -x smb1 +[root@localhost ~]# pdbedit -x -u smb1 +``` + +* 查看samba用户列表 + +```shell +[root@localhost ~]# pdbedit -L -v +``` + +* 查看samba服务器状态 + +```shell +[root@localhost ~]# yum install -y samba +[root@localhost ~]# smbstatus +``` + +#### 2.3 基于特定用户或组的共享 + +##### 2.3.1 服务端操作 + +一、创建共享目录 + +共享目录为:`/data/samba` + +```bash +[root@localhost ~]# mkdir -p /data/samba +[root@localhost ~]# chown -R smbuser:smbgroup /data/samba +[root@localhost ~]# chmod -R 2770 /data/samba +``` + +二、添加配置文件 + +```bash +[root@localhost ~]# vim /etc/samba/smb.conf +...... +[shared] + path = /data/samba + browseable = yes + writable = yes + valid users = @smbgroup + create mask = 0660 + directory mask = 2770 +``` + +三、关闭防火墙与SELinux + +```bash +[root@localhost ~]# systemctl stop firewalld +[root@localhost ~]# setenforce 0 +``` + +四、重启smb服务 + +```bash +[root@localhost ~]# systemctl restart smb +[root@localhost ~]# systemctl restart nmb +``` + +##### 2.3.2 客户端操作 + +###### 2.3.2.1 Windows连接 + +一、在运行窗口中输入:`\\192.168.88.10\`进行连接 + +![image-20250111104202425](11.samba文件管理/image-20250111104202425.png) + +二、用户验证:smbuser/123 + +三、文件创建写入测试 + +![image-20250111105213658](11.samba文件管理/image-20250111105213658.png) + +四、Samba服务端中查看 + +```bash +[root@localhost ~]# cat /data/samba/file.txt +The file is Created by windows... +``` + +###### 2.3.2.2 Linux连接 + +一、客户端工具下载 + +```bash +[root@localhost ~]# yum -y install samba-client +``` + +二、创建上传测试文件 + +```bash +[root@localhost ~]# echo "In server2..." > server2.txt +``` + +三、使用smbclient连接服务器测试 + +```bash +[root@localhost ~]# smbclient -L 192.168.88.10 -U smbuser +Password for [SAMBA\smbuser]: + + Sharename Type Comment + --------- ---- ------- + print$ Disk Printer Drivers + shared Disk + IPC$ IPC IPC Service (Samba 4.20.2) + smbuser Disk Home Directories +SMB1 disabled -- no workgroup available +[root@localhost ~]# smbclient //192.168.88.10/shared -U smbuser +Password for [SAMBA\smbuser]: +Try "help" to get a list of possible commands. +smb: \> ls + . D 0 Sat Jan 11 11:06:08 2025 + .. D 0 Sat Jan 11 11:06:08 2025 + file.txt A 33 Sat Jan 11 10:51:54 2025 + + 17756160 blocks of size 1024. 16032064 blocks available +smb: \> get file.txt # 下载文件 +getting file \file.txt of size 33 as file.txt (16.1 KiloBytes/sec) (average 16.1 KiloBytes/sec) +smb: \> put /server2.txt # 上传文件 +putting file /server2.txt as \server2.txt (4.6 kb/s) (average 4.6 kb/s) +``` + +##### 2.3.3 挂载CIFS文件系统 + +手动挂载: + +```bash +[root@localhost ~]# yum install -y cifs-utils +[root@localhost ~]# mkdir /mnt/smb +[root@localhost ~]# mount -t cifs //192.168.88.10/shared /mnt/smb -o username=smbuser,password=123 +[root@localhost ~]# df -h +Filesystem Size Used Avail Use% Mounted on +devtmpfs 4.0M 0 4.0M 0% /dev +tmpfs 872M 0 872M 0% /dev/shm +tmpfs 349M 5.2M 344M 2% /run +/dev/mapper/rl-root 17G 1.7G 16G 10% / +/dev/nvme0n1p1 960M 261M 700M 28% /boot +tmpfs 175M 0 175M 0% /run/user/0 +//192.168.88.10/shared 17G 1.7G 16G 10% /mnt/smb +[root@localhost ~]# cd /mnt/smb/ +[root@localhost smb]# ls +file.txt server2.txt +``` + +开机自动挂载: + +```bash +[root@localhost ~]# vim /etc/fstab +//192.168.88.10/shared /mnt/smb cifs defaults,username=smbuser,password=123 0 0 +[root@localhost ~]# systemctl daemon-reload +[root@localhost ~]# mount -a +[root@localhost ~]# df -h +Filesystem Size Used Avail Use% Mounted on +devtmpfs 4.0M 0 4.0M 0% /dev +tmpfs 872M 0 872M 0% /dev/shm +tmpfs 349M 5.2M 344M 2% /run +/dev/mapper/rl-root 17G 1.7G 16G 10% / +/dev/nvme0n1p1 960M 261M 700M 28% /boot +//192.168.88.10/shared 17G 1.7G 16G 10% /mnt/smb +tmpfs 175M 0 175M 0% /run/user/0 +``` + +### 3. 实战:不同账户访问不同目录 + +#### 3.1 服务端 + +一、创建并启用用户 + +创建三个samba用户,分别为smb1、smb2、smb3。密码均为:123 + +```bash +[root@localhost ~]# useradd -s /sbin/nologin -r smb1 # -r 不创建家目录 +[root@localhost ~]# useradd -s /sbin/nologin -r smb2 +[root@localhost ~]# useradd -s /sbin/nologin -r smb3 +[root@localhost ~]# +[root@localhost ~]# smbpasswd -a smb1 +New SMB password: +Retype new SMB password: +Added user smb1. +[root@localhost ~]# smbpasswd -a smb2 +New SMB password: +Retype new SMB password: +Added user smb2. +[root@localhost ~]# smbpasswd -a smb3 +New SMB password: +Retype new SMB password: +Added user smb3. +[root@localhost ~]# smbpasswd -e smb1 +Enabled user smb1. +[root@localhost ~]# smbpasswd -e smb2 +Enabled user smb2. +[root@localhost ~]# smbpasswd -e smb3 +Enabled user smb3. + +# 查看smb用户 +[root@localhost ~]# pdbedit -L +smbuser:1000: +smb2:986: +smb1:987: +smb3:985: +``` + +二、修改Samba配置文件如下 + +```bash +[root@localhost ~]# vim /etc/samba/smb.conf +# 在global中添加该字段 +[global] +config file = /etc/samba/conf.d/%U # 变量%U表示匹配用户名 + +# 新建共享配置 +[share] + path = /data/samba/share + browseable = yes + writable = yes + Guest ok = yes + create mask = 0660 + directory mask = 2770 +``` + +三、配置共享目录和文件 + +```bash +[root@localhost ~]# mkdir -p /data/samba/share +[root@localhost ~]# mkdir -p /data/samba/smb1 +[root@localhost ~]# mkdir -p /data/samba/smb2 +[root@localhost ~]# touch /data/samba/share/share.txt # 共享目录及文件 +[root@localhost ~]# touch /data/samba/smb1/smb1.txt # smb1目录及文件 +[root@localhost ~]# touch /data/samba/smb2/smb2.txt # smb2目录及文件 +[root@localhost ~]# tree /data/samba/ +/data/samba/ +├── file.txt +├── server2.txt +├── share +│   └── share.txt +├── smb1 +│   └── smb1.txt +└── smb2 + └── smb2.txt + +# 将/data/samba目录权限放开 +[root@localhost ~]# chmod 777 -R /data/samba +``` + +四、针对smb1用户和smb2用户单独编辑配置文件 + +```bash +[root@localhost ~]# vim /etc/samba/conf.d/smb1 +[share] + path = /data/samba/smb1 + writable = yes + create mask = 0660 + browseable = yes +[root@localhost ~]# vim /etc/samba/conf.d/smb2 +[share] + path = /data/samba/smb2 + writable = yes + create mask = 0660 + browseable = yes +``` + +五、重启相关服务 + +```bash +[root@localhost ~]# systemctl restart smb +[root@localhost ~]# systemctl restart nmb +``` + +#### 3.2 客户端 + +客户端访问测试 + +```bash +[root@localhost ~]# smbclient //192.168.88.10/share -U smb1 +Password for [SAMBA\smb1]: +Try "help" to get a list of possible commands. +smb: \> ls + . D 0 Sat Jan 11 15:00:58 2025 + .. D 0 Sat Jan 11 15:00:58 2025 + smb1.txt N 0 Sat Jan 11 15:00:58 2025 + + 17756160 blocks of size 1024. 16030864 blocks available +smb: \> exit +[root@localhost ~]# smbclient //192.168.88.10/share -U smb2 +Password for [SAMBA\smb2]: +Try "help" to get a list of possible commands. +smb: \> ls + . D 0 Sat Jan 11 15:00:03 2025 + .. D 0 Sat Jan 11 15:00:03 2025 + smb2.txt N 0 Sat Jan 11 15:00:03 2025 + + 17756160 blocks of size 1024. 16030864 blocks available +smb: \> exit +[root@localhost ~]# smbclient //192.168.88.10/share -U smb3 +Password for [SAMBA\smb3]: +Try "help" to get a list of possible commands. +smb: \> ls + . D 0 Sat Jan 11 14:59:44 2025 + .. D 0 Sat Jan 11 14:59:44 2025 + share.txt N 0 Sat Jan 11 14:59:44 2025 + + 17756160 blocks of size 1024. 16030884 blocks available +``` + +#### 3.3 **结论** + +由此可以看出,我们通过针对不同用户编写子配置文件的方式来覆盖主配置文件中相同的共享。可以实现对于没有子配置的用户,访问主配置文件中的定义的目录。对于具备子配置的用户,访问子配置所定义的目录。实现控制不用用户登录访问不同目录。 \ No newline at end of file diff --git a/00.基础阶段/02.Linux基础/11.samba文件管理/image-20250111104202425.png b/00.基础阶段/02.Linux基础/11.samba文件管理/image-20250111104202425.png new file mode 100644 index 0000000..2b0ce25 Binary files /dev/null and b/00.基础阶段/02.Linux基础/11.samba文件管理/image-20250111104202425.png differ diff --git a/00.基础阶段/02.Linux基础/11.samba文件管理/image-20250111105213658.png b/00.基础阶段/02.Linux基础/11.samba文件管理/image-20250111105213658.png new file mode 100644 index 0000000..c33755e Binary files /dev/null and b/00.基础阶段/02.Linux基础/11.samba文件管理/image-20250111105213658.png differ diff --git a/00.基础阶段/02.Linux基础/12.HTTP协议.md b/00.基础阶段/02.Linux基础/12.HTTP协议.md new file mode 100644 index 0000000..2a818bf --- /dev/null +++ b/00.基础阶段/02.Linux基础/12.HTTP协议.md @@ -0,0 +1,291 @@ +# 12.HTTP协议 + +## 12.HTTP协议 + +### 1. HTTP协议介绍 + +HTTP(HyperText Transfer Protocol,超文本传输协议)是用于在客户端(通常是浏览器)和服务器之间传输超文本(如HTML)的应用层协议。它是无状态的、面向请求-响应的协议,基于TCP/IP传输。 + +HTTP有不同版本号,不同版本号区别如下 + +* HTTP0.9:仅支持GET方法,仅能访问HTML格式的资源 +* HTTP1.0:增加POST和HEAD方法,MIME支持多种数据格式,开始支持Cache,支持tcp短连接 +* HTTP1.1:支持持久连接(长连接),一个TCP连接允许多个请求,新增PUT、PATCH、DELETE等 +* HTTP2.0:性能大幅提升,新的二进制格式,多路复用,header压缩,服务端推送。 + +### 2. HTTP工作原理 + +HTTP的工作过程可以总结为以下几个步骤: + +1. **建立连接:** + 客户端(如浏览器)与服务器之间通过TCP三次握手建立连接。 +2. **发送请求:** + 客户端向服务器(Apache、Nginx、IIS服务器)发送HTTP请求报文,请求资源或操作。 +3. **服务器处理请求:** + HTTP服务器接收到请求后,处理请求并生成响应。 +4. **返回响应:** + 服务器将响应报文返回给客户端。 +5. **断开连接:** + 通常在响应完成后关闭TCP连接(HTTP/1.0默认短连接,HTTP/1.1支持长连接)。 + +### 3. URL与URI + +#### 3.1 URI(Uniform Resource Identifier) + +URI是统一资源标识符,用于标识互联网上的资源。URI分为两种 + +- **URL(Uniform Resource Locator):** 统一资源定位符,用于描述资源的地址。 + +- **URN(Uniform Resource Name):** 统一资源名称,用于标识资源的名称,不依赖物理位置 + +#### 3.2 URL(Uniform Resource Locator + +HTTP使用统一资源标识符(Uniform Resource Identifiers, URI)来传输数据和建立连接。URL是一种特殊类型的URI,包含了用于查找某个资源的足够的信息 + +URL,全称是UniformResourceLocator, 中文叫统一资源定位符,是互联网上用来标识某一处资源的地址。以下面这个URL为例,介绍下普通URL的各部分组成: + +```plain +http://iproute.cn:80/news/search?keyword=123&enc=utf8#name=321 +``` + +从上面的URL可以看出,一个完整的URL包括以下几部分: + +1. **协议部分:**该URL的协议部分为“http:”,这代表网页使用的是HTTP协议。在Internet中可以使用多种协议,如HTTP,FTP等等本例中使用的是HTTP协议。在"HTTP"后面的“//”为分隔符 +2. **域名(主机)部分:**该URL的域名部分为“iproute.cn”。一个URL中,也可以使用IP地址作为域名使用 +3. **端口部分:**跟在域名后面的是端口,域名和端口之间使用“:”作为分隔符。端口不是一个URL必须的部分,如果省略端口部分,将采用默认端口 +4. **虚拟目录部分:**从域名后的第一个“/”开始到最后一个“/”为止,是虚拟目录部分。虚拟目录也不是一个URL必须的部分。本例中的虚拟目录是“/news/” +5. **文件名部分:**从域名后的最后一个“/”开始到“?”为止,是文件名部分,如果没有“?”,则是从域名后的最后一个“/”开始到“#”为止,是文件部分,如果没有“?”和“#”,那么从域名后的最后一个“/”开始到结束,都是文件名部分。本例中的文件名是“search”。文件名部分也不是一个URL必须的部分,如果省略该部分,则使用默认的文件名 +6. **参数部分:**从“?”开始到“#”为止之间的部分为参数部分,又称搜索部分、查询部分。本例中的参数部分为“keyword=123&enc=utf8”。参数可以允许有多个参数,参数与参数之间用“&”作为分隔符。 +7. **锚部分:**从“#”开始到最后,都是锚部分。本例中的锚部分是“name”。锚部分也不是一个URL必须的部分 + +### 4. HTTP注意事项 + +1. HTTP是无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。 +2. HTTP是媒体独立的:这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型。 +3. HTTP是无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。 + +### 5. HTTP 消息结构 + +* HTTP是基于客户端/服务端(C/S)的架构模型,通过一个可靠的链接来交换信息,是一个无状态的请求/响应协议。 +* 一个HTTP"客户端"是一个应用程序(Web浏览器或其他任何客户端),通过连接到服务器达到向服务器发送一个或多个HTTP的请求的目的。 +* 一个HTTP"服务器"同样也是一个应用程序(通常是一个Web服务,如Apache Web服务器或IIS服务器等),通过接收客户端的请求并向客户端发送HTTP响应数据。 +* HTTP使用统一资源标识符(Uniform Resource Identifiers, URI)来传输数据和建立连接。 +* HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文,下面是一个HTTP响应示例 + +![img](12.HTTP协议/Go4zQyQGEC20GILn.png!thumbnail) + +#### 5.1 HTTP请求头部 + +客户端发送一个HTTP请求到服务器的请求消息包括以下格式: + +![img](12.HTTP协议/kRY1HYc5wuGHTvoh.png!thumbnail) + +![img](12.HTTP协议/cRIMczDoDQ2FyfDS.png!thumbnail) + +* 使用burpsuit抓包如下 + + * GET请求案例 + + ``` + GET / HTTP/1.1 + Host: iproute.cn + User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0 + Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 + Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3 + Accept-Encoding: gzip, deflate + Connection: close + ``` + + * POST请求 + + ``` + POST / HTTP/1.1 + Host: d2.s.iproute.cn + User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0 + Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 + Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3 + Accept-Encoding: gzip, deflate + Referer: http://d2.s.iproute.cn/ + Connection: close + Content-Type: application/x-www-form-urlencoded + Content-Length: 27 + + m_name=admin&m_pwd=admin888 + ``` + +#### 5.2 常见http请求报文头部属性 + +* Accpet + * 告诉服务端,客户端接收什么类型的响应 +* Referer + * 表示这是请求是从哪个URL进来的,比如想在网上购物,但是不知道选择哪家电商平台,你就去问百度,说哪家电商的东西便宜啊,然后一堆东西弹出在你面前,第一给就是某宝,当你从这里进入某宝的时候,这个请求报文的Referer就是[www.baidu.com](http://www.baidu.com) +* Cache-Control + * 对缓存进行控制,如一个请求希望响应的内容在客户端缓存一年,或不被缓可以通过这个报文头设置 +* Accept-Encoding + * 这个属性是用来告诉服务器能接受什么编码格式,包括字符编码,压缩形式(一般都是压缩形式) + * 例如:Accept-Encoding:gzip, deflate(这两种都是压缩格式) +* Host + * 指定要请求的资源所在的主机和端口 +* User-Agent + * 告诉服务器,客户端使用的操作系统、浏览器版本和名称 +* 更多的头部属性可以参见脚本之家提供的http请求头部大全 + * [http://tools.jb51.net/table/http_header](http://tools.jb51.net/table/http_header) + +#### 5.3 HTTP响应头部 + +服务的相应信息格式如下: + +![img](12.HTTP协议/hWKtBTOPMwy2lKuo.png!thumbnail) + +![img](12.HTTP协议/qoHksWquM1MQnvzi.png!thumbnail) + +* 使用burpsuit抓包如下 + +```plain +HTTP/1.1 200 OK +Server: nginx +Date: Sun, 02 May 2021 00:27:06 GMT +Content-Type: text/html +Last-Modified: Wed, 05 Aug 2020 11:25:56 GMT +Connection: close +Vary: Accept-Encoding +ETag: W/"5f2a9744-aff7" +Strict-Transport-Security: max-age=31536000 +Content-Length: 45047 +

hello world

+``` + +#### 5.4 POST和GET请求方法区别 + +* 提交的过程 + * GET提交,请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),以?分割URL和传输数据,多个参数用&连接 + * POST提交:把提交的数据放置在是HTTP包的包体中 +* 传输数据的大小 + * 首先声明:HTTP协议没有对传输的数据大小进行限制,HTTP协议规范也没有对URL长度进行限制 + * GET提交,特定浏览器和服务器对URL长度有限制 + * POST提交,由于不是通过URL传值,理论上数据不受限 +* 安全性 + * POST的安全性要比GET的安全性高 + * 登录页面有可能被浏览器缓存,而缓存的是URL + * 其他人查看浏览器的历史纪录,那么别人就可以拿到你的账号和密码了 + * 使用GET提交数据还可能会造成Cross-site request forgery攻击 + +#### 5.5 常见http响应报文头部属性 + +* Cache-Control + * 响应输出到客户端后,服务端通过该属性告诉客户端该怎么控制响应内容的缓存 +* ETag + * 表示你请求资源的版本,如果该资源发生啦变化,那么这个属性也会跟着变 +* Location + * 在重定向中或者创建新资源时使用 +* Set-Cookie + * 服务端可以设置客户端的cookie +* 更多的头部属性可以参见脚本之家提供的http请求头部大全 + * [http://tools.jb51.net/table/http_header](http://tools.jb51.net/table/http_header) + +### 6. HTTP状态码 + +* 状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别: + * 1xx:指示信息--表示请求已接收,继续处理 + * 2xx:成功--表示请求已被成功接收、理解、接受 + * 3xx:重定向--要完成请求必须进行更进一步的操作 + * 4xx:客户端错误--请求有语法错误或请求无法实现 + * 5xx:服务器端错误--服务器未能实现合法的请求 +* 常见状态码 + +```xml +200 OK //客户端请求成功 +400 Bad Request //客户端请求有语法错误,不能被服务器所理解 +401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用 +403 Forbidden //服务器收到请求,但是拒绝提供服务 +404 Not Found //请求资源不存在,eg:输入了错误的URL +500 Internal Server Error //服务器发生不可预期的错误 +503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常 +``` + +* 更多状态码属性可以参见脚本之家提供的状态码大全 + * [http://tools.jb51.net/table/http_status_code](http://tools.jb51.net/table/http_status_code) + +### 7. HTTP请求方法 + +根据HTTP标准,HTTP请求可以使用多种请求方法。 + +HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。 + +HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。 + +* GET     请求指定的页面信息,并返回实体主体。 +* HEAD     类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头 +* POST     向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。 +* PUT     从客户端向服务器传送的数据取代指定的文档的内容。 +* DELETE      请求服务器删除指定的页面。 +* CONNECT     HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。 +* OPTIONS     允许客户端查看服务器的性能。 +* TRACE     回显服务器收到的请求,主要用于测试或诊断。 +* 更多http请求方法可以参见脚本之家提供的http请求方法大全 + * [http://tools.jb51.net/table/http_request_method](http://tools.jb51.net/table/http_request_method) + +### 8. HTTP工作原理 + +在浏览器地址栏键入URL,按下回车之后会经历以下流程: + +1. 浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址; +2. 解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立TCP连接; +3. 浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器; +4. 服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器; +5. 释放 TCP连接; +6. 浏览器将该 html 文本并显示内容; + +### 9. 长连接与短连接 + +HTTP1.1规定了默认保持长连接(HTTP persistent connection ,也有翻译为持久连接),数据传输完成了保持TCP连接不断开(不发RST包、不四次握手),等待在同域名下继续用这个通道传输数据;相反的就是短连接。 + +在实际使用中,HTTP头部有了Keep-Alive这个值并不代表一定会使用长连接,客户端和服务器端都可以无视这个值,也就是不按标准来。毕竟TCP是一个双向连接的协议,双方都可以决定是不是主动断开。 + +客户端的长连接不可能无限期的拿着,会有一个超时时间,服务器有时候会告诉客户端超时时间。下图中的Keep-Alive: timeout=20,表示这个TCP通道可以保持20秒 + +![img](12.HTTP协议/AhJjalIMlDNIvSjd.png!thumbnail) + +### 10. python实现http协议 + +```python +import socket + +sk = socket.socket() +sk.bind(("127.0.0.1", 80)) +sk.listen() +print("Web服务器正在监听中:127.0.0.1") +while True: + conn, addr = sk.accept() + data = conn.recv(8096) + print("请求报文:\n",data) + conn.send(b"HTTP/1.1 200 OK\r\n\r\n") + conn.send(b"

OK

") + conn.close() +``` + +#### 10.1 根据不同的路径返回不同的内容 + +```python +import socket +sk = socket.socket() +sk.bind(("127.0.0.1",80)) +sk.listen() +print("Web服务器正在监听中:127.0.0.1") +while True: + conn, addr = sk.accept() + data = conn.recv(8096) + print("请求报文:\n", data) + ret = str(data,encoding='utf-8') + url = ret.split()[1] + conn.send(b"HTTP/1.1 200 OK\r\n\r\n") + if url == '/home': + respone = b"

in home

" + elif url == '/index': + respone = b"

in index

" + else: + respone = b"

404 not found!

" + conn.send(respone) + conn.close() +``` + diff --git a/00.基础阶段/02.Linux基础/12.HTTP协议/AhJjalIMlDNIvSjd.png!thumbnail b/00.基础阶段/02.Linux基础/12.HTTP协议/AhJjalIMlDNIvSjd.png!thumbnail new file mode 100644 index 0000000..8872372 Binary files /dev/null and b/00.基础阶段/02.Linux基础/12.HTTP协议/AhJjalIMlDNIvSjd.png!thumbnail differ diff --git a/00.基础阶段/02.Linux基础/12.HTTP协议/Go4zQyQGEC20GILn.png!thumbnail b/00.基础阶段/02.Linux基础/12.HTTP协议/Go4zQyQGEC20GILn.png!thumbnail new file mode 100644 index 0000000..96be4c0 Binary files /dev/null and b/00.基础阶段/02.Linux基础/12.HTTP协议/Go4zQyQGEC20GILn.png!thumbnail differ diff --git a/00.基础阶段/02.Linux基础/12.HTTP协议/cRIMczDoDQ2FyfDS.png!thumbnail b/00.基础阶段/02.Linux基础/12.HTTP协议/cRIMczDoDQ2FyfDS.png!thumbnail new file mode 100644 index 0000000..c867a24 Binary files /dev/null and b/00.基础阶段/02.Linux基础/12.HTTP协议/cRIMczDoDQ2FyfDS.png!thumbnail differ diff --git a/00.基础阶段/02.Linux基础/12.HTTP协议/hWKtBTOPMwy2lKuo.png!thumbnail b/00.基础阶段/02.Linux基础/12.HTTP协议/hWKtBTOPMwy2lKuo.png!thumbnail new file mode 100644 index 0000000..077803e Binary files /dev/null and b/00.基础阶段/02.Linux基础/12.HTTP协议/hWKtBTOPMwy2lKuo.png!thumbnail differ diff --git a/00.基础阶段/02.Linux基础/12.HTTP协议/kRY1HYc5wuGHTvoh.png!thumbnail b/00.基础阶段/02.Linux基础/12.HTTP协议/kRY1HYc5wuGHTvoh.png!thumbnail new file mode 100644 index 0000000..204aa70 Binary files /dev/null and b/00.基础阶段/02.Linux基础/12.HTTP协议/kRY1HYc5wuGHTvoh.png!thumbnail differ diff --git a/00.基础阶段/02.Linux基础/12.HTTP协议/qoHksWquM1MQnvzi.png!thumbnail b/00.基础阶段/02.Linux基础/12.HTTP协议/qoHksWquM1MQnvzi.png!thumbnail new file mode 100644 index 0000000..1c67422 Binary files /dev/null and b/00.基础阶段/02.Linux基础/12.HTTP协议/qoHksWquM1MQnvzi.png!thumbnail differ diff --git a/00.基础阶段/02.Linux基础/13.Nginx.md b/00.基础阶段/02.Linux基础/13.Nginx.md new file mode 100644 index 0000000..08768d8 --- /dev/null +++ b/00.基础阶段/02.Linux基础/13.Nginx.md @@ -0,0 +1,441 @@ +# 13.Nginx + +## 13.Nginx + +### 1. Nginx介绍 + +Nginx:engine X ,2002年开始开发,2004年开源,2019年3⽉11⽇,Nginx公司被F5 Networks以6.7亿美元收购。 + +Nginx 则是免费的、开源的、⾼性能的HTTP和反向代理服务器、邮件代理服务器、以及TCP/UDP代理服务器 解决[C10K问题](https://www.ideawu.net/blog/archives/740.html)(10K Connections) + +Nginx官⽹:[http://nginx.org](http://nginx.org/) + +Nginx 商业版为Nginx Plus:https://www.nginx.com/products/nginx/ + +- nginx的其它的⼆次发⾏版: + - Tengine:由淘宝⽹发起的Web服务器项⽬。它在Nginx的基础上,针对⼤访问量⽹站的需求,添加了很多⾼级功能和特性。Tengine的性能和稳定性已经在⼤型的⽹站如淘宝⽹,天猫商城等得到了很好的检验。它的最终⽬标是打造⼀个⾼效、稳定、安全、易⽤的Web平台,从2011年12⽉开始,Tengine成为⼀个开源项⽬,官⽹http://tengine.taobao.org/ + - OpenResty:基于 Nginx 与 Lua 语⾔的⾼性能 Web 平台, 章亦春团队开发,官⽹:http://openresty.org/cn/ + +#### 1.1 Nginx的作用 + +Nginx的作用非常的多,算是企业软件中的“变形金刚”,我们现在不需要过多的纠结Nginx的作用,在基础课程中我们只要知道一个事情,就是Nginx可以作为网页服务器,为我们电脑提供网站服务 + +#### 1.2 Nginx使用过程 + +我们在后续的学习过程中,Nginx是非常重要的知识点,也是IT技术人员必会的技能之一,所以关于Nginx的运行原理也是需要我们在后续的课程中深入了解的。 + +本次基础课程我们针对Nginx的网站服务做简单讲解和练习 + +- Nginx安装 +- 了解Nginx的网站根目录 +- 了解vhosts作用 +- 配置vhosts + +### 2. Nginx安装 + +Nginx支持windows和Linux系统,但是在企业中99.9999%都是部署在Linux中的,我们需要打开Centos7虚拟机,然后远程连接上去,在命令行中敲如下代码 + +```bash +# 默认情况下,Centos7的基本软件仓库中是没有Nginx的,我们需要安装一个企业软件扩展仓库 +yum -y install epel-release + +# 在安装好了扩展仓库之后,我们就可以一键安装nginx了 +yum -y install nginx + +# 在安装完毕之后,我们可以查看nginx的版本号(其实版本号什么的不重要,重要的是这个就证明我们已经装上了) +nginx -v +``` + +### 3. 网站相关的内容 + +#### 3.1 输入网址之后发生了什么 + +[有一篇博客](https://iproute.cn/2020/03/13/%E8%BE%93%E5%85%A5URL%E5%9B%9E%E8%BD%A6%E4%B9%8B%E5%90%8E%E5%8F%91%E7%94%9F%E4%BA%86%E4%BB%80%E4%B9%88%EF%BC%9F/) + +#### 3.2 域名 + +##### 3.2.1 DNS的诞生 + +DNS(Domain Name System) 是一套从域名到IP的映射系统。 + +在网络中要确定一台主机,可以通过IP地址来做到。但是IP地址不方便记忆, 于是人们发明了一种叫主机名的东西 。 + +最初时候人们把主机名和IP地址的对应关系都写在一个hosts文件里面,然后这个hosts文件由“互联网信息中心(SRI-NIC)”来管理和分发。也就是人们需要定期更新hosts文件。这个文件目前在windows系统的`C:\Windows\System32\drivers\etc\hosts`中。 + +时间长了,这个Hosts的机制并不好用,而且更新不及时,主机名多了之后hosts文件太大了,后来就不用这个机制了。 + +人们后来改用域名解析系统DNS + +- 一个组织的系统管理机构,维护系统内的每个主机的`IP和主机名`的对应关系 +- 如果新计算机接入网络,将这个信息注册到`数据库`中 +- 用户输入域名的时候,会自动查询`DNS`服务器,由`DNS服务器`检索数据库, 得到对应的IP地址。 + +##### 3.2.2 域名 + +主域名是用来识别主机名称和主机所属的组织机构的一种分层结构的名称。 +例如:http://www.baidu.com(域名使用.连接) + +- com: 一级域名,表示这是一个企业域名。同级的还有 "net"(网络提供商),"org"(非盈利组织) 等。 +- baidu: 二级域名, 公司名。 +- www: 只是一种习惯用法,并不是每个域名都支持。 +- http:// : 要使用什么协议来连接这个主机名。 + +##### 3.2.3 域名解析的过程 + +1. 浏览器发起域名解析,首先查询浏览器缓存,如果没有,就查询hosts文件,如果没有就提出域名解析请求 +2. 客户机提出域名解析请求,并将该请求发送给本地的域名服务器。 +3. 当本地的域名服务器收到请求后,就先查询本地的缓存,如果有该纪录项,则本地的域名服务器就直接把查询的结果返回。 +4. 如果本地的缓存中没有该纪录,则本地域名服务器就直接把请求发给根域名服务器,然后根域名服务器再返回给本地域名服务器一个所查询域(根的子域)的主域名服务器的地址。 +5. 本地服务器再向上一步返回的域名服务器发送请求,然后接受请求的服务器查询自己的缓存,如果没有该纪录,则返回相关的下级的域名服务器的地址。 +6. 重复第四步,直到找到正确的纪录。 +7. 本地域名服务器把返回的结果保存到缓存,以备下一次使用,同时还将结果返回给客户机 + +##### 3.2.4 查看域名解析的工具 + +nslookup + +windows上在`cmd`中直接输入使用 + +``` +C:\Users\Aaron>nslookup iproute.cn +服务器: public1.114dns.com +Address: 114.114.114.114 + +非权威应答: +名称: cqfz53.coding-pages.com +Address: 124.156.193.111 +Aliases: iproute.cn +``` + +#### 3.3 网站根目录 + +网站根目录是用来存放网页文件的,把你想让别人访问的资源放在这个目录中,让别人通过URL来定位这些资源进行访问 + +Nginx默认的网站根目录是在`/usr/share/nginx/html/`中 + +```bash +# 在Nginx的网站目录下创建一个文件 +cd /usr/share/nginx/html +vim file.txt +hello world +``` + +创建好了之后,我们就可以启动Nginx服务了,在我们的浏览器中可以访问这个文件了 + +```bash +# 启动Nginx服务 +systemctl start nginx + +# 防火墙放行80端口,80端口是网页的端口,防火墙默认是不给外部设备访问的 +firewall-cmd --add-port=80/tcp --permanet + +# 刷新防火墙策略 +firewall-cmd --reload +``` + +如果这个时候你浏览器访问的是`http://192.168.175.88/file.txt`,这个IP地址是我当前虚拟机的IP! + +![image-20211104110756051](13.Nginx/image-20211104110756051.png) + +相信各位同学也发现了,我们可以在IP地址后面加上对应的文件名,来访问网站根目录下的文件,下面我们可以尝试在网站根目录下创建文件夹 + +```bash +# 创建一个文件夹,并且在文件夹中放入一个文件 +cd /usr/share/nginx/html +mkdir dir +cd dir +vim indir.txt +I'am in dir +``` + +那么你访问这个资源的方式将是下面的样子 + +![image-20211104111029469](13.Nginx/image-20211104111029469.png) + +结论就是,我们在地址后面加上文件的路径和文件名,就可以正确的访问我们在网站服务器上的资源。 + +#### 3.4 默认文件 + +有些网站并不是在地址后面一定是一个文件,我们也见过这样的网址 + +![image-20211104111228904](13.Nginx/image-20211104111228904.png) + +这样的网站地址并没有定位到一个文件,而是只定位到了一个文件夹,这个是因为如果没有指定文件Nginx会尝试打开你访问目录下的默认文件,默认文件名往往叫`index.html`,如果在目录中有`index.html`,那么在访问路径资源的时候就可以不用指定文件名。 + +```bash +# 在dir文件夹中创建index.html +# cd不是必须的,这个是防止有的同学并没有在网站根目录下,就直接创建了文件 +cd /usr/share/nginx/html/dir/ +vim index.html +in dir index.html +``` + +![image-20211104112118564](13.Nginx/image-20211104112118564.png) + +如果访问某个目录,这个目录下没有默认的文件,那么会出现如下错误 + +![image-20211104112255260](13.Nginx/image-20211104112255260.png) + +### 4. 支持的资源 + +先说结论,只要是浏览器支持的资源类型,都可以支持 + +但是... + +目前我们浏览器在没安装任何额外的软件情况下,最主要支持的文件如下 + +- 网页文件 + - html、css、js + - xml、json + - 等等 +- 媒体文件 + - 视频:mp4、swf等等 + - 音频:mp3等等 + - 图片:jpg,png,svg等等 +- 文档 + - txt、pdf等等 + +其他的大多数文件,都会默认是做下载处理 + +我们可以尝试一下,在根目录放一个压缩包 + +```bash +# cd不是必须的,这个是防止有的同学并没有在网站根目录下,就直接创建了文件 +cd /usr/share/nginx/html/ + +# 创建一个空文件,假装是压缩包,浏览器是看文件的后缀名来判断的 +touch file.zip +``` + +浏览器访问这个zip文件,会发现是默认情况下是下载 + +![image-20211104140726023](13.Nginx/image-20211104140726023.png) + +### 5. 搭建游戏小网站 + +英格科技准备好了一个flash小游戏网站,我们可以下载到网站根目录下 + +```bash +# cd不是必须的,这个是防止有的同学并没有在网站根目录下,就直接开始文件操作 +cd /usr/share/nginx/html/ + +# 下载英格科技准备好的网页小游戏源代码,也可以手动访问这个http://file.eagleslab.com:8889/地址获取 +yum -y install wget +wget http://file.eagleslab.com:8889/课程相关软件/云计算课程/课程相关文件/games.zip + +# 解压 +unzip games.zip + +# games文件夹的目录结构如下 +[root@localhost html]# tree -C -L 1 games +games +├── game +├── index_files +└── index.html +``` + +我们可以看到games的index.html文件,在games的目录中,所以我们浏览器需要访问`http://192.168.175.88/games` + +![image-20211104142258054](13.Nginx/image-20211104142258054.png) + +### 6. 虚拟主机 + +如果一台服务器一个IP地址仅仅只搭建一个网站是非常浪费的,我们可以让Nginx搭建多个网站,然后根据我们浏览器访问的域名来判断应该回应我们哪一个页面,这种功能就被称之为虚拟主机 + +我们先创建三个文件夹用于存放三个不同网站的内容 + +```bash +# 为了方便使用,我们把网站目录创建在根目录下 +mkdir -p /html/www/ +mkdir -p /html/bbs/ +mkdir -p /html/blog/ + +[root@localhost ~]# tree /html/ +/html/ +├── bbs +├── blog +└── www +``` + +Nginx会主动加载`/etc/nginx/conf.d`目录中的配置文件,我们可以将不同网站的配置文件放在这个目录中 + +```bash +# 创建用于存放网站主页文件的配置文件 +vim /etc/nginx/conf.d/www.conf +server { + listen 80; + server_name www.iproute.cn; + location / { + root /html/www; + index index.html; + } +} +``` + +关于这个配置文件中的解释如下: + +- server + - 开始服务器配置 +- listen + - 这个网站的端口号 + - 默认是80端口,如果不是80端口,那么在访问的时候就需要加上端口号 +- server_name + - 如果访问的是这个域名,那么将会是此配置文件生效 +- root + - 网站根目录 +- index + - 默认的打开的文件 + +依照上面的格式,创建好额外的两个文件 + +```bash +# 创建论坛相关的配置文件 +vim /etc/nginx/conf.d/bbs.conf +server { + listen 80; + server_name bbs.iproute.cn; + location / { + root /html/bbs; + index index.html; + } +} + +# 创建博客相关的配置文件 +vim /etc/nginx/conf.d/blog.conf +server { + listen 80; + server_name blog.iproute.cn; + location / { + root /html/blog; + index index.html; + } +} + +# 创建好后进行检查 +[root@localhost ~]# ls -lh /etc/nginx/conf.d/ +总用量 12K +-rw-r--r--. 1 root root 115 11月 4 14:35 bbs.conf +-rw-r--r--. 1 root root 117 11月 4 14:36 blog.conf +-rw-r--r--. 1 root root 115 11月 4 14:33 www.conf + +# 检查nginx配置文件是否语法错误 +[root@localhost ~]# nginx -t +nginx: the configuration file /etc/nginx/nginx.conf syntax is ok +nginx: configuration file /etc/nginx/nginx.conf test is successful + +# 加载配置文件 +nginx -s reload +``` + +下面准备好三个网站的网页内容,我们下次才会学习动态网站环境搭建,这边我们就先用自己写的页面测试效果 + +```bash +# 准备好三个网站的内容 +cat << EOF > /html/www/index.html +in www... +EOF + +cat << EOF > /html/bbs/index.html +in bbs... +EOF + +cat << EOF > /html/blog/index.html +in blog... +EOF +``` + +正常情况下,我们应该去购买一个域名,并且在域名主机商那边解析到我们的IP地址上,但是这边我们只是学习测试的,我们可以修改自己本机的hosts文件,来让我们的电脑可以成功解析到这个地址上 + +用记事本编辑我们电脑上的`C:\Windows\System32\drivers\etc\hosts`文件,在最后加上(注意,这边的IP是虚拟机的IP,域名是我上面配置文件里面写的三个域名) + +```bash +192.168.175.88 www.iproute.cn +192.168.175.88 bbs.iproute.cn +192.168.175.88 blog.iproute.cn +``` + +如果大家都配置正确,那么最后效果如下 + +![image-20211104145152984](13.Nginx/image-20211104145152984.png) + + + +### 7. NAT(Network Address Translation) + +#### 7.1 私有IP地址 + +- 如果要取得互联网合法地址用于通信,必须要找iana.org组织分配 +- 很多企业内部都有大量的网络设备,大多数时候这些设备只需要内部通信即可 +- 企业的网络管理员可以从如下网段中自行分配地址 + +| 私有IP地址空间 | 地址范围 | +| -------------- | ---------------------------- | +| 10.0.0.0/8 | 10.0.0.0到10.255.255.255 | +| 172.16.0.0/12 | 172.16.0.0到172.31.255.255 | +| 192.168.0.0/16 | 192.168.0.0到192.168.255.255 | + +- 私有IP地址空间中的地址不需要申请,随意使用,但是不能在互联网上与合法地址通信(因为对方没法回复你这个地址,因为世界上私有IP地址段无数个重复的,怎么知道回到谁那里呢) +- 而我们明明用的私有IP地址,也可以上网,因为我们需要先把自己的上网请求提交给网络中的网关(就是你家的出口路由器),再由网关代替我们去获取内容转交给我们的电脑手机,而网关往往能从运营商那里得到一个合法的公有IP地址 + +#### 7.2 NAT + +- 当今的互联网是由一个个小的自治系统组成,一个家庭,一个企业就是一个小的自治系统 +- 自治系统内部有着众多的设备需要IP地址联网,每个地址都需要去IANA申请明显做不到,所以就会使用私有IP地址进行分配 +- 私有IP地址无法做到互联网通信,在内网之中就需要一个默认网关来代替大家请求互联网数据 +- NAT网络地址转换技术能够将数据包中的IP地址进行转换 + +#### 7.3 NAT优缺点 + +| 优点 | 缺点 | +| :----------------------------------- | :------------------------------------ | +| 节省IP地址空间 | 增加转发延迟 | +| 解决IP地址重叠问题 | 丧失端到端的寻址能力 | +| 增加网络的连入Internet的弹性 | 某些应用不支持NAT | +| 网络变更的时候减少IP重编址带来的麻烦 | 需要一定的内存空间支持动态存储NAT表项 | +| 对外隐藏内部地址,增加网络安全性 | 需要耗费一定CPU内存资源进行NAT操作 | + +#### 7.4 NAT实验 + +![image-20200618184558677](13.Nginx/image-20200618184558677.png) + +#### 7.5 端口映射 + +- NAT会导致只能内网主动访问外网,而互联网没法主动访问内部网络,这样虽然保护了内部网络,但是却丢失了端到端通信的过程 +- 端口映射可以将公网IP地址的端口对应到内网某个IP的端口号,从而让内网的设备也可以对外发布服务 +- 端口映射可以让内网多个IP地址共用一个公网IP,可以节约很多成本 + + + +![image-20200619143044631](13.Nginx/image-20200619143044631.png) + +### 8. 内网穿透 + +- frp是开源的内网穿透软件,[github地址](https://github.com/fatedier/frp) + +- frp主要分为服务端和客户端,服务端是frps,客户端是frpc +- frpc和frps会建立一条通道,当用户访问frps的流量,都会最终被转发到frpc上 +- 如果你有公网服务器,可以参照官方教程自己搭建 +- 免费frp提供网站,不过frp非常消耗带宽,所谓免费也是有很大限制的 + - http://ngrok.cc/ + - http://freefrp.wlphp.com/ + - https://www.natfrp.com/ + - 等等 + +#### 8.1 实战演示 + +略 + + + + + + + + + + + + + + + diff --git a/00.基础阶段/02.Linux基础/13.Nginx/image-20200618184558677.png b/00.基础阶段/02.Linux基础/13.Nginx/image-20200618184558677.png new file mode 100644 index 0000000..f152ecf Binary files /dev/null and b/00.基础阶段/02.Linux基础/13.Nginx/image-20200618184558677.png differ diff --git a/00.基础阶段/02.Linux基础/13.Nginx/image-20200619143044631.png b/00.基础阶段/02.Linux基础/13.Nginx/image-20200619143044631.png new file mode 100644 index 0000000..11fe6d7 Binary files /dev/null and b/00.基础阶段/02.Linux基础/13.Nginx/image-20200619143044631.png differ diff --git a/00.基础阶段/02.Linux基础/13.Nginx/image-20211104110756051.png b/00.基础阶段/02.Linux基础/13.Nginx/image-20211104110756051.png new file mode 100644 index 0000000..6e0658c Binary files /dev/null and b/00.基础阶段/02.Linux基础/13.Nginx/image-20211104110756051.png differ diff --git a/00.基础阶段/02.Linux基础/13.Nginx/image-20211104111029469.png b/00.基础阶段/02.Linux基础/13.Nginx/image-20211104111029469.png new file mode 100644 index 0000000..c0fe8f1 Binary files /dev/null and b/00.基础阶段/02.Linux基础/13.Nginx/image-20211104111029469.png differ diff --git a/00.基础阶段/02.Linux基础/13.Nginx/image-20211104111228904.png b/00.基础阶段/02.Linux基础/13.Nginx/image-20211104111228904.png new file mode 100644 index 0000000..3e3830d Binary files /dev/null and b/00.基础阶段/02.Linux基础/13.Nginx/image-20211104111228904.png differ diff --git a/00.基础阶段/02.Linux基础/13.Nginx/image-20211104112118564.png b/00.基础阶段/02.Linux基础/13.Nginx/image-20211104112118564.png new file mode 100644 index 0000000..1acc006 Binary files /dev/null and b/00.基础阶段/02.Linux基础/13.Nginx/image-20211104112118564.png differ diff --git a/00.基础阶段/02.Linux基础/13.Nginx/image-20211104112255260.png b/00.基础阶段/02.Linux基础/13.Nginx/image-20211104112255260.png new file mode 100644 index 0000000..7facfa0 Binary files /dev/null and b/00.基础阶段/02.Linux基础/13.Nginx/image-20211104112255260.png differ diff --git a/00.基础阶段/02.Linux基础/13.Nginx/image-20211104140726023.png b/00.基础阶段/02.Linux基础/13.Nginx/image-20211104140726023.png new file mode 100644 index 0000000..eabf857 Binary files /dev/null and b/00.基础阶段/02.Linux基础/13.Nginx/image-20211104140726023.png differ diff --git a/00.基础阶段/02.Linux基础/13.Nginx/image-20211104142258054.png b/00.基础阶段/02.Linux基础/13.Nginx/image-20211104142258054.png new file mode 100644 index 0000000..48cb2de Binary files /dev/null and b/00.基础阶段/02.Linux基础/13.Nginx/image-20211104142258054.png differ diff --git a/00.基础阶段/02.Linux基础/13.Nginx/image-20211104145152984.png b/00.基础阶段/02.Linux基础/13.Nginx/image-20211104145152984.png new file mode 100644 index 0000000..ce25ad0 Binary files /dev/null and b/00.基础阶段/02.Linux基础/13.Nginx/image-20211104145152984.png differ diff --git a/00.基础阶段/02.Linux基础/14.LNMP.md b/00.基础阶段/02.Linux基础/14.LNMP.md new file mode 100644 index 0000000..38af5f1 --- /dev/null +++ b/00.基础阶段/02.Linux基础/14.LNMP.md @@ -0,0 +1,486 @@ +# 14.LNMP + +## 14.LNMP + +### 1. LNMP架构概述 + +#### 1.1 什么是LNMP + +LNMP是一套技术的组合,L=Linux、N=Nginx、M=MySQL、P=PHP + +#### 1.2 LNMP架构是如何工作的 + +- 首先nginx服务是不能处理动态请求,那么当用户发起动态请求时,nginx无法处理 +- 当用户发起http请求,请求会被nginx处理,如果是静态资源请求nginx则直接返回,如果是动态请求nginx则通过fastcgi协议转交给后端的PHP程序处理 + +![image-20210711094454191](14.LNMP/image-20210711094454191.png) + +#### 1.3 Nginx与fastcgi详细工作流程 + +![images2015.cnblogs](14.LNMP/images2015.cnblogs.jpg) + +1. 用户通过http协议发起请求,请求会先抵达LNMP架构中的nginx; +2. nginx会根据用户的请求进行location规则匹配; +3. location如果匹配到请求是静态,则由nginx读取本地直接返回; +4. location如果匹配到请求是动态,则由nginx将请求转发给fastcgi协议; +5. fastcgi收到请求交给php-fpm管理进程,php-fpm管理进程接收到后会调用具体的工作进程wrapper; +6. wrapper进程会调用PHP程序进行解析,如果只是解析代码,php直接返回; +7. 如果有查询数据库操作,则由php连接数据库(用户 密码 ip)发起查询的操作; +8. 最终数据由mysql-->php-->php-fpm-->fastcgi-->nginx-->http-->user + +### 2. LNMP架构环境部署 + +#### 2.1 安装nginx + +参考课件开始部分中的编译安装,当然也可以通过yum安装,但是yum安装的时候需要注意配置文件的路径 + +自行完成nginx的编译安装... + +#### 2.2 安装php + +1. 安装php8.0全家桶 + +```bash +[root@localhost ~]# yum install -y epel-release + +# 安装php仓库 +[root@localhost ~]# yum install -y dnf-utils http://rpms.remirepo.net/enterprise/remi-release-8.rpm --skip-broken +[root@localhost ~]# yum install -y php php-cli php-curl php-mysqlnd php-gd php-opcache php-zip php-intl +``` + +2. 更改php配置文件,启动监控9000端口 + +```bash +[root@localhost ~]# vim /etc/php-fpm.d/www.conf +...... +;listen = /run/php-fpm/www.sock +listen = 9000 +...... +``` + +3. 更改php-fpm用户,与nginx保持一致 + +```bash +[root@localhost ~]# sed -i '/^user/c user = nginx' /etc/php-fpm.d/www.conf +[root@localhost ~]# sed -i '/^group/c group = nginx' /etc/php-fpm.d/www.conf +``` + +4. 启动php-fpm管理器 + +```bash +[root@localhost ~]# systemctl enable --now php-fpm +[root@localhost ~]# systemctl status php-fpm +● php-fpm.service - The PHP FastCGI Process Manager + Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; enabled; pr> + Active: active (running) since Fri 2025-02-07 19:26:10 CST; 10s ago + Main PID: 34396 (php-fpm) + Status: "Processes active: 0, idle: 5, Requests: 0, slow: 0, Traffic> + Tasks: 6 (limit: 10888) + Memory: 29.1M + CPU: 60ms + CGroup: /system.slice/php-fpm.service + ├─34396 "php-fpm: master process (/etc/php-fpm.conf)" + ├─34397 "php-fpm: pool www" + ├─34398 "php-fpm: pool www" + ├─34399 "php-fpm: pool www" + ├─34400 "php-fpm: pool www" + └─34401 "php-fpm: pool www" + +# 检查9000端口号是否监听 +[root@localhost ~]# ss -nlt +State Recv-Q Send-Q Local Address:Port Peer Address:Port Process +LISTEN 0 128 0.0.0.0:22 0.0.0.0:* +LISTEN 0 511 0.0.0.0:80 0.0.0.0:* +LISTEN 0 511 *:9000 *:* +LISTEN 0 128 [::]:22 [::]:* +``` + +#### 2.3 安装Mariadb数据库 + +```bash +# 安装mariadb数据库软件 +[root@localhost ~]# yum install -y mariadb-server mariadb + +# 启动数据库并且设置开机自启动 +[root@localhost ~]# systemctl enable --now mariadb + +# 设置mariadb的密码 +[root@localhost ~]# mysqladmin password '123456' + +# 验证数据库是否工作正常 +[root@localhost ~]# mysql -uroot -p123456 -e "show databases;" ++--------------------+ +| Database | ++--------------------+ +| information_schema | +| mysql | +| performance_schema | ++--------------------+ +``` + +### 3. LNMP架构环境配置 + +- 在将nginx与PHP集成的过程中,需要先了解fastcgi代理配置语法 + +#### 3.1 设置fastcgi服务器的地址 + +- 该地址可以指定为域名或IP地址,以及端口 + +```bash +Syntax: fastcgi_pass address; +Default:- +Context:location,if in location +#语法示例 +fastcgi_pass location:9000; +fastcgi_pass unix:/tmp/fastcgi.socket; +``` + +#### 3.2 设置fastcgi默认的首页文件 + +- 需要结合fastcgi_param一起设置 + +```bash +Syntax: fastcgi_index name; +Default:- +Context:http,server,location +``` + +#### 3.3 通过fastcgi_param设置变量 + +- 将设置的变量传递到后端的fastcgi服务器 + +```bash +Syntax: fastcgi_param parameter value [if_not_empty]; +Default:- +Context:http,server,location +#语法示例 +fastcgi_index index.php; +fastcgi_param SCRIPT_FILENAME /code$fastcgi_script_name; +``` + +#### 3.4 php探针测试 + +为了测试php环境是否正常,我们可以编写一个php文件,然后查看是否运行正常来进行判断 + +```bash +# 首先为php探针创建一个虚拟主机 +[root@localhost ~]# vim /apps/nginx/conf.d/php.conf +server { + listen 80; + server_name php.iproot.cn; + root /code; + + location / { + index index.php index.html; + } + + location ~ \.php$ { + fastcgi_pass 127.0.0.1:9000; + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + include fastcgi_params; + } +} + +# 测试nginx配置是否正确 +[root@localhost ~]# nginx -t + +# 重启nginx服务 +[root@localhost ~]# systemctl restart nginx +``` + +编写php文件,在php文件中编写如下代码 + +```php +[root@localhost ~]# mkdir /code +[root@localhost ~]# vim /code/info.php + +``` + +在浏览器中访问`php.iproot.cn`记得更改windows的hosts文件,可以得到如下的结果: + +![image-20211106103800569](14.LNMP/image-20211106103800569.png) + +![image-20250207194233281](14.LNMP/image-20250207194233281.png) + +#### 3.5 测试数据库连接 + +为了确保php能正确访问数据库,我们可以编写如下php代码用于验证数据库是否正确连接 + +```php +[root@localhost ~]# vim /code/mysql.php + +``` + +使用浏览器访问,可以得到数据库连接的结果: + +![image-20250207194355266](14.LNMP/image-20250207194355266.png) + +#### 3.6 安装phpmyadmin + +为了方便的使用数据库,我们可以安装数据库图形化管理工具phpmyadmin + +```bash +# 为数据库管理工具创建虚拟主机 +[root@localhost ~]# vim /apps/nginx/conf.d/mysql.conf +server { + listen 80; + server_name mysql.iproot.cn; + root /code/phpmyadmin; + + location / { + index index.php index.html; + } + + location ~ \.php$ { + fastcgi_pass 127.0.0.1:9000; + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + include fastcgi_params; + } +} + +# 检查nginx配置文件,并且重启 +[root@localhost ~]# nginx -t +[root@localhost ~]# systemctl restart nginx + + +# 下载phpmyadmin源码 +[root@localhost ~]# cd /code/ +[root@localhost code]# wget https://files.phpmyadmin.net/phpMyAdmin/5.1.1/phpMyAdmin-5.1.1-all-languages.zip + +# 解压软件包,并且重命名 +[root@localhost phpmyadmin]# unzip phpMyAdmin-5.1.1-all-languages.zip +[root@localhost phpmyadmin]# mv phpMyAdmin-5.1.1-all-languages phpmyadmin + +# 添加session文件夹权限 +[root@localhost phpmyadmin]# chown nginx.nginx /var/lib/php/session +``` + +下面浏览器访问phpmyadmin页面,同样记得更改windows下的hosts文件 + +![image-20250207195412139](14.LNMP/image-20250207195412139.png) + +输入数据库用户名`root`和密码`123456`就可以进入图形化数据库管理页面了 + +![image-20250207195442656](14.LNMP/image-20250207195442656.png) + +### 4. 安装博客系统 + +#### 4.1 部署虚拟主机 + +```bash +# 为博客创建虚拟主机 +[root@localhost ~]# vim /apps/nginx/conf.d/typecho.conf +server { + listen 80; + server_name blog.iproot.cn; + root /code/typecho; + index index.php index.html; + + location ~ .*\.php(\/.*)*$ { + root /code/typecho; + fastcgi_pass 127.0.0.1:9000; + fastcgi_index index.php; + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + include fastcgi_params; + } +} + +# 检查nginx配置文件,并且重启 +[root@localhost ~]# nginx -t +[root@localhost ~]# systemctl restart nginx + +# 创建typecho目录 +[root@localhost ~]# mkdir /code/typecho +[root@localhost ~]# cd /code/typecho + +[root@localhost ~]# wget https://github.com/typecho/typecho/releases/latest/download/typecho.zip + +# 解压源码 +[root@localhost ~]# unzip typecho.zip +``` + +#### 4.2 创建数据库 + +点击数据库,输入数据库名之后,就可以点击创建 + +![image-20250207195822737](14.LNMP/image-20250207195822737.png) + +#### 4.3 安装博客系统 + +下面就可以开始进入网站安装的部分了,访问博客系统页面 + +![image-20250207195859686](14.LNMP/image-20250207195859686.png) + +赋予网站根目录下usr/uploads目录权限 + +```bash +[root@localhost typecho]# chmod a+w usr/uploads/ +``` + +继续下一步,填写数据库密码和网站后台管理员密码 + +![image-20250207200047813](14.LNMP/image-20250207200047813.png) + +点击开始安装之后,会出现了如下页面,这个是因为php的用户是nginx用户,而/code/typecho文件夹是root用户的,所以这个网站根本没有权限保存数据相关的配置到文件夹中 + +![image-20250207200142034](14.LNMP/image-20250207200142034.png) + +方法一:直接将typecho文件夹赋予nginx权限 + +方法二:手动去帮助网站创建网站没有权限的配置文件,下面将会演示方法二 + +直接在/code/typecho下创建`config.inc.php`文件,然后将网页提示内容写入这个文件中 + +```bash +[root@localhost typecho]# vim /code/typecho/config.inc.php +复制网页上的内容进去 +``` + +配置文件创建完成之后,可以点击`创建完毕,继续安装>>` + +下面是安装成功的页面 + +![image-20250207200242332](14.LNMP/image-20250207200242332.png) + +![image-20250207200300668](14.LNMP/image-20250207200300668.png) + +#### 4.4 切换主题 + +默认的主题如下,界面比较的简洁,我们可以给这个网站替换主题,也可以借此加深熟悉我们对Linux命令行的熟练程度 + +![image-20250118221202018](14.LNMP/image-20250118221202018.png) + +第三方主题商店:https://www.typechx.com/ + +我们尝试更换这个主题 + +![image-20250118221344667](14.LNMP/image-20250118221344667.png) + +选择模板下载 + +![image-20250118221414487](14.LNMP/image-20250118221414487.png) + +然后在打开的github仓库中下载ZIP压缩包 + +![image-20250118221502963](14.LNMP/image-20250118221502963.png) + +将下载好的主题压缩包上传到博客主题的目录`/code/typecho/usr/themes` + +![image-20250118221634385](14.LNMP/image-20250118221634385.png) + +然后解压主题包,并且将名称改为简单一点的 + +```bash +[root@localhost themes]# unzip Typecho-Butterfly-main.zip +[root@localhost themes]# ls +Typecho-Butterfly-main Typecho-Butterfly-main.zip default +[root@localhost themes]# mv Typecho-Butterfly-main butterfly +[root@localhost themes]# rm -rf Typecho-Butterfly-main.zip +``` + +然后登录到博客后台,在设置里更换主题 + +![image-20250118221843976](14.LNMP/image-20250118221843976.png) + +然后回到博客首页刷新一下,就可以看到新的主题已经应用了~ + +![image-20250118221920089](14.LNMP/image-20250118221920089.png) + +会有一些图片资源的丢失,稍微了解一点前端知识,就可以将其完善好了。不懂前端的同学,可以去找一些简单一点的主题。 + +![image-20250118221958932](14.LNMP/image-20250118221958932.png) + +### 5. 安装网盘 + +#### 5.1 部署虚拟主机 + +```bash +# 为网盘创建虚拟主机 +[root@localhost themes]# vim /apps/nginx/conf.d/kod.conf +server { + listen 80; + server_name kod.iproot.cn; + root /code/kod; + index index.php index.html; + + location ~ .*\.php(\/.*)*$ { + root /code/kod; + fastcgi_pass 127.0.0.1:9000; + fastcgi_index index.php; + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + include fastcgi_params; + } +} + +# 检查nginx配置文件,并且重启 +[root@localhost ~]# nginx -t +[root@localhost ~]# systemctl restart nginx + +# 下载源代码然后解压重命名 +[root@localhost ~]# mkdir /code/kod +[root@localhost ~]# cd /code/kod +[root@localhost kod]# wget https://static.kodcloud.com/update/download/kodbox.1.23.zip + +# 解压源码 +[root@localhost kod]# unzip kodbox.1.23.zip +``` + +#### 5.2 创建数据库 + +![image-20250207200725398](14.LNMP/image-20250207200725398.png) + +#### 5.3 安装网盘系统 + +浏览器访问此站点,我们发现目录权限,这个比较重要 + +![image-20250207201018894](14.LNMP/image-20250207201018894.png) + +```bash +# 设置权限 +[root@localhost kod]# chown -R nginx.nginx /code/kod +``` + +添加完成之后,刷新页面,可以看到所有条件都已经符合,就可以直接点击下一步了 + +![image-20250207201110920](14.LNMP/image-20250207201110920.png) + +填写数据库密码和数据库名 + +![image-20250207201132377](14.LNMP/image-20250207201132377.png) + +设置系统密码 + +![image-20250207201248174](14.LNMP/image-20250207201248174.png) + +完成网站安装 + +![image-20211106114747284](14.LNMP/image-20211106114747284.png) + +![image-20250207201334236](14.LNMP/image-20250207201334236.png) + +下面根据自己的喜好,进行简单的设置就可以正常使用啦! + +![image-20250207201405074](14.LNMP/image-20250207201405074.png) + +我们也可以直接在这个上面编辑Linux上的文件,比如我们之前创建的php文件 + +![image-20211106114944358](14.LNMP/image-20211106114944358.png) + +### 6. 总结 + +如何各位同学不是搭建在自己虚拟机上的,是去租用阿里云或者腾讯云,直接搭建,并且购买域名,就可以让自己的网站在互联网上永远在线了 \ No newline at end of file diff --git a/00.基础阶段/02.Linux基础/14.LNMP/image-20210711094454191.png b/00.基础阶段/02.Linux基础/14.LNMP/image-20210711094454191.png new file mode 100644 index 0000000..8b20541 Binary files /dev/null and b/00.基础阶段/02.Linux基础/14.LNMP/image-20210711094454191.png differ diff --git a/00.基础阶段/02.Linux基础/14.LNMP/image-20211106103800569.png b/00.基础阶段/02.Linux基础/14.LNMP/image-20211106103800569.png new file mode 100644 index 0000000..ce1e69d Binary files /dev/null and b/00.基础阶段/02.Linux基础/14.LNMP/image-20211106103800569.png differ diff --git a/00.基础阶段/02.Linux基础/14.LNMP/image-20211106114747284.png b/00.基础阶段/02.Linux基础/14.LNMP/image-20211106114747284.png new file mode 100644 index 0000000..5846400 Binary files /dev/null and b/00.基础阶段/02.Linux基础/14.LNMP/image-20211106114747284.png differ diff --git a/00.基础阶段/02.Linux基础/14.LNMP/image-20211106114944358.png b/00.基础阶段/02.Linux基础/14.LNMP/image-20211106114944358.png new file mode 100644 index 0000000..5695ba8 Binary files /dev/null and b/00.基础阶段/02.Linux基础/14.LNMP/image-20211106114944358.png differ diff --git a/00.基础阶段/02.Linux基础/14.LNMP/image-20250118221202018.png b/00.基础阶段/02.Linux基础/14.LNMP/image-20250118221202018.png new file mode 100644 index 0000000..9c04f14 Binary files /dev/null and b/00.基础阶段/02.Linux基础/14.LNMP/image-20250118221202018.png differ diff --git a/00.基础阶段/02.Linux基础/14.LNMP/image-20250118221344667.png b/00.基础阶段/02.Linux基础/14.LNMP/image-20250118221344667.png new file mode 100644 index 0000000..cd68b8d Binary files /dev/null and b/00.基础阶段/02.Linux基础/14.LNMP/image-20250118221344667.png differ diff --git a/00.基础阶段/02.Linux基础/14.LNMP/image-20250118221414487.png b/00.基础阶段/02.Linux基础/14.LNMP/image-20250118221414487.png new file mode 100644 index 0000000..39da26f Binary files /dev/null and b/00.基础阶段/02.Linux基础/14.LNMP/image-20250118221414487.png differ diff --git a/00.基础阶段/02.Linux基础/14.LNMP/image-20250118221502963.png b/00.基础阶段/02.Linux基础/14.LNMP/image-20250118221502963.png new file mode 100644 index 0000000..4b009f7 Binary files /dev/null and b/00.基础阶段/02.Linux基础/14.LNMP/image-20250118221502963.png differ diff --git a/00.基础阶段/02.Linux基础/14.LNMP/image-20250118221634385.png b/00.基础阶段/02.Linux基础/14.LNMP/image-20250118221634385.png new file mode 100644 index 0000000..4da4c1a Binary files /dev/null and b/00.基础阶段/02.Linux基础/14.LNMP/image-20250118221634385.png differ diff --git a/00.基础阶段/02.Linux基础/14.LNMP/image-20250118221843976.png b/00.基础阶段/02.Linux基础/14.LNMP/image-20250118221843976.png new file mode 100644 index 0000000..e1d1783 Binary files /dev/null and b/00.基础阶段/02.Linux基础/14.LNMP/image-20250118221843976.png differ diff --git a/00.基础阶段/02.Linux基础/14.LNMP/image-20250118221920089.png b/00.基础阶段/02.Linux基础/14.LNMP/image-20250118221920089.png new file mode 100644 index 0000000..6d7a0e1 Binary files /dev/null and b/00.基础阶段/02.Linux基础/14.LNMP/image-20250118221920089.png differ diff --git a/00.基础阶段/02.Linux基础/14.LNMP/image-20250118221958932.png b/00.基础阶段/02.Linux基础/14.LNMP/image-20250118221958932.png new file mode 100644 index 0000000..2ae3a7f Binary files /dev/null and b/00.基础阶段/02.Linux基础/14.LNMP/image-20250118221958932.png differ diff --git a/00.基础阶段/02.Linux基础/14.LNMP/image-20250207194233281.png b/00.基础阶段/02.Linux基础/14.LNMP/image-20250207194233281.png new file mode 100644 index 0000000..0cf6336 Binary files /dev/null and b/00.基础阶段/02.Linux基础/14.LNMP/image-20250207194233281.png differ diff --git a/00.基础阶段/02.Linux基础/14.LNMP/image-20250207194355266.png b/00.基础阶段/02.Linux基础/14.LNMP/image-20250207194355266.png new file mode 100644 index 0000000..a5457e7 Binary files /dev/null and b/00.基础阶段/02.Linux基础/14.LNMP/image-20250207194355266.png differ diff --git a/00.基础阶段/02.Linux基础/14.LNMP/image-20250207195412139.png b/00.基础阶段/02.Linux基础/14.LNMP/image-20250207195412139.png new file mode 100644 index 0000000..5a4eaf4 Binary files /dev/null and b/00.基础阶段/02.Linux基础/14.LNMP/image-20250207195412139.png differ diff --git a/00.基础阶段/02.Linux基础/14.LNMP/image-20250207195442656.png b/00.基础阶段/02.Linux基础/14.LNMP/image-20250207195442656.png new file mode 100644 index 0000000..c4ffb34 Binary files /dev/null and b/00.基础阶段/02.Linux基础/14.LNMP/image-20250207195442656.png differ diff --git a/00.基础阶段/02.Linux基础/14.LNMP/image-20250207195822737.png b/00.基础阶段/02.Linux基础/14.LNMP/image-20250207195822737.png new file mode 100644 index 0000000..179c21b Binary files /dev/null and b/00.基础阶段/02.Linux基础/14.LNMP/image-20250207195822737.png differ diff --git a/00.基础阶段/02.Linux基础/14.LNMP/image-20250207195859686.png b/00.基础阶段/02.Linux基础/14.LNMP/image-20250207195859686.png new file mode 100644 index 0000000..34c0916 Binary files /dev/null and b/00.基础阶段/02.Linux基础/14.LNMP/image-20250207195859686.png differ diff --git a/00.基础阶段/02.Linux基础/14.LNMP/image-20250207200047813.png b/00.基础阶段/02.Linux基础/14.LNMP/image-20250207200047813.png new file mode 100644 index 0000000..2cf1e7b Binary files /dev/null and b/00.基础阶段/02.Linux基础/14.LNMP/image-20250207200047813.png differ diff --git a/00.基础阶段/02.Linux基础/14.LNMP/image-20250207200142034.png b/00.基础阶段/02.Linux基础/14.LNMP/image-20250207200142034.png new file mode 100644 index 0000000..ae3ab79 Binary files /dev/null and b/00.基础阶段/02.Linux基础/14.LNMP/image-20250207200142034.png differ diff --git a/00.基础阶段/02.Linux基础/14.LNMP/image-20250207200242332.png b/00.基础阶段/02.Linux基础/14.LNMP/image-20250207200242332.png new file mode 100644 index 0000000..5246ae7 Binary files /dev/null and b/00.基础阶段/02.Linux基础/14.LNMP/image-20250207200242332.png differ diff --git a/00.基础阶段/02.Linux基础/14.LNMP/image-20250207200300668.png b/00.基础阶段/02.Linux基础/14.LNMP/image-20250207200300668.png new file mode 100644 index 0000000..1ba2823 Binary files /dev/null and b/00.基础阶段/02.Linux基础/14.LNMP/image-20250207200300668.png differ diff --git a/00.基础阶段/02.Linux基础/14.LNMP/image-20250207200725398.png b/00.基础阶段/02.Linux基础/14.LNMP/image-20250207200725398.png new file mode 100644 index 0000000..1a2292a Binary files /dev/null and b/00.基础阶段/02.Linux基础/14.LNMP/image-20250207200725398.png differ diff --git a/00.基础阶段/02.Linux基础/14.LNMP/image-20250207201018894.png b/00.基础阶段/02.Linux基础/14.LNMP/image-20250207201018894.png new file mode 100644 index 0000000..162c1d1 Binary files /dev/null and b/00.基础阶段/02.Linux基础/14.LNMP/image-20250207201018894.png differ diff --git a/00.基础阶段/02.Linux基础/14.LNMP/image-20250207201110920.png b/00.基础阶段/02.Linux基础/14.LNMP/image-20250207201110920.png new file mode 100644 index 0000000..004c9d6 Binary files /dev/null and b/00.基础阶段/02.Linux基础/14.LNMP/image-20250207201110920.png differ diff --git a/00.基础阶段/02.Linux基础/14.LNMP/image-20250207201132377.png b/00.基础阶段/02.Linux基础/14.LNMP/image-20250207201132377.png new file mode 100644 index 0000000..3df894c Binary files /dev/null and b/00.基础阶段/02.Linux基础/14.LNMP/image-20250207201132377.png differ diff --git a/00.基础阶段/02.Linux基础/14.LNMP/image-20250207201248174.png b/00.基础阶段/02.Linux基础/14.LNMP/image-20250207201248174.png new file mode 100644 index 0000000..18dd206 Binary files /dev/null and b/00.基础阶段/02.Linux基础/14.LNMP/image-20250207201248174.png differ diff --git a/00.基础阶段/02.Linux基础/14.LNMP/image-20250207201334236.png b/00.基础阶段/02.Linux基础/14.LNMP/image-20250207201334236.png new file mode 100644 index 0000000..68a0f75 Binary files /dev/null and b/00.基础阶段/02.Linux基础/14.LNMP/image-20250207201334236.png differ diff --git a/00.基础阶段/02.Linux基础/14.LNMP/image-20250207201405074.png b/00.基础阶段/02.Linux基础/14.LNMP/image-20250207201405074.png new file mode 100644 index 0000000..c49d877 Binary files /dev/null and b/00.基础阶段/02.Linux基础/14.LNMP/image-20250207201405074.png differ diff --git a/00.基础阶段/02.Linux基础/14.LNMP/images2015.cnblogs.jpg b/00.基础阶段/02.Linux基础/14.LNMP/images2015.cnblogs.jpg new file mode 100644 index 0000000..f51590e Binary files /dev/null and b/00.基础阶段/02.Linux基础/14.LNMP/images2015.cnblogs.jpg differ diff --git a/00.基础阶段/02.Linux基础/15.Docker/01.Docker介绍与安装.md b/00.基础阶段/02.Linux基础/15.Docker/01.Docker介绍与安装.md new file mode 100644 index 0000000..1fb7ad0 --- /dev/null +++ b/00.基础阶段/02.Linux基础/15.Docker/01.Docker介绍与安装.md @@ -0,0 +1,939 @@ +# 01.Docker介绍与安装 + +## 01.Docker介绍与安装 + +### 1. Docker是什么? + +Docker是一个在2013年开源的应用程序,并且是一个基于go语言编写的PAAS服务。 + +Docker最早采用LXC技术,之后改为自己研发并开源的runc技术运行容器。 + +Docker相比虚拟机的交付速度更快,资源消耗更低,Docker采用客户端、服务端架构,使用远程api来管理和创建Docker容器。 + +Docker的三大理念是build(构建)、ship(运输)、run(运行)。 + +Docker通过namespace、cgroup等技术来提供容器的资源隔离与安全保障。 + +### 2. Docker与虚拟机之间的对比 + +![img](01.Docker介绍与安装/image-20191028193918568.png) + +| **虚拟化** | **容器** | +| ------------------------------------------------ | ------------------------------------------------------- | +| 隔离性强,有独立的GUEST OS | 共享内核和OS,隔离性弱! | +| 虚拟化性能差(>15%) | 计算/存储无损耗,无Guest OS内存开销(~200M) | +| 虚拟机镜像庞大(十几G~几十G), 且实例化时不能共享 | Docker容器镜象200~300M,且公共基础镜象实例化时可以共享 | +| 虚拟机镜象缺乏统一标准 | Docker提供了容器应用镜象事实标准,OCI推动进一 步标准化 | +| 虚拟机创建慢(>2分钟) | 秒级创建(<10s)相当于建立索引 | +| 虚拟机启动慢(>30s) 读文件逐个加载 | 秒级(<1s,不含应用本身启动) | +| 资源虚拟化粒度低,单机10~100虚拟机 | 单机支持1000+容器密度很高,适合大规模的部署 | + +- 资源利用率更高:一台物理机可以运行数百个容器,但一般只能运行数十个虚拟机 +- 开销更小:不需要启动单独的虚拟机占用硬件资源 +- 启动速度更快:可以在数秒内完成启动 + +### 3. Docker的组成 + +官网:https://docs.docker.com/get-started/overview/ + +Docker主机 host:一个物理机或者虚拟机,用于运行docker服务进程和容器 + +Docker服务端 Server:Docker守护进程,运行docker容器 + +Docker客户端 client:客户端使用docker命令或其他工具调用docker api + +Docker仓库 registry:保存镜像的仓库,类似于git或svn这样的版本控制器 + +Docker镜像 images:镜像可以理解为创建实例使用的模板 + +Docker容器 container:容器是从镜像生成对外提供服务的一个或一组服务 + +![image-20210531152229098](01.Docker介绍与安装/image-20210531152229098.png) + +![image-20210531152329941](01.Docker介绍与安装/image-20210531152329941.png) + +### 4. Docker服务端软件选择 + +Docker CE(Community Edition,社区版)和 Docker EE(Enterprise Edition,企业版)是 Docker 产品的两个主要版本,它们之间的主要区别在于目标用户、功能集、支持和维护等方面: + +1. **目标用户**: + - **Docker CE**:面向个人开发者、小团队以及技术爱好者,主要用于开发和测试环境。 + - **Docker EE**:面向大型企业和组织,提供企业级的功能和支持。 +2. **功能集**: + - **Docker CE**:提供基本的容器化功能,包括构建、运行和共享容器。 + - **Docker EE**:除了包含 CE 版本的所有功能外,还提供了额外的企业级特性,如增强的安全、管理、可扩展性和集成性。 +3. **支持和维护**: + - **Docker CE**:社区支持,适合自我解决问题的开发者。 + - **Docker EE**:提供商业支持和专业服务,适合需要稳定运行环境的企业。 +4. **安全性**: + - **Docker CE**:安全性相对较低,适合非生产环境。 + - **Docker EE**:提供更高级的安全特性,如镜像扫描、安全策略和合规性报告。 +5. **管理**: + - **Docker CE**:通常不需要复杂的管理工具。 + - **Docker EE**:提供 Docker Universal Control Plane (UCP) 和 Docker Trusted Registry (DTR) 等管理工具,帮助企业更有效地管理容器环境。 +6. **成本**: + - **Docker CE**:免费。 + - **Docker EE**:需要购买许可证。 +7. **更新和生命周期**: + - **Docker CE**:更新频繁,可能包含实验性功能,生命周期较短。 + - **Docker EE**:更新周期更稳定,更注重稳定性和兼容性,生命周期较长。 + +### 5. Docker安装 + +- 安装docker-ce + +```bash +[root@localhost ~]# yum install -y yum-utils +[root@localhost ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo +[root@localhost ~]# sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo +[root@localhost ~]# yum install docker-ce -y +``` + +- 启动docker + +```bash +[root@localhost ~]# systemctl enable --now docker +Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /usr/lib/systemd/system/docker.service. +[root@localhost ~]# systemctl status docker +● docker.service - Docker Application Container Engine + Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; preset: disabled) + Active: active (running) since Sun 2025-03-23 23:36:27 CST; 10s ago +TriggeredBy: ● docker.socket + Docs: https://docs.docker.com + Main PID: 29081 (dockerd) + Tasks: 10 + Memory: 25.7M + CPU: 141ms + CGroup: /system.slice/docker.service + └─29081 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock +``` + +#### 5.1 镜像加速配置 + +由于Docker Image仓库在国外,目前,从23年底开始,国内陆续访问不到了,所以要通过一些镜像加速器才能获取到镜像 + +```bash +[root@localhost ~]# docker pull nginx +Error response from daemon: Get "https://registry-1.docker.io/v2/": context deadline exceeded + +# 无法从docker官方镜像仓库,docker.io获取镜像 +``` + +**使用国内镜像加速器**(不稳定,会经常变化) + +```bash +[root@localhost ~]# mkdir -p /etc/docker +[root@localhost ~]# vim /etc/docker/daemon.json +{ + "registry-mirrors": [ + "https://docker.m.daocloud.io" + ] +} + +# 重启容器服务 +[root@localhost ~]# systemctl daemon-reload +[root@localhost ~]# systemctl restart docker + +# 可选加速地址(不一定有用,随时会跑路): +1、https://docker.m.daocloud.io +2、https://docker.1panelproxy.com +3、https://atomhub.openatom.cn +4、https://docker.1panel.live +5、https://dockerhub.jobcher.com +6、https://hub.rat.dev +7、https://docker.registry.cyou +8、https://docker.awsl9527.cn +9、https://do.nark.eu.org/ +10、https://docker.ckyl.me +11、https://hub.uuuadc.top +12、https://docker.chenby.cn +13、https://docker.ckyl.me + + +# 实在不行的话,可以在拉去的时候手动加上镜像加速器,因为有时候写到daemon.json中也有可能访问不到 +[root@localhost ~]# docker pull nginx +[root@localhost ~]# docker pull docker.m.daocloud.io/nginx +[root@localhost ~]# docker images +REPOSITORY TAG IMAGE ID CREATED SIZE +nginx latest 53a18edff809 6 weeks ago 192MB +``` + +#### 5.2 快速开始 + +```bash +[root@localhost ~]# docker pull nginx +[root@localhost ~]# docker images +REPOSITORY TAG IMAGE ID CREATED SIZE +nginx latest d1a364dc548d 5 days ago 133MB +[root@localhost ~]# docker run -d -p 80:80 nginx +e617ca1db9a5d242e6b4145b9cd3dff9f7955c6ab1bf160f13fb6bec081a29e4 +[root@localhost ~]# docker ps +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +e617ca1db9a5 nginx "/docker-entrypoint.…" 6 seconds ago Up 5 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp intelligent_turing +[root@localhost ~]# docker exec -it e617ca1db9a5 bash +root@e617ca1db9a5:/# cd /usr/share/nginx/html/ +root@e617ca1db9a5:/usr/share/nginx/html# ls +50x.html index.html +root@e617ca1db9a5:/usr/share/nginx/html# echo 'docker nginx test' > index.html +[root@localhost ~]# curl 192.168.88.10 +docker nginx test + +[root@admin ~]# docker ps +CONTAINER ID IMAGE COMMAND CREATED NAMES +e0a818c40b7e nginx "/docker-entrypoint.…" About an hour ago 0.0.0.0:9000->9000/tcp, :::9000->9000/tcp determined_sanderson +9b066ef4bcd2 nginx "/docker-entrypoint.…" About an hour ago 90->80/tcp, :::90->80/tcp vigorous_hypatia +[root@admin ~]# docker stop e0a818c40b7e +e0a818c40b7e +[root@localhost ~]# docker ps +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +``` + +- **`-i`(`--interactive`)**: + - **功能**:保持标准输入(stdin)打开,即使没有附加终端。 + - **作用**:允许用户与容器内的命令进行交互。 +- **`-t`(`--tty`)**: + - **功能**:分配一个伪终端(TTY)。 + - **作用**:为用户创建一个类似本地终端的交互环境,支持颜色显示、光标操作等终端特性。 + +##### 5.2.1 Docker快速搭建RPG小游戏 + +```bash +[root@localhost ~]# docker pull registry.cn-guangzhou.aliyuncs.com/welldene/games:rpg_game +[root@localhost ~]# docker run -d -p 8000:8000 -p 8787:8787 --name rpg -e HOST_IP=192.168.88.10 registry.cn-guangzhou.aliyuncs.com/welldene/games:rpg_game +9c4bc95c98836a1df0453c282196083e4cb0b5d06e507d5d4567a4c018c13272 +[root@localhost ~]# docker ps +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +35a6b44d5645 registry.cn-guangzhou.aliyuncs.com/welldene/games:rpg_game "bash run.sh" 3 seconds ago Up 2 seconds 0.0.0.0:8000->8000/tcp, [::]:8000->8000/tcp, 0.0.0.0:8787->8787/tcp, [::]:8787->8787/tcp rpg +``` + +**浏览器访问: http://IP:8787** + +![image-20250324001839505](01.Docker介绍与安装/image-20250324001839505.png) + +##### 5.2.2 Docker参数说明 + +```bash +-d, --detach: 以守护进程方式运行容器 +-p, --publish: 映射容器端口到宿主机端口 +格式: `-p [hostPort]:[containerPort]` + +-P(大写):随机端口映射 + +-v, --volume: 挂载数据卷 +格式: `-v [hostPath]:[containerPath]` + +-e, --env: 设置环境变量 +--name: 为容器指定名称 +--network: 指定容器所属网络 +--restart: 容器退出时的重启策略 +可选值: `no`, `on-failure`, `unless-stopped`, `always` + +-i, --interactive: 保持标准输入打开 +-t, --tty: 分配一个伪终端 +-u, --user: 指定运行容器的用户 +--entrypoint: 覆盖容器的默认入口点 +--rm: 容器退出后自动删除 +--hostname: 设置容器主机名 +--add-host: 添加自定义主机名到 IP 的映射 +--link: 添加到另一个容器的链接 +--expose: 暴露容器端口 +--volume-driver: 指定数据卷驱动程序 +--cpu-shares: 设置 CPU 权重 +--memory: 设置容器内存限制 +``` + +### 6. Docker核心技术 + +#### 6.1 Linux namespace技术 + +如果一个宿主机运行了N个容器,多个容器带来的以下问题怎么解决: + +1. 怎么样保证每个容器都有不同的文件系统并且能互不影响? +2. 一个docker主进程内的各个容器都是其子进程,那么如何实现同一个主进程下不同类型的子进程?各个子进程间通信能相互访问吗? +3. 每个容器怎么解决IP以及端口分配的问题? +4. 多个容器的主机名能一样吗? +5. 每个容器都要不要有root用户?怎么解决账户重名问题呢? + +以上问题怎么解决 + +Docker 的 Namespace 技术是实现容器隔离的核心机制之一。它通过 Linux Namespace 提供的隔离功能,为每个容器创建独立的资源视图,从而实现容器之间的隔离 + +**namespace**是Linux系统的底层概念,在内核层实现,即有一些不同类型的命名空间都部署在核内,**各个docker容器运行在同一个docker主进程并且共用同一个宿主机系统内核**,各个docker容器运行在宿主机的用户空间,每个容器都要有类似于虚拟机一样的相**互隔离的运行空间**,但是容器技术是在一个进程内实现运行指定服务的运行环境,并且还可以保护宿主机内核不受其他进程的干扰和影响,如文件系统、网络空间、进程空间等,目前主要通过以下技术实现容器运行空间的相互隔离: + +| 隔离类型 | 功能 | 系统调用参数 | 内核 | +| -------------------------------------------- | ---------------------------------- | ------------- | ------ | +| MNT Namespace(mount) | 提供磁盘挂载点和文件系统的隔离能力 | CLONE_NEWNS | 2.4.19 | +| IPC Namespace(Inter-Process Communication) | 提供进程间通信的隔离能力 | CLONE_NEWIPC | 2.6.19 | +| UTS Namespace(UNIX Timesharing System) | 提供主机名隔离能力 | CLONE_NEWUTS | 2.6.19 | +| PID Namespace(Process Identification) | 提供进程隔离能力 | CLONE_NEWPID | 2.6.24 | +| Net Namespace(network) | 提供网络隔离能力 | CLONE_NEWNET | 2.6.29 | +| User Namespace(user) | 提供用户隔离能力 | CLONE_NEWUSER | 3.8 | + +##### 6.1.1 MNT Namespace + +每个容器都要有独立的根文件系统有独立的用户空间,以实现容器里面启动服务并且使用容器的运行环境。 + +- 启动三个容器 + +```bash +[root@localhost ~]# docker run -d --name nginx-1 -p 80:80 nginx +0e72f06bba417073d1d4b2cb53e62c45b75edc699b737e46a157a3249f3a803e +[root@localhost ~]# docker run -d --name nginx-2 -p 81:80 nginx +c8ce6a0630b66e260eef16d8ecf48049eed7b893b87459888b634bf0e9e40f23 +[root@localhost ~]# docker run -d --name nginx-3 -p 82:80 nginx +1cddbd412b5997f8935815c2f588431e100b752595ceaa92b95758ca45179096 +[root@localhost ~]# docker ps +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +b42378a51c40 nginx "/docker-entrypoint.…" 2 seconds ago Up 1 second 0.0.0.0:82->80/tcp, [::]:82->80/tcp nginx-3 +d30f033c2f29 nginx "/docker-entrypoint.…" 5 seconds ago Up 5 seconds 0.0.0.0:81->80/tcp, [::]:81->80/tcp nginx-2 +d34a012dcebc nginx "/docker-entrypoint.…" 10 seconds ago Up 10 seconds 0.0.0.0:80->80/tcp, [::]:80->80/tcp nginx-1 +``` + +- 连接进入某一个容器中,并创建一个文件 + +```bash +[root@localhost ~]# docker exec -it nginx-1 bash +root@d34a012dcebc:/# echo 'hello world test!' > /opt/test_nginx-1 +root@d34a012dcebc:/# exit +``` + +- 宿主机是使用了chroot技术把容器锁定到一个指定的运行目录里 + +```bash +[root@localhost ~]# find / -name test_nginx-1 +/var/lib/docker/overlay2/075b51fb5d33011d4b449fde8c14199c1e30f86224862f68a6116b1cb1dacfdf/diff/opt/test_nginx-1 +/var/lib/docker/overlay2/075b51fb5d33011d4b449fde8c14199c1e30f86224862f68a6116b1cb1dacfdf/merged/opt/test_nginx-1 +``` + +在 Docker 中,文件系统是通过分层存储机制实现的,这与 Docker 的镜像和容器的架构有关。看到的两个文件路径反映了 Docker 的存储驱动(如 Overlay2)的工作原理。 + +###### 6.1.1.1 Docker 的存储架构 + +1. **镜像层(Read-Only)**: + - Docker 镜像是由多个只读层组成的。每一层代表了镜像的某个状态或修改。 + - 这些层是不可变的,一旦创建,不会被修改。 +2. **容器层(Read-Write)**: + - 当你运行一个容器时,Docker 会在镜像层之上添加一个可写层。 + - 容器的所有写操作(如创建文件、修改文件等)都会在这个可写层中进行,而不会影响下面的镜像层。 + +###### 6.1.1.2 Overlay2 存储驱动 + +Docker 默认使用 Overlay2 存储驱动(在支持的系统上)。Overlay2 的工作机制如下: + +- **`merged` 目录**: + - 这是容器的根文件系统,是镜像层和容器层的联合视图。 + - 当你在容器中访问文件时,看到的是 `merged` 目录中的内容。 + - 例如,你在容器中创建的文件 `/opt/test_nginx-1`,在宿主机上可以通过 `/var/lib/docker/overlay2//merged/opt/test_nginx-1` 访问。 +- **`diff` 目录**: + - 这是容器的可写层,记录了容器对文件系统的修改。 + - 当你在容器中创建或修改文件时,实际的文件数据会存储在 `diff` 目录中。 + - 例如,你在容器中创建的文件 `/opt/test_nginx-1`,其实际数据存储在 `/var/lib/docker/overlay2//diff/opt/test_nginx-1`。 + +- 当你在容器中创建文件 `/opt/test_nginx-1` 时: + - 文件的实际数据被写入到 `diff` 目录中。 + - 在 `merged` 目录中,通过联合文件系统(OverlayFS)的机制,将 `diff` 目录中的文件映射到 `merged` 目录中,让你在容器中看到完整的文件系统视图。 + +##### 6.1.2 IPC Namespace + +一个容器内的进程间通信,允许一个容器内的不同进程数据互相访问,但是不能跨容器访问其他容器的数据 + +UTS Namespace包含了运行内核的名称、版本、底层体系结构类型等信息用于系统表示,其中包含了hostname和域名,它使得一个容器拥有属于自己hostname标识,这个主机名标识独立于宿主机系统和其上的其他容器。 + +##### 6.1.3 PID Namespace + +Linux系统中,有一个pid为1的进程(init/systemd)是其他所有进程的父进程,那么在每个容器内也要有一个父进程来管理其下属的进程,那么多个容器的进程通PID namespace进程隔离 + +- 安装软件包 + +```bash +[root@localhost ~]# docker exec -it 065f06e5caa4 bash +root@0e72f06bba41:/# apt update +# ifconfig +root@0e72f06bba41:/# apt install -y net-tools +root@0e72f06bba41:/# apt install -y procps +root@0e72f06bba41:/# ps -ef +UID PID PPID C STIME TTY TIME CMD +root 10 0 03:20 ? 00:00:00 nginx: master process nginx -g d +nginx 32 1 0 03:20 ? 00:00:00 nginx: worker process +nginx 33 1 0 03:20 ? 00:00:00 nginx: worker process +nginx 34 1 0 03:20 ? 00:00:00 nginx: worker process +nginx 35 1 0 03:20 ? 00:00:00 nginx: worker process +nginx 36 1 0 03:20 ? 00:00:00 nginx: worker process +nginx 37 1 0 03:20 ? 00:00:00 nginx: worker process +nginx 38 1 0 03:20 ? 00:00:00 nginx: worker process +nginx 39 1 0 03:20 ? 00:00:00 nginx: worker process +root 59 0 0 03:35 pts/0 00:00:00 bash +root 503 59 0 03:42 pts/0 00:00:00 ps -ef +``` + +**那么宿主机的PID与容器内的PID是什么关系?** + +```bash +[root@localhost ~]# yum install psmisc +[root@localhost ~]# pstree -p +[root@localhost ~]# pstree -p +systemd(1)─┬─NetworkManager(769)─┬─{NetworkManager}(772) + │ └─{NetworkManager}(775) + ├─agetty(817) + ├─atd(799) + ├─auditd(693)─┬─sedispatch(695) + │ ├─{auditd}(694) + │ └─{auditd}(696) + ├─bluetoothd(742) + ├─chronyd(753) + ├─containerd(28884)─┬─{containerd}(28886) + │ ├─{containerd}(28887) + │ ├─{containerd}(28888) + │ ├─{containerd}(28889) + │ ├─{containerd}(28890) + │ ├─{containerd}(28891) + │ ├─{containerd}(28892) + │ └─{containerd}(28894) + ├─containerd-shim(30330)─┬─bash(30801) + │ ├─nginx(30353)─┬─nginx(30426) + │ │ ├─nginx(30427) + │ │ ├─nginx(30428) + │ │ └─nginx(30429) + │ ├─{containerd-shim}(30332) + │ ├─{containerd-shim}(30333) + │ ├─{containerd-shim}(30334) + │ ├─{containerd-shim}(30335) + │ ├─{containerd-shim}(30336) + │ ├─{containerd-shim}(30337) + │ ├─{containerd-shim}(30338) + │ ├─{containerd-shim}(30339) + │ ├─{containerd-shim}(30340) + │ ├─{containerd-shim}(30703) + │ └─{containerd-shim}(30909) + ├─containerd-shim(30447)─┬─nginx(30469)─┬─nginx(30546) + │ │ ├─nginx(30547) + │ │ ├─nginx(30548) + │ │ └─nginx(30549) + │ ├─{containerd-shim}(30448) + │ ├─{containerd-shim}(30449) + │ ├─{containerd-shim}(30450) + │ ├─{containerd-shim}(30451) + │ ├─{containerd-shim}(30452) + │ ├─{containerd-shim}(30453) + │ ├─{containerd-shim}(30454) + │ ├─{containerd-shim}(30455) + │ ├─{containerd-shim}(30456) + │ └─{containerd-shim}(30705) + ├─containerd-shim(30566)─┬─nginx(30587)─┬─nginx(30662) + │ │ ├─nginx(30663) + │ │ ├─nginx(30664) + │ │ └─nginx(30665) + │ ├─{containerd-shim}(30567) + │ ├─{containerd-shim}(30568) + │ ├─{containerd-shim}(30569) + │ ├─{containerd-shim}(30570) + │ ├─{containerd-shim}(30571) + │ ├─{containerd-shim}(30572) + │ ├─{containerd-shim}(30573) + │ ├─{containerd-shim}(30574) + │ ├─{containerd-shim}(30593) + │ ├─{containerd-shim}(30706) + │ └─{containerd-shim}(30780) + ├─crond(801) + ├─dbus-broker-lau(719)───dbus-broker(723) + ├─dockerd(29156)─┬─docker-proxy(30381)─┬─{docker-proxy}(30382) + │ │ ├─{docker-proxy}(30383) + │ │ ├─{docker-proxy}(30384) + │ │ ├─{docker-proxy}(30385) + │ │ ├─{docker-proxy}(30386) + │ │ └─{docker-proxy}(30388) + │ ├─docker-proxy(30387)─┬─{docker-proxy}(30389) + │ │ ├─{docker-proxy}(30390) + │ │ ├─{docker-proxy}(30391) + │ │ ├─{docker-proxy}(30392) + │ │ ├─{docker-proxy}(30393) + │ │ ├─{docker-proxy}(30394) + │ │ ├─{docker-proxy}(30395) + │ │ └─{docker-proxy}(30396) + │ ├─docker-proxy(30497)─┬─{docker-proxy}(30498) + │ │ ├─{docker-proxy}(30499) + │ │ ├─{docker-proxy}(30500) + │ │ ├─{docker-proxy}(30501) + │ │ ├─{docker-proxy}(30502) + │ │ ├─{docker-proxy}(30503) + │ │ ├─{docker-proxy}(30504) + │ │ └─{docker-proxy}(30505) + │ ├─docker-proxy(30506)─┬─{docker-proxy}(30507) + │ │ ├─{docker-proxy}(30508) + │ │ ├─{docker-proxy}(30509) + │ │ ├─{docker-proxy}(30510) + │ │ ├─{docker-proxy}(30511) + │ │ ├─{docker-proxy}(30512) + │ │ └─{docker-proxy}(30513) + │ ├─docker-proxy(30616)─┬─{docker-proxy}(30617) + │ │ ├─{docker-proxy}(30618) + │ │ ├─{docker-proxy}(30619) + │ │ ├─{docker-proxy}(30620) + │ │ ├─{docker-proxy}(30621) + │ │ ├─{docker-proxy}(30622) + │ │ ├─{docker-proxy}(30624) + │ │ └─{docker-proxy}(30625) + │ ├─docker-proxy(30623)─┬─{docker-proxy}(30626) + │ │ ├─{docker-proxy}(30627) + │ │ ├─{docker-proxy}(30628) + │ │ ├─{docker-proxy}(30629) + │ │ ├─{docker-proxy}(30630) + │ │ ├─{docker-proxy}(30631) + │ │ └─{docker-proxy}(30632) + │ ├─{dockerd}(29157) + │ ├─{dockerd}(29159) + │ ├─{dockerd}(29161) + │ ├─{dockerd}(29163) + │ ├─{dockerd}(29407) + │ ├─{dockerd}(29420) + │ ├─{dockerd}(29430) + │ ├─{dockerd}(29537) + │ ├─{dockerd}(29711) + │ ├─{dockerd}(29712) + │ ├─{dockerd}(29823) + │ ├─{dockerd}(29844) + │ ├─{dockerd}(29845) + │ ├─{dockerd}(30633) + │ └─{dockerd}(30683) + ├─irqbalance(729)───{irqbalance}(738) + ├─lsmd(730) + ├─mcelog(734) + ├─polkitd(944)─┬─{polkitd}(975) + │ ├─{polkitd}(976) + │ ├─{polkitd}(979) + │ ├─{polkitd}(980) + │ ├─{polkitd}(981) + │ ├─{polkitd}(982) + │ └─{polkitd}(1004) + ├─rsyslogd(1063)─┬─{rsyslogd}(1095) + │ └─{rsyslogd}(1096) + ├─sshd(786)─┬─sshd(1527)───sshd(1541)───bash(1542)───docker(30781)─┬─{docker}(30782) + │ │ ├─{docker}(30783) + │ │ ├─{docker}(30784) + │ │ ├─{docker}(30785) + │ │ ├─{docker}(30786) + │ │ ├─{docker}(30787) + │ │ ├─{docker}(30788) + │ │ └─{docker}(30807) + │ └─sshd(30928)───sshd(30932)───bash(30933)───pstree(31158) + ├─systemd(1532)───(sd-pam)(1534) + ├─systemd-journal(635) + ├─systemd-logind(739) + ├─systemd-udevd(648) + └─tuned(791)─┬─{tuned}(1106) + ├─{tuned}(1137) + └─{tuned}(1138) + +[root@localhost ~]# ps aux | grep b42378a51c40 +root 30566 0.0 0.9 1237984 16524 ? Sl 18:42 0:00 /usr/bin/containerd-shim-runc-v2 -namespace moby -id b42378a51c402d7ffa408d331a61ebdefe1b920eb723cd343ebc8e5781bec03d -address /run/containerd/containerd.sock +root 31171 0.0 0.1 3880 2048 pts/1 S+ 18:54 0:00 grep --color=auto b42378a51c40 +``` + +**在宿主机上查看容器的进程** + +```bash +[root@localhost ~]# docker top nginx-1 +UID PID PPID C STIME TTY TIME CMD +root 30353 30330 0 18:42 ? 00:00:00 nginx: master process nginx -g daemon off; +101 30426 30353 0 18:42 ? 00:00:00 nginx: worker process +101 30427 30353 0 18:42 ? 00:00:00 nginx: worker process +101 30428 30353 0 18:42 ? 00:00:00 nginx: worker process +101 30429 30353 0 18:42 ? 00:00:00 nginx: worker process +root 30801 30330 0 18:46 pts/0 00:00:00 bash +``` + +首先,可以看到容器内的进程在宿主机上的 PID。容器内的进程只能看到自己命名空间中的进程,而无法看到宿主机或其他容器的进程 + +所以说明docker采用PID Namespace技术将容器内部的进程与宿主机的进程进行了隔离 + +并且,容器内部的进程和宿主机上的进程还存在一定的对应或者映射关系 + +1. **独立的 PID 命名空间**: + - 每个 Docker 容器都有自己独立的 PID 命名空间。 + - 容器内的进程 PID 从 1 开始编号,与宿主机上的 PID 是相互独立的。 +2. **PID 映射**: + - 容器内的进程 PID 与宿主机上的进程 PID 之间是有映射关系的。 +3. **PID 可见性**: + - 容器内的进程只能看到容器内部的 PID。 + - 宿主机上的进程可以看到容器内部的 PID,但容器内的进程无法看到宿主机上的 PID。 +4. **PID 隔离**: + - 容器内的进程无法访问或影响宿主机上的其他进程。 + - 宿主机上的进程可以访问和管理容器内的进程。 + +##### 6.1.4 Net Namespace + +每一个容器都类似于虚拟机一样有自己的网卡、监听端口、TCP/IP协议栈等,Docker使用network namespace启动一个vethX接口,这样容器将拥有它自己的桥接IP地址,通常是docker0,而docker0实质就是linux的虚拟网桥。 + +查看容器内部的IP网络信息,发现有一个eth0的网卡 + +```bash +root@d34a012dcebc:/# ifconfig +eth0: flags=4163 mtu 1500 + inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255 + ether ce:f2:f5:63:47:16 txqueuelen 0 (Ethernet) + RX packets 4713 bytes 10994487 (10.4 MiB) + RX errors 0 dropped 0 overruns 0 frame 0 + TX packets 3888 bytes 212050 (207.0 KiB) + TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 + +lo: flags=73 mtu 65536 + inet 127.0.0.1 netmask 255.0.0.0 + inet6 ::1 prefixlen 128 scopeid 0x10 + loop txqueuelen 1000 (Local Loopback) + RX packets 0 bytes 0 (0.0 B) + RX errors 0 dropped 0 overruns 0 frame 0 + TX packets 0 bytes 0 (0.0 B) + TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 +``` + +而我们的宿主机上的网卡中,多了个docker0的虚拟网桥,这样以来,通过Net Namespace将容器的网络与宿主机的网络进行隔离,并且通过虚拟网桥docker0与容器进行网络通信 + +```bash +[root@localhost ~]# ifconfig +docker0: flags=4163 mtu 1500 + inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255 + inet6 fe80::38a5:cdff:fe6b:7dbc prefixlen 64 scopeid 0x20 + ether 3a:a5:cd:6b:7d:bc txqueuelen 0 (Ethernet) + RX packets 5820 bytes 11520579 (10.9 MiB) + RX errors 0 dropped 0 overruns 0 frame 0 + TX packets 9483 bytes 11508761 (10.9 MiB) + TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 + +ens160: flags=4163 mtu 1500 + inet 192.168.88.10 netmask 255.255.255.0 broadcast 192.168.88.255 + inet6 fe80::20c:29ff:fe26:8384 prefixlen 64 scopeid 0x20 + ether 00:0c:29:26:83:84 txqueuelen 1000 (Ethernet) + RX packets 235433 bytes 340010957 (324.2 MiB) + RX errors 0 dropped 0 overruns 0 frame 0 + TX packets 54812 bytes 14709198 (14.0 MiB) + TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 + +lo: flags=73 mtu 65536 + inet 127.0.0.1 netmask 255.0.0.0 + inet6 ::1 prefixlen 128 scopeid 0x10 + loop txqueuelen 1000 (Local Loopback) + RX packets 0 bytes 0 (0.0 B) + RX errors 0 dropped 0 overruns 0 frame 0 + TX packets 0 bytes 0 (0.0 B) + TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 + +veth51c3173: flags=4163 mtu 1500 + inet6 fe80::d8fa:18ff:fe0f:d176 prefixlen 64 scopeid 0x20 + ether da:fa:18:0f:d1:76 txqueuelen 0 (Ethernet) + RX packets 3888 bytes 212050 (207.0 KiB) + RX errors 0 dropped 0 overruns 0 frame 0 + TX packets 4714 bytes 10994557 (10.4 MiB) + TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 + +veth813b530: flags=4163 mtu 1500 + inet6 fe80::e498:2eff:fe08:2c5b prefixlen 64 scopeid 0x20 + ether e6:98:2e:08:2c:5b txqueuelen 0 (Ethernet) + RX packets 3 bytes 126 (126.0 B) + RX errors 0 dropped 0 overruns 0 frame 0 + TX packets 15 bytes 1118 (1.0 KiB) + TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 + +vethc11c399: flags=4163 mtu 1500 + inet6 fe80::a482:dfff:fe74:dec7 prefixlen 64 scopeid 0x20 + ether a6:82:df:74:de:c7 txqueuelen 0 (Ethernet) + RX packets 3 bytes 126 (126.0 B) + RX errors 0 dropped 0 overruns 0 frame 0 + TX packets 18 bytes 1244 (1.2 KiB) + TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 +``` + +- **`docker0` 网桥**: + - 它是 Docker 默认创建的一个虚拟网桥,用于管理容器的网络通信。 + - 它为连接到它的容器提供了一个内部网络环境,允许容器之间通过这个网桥进行通信。 +- **`veth3ad3c5b` 接口**: + - 这是一个虚拟以太网接口,用于连接容器和宿主机的网络。 + - 它的一端连接到 `docker0` 网桥,另一端连接到容器的网络命名空间。 + - 当容器启动时,Docker 会自动创建这样的 veth pair,并将一端连接到 `docker0`,另一端连接到容器的网络命名空间。 + +逻辑图 + +![image-20210603144141780](01.Docker介绍与安装/image-20210603144141780.png) + +##### 6.1.5 User Namespace + +各个容器内可能会出现重名的用户和用户组名称,或重复的用户UID或者GID,那么怎么隔离各个容器内的用户空间呢? + +User Namespace允许在宿主机的各个容器空间内创建相同的用户名以及相同的uid和gid,只是此用户的有效范围仅仅是当前的容器内,不能访问另外一个容器内的文件系统,即相互隔离、互不影响、永不相见 + +#### 6.2 Linux control groups + +在一个容器内部,如果不对其做任何资源限制,则宿主机会允许其占用无限大的内存空间,有时候会因为代码bug程序会一直申请内存,直到把宿主机内存占完,为了避免此类的问题出现,宿主机有必要对容器进行资源分配限制,比如cpu、内存等,Linux Cgroups的全称是Linux control Groups,它最重要的作用就是限制一个进程组能够使用的资源上线,包括cpu、内存、磁盘、网络等等。 + +- 验证系统内核层已经默认开启cgroup功能 + +```bash +[root@localhost ~]# cat /boot/config-5.14.0-427.13.1.el9_4.x86_64 | grep cgroup -i +CONFIG_CGROUPS=y +# CONFIG_CGROUP_FAVOR_DYNMODS is not set +CONFIG_BLK_CGROUP=y +CONFIG_CGROUP_WRITEBACK=y +CONFIG_CGROUP_SCHED=y +CONFIG_CGROUP_PIDS=y +CONFIG_CGROUP_RDMA=y +CONFIG_CGROUP_FREEZER=y +CONFIG_CGROUP_HUGETLB=y +CONFIG_CGROUP_DEVICE=y +CONFIG_CGROUP_CPUACCT=y +CONFIG_CGROUP_PERF=y +CONFIG_CGROUP_BPF=y +CONFIG_CGROUP_MISC=y +# CONFIG_CGROUP_DEBUG is not set +CONFIG_SOCK_CGROUP_DATA=y +CONFIG_BLK_CGROUP_RWSTAT=y +CONFIG_BLK_CGROUP_IOLATENCY=y +CONFIG_BLK_CGROUP_FC_APPID=y +# CONFIG_BLK_CGROUP_IOCOST is not set +# CONFIG_BLK_CGROUP_IOPRIO is not set +# CONFIG_BFQ_CGROUP_DEBUG is not set +CONFIG_NETFILTER_XT_MATCH_CGROUP=m +CONFIG_NET_CLS_CGROUP=y +CONFIG_CGROUP_NET_PRIO=y +CONFIG_CGROUP_NET_CLASSID=y +# CONFIG_DEBUG_CGROUP_REF is not set +``` + +- 关于内存的模块 + +```bash +[root@localhost ~]# cat /boot/config-3.10.0-957.el7.x86_64 | grep mem -i | grep cg -i +CONFIG_MEMCG=y +CONFIG_MEMCG_SWAP=y +CONFIG_MEMCG_SWAP_ENABLED=y +CONFIG_MEMCG_KMEM=y +``` + +扩展阅读: + +https://blog.csdn.net/qyf158236/article/details/110475457 + +##### 6.2.1 Docker 中的 cgroups 资源限制 + +###### 6.2.1.1 **CPU 资源限制** + +Docker 提供了多种方式来限制容器的 CPU 使用: + +- **`--cpus`**:限制容器可以使用的 CPU 核心数量。例如,`--cpus="1.5"` 表示容器最多可以使用 1.5 个 CPU。 +- **`--cpu-shares`**:设置容器的 CPU 使用权重。默认值为 1024,值越高,分配的 CPU 时间片越多。 +- **`--cpu-period` 和 `--cpu-quota`**:更细粒度地控制 CPU 时间片。`--cpu-period` 设置 CPU 时间片的周期(单位为微秒),`--cpu-quota` 设置每个周期内容器可以使用的 CPU 时间。 + +###### 6.2.1.2 **内存资源限制** + +Docker 可以通过以下参数限制容器的内存使用: + +- **`-m` 或 `--memory`**:限制容器的物理内存使用量。例如,`-m 512m` 表示限制容器使用 512MB 的物理内存。 +- **`--memory-swap`**:限制容器的总内存使用量(物理内存 + 交换空间)。例如,`--memory-swap=1g` 表示容器可以使用 1GB 的总内存。 + +###### 6.2.1.3 **磁盘 I/O 资源限制** + +Docker 可以限制容器的磁盘 I/O 使用: + +- **`--blkio-weight`**:设置容器的块设备 I/O 权重,范围为 10 到 1000。 +- **`--device-read-bps` 和 `--device-write-bps`**:限制特定设备的读写速率。例如,`--device-read-bps /dev/sda:1mb` 表示限制容器对 `/dev/sda` 的读取速率为 1MB/s。 + +##### 6.2.2 查看和管理 cgroups 资源限制 + +- **查看 cgroups 配置**:可以通过访问 `/sys/fs/cgroup` 目录来查看容器的 cgroups 配置。例如,`/sys/fs/cgroup/cpu/docker/` 目录下包含了容器的 CPU 资源限制文件。 +- **动态调整资源限制**:在容器运行时,可以通过修改 cgroups 文件的内容来动态调整资源限制。 + +##### 6.2.3 使用压缩工具测试 + +```plain +[root@bogon ~]# docker pull lorel/docker-stress-ng +Using default tag: latest +latest: Pulling from lorel/docker-stress-ng +c52e3ed763ff: Pull complete +a3ed95caeb02: Pull complete +7f831269c70e: Pull complete +Digest: sha256:c8776b750869e274b340f8e8eb9a7d8fb2472edd5b25ff5b7d55728bca681322 +Status: Downloaded newer image for lorel/docker-stress-ng:latest +``` + +###### 6.2.3.1 测试CPU + +不限制cpu使用 + +```bash +[root@bogon ~]# docker container run --name stress -it --rm lorel/docker-stress-ng:latest --cpu 4 +stress-ng: info: [1] defaulting to a 86400 second run per stressor +stress-ng: info: [1] dispatching hogs: 8 cpu +[root@bogon ~]# docker stats +CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS +92b0b8d916c1 stress 101.54% 15.81MiB / 983.3MiB 1.61% 648B / 0B 0B / 0B 9 +[root@bogon ~]# top +top - 19:15:49 up 2 days, 2:38, 2 users, load average: 7.02, 3.00, 1.15 +Tasks: 131 total, 10 running, 121 sleeping, 0 stopped, 0 zombie +%Cpu(s): 99.7 us, 0.3 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st +KiB Mem : 1006892 total, 100680 free, 320704 used, 585508 buff/cache +KiB Swap: 2097148 total, 2096628 free, 520 used. 422732 avail Mem + PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND +40035 root 20 0 6908 4180 252 R 12.6 0.4 0:12.79 stress-ng-cpu +40037 root 20 0 6908 4180 252 R 12.6 0.4 0:12.78 stress-ng-cpu +40038 root 20 0 6908 2136 252 R 12.6 0.2 0:12.78 stress-ng-cpu +40040 root 20 0 6908 2136 252 R 12.6 0.2 0:12.78 stress-ng-cpu +40036 root 20 0 6908 2136 252 R 12.3 0.2 0:12.77 stress-ng-cpu +40039 root 20 0 6908 2136 252 R 12.3 0.2 0:12.78 stress-ng-cpu +40041 root 20 0 6908 4180 252 R 12.3 0.4 0:12.77 stress-ng-cpu +40042 root 20 0 6908 2136 252 R 12.3 0.2 0:12.77 stress-ng-cpu + 1 root 20 0 128484 7208 4196 S 0.0 0.7 0:10.12 systemd +``` + +可以看到,cpu使用已经满了 + +重新启动容器加入CPU限制参数 + +```bash +[root@bogon ~]# docker container run --name stress --cpus=0.5 -it --rm lorel/docker-stress-ng:latest --cpu 8 +stress-ng: info: [1] defaulting to a 86400 second run per stressor +stress-ng: info: [1] dispatching hogs: 8 cpu +[root@bogon ~]# docker stats +CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS +845220ef9982 stress 51.57% 20.05MiB / 983.3MiB 2.04% 648B / 0B 0B / 0B 9 +``` + +### 7. 容器规范 + +#### 7.1 容器技术及其标准化组织 OCI + +容器技术是一种轻量级的虚拟化技术,用于隔离应用程序及其依赖项,使其能够在不同的环境中一致地运行。除了 Docker 之外,还有其他多种容器运行时和工具,例如 CoreOS 的 rkt、阿里的 Pouch 和红帽的 Podman。为了确保容器生态系统的标准性和可持续发展,Linux 基金会、Docker、微软、红帽、谷歌和 IBM 等公司在 2015 年 6 月共同成立了 **Open Container Initiative (OCI)** 组织。 + +##### 7.1.1 **OCI 的目标** + +OCI 的主要目标是制定开放的容器规范,以确保不同容器技术之间的可移植性和互操作性。目前,OCI 已经发布了两个核心规范: + +1. **Runtime Spec**:定义了容器运行时的规范,包括容器的生命周期管理、资源隔离和安全等。 +2. **Image Format Spec**:定义了容器镜像的格式和元数据,确保镜像可以在不同的容器运行时之间共享和运行。 + +通过遵循这些规范,不同的容器运行时和工具可以实现互操作性,从而推动容器技术的标准化和健康发展。 + +##### 7.1.2 主流容器运行时 + +容器运行时是真正运行容器的地方,它需要与操作系统的内核紧密合作,为容器提供隔离的运行环境。以下是目前主流的三种容器运行时: + +###### 7.1.2.1 **LXC (Linux Containers)** + +- **简介**:LXC 是 Linux 上早期的容器运行时,它利用 Linux 内核的 Namespace 和 Cgroups 技术来实现进程隔离和资源管理。 +- **特点**: + - 提供了完整的 Linux 系统环境,支持多种 Linux 发行版。 + - 早期 Docker 也曾使用 LXC 作为其默认的运行时。 +- **适用场景**:适用于需要完整 Linux 系统环境的容器化应用。 + +###### 7.1.2.2 **Runc** + +- **简介**:Runc 是目前 Docker 默认的容器运行时,它是一个轻量级的命令行工具,用于运行和管理容器。 +- **特点**: + - 完全遵循 OCI 的 Runtime Spec 规范,确保与 OCI 标准的兼容性。 + - 由于其轻量级和高性能的特点,Runc 已经成为许多容器运行时的底层实现。 +- **适用场景**:适用于需要高性能和轻量级容器运行环境的场景。 + +###### 7.1.2.3 **Rkt (Rocket)** + +- **简介**:Rkt 是由 CoreOS 开发的容器运行时,旨在提供一个安全、可靠且符合 OCI 规范的容器运行环境。 +- **特点**: + - 与 Docker 不同,Rkt 本身是一个独立的容器运行时,不依赖 Docker 的守护进程。 + - 提供了更好的安全性和隔离性,例如通过 AppArmor 和 SELinux 等安全机制。 +- **适用场景**:适用于对安全性要求较高的容器化应用。 + +容器技术的发展离不开标准化的推动。OCI 通过制定 Runtime Spec 和 Image Format Spec,为容器运行时和工具提供了统一的标准,确保了不同容器技术之间的互操作性和可移植性。目前主流的容器运行时(如 LXC、Runc 和 Rkt)都遵循这些规范,从而推动了容器技术的广泛应用和发展。 + +### 8. docker info信息 + +```bash +[root@localhost ~]# docker info +Client: + Context: default + Debug Mode: false + Plugins: + app: Docker App (Docker Inc., v0.9.1-beta3) + buildx: Build with BuildKit (Docker Inc., v0.5.1-docker) + scan: Docker Scan (Docker Inc.) + +Server: + Containers: 2 # 当前主机运行容器总数 + Running: 1 # 有几个容器是正在运行的 + Paused: 0 # 有几个容器是暂停的 + Stopped: 1 # 有几个容器是停止的 + Images: 1 # 当前服务器的镜像数 + Server Version: 20.10.6 # 服务端版本 + Storage Driver: overlay2 # 正在使用的存储引擎 + Backing Filesystem: xfs # 后端文件系统,即服务器的磁盘文件系统 + Supports d_type: true # 是否支持d_type + Native Overlay Diff: true # 是否支持差异数据存储 + userxattr: false + Logging Driver: json-file # 日志文件类型 + Cgroup Driver: cgroupfs # cgroups类型 + Cgroup Version: 1 + Plugins: # 插件 + Volume: local # 卷 + Network: bridge host ipvlan macvlan null overlay + Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog + Swarm: inactive # 是否支持swarm + Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc + Default Runtime: runc # 默认的runtime + Init Binary: docker-init # 初始化容器的守护进程 + containerd version: d71fcd7d8303cbf684402823e425e9dd2e99285d + runc version: b9ee9c6314599f1b4a7f497e1f1f856fe433d3b7 + init version: de40ad0 + Security Options: # 安全选项 + seccomp + Profile: default + Kernel Version: 3.10.0-693.el7.x86_64 # 宿主机内核版本 + Operating System: CentOS Linux 7 (Core) # 宿主机操作系统 + OSType: linux # 宿主机操作系统类型 + Architecture: x86_64 # 宿主机架构 + CPUs: 1 # 宿主机cpu数量 + Total Memory: 1.781GiB # 宿主机总内存 + Name: docker-server # 宿主机主机名 + ID: ARN5:ESPO:FEZ4:KDZ6:RWGG:WQ3X:SIXN:3FVG:ATXH:JAXA:ENGH:RAVE + Docker Root Dir: /var/lib/docker # 宿主机数据保存目录 + Debug Mode: false + Registry: https://index.docker.io/v1/ # 镜像仓库 + Labels: + Experimental: false # 是否是测试版 + Insecure Registries: + 127.0.0.0/8 + Live Restore Enabled: false # 是否开启活动容器(重启不关闭容器) +``` + +### 9. docker 存储引擎 + +Docker 的存储引擎是 Docker 平台中用于管理容器和镜像数据的核心组件。它负责容器的文件系统、网络配置、权限管理等,以及其他与容器运行相关的任务。以下是对 Docker 存储引擎的详细介绍: + +#### 9.1 **核心概念及工作原理** + +Docker 存储引擎的核心思想是“层”的概念。镜像是由多个只读层组成的,而容器则在镜像的基础上添加了一个可读写的层。这种分层架构使得镜像的复用和部署变得非常方便,同时减少了容器的体积。 + +Docker 使用联合文件系统(Union File System)来管理容器的文件系统。联合文件系统允许将多个目录(或文件系统)合并为一个统一的文件系统视图。Docker 的存储引擎通过这种机制,将镜像层和容器层合并在一起,使得容器能够看到一个完整的文件系统。 + +Docker 支持多种存储引擎,每种存储引擎都有其特点和适用场景。以下是一些常见的存储引擎: + +**AUFS(Another Union File System)** + +- **特点**:AUFS 是一种文件级的存储驱动,允许多个目录共享相同的文件系统层次结构。它通过联合挂载技术将多个目录挂载到一个单一的文件系统上。 +- **适用场景**:AUFS 曾是 Docker 早期版本的默认存储驱动,但在较新的 Docker 版本中已被 Overlay2 替代。 + +**OverlayFS** + +- **特点**:OverlayFS 是一种更现代的联合文件系统,从 Linux 内核 3.18 开始支持。它将文件系统简化为两层:一个只读的下层(lowerdir)和一个可读写的上层(upperdir),统一后的视图称为合并层(merged)。 +- **优势**:OverlayFS 支持页缓存共享,多个容器如果读取相同层的同一个文件,可以共享页缓存,从而提高内存利用率。此外,OverlayFS 在性能和稳定性方面表现更好,是目前 Docker 的默认存储驱动。 + +#### 9.2 Docker 的 Overlay2 存储驱动介绍 + +1. **什么是 Overlay2?** + +Overlay2 是 Docker 中的一种存储驱动,用于管理容器和镜像的文件系统。它是 OverlayFS 的改进版本,解决了早期 Overlay 驱动可能遇到的 inode 耗尽问题。Overlay2 使用联合文件系统(Union File System)技术,将多个文件系统层合并为一个统一的文件系统视图,从而实现高效的容器文件系统管理。 + +2. **Overlay2 的工作原理** + +Overlay2 通过以下三个主要目录来管理文件系统: + +- **`LowerDir`**:只读层,包含基础镜像的文件系统。可以有多个只读层,每层都是独立的。 +- **`UpperDir`**:读写层,用于存储容器运行时的文件系统变更(即 diff 层)。 +- **`MergedDir`**:联合挂载后的视图,容器看到的完整文件系统。它将 `LowerDir` 和 `UpperDir` 合并为一个统一的文件系统视图。 +- **`WorkDir`**:工作目录,用于联合挂载的内部操作,挂载后内容被清空。 + +当启动一个容器时,Overlay2 会将镜像层(`LowerDir`)和容器层(`UpperDir`)联合挂载到 `MergedDir`,容器通过这个目录看到完整的文件系统。 \ No newline at end of file diff --git a/00.基础阶段/02.Linux基础/15.Docker/01.Docker介绍与安装/image-20191028193918568.png b/00.基础阶段/02.Linux基础/15.Docker/01.Docker介绍与安装/image-20191028193918568.png new file mode 100644 index 0000000..42963f5 Binary files /dev/null and b/00.基础阶段/02.Linux基础/15.Docker/01.Docker介绍与安装/image-20191028193918568.png differ diff --git a/00.基础阶段/02.Linux基础/15.Docker/01.Docker介绍与安装/image-20210531152229098.png b/00.基础阶段/02.Linux基础/15.Docker/01.Docker介绍与安装/image-20210531152229098.png new file mode 100644 index 0000000..9f9e157 Binary files /dev/null and b/00.基础阶段/02.Linux基础/15.Docker/01.Docker介绍与安装/image-20210531152229098.png differ diff --git a/00.基础阶段/02.Linux基础/15.Docker/01.Docker介绍与安装/image-20210531152329941.png b/00.基础阶段/02.Linux基础/15.Docker/01.Docker介绍与安装/image-20210531152329941.png new file mode 100644 index 0000000..a3c526a Binary files /dev/null and b/00.基础阶段/02.Linux基础/15.Docker/01.Docker介绍与安装/image-20210531152329941.png differ diff --git a/00.基础阶段/02.Linux基础/15.Docker/01.Docker介绍与安装/image-20210603144141780.png b/00.基础阶段/02.Linux基础/15.Docker/01.Docker介绍与安装/image-20210603144141780.png new file mode 100644 index 0000000..dbe7628 Binary files /dev/null and b/00.基础阶段/02.Linux基础/15.Docker/01.Docker介绍与安装/image-20210603144141780.png differ diff --git a/00.基础阶段/02.Linux基础/15.Docker/01.Docker介绍与安装/image-20250324001839505.png b/00.基础阶段/02.Linux基础/15.Docker/01.Docker介绍与安装/image-20250324001839505.png new file mode 100644 index 0000000..e65c8c8 Binary files /dev/null and b/00.基础阶段/02.Linux基础/15.Docker/01.Docker介绍与安装/image-20250324001839505.png differ diff --git a/00.基础阶段/02.Linux基础/15.Docker/02.Docker镜像管理.md b/00.基础阶段/02.Linux基础/15.Docker/02.Docker镜像管理.md new file mode 100644 index 0000000..b702b92 --- /dev/null +++ b/00.基础阶段/02.Linux基础/15.Docker/02.Docker镜像管理.md @@ -0,0 +1,293 @@ +# 02.Docker镜像管理 + +## 02.Docker镜像管理 + +### 1. 搜索镜像 + +```bash +[root@docker-server ~]# docker search centos +NAME DESCRIPTION STARS OFFICIAL AUTOMATED +centos The official build of CentOS. 6584 [OK] +ansible/centos7-ansible Ansible on Centos7 134 [OK] +consol/centos-xfce-vnc Centos container with "headless" VNC session… 129 [OK] +jdeathe/centos-ssh OpenSSH / Supervisor / EPEL/IUS/SCL Repos - … 118 [OK] +centos/systemd systemd enabled base container. 99 [OK] +imagine10255/centos6-lnmp-php56 centos6-lnmp-php56 58 [OK] +tutum/centos Simple CentOS docker image with SSH access 48 +kinogmt/centos-ssh CentOS with SSH 29 [OK] +pivotaldata/centos-gpdb-dev CentOS image for GPDB development. Tag names… 13 +guyton/centos6 From official centos6 container with full up… 10 [OK] +centos/tools Docker image that has systems administration… 7 [OK] +drecom/centos-ruby centos ruby 6 [OK] +pivotaldata/centos Base centos, freshened up a little with a Do… 5 +pivotaldata/centos-gcc-toolchain CentOS with a toolchain, but unaffiliated wi… 3 +darksheer/centos Base Centos Image -- Updated hourly 3 [OK] +mamohr/centos-java Oracle Java 8 Docker image based on Centos 7 3 [OK] +pivotaldata/centos-mingw Using the mingw toolchain to cross-compile t… 3 +miko2u/centos6 CentOS6 日本語環境 2 [OK] +indigo/centos-maven Vanilla CentOS 7 with Oracle Java Developmen… 2 [OK] +amd64/centos The official build of CentOS. 2 +dokken/centos-7 CentOS 7 image for kitchen-dokken 2 +pivotaldata/centos6.8-dev CentosOS 6.8 image for GPDB development 1 +blacklabelops/centos CentOS Base Image! Built and Updates Daily! 1 [OK] +smartentry/centos centos with smartentry 0 [OK] +``` + +可以看到返回了很多包含关键字的镜像,其中包括镜像名字、描述、点赞数(表示该镜像的受欢迎程度)、是否官方创建、是否自动创建。默认输出结果按照星级评价进行排序。 + +![image-20250324192816988](02.Docker镜像管理/image-20250324192816988.png) + +### 2. 下载镜像 + +可以使用docker pull命令直接下载镜像,语法为: + +```bash +docker pull NAME:TAG +``` + +其中,NAME是镜像名称,TAG是镜像的标签(往往用来是表示版本信息),通常情况下,描述一个镜像需要包括名称+标签,如果不指定标签,标签的值默认为latest。 + +- 下载nginx、centos、hello-world镜像 + +```bash +[root@docker-server ~]# docker pull nginx +[root@docker-server ~]# docker pull centos +[root@docker-server ~]# docker pull hello-world +``` + +### 3. 查看镜像信息 + +#### 3.1 docker images + +- 列出本地所有镜像 + +```bash +[root@docker-server ~]# docker images +REPOSITORY TAG IMAGE ID CREATED SIZE +nginx latest d1a364dc548d 2 weeks ago 133MB +hello-world latest d1165f221234 3 months ago 13.3kB +centos latest 300e315adb2f 6 months ago 209MB +``` + +在列出的信息中可以看到几个字段: + +- REPOSITORY:镜像仓库名称 +- TAG:镜像的标签信息 +- 镜像ID:唯一用来标识镜像,如果两个镜像的ID相同,说明他们实际上指向了同一个镜像,只是具有不同标签名称而已 +- CREATED:创建时间,说明镜像的最后更新时间 +- SIZE:镜像大小,优秀的镜像往往体积都较小 + +#### 3.2 docker tag + +为了方便在后续工作中使用特定镜像,可以使用docker tag命令来为本地镜像任意添加新的标签 + +```bash +[root@localhost ~]# docker tag nginx:latest mynginx:latest +[root@localhost ~]# docker images +REPOSITORY TAG IMAGE ID CREATED SIZE +mynginx latest 53a18edff809 6 weeks ago 192MB +nginx latest 53a18edff809 6 weeks ago 192MB +hello-world latest 74cc54e27dc4 2 months ago 10.1kB +registry.cn-guangzhou.aliyuncs.com/welldene/games rpg_game 6a963645d135 22 months ago 310MB +``` + +#### 3.3 docker inspect + +可以使用docker inspect命令获取该镜像的详细信息 + +```bash +[root@localhost ~]# docker inspect nginx:latest +[ + { + "Id": "sha256:53a18edff8091d5faff1e42b4d885bc5f0f897873b0b8f0ace236cd5930819b0", + "RepoTags": [ + "mynginx:latest", + "nginx:latest" + ], + "RepoDigests": [ + "nginx@sha256:124b44bfc9ccd1f3cedf4b592d4d1e8bddb78b51ec2ed5056c52d3692baebc19" + ], + "Parent": "", + "Comment": "buildkit.dockerfile.v0", + "Created": "2025-02-05T21:27:16Z", + "DockerVersion": "", + "Author": "", + "Config": { + "Hostname": "", + "Domainname": "", + "User": "", + "AttachStdin": false, + "AttachStdout": false, + "AttachStderr": false, + "ExposedPorts": { + "80/tcp": {} + }, + "Tty": false, + "OpenStdin": false, + "StdinOnce": false, + "Env": [ + "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", + "NGINX_VERSION=1.27.4", + "NJS_VERSION=0.8.9", + "NJS_RELEASE=1~bookworm", + "PKG_RELEASE=1~bookworm", + "DYNPKG_RELEASE=1~bookworm" + ], + "Cmd": [ + "nginx", + "-g", + "daemon off;" + ], + "Image": "", + "Volumes": null, + "WorkingDir": "", + "Entrypoint": [ + "/docker-entrypoint.sh" + ], + "OnBuild": null, + "Labels": { + "maintainer": "NGINX Docker Maintainers " + }, + "StopSignal": "SIGQUIT" + }, + "Architecture": "amd64", + "Os": "linux", + "Size": 192004242, + "GraphDriver": { + "Data": { + "LowerDir": "/var/lib/docker/overlay2/5698387a01cba2eedc0058d1ceec91493ae1c0a55352cc3d3ff2de257add6461/diff:/var/lib/docker/overlay2/3c85557f47aee3bc95423d00407b301ba73ee79e689a4acaa63b22aea3f64a29/diff:/var/lib/docker/overlay2/0dcd12c3dfdc4ca7e74cc05e6ec1ea701bff84acbdbe8c0ece63a1a5cbac85c4/diff:/var/lib/docker/overlay2/3105b0866bd0cba95bb28d3df6e7948853129aaadf4bdb6f162de3d61bb176cc/diff:/var/lib/docker/overlay2/f0864c0d8aa319dbf9e0f63d00b817bd9723badce3eef3879cc3114523ed6831/diff:/var/lib/docker/overlay2/44374136ef63aea5fd69dc1dc7d3c6238b4eca766845f15a869eb1479bd12387/diff", + "MergedDir": "/var/lib/docker/overlay2/d658b597a569f714a0dab28da1ddf3b7b15001f1b1889dfc72f1ea8ed56d2cad/merged", + "UpperDir": "/var/lib/docker/overlay2/d658b597a569f714a0dab28da1ddf3b7b15001f1b1889dfc72f1ea8ed56d2cad/diff", + "WorkDir": "/var/lib/docker/overlay2/d658b597a569f714a0dab28da1ddf3b7b15001f1b1889dfc72f1ea8ed56d2cad/work" + }, + "Name": "overlay2" + }, + "RootFS": { + "Type": "layers", + "Layers": [ + "sha256:1287fbecdfcce6ee8cf2436e5b9e9d86a4648db2d91080377d499737f1b307f3", + "sha256:135f786ad04647c6e58d9a2d4f6f87bd677ef6144ab24c81a6f5be7acc63fbc9", + "sha256:ad2f08e39a9de1e12157c800bd31ba86f8cc222eedec11e8e072c3ba608d26fb", + "sha256:d98dcc720ae098efb91563f0a9abe03de50b403f7aa6c6f0e1dfb8297aedb61f", + "sha256:aa82c57cd9fe730130e35d42c6b26a4a9d3c858f61c23f63d53b703abf30adf8", + "sha256:d26dc06ef910f67b1b2bcbcc6318e2e08881011abc7ad40fd859f38641ab105c", + "sha256:03d9365bc5dc9ec8b2f032927d3d3ae10b840252c86cf245a63b713d50eaa2fd" + ] + }, + "Metadata": { + "LastTagTime": "2025-03-24T19:26:37.193805768+08:00" + } + } +] +``` + +#### 3.4 docker history + +镜像由多层组成,可以使用history子命令,该命令将列出各层创建信息 + +```bash +[root@localhost ~]# docker history nginx +IMAGE CREATED CREATED BY SIZE COMMENT +53a18edff809 6 weeks ago CMD ["nginx" "-g" "daemon off;"] 0B buildkit.dockerfile.v0 + 6 weeks ago STOPSIGNAL SIGQUIT 0B buildkit.dockerfile.v0 + 6 weeks ago EXPOSE map[80/tcp:{}] 0B buildkit.dockerfile.v0 + 6 weeks ago ENTRYPOINT ["/docker-entrypoint.sh"] 0B buildkit.dockerfile.v0 + 6 weeks ago COPY 30-tune-worker-processes.sh /docker-ent… 4.62kB buildkit.dockerfile.v0 + 6 weeks ago COPY 20-envsubst-on-templates.sh /docker-ent… 3.02kB buildkit.dockerfile.v0 + 6 weeks ago COPY 15-local-resolvers.envsh /docker-entryp… 389B buildkit.dockerfile.v0 + 6 weeks ago COPY 10-listen-on-ipv6-by-default.sh /docker… 2.12kB buildkit.dockerfile.v0 + 6 weeks ago COPY docker-entrypoint.sh / # buildkit 1.62kB buildkit.dockerfile.v0 + 6 weeks ago RUN /bin/sh -c set -x && groupadd --syst… 117MB buildkit.dockerfile.v0 + 6 weeks ago ENV DYNPKG_RELEASE=1~bookworm 0B buildkit.dockerfile.v0 + 6 weeks ago ENV PKG_RELEASE=1~bookworm 0B buildkit.dockerfile.v0 + 6 weeks ago ENV NJS_RELEASE=1~bookworm 0B buildkit.dockerfile.v0 + 6 weeks ago ENV NJS_VERSION=0.8.9 0B buildkit.dockerfile.v0 + 6 weeks ago ENV NGINX_VERSION=1.27.4 0B buildkit.dockerfile.v0 + 6 weeks ago LABEL maintainer=NGINX Docker Maintainers 6 weeks ago # debian.sh --arch 'amd64' out/ 'bookworm' '… 74.8MB debuerreotype 0.15 +``` + +### 4. 镜像导入导出 + +#### 4.1 导出 + +可以将镜像从本地导出为一个压缩文件,然后复制到其他服务器进行导入使用 + +- 导出方法一 + +```bash +[root@localhost ~]# docker save nginx:latest -o /opt/nginx.tar.gz +[root@localhost ~]# ll /opt/nginx.tar.gz +-rw-------. 1 root root 196167168 Mar 24 19:28 /opt/nginx.tar.gz +``` + +- 导出方法二 + +```bash +[root@localhost ~]# docker save nginx:latest > /opt/nginx-1.tar.gz +[root@localhost ll /opt/nginx-1.tar.gz +-rw-r--r--. 1 root root 196167168 Mar 24 19:29 /opt/nginx-1.tar.gz +``` + +#### 4.2 导入 + +先将导出的镜像发到需要导入的docker服务器中 + +- 导入方法一 + +```bash +[root@docker-server ~]# docker load -i /opt/nginx.tar.gz +Loaded image: centos:latest +``` + +- 导出方法二 + +```bash +[root@docker-server ~]# docker load < /opt/nginx.tar.gz +Loaded image: centos:latest +``` + +### 5. 删除镜像 + +- 使用镜像名称+标签 + +```bash +[root@docker-server ~]# docker images +REPOSITORY TAG IMAGE ID CREATED SIZE +nginx latest d1a364dc548d 2 weeks ago 133MB +hello-world latest d1165f221234 3 months ago 13.3kB +centos latest 300e315adb2f 6 months ago 209MB +mycentos latest 300e315adb2f 6 months ago 209MB +[root@docker-server ~]# docker rmi nginx:latest +Untagged: nginx:latest +Untagged: nginx@sha256:6d75c99af15565a301e48297fa2d121e15d80ad526f8369c526324f0f7ccb750 +Deleted: sha256:d1a364dc548d5357f0da3268c888e1971bbdb957ee3f028fe7194f1d61c6fdee +Deleted: sha256:fcc8faba78fe8a1f75025781c8fa1841079b75b54fce8408d039f73a48b7a81b +Deleted: sha256:a476b265974ace4c857e3d88b358e848f126297a8249840c72d5f5ea1954a4bf +Deleted: sha256:56722ee1ee7e73a5c6f96ea2959fa442fb4db9f044399bcd939bb0a6eb7919dc +Deleted: sha256:c657df997c75f6c1a9c5cc683e8e34c6f29e5b4c1dee60b632d3477fd5fdd644 +Deleted: sha256:e9e1f772d2a8dbbeb6a4a4dcb4f0d07ff1c432bf94fac7a2db2216837bf9ec5b +Deleted: sha256:02c055ef67f5904019f43a41ea5f099996d8e7633749b6e606c400526b2c4b33 +``` + +- 使用镜像id + +```bash +[root@docker-server ~]# docker images +REPOSITORY TAG IMAGE ID CREATED SIZE +hello-world latest d1165f221234 3 months ago 13.3kB +centos latest 300e315adb2f 6 months ago 209MB +mycentos latest 300e315adb2f 6 months ago 209MB +[root@docker-server ~]# docker rmi 300e315adb2f +Error response from daemon: conflict: unable to delete 300e315adb2f (must be forced) - image is referenced in multiple repositories +[root@docker-server ~]# docker rmi 300e315adb2f -f +Untagged: centos:latest +Untagged: centos@sha256:5528e8b1b1719d34604c87e11dcd1c0a20bedf46e83b5632cdeac91b8c04efc1 +Untagged: mycentos:latest +Deleted: sha256:300e315adb2f96afe5f0b2780b87f28ae95231fe3bdd1e16b9ba606307728f55 +Deleted: sha256:2653d992f4ef2bfd27f94db643815aa567240c37732cae1405ad1c1309ee9859 +[root@docker-server ~]# docker images +REPOSITORY TAG IMAGE ID CREATED SIZE +hello-world latest d1165f221234 3 months ago 13.3kB + +``` \ No newline at end of file diff --git a/00.基础阶段/02.Linux基础/15.Docker/02.Docker镜像管理/image-20250324192816988.png b/00.基础阶段/02.Linux基础/15.Docker/02.Docker镜像管理/image-20250324192816988.png new file mode 100644 index 0000000..13d57e8 Binary files /dev/null and b/00.基础阶段/02.Linux基础/15.Docker/02.Docker镜像管理/image-20250324192816988.png differ diff --git a/00.基础阶段/02.Linux基础/15.Docker/03.Docker容器管理.md b/00.基础阶段/02.Linux基础/15.Docker/03.Docker容器管理.md new file mode 100644 index 0000000..b731b0d --- /dev/null +++ b/00.基础阶段/02.Linux基础/15.Docker/03.Docker容器管理.md @@ -0,0 +1,400 @@ +# 03.Docker容器管理 + +## 03.Docker容器管理 + +### 1. docker容器管理 + +### 2. 创建容器 + +#### 2.1 docker create + +docker create命令新建的容器处于停滞状态,可以使用docker start命令来启动它 + +| 选项 | 说明 | +| ------------- | ------------------------------------------------------------ | +| -d | 是否在后台运行容器,默认为否 | +| -i | 保持标准输入打开 | +| -P | 通过NAT机制将容器标记暴露的端口自动映射到本地主机的临时端口 | +| -p | 指定如何映射到本地主机端口 | +| -t | 分配一个终端 | +| -v | 挂载主机上的文件卷到容器内 | +| --rm | 容器退出后是否自动删除,不能跟-d同时使用 | +| -e | 指定容器内的环境变量 | +| -h | 指定容器内的主机名 | +| --name | 指定容器的别名 | +| --cpu-shares | 允许容器使用cpu资源的相对权重,默认一个容器能用满一个核的cpu | +| --cpuset-cpus | 限制容器能使用哪些cpu核心 | +| -m | 限制容器内使用的内存,单位可以是b、k、m、g | + +``` +docker create -it --name mycontainer mycentos bash +docker start mycontainer +``` + +#### 2.2 docker run + +除了创建容器后通过start命令来启动也可以通过docker run直接新建并启动容器。 + +- 启动一个容器 + +```bash +[root@docker-server ~]# docker run -it centos:latest bash +[root@4abaf8a399fe /]# +``` + +- 显示正在运行的容器 + +```bash +[root@docker-server ~]# docker ps +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +4abaf8a399fe centos:latest "bash" 47 seconds ago Up 46 seconds hardcore_perlman +``` + +- 显示所有容器,包括停止的所有容器 + +```bash +[root@docker-server ~]# docker ps +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +[root@docker-server ~]# docker ps -a +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +4abaf8a399fe centos:latest "bash" 2 minutes ago Exited (0) 9 seconds ago hardcore_perlman +``` + +#### 2.3 端口映射 + +- 前台启动随机映射端口 + +```bash +[root@docker-server ~]# docker pull nginx +[root@docker-server ~]# docker run -P nginx +# 随机映射端口,其实是从32768开始映射 +[root@docker-server ~]# ss -tanl +State Recv-Q Send-Q Local Address:Port Peer Address:Port +LISTEN 0 128 *:22 *:* +LISTEN 0 100 127.0.0.1:25 *:* +LISTEN 0 128 *:49153 *:* +LISTEN 0 128 :::22 :::* +LISTEN 0 100 ::1:25 :::* +LISTEN 0 128 :::49153 :::* +``` + +![image-20210609140116589](03.Docker容器管理/image-20210609140116589.png) + +- 指定端口映射 + +```bash +# 方式1,本地端口80映射到容器80端口 +[root@docker-server ~]# docker run -p 80:80 --name nginx-1 nginx:latest +# 方式2,本地ip:本地端口:容器端口 +[root@docker-server ~]# docker run -p 192.168.204.135:80:80 --name nginx-1 nginx:latest +# 方式3,本地ip:本地随机端口:容器端口 +[root@docker-server ~]# docker run -p 192.168.175.10::80 --name nginx-1 nginx:latest +# 方式4,本地ip:本地端口:容器端口/协议默认为tcp协议 +[root@docker-server ~]# docker run -p 192.168.175.10:80:80/tcp --name nginx-1 nginx:latest + +``` + +- 查看容器已经映射的端口 + +```bash +[root@docker-server ~]# docker port nginx-1 +80/tcp -> 0.0.0.0:80 +80/tcp -> :::80 +``` + +#### 2.4 后台启动容器 + +- 当容器前台启动时,前台进程退出容器也就退出,更多时候需要容器在后台启动 + +```bash +[root@docker-server ~]# docker run -d -P --name nginx-2 nginx +c75333168c0dad9094d94828c33998294f2809ae8c5b60881707d9cc33ea4893 +``` + +- 传递运行命令 + +容器需要由一个前台运行的进程才能保持容器的运行,通过传递运行参数是一种方式,另外也可以在构建镜像的时候指定容器启动时运行的前台命令 + +```bash +[root@docker-server ~]# docker ps -a +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +[root@docker-server ~]# docker run -d centos +9ef312d30f7a396ecb5c93b7b70e70a742f333bbe01e9112d6f22fc52aeb71b8 +[root@docker-server ~]# docker ps +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +[root@docker-server ~]# docker ps -a +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +9ef312d30f7a centos "/bin/bash" 12 seconds ago Exited (0) 11 seconds ago upbeat_noether +[root@docker-server ~]# docker run -d centos tail -f /etc/hosts +7b0700c01f9516f49e70ad92e7256d965e0fe4eb8ccc7b30676a03c1d8046c64 +[root@docker-server ~]# docker ps +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +7b0700c01f95 centos "tail -f /etc/hosts" 3 seconds ago Up 2 seconds charming_brahmagupta +``` + +- 单次运行,容器退出后自动删除 + +```bash +[root@docker-server ~]# docker run --name hello_world_test --rm hello-world + +Hello from Docker! +This message shows that your installation appears to be working correctly. + +To generate this message, Docker took the following steps: + 1. The Docker client contacted the Docker daemon. + 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. + (amd64) + 3. The Docker daemon created a new container from that image which runs the + executable that produces the output you are currently reading. + 4. The Docker daemon streamed that output to the Docker client, which sent it + to your terminal. + +To try something more ambitious, you can run an Ubuntu container with: + $ docker run -it ubuntu bash + +Share images, automate workflows, and more with a free Docker ID: + https://hub.docker.com/ + +For more examples and ideas, visit: + https://docs.docker.com/get-started/ + +[root@docker-server ~]# docker ps -a +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +[root@docker-server ~]# +``` + +### 3. 停止容器 + +#### 3.1 暂停容器 + +- 挂起容器 + +```bash +[root@docker-server ~]# docker ps +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +4c6344c46c80 nginx "/docker-entrypoint.…" 8 seconds ago Up 8 seconds 80/tcp wizardly_hofstadter +[root@docker-server ~]# docker pause wizardly_hofstadter +wizardly_hofstadter +[root@docker-server ~]# docker ps +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +4c6344c46c80 nginx "/docker-entrypoint.…" 17 seconds ago Up 16 seconds (Paused) 80/tcp wizardly_hofstadter +``` + +- 取消挂起容器 + +```bash +[root@docker-server ~]# docker unpause wizardly_hofstadter +wizardly_hofstadter +[root@docker-server ~]# docker ps +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +4c6344c46c80 nginx "/docker-entrypoint.…" 33 seconds ago Up 33 seconds 80/tcp wizardly_hofstadter +``` + +#### 3.2 终止容器 + +```bash +[root@docker-server ~]# docker ps +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +4c6344c46c80 nginx "/docker-entrypoint.…" About a minute ago Up About a minute 80/tcp wizardly_hofstadter + +[root@docker-server ~]# docker stop wizardly_hofstadter +wizardly_hofstadter +[root@docker-server ~]# docker ps -a +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +4c6344c46c80 nginx "/docker-entrypoint.…" 2 minutes ago Exited (0) 5 seconds ago wizardly_hofstadter + +[root@docker-server ~]# docker start wizardly_hofstadter +wizardly_hofstadter +[root@docker-server ~]# docker ps -a +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +4c6344c46c80 nginx "/docker-entrypoint.…" 2 minutes ago Up 2 seconds 80/tcp wizardly_hofstadter +``` + +### 4. 删除容器 + +#### 4.1 docker rm + +- 删除正在运行的容器 + +```bash +[root@docker-server ~]# docker ps +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +dfd5ba20c3c6 centos:latest "bash" 8 seconds ago Up 6 seconds frosty_elbakyan +[root@docker-server ~]# docker rm -f dfd5ba20c3c6 +dfd5ba20c3c6 +``` + +- 批量删除容器 + +```bash +[root@docker-server ~]# docker ps -a +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +8e3cb314c9ad nginx "/docker-entrypoint.…" 4 seconds ago Up 3 seconds 80/tcp pedantic_lovelace +4ab46864c8a3 nginx "/docker-entrypoint.…" 5 seconds ago Up 4 seconds 80/tcp beautiful_spence +26a154528469 nginx "/docker-entrypoint.…" 5 seconds ago Up 5 seconds 80/tcp serene_booth +2ecbf60d817a nginx "/docker-entrypoint.…" 6 seconds ago Up 6 seconds 80/tcp dreamy_bassi +d73faf8c2f7d nginx "/docker-entrypoint.…" 8 seconds ago Up 8 seconds 80/tcp beautiful_solomon +[root@docker-server ~]# docker ps -a -q +8e3cb314c9ad +4ab46864c8a3 +26a154528469 +2ecbf60d817a +d73faf8c2f7d +[root@docker-server ~]# docker rm -f `docker ps -a -q` +8e3cb314c9ad +4ab46864c8a3 +26a154528469 +2ecbf60d817a +d73faf8c2f7d +[root@docker-server ~]# docker ps -a +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +``` + +### 5. 进入容器 + +#### 5.1 attach + +所有使用此方式进入容器的操作都是同步显示的且exit容器将被关闭,且使用exit退出后容器关闭,不推荐使用 + +![image-20210609143957975](03.Docker容器管理/image-20210609143957975.png) + +当有一个容器执行exit退出后会导致容器退出 + +#### 5.2 exec + +执行单次命令与进入容器,退出容器后容器还在运行 + +```bash +[root@docker-server ~]# docker run -d -it centos +129d518869d550e579bcff38608bae38209923dcbfab49c823d5e1473d38214a +[root@docker-server ~]# docker ps +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +129d518869d5 centos "/bin/bash" 2 seconds ago Up 1 second jovial_haibt +[root@docker-server ~]# docker exec -it jovial_haibt /bin/bash +[root@129d518869d5 /]# echo hello +hello +[root@129d518869d5 /]# exit +exit +[root@docker-server ~]# docker ps +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +129d518869d5 centos "/bin/bash" 46 seconds ago Up 45 seconds jovial_haibt +``` + +``` +在Docker中,docker exec命令用于在正在运行的容器中执行命令。docker exec命令的一般语法如下: + +docker exec [OPTIONS] CONTAINER COMMAND [ARG...] +其中,参数的含义如下: + +OPTIONS:可选参数,用于指定一些附加选项。常用的选项包括: + +-i, --interactive:保持标准输入(stdin)打开,允许用户与命令交互。 +-t, --tty:分配一个伪终端(pseudo-TTY),以便于命令的交互和输出格式化。 +-u, --user:指定执行命令的用户或用户组。 +-d, --detach:在后台运行命令。 +-e, --env:设置环境变量。 +-w, --workdir:指定命令执行的工作目录。 +等等。 +CONTAINER:必需参数,指定要执行命令的容器名称或容器ID。 + +COMMAND:必需参数,指定要在容器中执行的命令。 + +ARG:可选参数,传递给命令的参数 +``` + +#### 5.3 nsenter + +nsenter命令需要通过pid进入到容器内部,不过可以使用docker inspect获取到容器的pid + +- 可以通过docker inspect获取到某个容器的进程id + +```bash +[root@docker-server ~]# docker inspect -f ".State.Pid" 129d518869d5 # .State.Pid 两边需要加上两个花括号 +7949 +``` + +- 通过nsenter进入到容器内部 + +```bash +[root@docker-server ~]# nsenter -t 7949 -m -u -i -n -p +[root@129d518869d5 /]# +``` + +- 使用脚本方式进入 + +```bash +[root@docker-server ~]# cat docker_in.sh +#!/bin/bash +docker_in(){ +DOCKER_ID=$1 +PID=`docker inspect -f ".State.Pid" ${DOCKER_ID}` +nsenter -t ${PID} -m -u -i -n -p +} + +docker_in $1 +[root@docker-server ~]# chmod +x docker_in.sh +[root@docker-server ~]# ./docker_in.sh 129d518869d5 +[root@129d518869d5 /]# exit +logout +[root@docker-server ~]# docker ps +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +129d518869d5 centos "/bin/bash" 14 minutes ago Up 14 minutes jovial_haibt +[root@docker-server ~]# +``` + +### 6. 指定容器DNS + +dns服务,默认采用dns地址 + +一是通过将dns地址配置在宿主机上 + +二是将参数配置在docker启动脚本里面 + +```bash +[root@docker-server ~]# docker run -it --rm --dns 8.8.8.8 centos bash +[root@a6ce80126e75 /]# cat /etc/resolv.conf +nameserver 8.8.8.8 +[root@a6ce80126e75 /]# ping www.baidu.com -c 1 +PING www.a.shifen.com (180.101.49.11) 56(84) bytes of data. +64 bytes from 180.101.49.11 (180.101.49.11): icmp_seq=1 ttl=127 time=9.35 ms + +--- www.a.shifen.com ping statistics --- +1 packets transmitted, 1 received, 0% packet loss, time 0ms +rtt min/avg/max/mdev = 9.346/9.346/9.346/0.000 ms +[root@a6ce80126e75 /]# exit +exit +``` + +### 7. 导入导出容器 + +#### 7.1 docker export + +导出容器是指,导出一个已经创建的容器到一个文件,不管此时这个容器是否处于运行状态,**导出一个容器快照** + +```bash +[root@docker-server ~]# docker run -d -it centos +43f2397b9456d27a3b84dba0d79ae9a1dd8dddf40440d7d73fca71cddea0e10d +[root@docker-server ~]# docker ps +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +43f2397b9456 centos "/bin/bash" 2 seconds ago Up 2 seconds awesome_rubin +[root@docker-server ~]# docker export -o /opt/centos.tar 43f +[root@docker-server ~]# ll /opt/centos.tar +-rw------- 1 root root 216525312 6月 9 13:28 /opt/centos.tar +``` + +#### 7.2 docker import + +导出的文件可以使用docker import命令导入变成镜像,**导入一个容器快照到本地镜像库** + +```bash +[root@docker-server ~]# docker import /opt/centos.tar mycentos:v1 +sha256:acf250a6cabb56e0464102dabedb0a562f933facd3cd7b387e665459da46bf29 +[root@docker-server ~]# docker images +REPOSITORY TAG IMAGE ID CREATED SIZE +mycentos v1 acf250a6cabb 9 seconds ago 209MB +nginx latest d1a364dc548d 2 weeks ago 133MB +hello-world latest d1165f221234 3 months ago 13.3kB +centos latest 300e315adb2f 6 months ago 209MB +``` + +适用场景:主要用来制作基础镜像,比如从一个ubuntu镜像启动一个容器,然后安装一些软件和进行一些设置后,使用docker export保存为一个基础镜像。然后把这个镜像分发给其他人使用,作为基础的开发环境。(因为export导出的镜像只会保留从镜像运行到export之间对文件系统的修改,所以只适合做基础镜像) \ No newline at end of file diff --git a/00.基础阶段/02.Linux基础/15.Docker/03.Docker容器管理/image-20210609140116589.png b/00.基础阶段/02.Linux基础/15.Docker/03.Docker容器管理/image-20210609140116589.png new file mode 100644 index 0000000..26c557c Binary files /dev/null and b/00.基础阶段/02.Linux基础/15.Docker/03.Docker容器管理/image-20210609140116589.png differ diff --git a/00.基础阶段/02.Linux基础/15.Docker/03.Docker容器管理/image-20210609143957975.png b/00.基础阶段/02.Linux基础/15.Docker/03.Docker容器管理/image-20210609143957975.png new file mode 100644 index 0000000..c269435 Binary files /dev/null and b/00.基础阶段/02.Linux基础/15.Docker/03.Docker容器管理/image-20210609143957975.png differ diff --git a/00.基础阶段/02.Linux基础/15.Docker/04.Docker镜像制作.md b/00.基础阶段/02.Linux基础/15.Docker/04.Docker镜像制作.md new file mode 100644 index 0000000..e93d941 --- /dev/null +++ b/00.基础阶段/02.Linux基础/15.Docker/04.Docker镜像制作.md @@ -0,0 +1,469 @@ +# 04.Docker镜像制作 + +## 04.Docker镜像制作 + +### 1. Docker镜像制作 + +### 2. 基于rocky手动构建nginx镜像 + +Docker镜像制作类似于虚拟机的模板制作,即按照公司的实际业务将需要安装的软件、相关配置等基础环境配置完成,然后将容器再提交为模板,最后再批量从模板批量创建新的虚拟机,这样可以极大地简化业务中相同环境的虚拟机运行环境的部署工作,Docker的镜像制作分为手动制作可自动制作(基于DockerFile),企业通常都是基于DockerFile制作镜像。 + +#### 2.1 从初始镜像开始构建 + +一、启动一个RockyLinux容器,安装好nginx以及常用软件 + +```bash +[root@localhost ~]# docker run -it -d --name mynginx_server rockylinux:9 bash +18914b0f6005e7b20122508f8bc70a830845711ff6200392bf0a7c76dc4a8a60 +[root@localhost ~]# docker ps +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +18914b0f6005 rockylinux:9 "bash" 3 seconds ago Up 2 seconds mynginx_server +[root@localhost ~]# docker exec -it mynginx_server bash + +# 进入容器以后,安装nginx以及一些常用的软件 +[root@18914b0f6005 /]# yum install -y epel-release nginx +[root@18914b0f6005 /]# yum install vim wget pcre pcre-devel zlib zlib-devel openssl openssl-devel iproute net-tools iotop -y +``` + +二、关闭nginx后台运行 + +```bash +[root@18914b0f6005 /]# vim /etc/nginx/nginx.conf +...... +daemon off; +...... +``` + +三、自定义web界面 + +```bash +[root@18914b0f6005 /]# vim /etc/nginx/nginx.conf +[root@18914b0f6005 /]# echo "

Welcome to Eagle nginx...

" > /usr/share/nginx/html/index.html +``` + +#### 2.2 镜像提交 + +通过commit提交为镜像 + +```bash +[root@localhost ~]# docker commit --help +Usage: docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] + +Create a new image from a container's changes + +Aliases: + docker container commit, docker commit + +Options: + -a, --author string Author (e.g., "John Hannibal Smith + ") + -c, --change list Apply Dockerfile instruction to the created image + -m, --message string Commit message + -p, --pause Pause container during commit (default true) + +# 重新打包为新镜像 +[root@localhost ~]# docker commit -a "Eagle_nls" -m "my nginx image v1" 18914b0f6005 rocky_nginx:v1 +sha256:9411e13b57d003a6d709054ccbbc026a7b005a1727ec470755f987e25ff45a6b +[root@localhost ~]# docker images +REPOSITORY TAG IMAGE ID CREATED SIZE +rocky_nginx v1 9411e13b57d0 33 seconds ago 357MB +mynginx v1 81ef4ae01fed 2 hours ago 190MB +codercom/code-server latest 5d9cf2e7e6bb 10 days ago 718MB +neosmemo/memos latest 8f07b54db502 6 weeks ago 65.9MB +``` + +docker commit**适用场景:**主要作用是将配置好的一些容器复用,再生成新的镜像。 +commit是合并了save、load、export、import这几个特性的一个综合性的命令,它主要做了: +1、将container当前的读写层保存下来,保存成一个新层 +2、和镜像的历史层一起合并成一个新的镜像 + +#### 2.3 从新镜像启动容器 + +从自己的镜像启动容器 + +```bash +[root@localhost ~]# docker run -d -p 80:80 --name mynginx_rocky rocky_nginx:v1 /usr/sbin/nginx +dc4225c68d28ffdcc559662b8680f9e4b4b95bdaeeca2f1ed566d638aa8fc8fe +[root@localhost ~]# docker ps +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +dc4225c68d28 rocky_nginx:v1 "/usr/sbin/nginx" 2 seconds ago Up 1 second 0.0.0.0:80->80/tcp, [::]:80->80/tcp mynginx_rocky +``` + +访问测试: + +![image-20250325185125851](04.Docker镜像制作/image-20250325185125851.png) + +### 3. DockerFile制作镜像 + +Dockerfile 是一种可以被 Docker 程序解释的脚本,它是一个文本文件,包含了一系列指令,用于定义如何构建 Docker 镜像。每一条指令都会创建镜像的一层,最终生成的镜像是由这些层叠加而成的。Dockerfile 中的指令关键字必须大写,执行顺序是从上到下,且每条指令创建一个镜像层。 + +Docker 程序会读取 Dockerfile 并根据指令生成 Docker 镜像。Dockerfile 的指令类似于 Linux 下的命令,但 Docker 程序会将这些 Dockerfile 指令翻译成真正的 Linux 命令来执行。相比手动制作镜像的方式,Dockerfile 能更直观地展示镜像是如何产生的。有了写好的 Dockerfile 文件,当后期某个镜像有额外的需求时,只需在之前的 Dockerfile 中添加或修改相应的操作,即可重新生成新的 Docker 镜像,避免了重复手动制作镜像的麻烦。 + +#### 3.1 指令说明 + +##### 3.1.1 配置指令 + +| 指令 | 说明 | +| :------------ | :--------------------------------- | +| `ARG` | 定义创建镜像过程中使用的变量 | +| `FROM` | 指定所创建镜像的基础镜像 | +| `LABEL` | 为生成的镜像添加元数据标签信息 | +| `EXPOSE` | 声明镜像内服务监听的端口 | +| `ENV` | 指定环境变量 | +| `ENTRYPOINT` | 指定镜像的默认入口命令 | +| `VOLUME` | 创建一个数据卷挂载点 | +| `USER` | 指定运行容器时的用户名或UID | +| `WORKDIR` | 配置工作目录 | +| `ONBUILD` | 创建子镜像时指定自动执行的操作指令 | +| `STOPSIGNAL` | 指定退出的信号值 | +| `HEALTHCHECK` | 配置所启动容器如何进行健康检查 | +| `SHELL` | 指定默认shell类型 | + +##### 3.1.2 操作指令 + +| 指令 | 说明 | +| :----- | :--------------------------- | +| `RUN` | 运行指定命令 | +| `CMD` | 启动容器时指定默认执行的命令 | +| `ADD` | 添加内容到镜像 | +| `COPY` | 复制内容到镜像 | + +#### 3.2 配置指令详解 + +##### 3.2.1 ARG + +定义创建过程中使用到的变量,例如 `HTTP_PROXY`、`HTTPS_PROXY`、`FTP_PROXY`、`NO_PROXY` 等,不区分大小写。 + +##### 3.2.2 FROM + +指定所创建镜像的基础镜像。为了保证镜像精简,可以选用体积较小的 Alpin 或 Debian 作为基础镜像。 + +##### 3.2.3 EXPOSE + +声明镜像内服务监听的端口。例如: + +```bash +EXPOSE 22 80 8443 +``` + +该指令只是起到声明作用,并不会自动完成端口映射。 + +##### 3.2.4 ENTRYPOINT + +指定镜像的默认入口命令,该入口命令会在启动容器时作为根命令执行,所有传入值作为该命令的参数。支持两种格式: + +- `ENTRYPOINT ["executable","param1","param2"]`(exec 调用执行) +- `ENTRYPOINT command param1 param2`(在 shell 中执行) + +此时 `CMD` 指令指定值将作为根命令的参数。每个 Dockerfile 中只能有一个 `ENTRYPOINT`,当指定多个时只有最后一个起效。 + +##### 3.2.5 VOLUME + +创建一个数据卷挂载点。例如: + +```bash +VOLUME ["/data"] +``` + +##### 3.2.6 WORKDIR + +为后续的 `RUN`、`CMD`、`ENTRYPOINT` 指令配置工作目录。例如: + +```bash +WORKDIR /path/to/workdir +``` + +可以使用多个 `WORKDIR` 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。例如: + +```bash +WORKDIR /a +WORKDIR b +WORKDIR c +RUN pwd +``` + +最终路径为 `/a/b/c`。因此,为了避免出错,推荐在 `WORKDIR` 指令中只使用绝对路径。 + +##### 3.2.7 操作指令详解 + +##### 3.2.8 RUN + +运行指定Linux命令。每条 `RUN` 指令将在当前镜像基础上执行指定命令,并提交为新的镜像层。当命令较长时可以使用 `\` 来换行。 + +##### 3.2.9 CMD + +`CMD` 指令用来指定启动容器时默认执行的命令。支持三种格式: + +- `CMD ["executable","param1","param2"]`(相当于执行 `executable param1 param2`) +- `CMD command param1 param2`(在默认的 shell 中执行,提供给需要交互的应用) +- `CMD ["param1","param2"]`(提供给 `ENTRYPOINT` 的默认参数) + +每个 Dockerfile 只能有一条 `CMD` 命令。如果指定了多条命令,只有最后一条会被执行。 + +##### 3.2.10 ADD + +添加内容到镜像。例如: + +```bash +ADD +``` + +该命令将复制指定的 `src` 路径下内容到容器中的 `dest` 路径下。`src` 可以是 Dockerfile 所在目录的一个相对路径,也可以是一个 URL,还可以是一个 tar 文件。`dest` 可以是镜像内绝对路径,或者相对于工作目录的相对路径。 + +##### 3.2.11 COPY + +复制内容到镜像。例如: + +```bash +COPY +``` + +`COPY` 与 `ADD` 指令功能类似,当使用本地目录为源目录时,推荐使用 `COPY`。 + +#### 3.3 制作nginx镜像 + +DockerFile可以说是一种可以被Docker程序解释的脚本,DockerFIle是由一条条的命令组成的,每条命令对应Linux下面的一条命令,Docker程序将这些DockerFile指令再翻译成真正的Linux命令,其有自己的书写方式和支持的命令,Docker程序读取DockerFile并根据指令生成Docker镜像。 + +##### 3.3.1 基于编译安装制作nginx小游戏网站 + +###### 3.3.1.1 环境准备 + +一、下载镜像 + +```bash +[root@localhost ~]# docker pull rockylinux:9 +``` + +二、创建所需文件存放的目录环境 + +```bash +[root@localhost ~]# mkdir -pv dockerfile/nginx +mkdir: created directory 'dockerfile' +mkdir: created directory 'dockerfile/nginx' +``` + +三、进入到指定目录中 + +```bash +[root@localhost ~]# cd dockerfile/nginx/ +[root@localhost nginx]# pwd +/root/dockerfile/nginx +``` + +四、下载nginx和小游戏网页的源码包 + +```bash +[root@localhost nginx]# wget http://nginx.org/download/nginx-1.22.0.tar.gz +[root@localhost nginx]# wget http://file.eagleslab.com:8889/%E8%AF%BE%E7%A8%8B%E7%9B%B8%E5%85%B3%E8%BD%AF%E4%BB%B6/%E4%BA%91%E8%AE%A1%E7%AE%97%E8%AF%BE%E7%A8%8B/%E8%AF%BE%E7%A8%8B%E7%9B%B8%E5%85%B3%E6%96%87%E4%BB%B6/games.tar.gz +[root@localhost nginx]# ll +total 125100 +-rw-r--r--. 1 root root 127022187 Jan 18 2022 games.tar.gz +-rw-r--r--. 1 root root 1073322 May 24 2022 nginx-1.22.0.tar.gz +``` + +###### 3.3.1.2 编写Dockerfile + +一、编写DockerFile + +```bash +[root@docker-server nginx]# vim Dockerfile +# 第一行先定义基础镜像,后面的本地有效的镜像名,如果本地没有,会从远程仓库下载 +FROM rockylinux:9 + +# 镜像作者的信息 +MAINTAINER Eagle_nls 2898485992@qq.com + +# 接下来在基础镜像之上构建nginx等所需环境 + +# 1. 编译安装nginx +# 1.1 安装所需环境及工具 +RUN yum install -y vim wget unzip tree lrzsz gcc gcc-c++ automake pcre pcre-devel zlib zlib-devel openssl openssl-devel iproute net-tools iotop + +# 1.2 上传nginx的官方源码包到指定目录 +ADD nginx-1.22.0.tar.gz /usr/local/src/ + +# 1.3 由于ADD会直接解压好,所以直接编译nginx +RUN cd /usr/local/src/nginx-1.22.0 \ +&& ./configure --prefix=/usr/local/nginx --with-http_sub_module \ +&& make \ +&& make install \ +&& cd /usr/local/nginx + +# 如果有配置文件,可以上传自己准备好的配置文件 +# ADD nginx.conf /usr/local/nginx/conf/nginx.conf + +# 2. 完善网站 +RUN useradd -s /sbin/nologin nginx \ +&& ln -sv /usr/local/nginx/sbin/nginx /usr/sbin/nginx + +# 3. 上传小游戏网页源码 +ADD games.tar.gz /usr/local/nginx/html/ + +# 4. 声明端口号 +EXPOSE 80 443 + +# 5. 设定启动时执行命令 +CMD ["nginx", "-g", "daemon off;"] +``` + +###### 3.3.1.3 构建镜像 + +一、通过docker build来构建镜像 + +```bash +[root@localhost nginx]# docker build -t nginx_games:v1 . +[root@localhost nginx]# docker images |grep nginx_games +nginx_games v1 9c86d96dfba0 4 minutes ago 686MB +``` + +二、镜像运行测试 + +```bash +[root@localhost nginx]# docker run -d -it -p 80:80 --name nginx_games nginx_games:v1 +e3c415425f95b3deac80ecb772d1de2a89e18a611c2ecc603f3c0b175bbea335 +[root@localhost nginx]# docker ps +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +e3c415425f95 nginx_games:v1 "nginx -g 'daemon of…" 3 seconds ago Up 2 seconds 0.0.0.0:80->80/tcp, [::]:80->80/tcp, 443/tcp nginx_games +``` + +三、访问测试 + +![image-20250325195752895](04.Docker镜像制作/image-20250325195752895.png) + +### 4. 镜像上传 + +#### 4.1 官方docker仓库 + +- 准备账户 + +登陆到docker hub官网创建账号,登陆后点击settings完善信息 + +- 填写账户基本信息 + +![image-20220920090601269](04.Docker镜像制作/image-20220920090601269.png) + +- 登陆仓库 + +```bash +[root@docker-server ~]# docker login docker.io +Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one. +Username: smqy +Password: +WARNING! Your password will be stored unencrypted in /root/.docker/config.json. +Configure a credential helper to remove this warning. See +https://docs.docker.com/engine/reference/commandline/login/#credentials-store + +Login Succeeded +[root@docker-server ~]# ls -a +. .bash_history .bashrc dockerfile .tcshrc +.. .bash_logout .cshrc docker_in.sh .viminfo +anaconda-ks.cfg .bash_profile .docker .pki +[root@docker-server ~]# cat .docker/config.json +{ + "auths": { + "https://index.docker.io/v1/": { + "auth": "YmJqMTAzMDp6aGFuZ2ppZTEyMw==" + } + } +}[root@docker-server ~]# + +``` + +- 给镜像tag标签并上传 + +```bash +[root@docker-server ~]# docker tag nginx:v1 docker.io/smqy/nginx:v1 +[root@docker-server ~]# docker images +REPOSITORY TAG IMAGE ID CREATED SIZE +nginx v1 fbd06c1753c0 12 minutes ago 581MB +smqy/nginx v1 fbd06c1753c0 12 minutes ago 581MB +centos_nginx v1 74acdcca8c97 21 hours ago 525MB +nginx latest 2b7d6430f78d 3 weeks ago 142MB +centos 7 eeb6ee3f44bd 12 months ago 204MB +nginx 1.8 0d493297b409 6 years ago 133MB +[root@docker-server ~]# docker push docker.io/smqy/nginx:v1 +The push refers to repository [docker.io/smqy/nginx] +4f86a3bf507f: Pushed +0d11c01ff3ef: Pushed +45fc5772a4e4: Pushed +174f56854903: Mounted from library/centos +v1: digest: sha256:385bfe364839b645f1b2aa70a1d779b0dca50256ea01ccbe4ebde53aabd1d96d size: 1164 +``` + +- 到docker官网进行验证 + +![image-20220920091110123](04.Docker镜像制作/image-20220920091110123.png) + +- 更换到其他docker服务器下载镜像 + +```bash +[root@docker-server ~]# docker login docker.io +``` + +#### 4.2 阿里云仓库 + +将本地镜像上传至阿里云,实现镜像备份与统一分发的功能 + +https://cr.console.aliyun.com/ + +注册并且登录阿里云镜像仓库,创建namespace空间,创建一个普通的镜像仓库 + +![image-20250325201301197](04.Docker镜像制作/image-20250325201301197.png) + +具体如何拉取镜像,上传镜像,可以查看阿里云仓库下方提供的操作指南 + +##### 4.2.1 Push镜像案例 + +一、登录阿里云仓库 + +```bash +[root@localhost nginx]# docker login --username=Echooool registry.cn-hangzhou.aliyuncs.com + +i Info → A Personal Access Token (PAT) can be used instead. + To create a PAT, visit https://app.docker.com/settings + + +Password: +Error response from daemon: Get "https://registry.cn-hangzhou.aliyuncs.com/v2/": unauthorized: authentication required +[root@localhost nginx]# docker login --username=Echooool registry.cn-hangzhou.aliyuncs.com + +i Info → A Personal Access Token (PAT) can be used instead. + To create a PAT, visit https://app.docker.com/settings + + +Password: + +WARNING! Your credentials are stored unencrypted in '/root/.docker/config.json'. +Configure a credential helper to remove this warning. See +https://docs.docker.com/go/credential-store/ + +Login Succeeded +``` + +二、推送镜像 + +```bash +# 先给要推送的镜像打上标签 +[root@localhost nginx]# docker tag 9c86d96dfba0 registry.cn-hangzhou.aliyuncs.com/atopos/docker_hub:nginx_games-v1 + +# 推送镜像 +docker push registry.cn-hangzhou.aliyuncs.com/atopos/docker_hub:nginx_games-v1 +``` + +三、阿里云查看 + +![image-20250325202050140](04.Docker镜像制作/image-20250325202050140.png) + +四、拉取镜像 + +```bash +[root@localhost nginx]# docker pull registry.cn-hangzhou.aliyuncs.com/atopos/docker_hub:nginx_games-v1 +nginx_games-v1: Pulling from atopos/docker_hub +446f83f14b23: Already exists +d9262d5a1401: Already exists +7330c5b74c49: Already exists +55e1c23f0b49: Already exists +5de772a29709: Already exists +f4819c5e7596: Already exists +Digest: sha256:f9a6ac50b9771c524017304847f3d8b2ffa4acbe01cef9279052272e50a9a3f3 +``` \ No newline at end of file diff --git a/00.基础阶段/02.Linux基础/15.Docker/04.Docker镜像制作/image-20220920090601269.png b/00.基础阶段/02.Linux基础/15.Docker/04.Docker镜像制作/image-20220920090601269.png new file mode 100644 index 0000000..3ebf20c Binary files /dev/null and b/00.基础阶段/02.Linux基础/15.Docker/04.Docker镜像制作/image-20220920090601269.png differ diff --git a/00.基础阶段/02.Linux基础/15.Docker/04.Docker镜像制作/image-20220920091110123.png b/00.基础阶段/02.Linux基础/15.Docker/04.Docker镜像制作/image-20220920091110123.png new file mode 100644 index 0000000..5eb63fe Binary files /dev/null and b/00.基础阶段/02.Linux基础/15.Docker/04.Docker镜像制作/image-20220920091110123.png differ diff --git a/00.基础阶段/02.Linux基础/15.Docker/04.Docker镜像制作/image-20250325185125851.png b/00.基础阶段/02.Linux基础/15.Docker/04.Docker镜像制作/image-20250325185125851.png new file mode 100644 index 0000000..13c791c Binary files /dev/null and b/00.基础阶段/02.Linux基础/15.Docker/04.Docker镜像制作/image-20250325185125851.png differ diff --git a/00.基础阶段/02.Linux基础/15.Docker/04.Docker镜像制作/image-20250325195752895.png b/00.基础阶段/02.Linux基础/15.Docker/04.Docker镜像制作/image-20250325195752895.png new file mode 100644 index 0000000..d4c8c92 Binary files /dev/null and b/00.基础阶段/02.Linux基础/15.Docker/04.Docker镜像制作/image-20250325195752895.png differ diff --git a/00.基础阶段/02.Linux基础/15.Docker/04.Docker镜像制作/image-20250325201301197.png b/00.基础阶段/02.Linux基础/15.Docker/04.Docker镜像制作/image-20250325201301197.png new file mode 100644 index 0000000..e01a100 Binary files /dev/null and b/00.基础阶段/02.Linux基础/15.Docker/04.Docker镜像制作/image-20250325201301197.png differ diff --git a/00.基础阶段/02.Linux基础/15.Docker/04.Docker镜像制作/image-20250325202050140.png b/00.基础阶段/02.Linux基础/15.Docker/04.Docker镜像制作/image-20250325202050140.png new file mode 100644 index 0000000..4f6dccf Binary files /dev/null and b/00.基础阶段/02.Linux基础/15.Docker/04.Docker镜像制作/image-20250325202050140.png differ diff --git a/00.基础阶段/02.Linux基础/15.Docker/05.Docker数据管理.md b/00.基础阶段/02.Linux基础/15.Docker/05.Docker数据管理.md new file mode 100644 index 0000000..b26a350 --- /dev/null +++ b/00.基础阶段/02.Linux基础/15.Docker/05.Docker数据管理.md @@ -0,0 +1,314 @@ +# 05.Docker数据管理 + +## 05.Docker数据管理 + +### 1. Docker数据管理 + +### 2. 数据管理 + +#### 2.1 UnionFS(联合文件系统) + +Docker 中的 UnionFS(联合文件系统)是一种分层、轻量级且高性能的文件系统,其核心功能是将多个目录内容联合挂载到同一个目录下,形成一个统一的文件系统视图。以下是其主要特点和作用: + +##### 2.1.1 核心特点 + +- **分层存储**:UnionFS 可以将不同层次的文件和目录合并成单一的目录树。在 Docker 中,每一层可以代表一个镜像层,最低层通常是只读的基础镜像层,上面的层是可写的容器层。 +- **写时复制(Copy-on-Write, CoW)**:当容器需要修改一个文件时,UnionFS 不会直接更改底层只读镜像中的文件,而是将更改写入到一个可写的上层。这样,原始镜像层保持不变,可以被多个容器共享。 +- **隔离性**:由于底层的只读镜像层保持不变,每个容器看到的是一个完整的文件系统视图,包括它们的改动,但这些改动仅存在于它们自己的可写层中。 +- **性能优化**:UnionFS 通过仅对发生更改的文件进行操作,以及通过页面缓存共享等机制,减少了磁盘 I/O 操作,加快了容器启动时间。 + +##### 2.1.2 在 Docker 中的应用 + +- **镜像分层**:Docker 镜像是由多个只读层叠加而成的,每一层都代表了镜像构建过程中的一个状态。UnionFS 将这些层联合起来,形成一个完整的文件系统。 +- **容器运行时的文件系统**:当启动一个容器时,Docker 会在镜像的最顶层添加一个新的可写层。容器的所有写操作都在这个可写层中进行,而不会影响到镜像的只读层。 +- **镜像继承与共享**:由于镜像的分层结构,新的镜像可以基于已有的镜像构建,只需添加新的层即可。同时,多个容器可以共享同一个镜像的只读层,极大地节省了磁盘空间。 + +##### 2.1.3 常见的 UnionFS 实现 + +虽然 UnionFS 是一个理念,但 Linux 内核中有多种具体的实现方式,Docker 默认使用的是 Overlay2。Overlay2 是一种先进的联合文件系统实现,具有更好的性能和一些先进的功能,如页面缓存共享。 + +#### 2.2 镜像层与可写层 + +在 Docker 中,镜像层和容器可写层是基于联合文件系统(UnionFS)实现的关键概念。它们共同构成了容器的文件系统结构,使得 Docker 能够高效地管理和运行容器。以下是对镜像层和容器可写层的详细解释: + +##### 2.2.1 一、镜像层 + +镜像层是 Docker 镜像的组成部分,每个镜像由多个只读层组成,这些层是不可修改的。 + +1. **镜像层的生成** + + - 当你构建一个 Docker 镜像时,Dockerfile 中的每一条指令(如 `RUN`、`COPY`、`ADD` 等)都会生成一个新的镜像层。 + + - 例如,一个简单的 Dockerfile 如下: + + ```dockerfile + FROM ubuntu:20.04 + RUN apt-get update && apt-get install -y nginx + COPY ./my_nginx.conf /etc/nginx/nginx.conf + ``` + + - 第一层是基础镜像层,如 `ubuntu:20.04`,这是从 Docker Hub 拉取的预构建镜像。 + - 第二层是通过 `RUN` 指令安装 Nginx 生成的层,包含了安装过程中产生的所有文件和目录变化。 + - 第三层是通过 `COPY` 指令将本地的 `my_nginx.conf` 文件复制到镜像中的 `/etc/nginx/nginx.conf` 位置生成的层。 + + - 每一层都是基于前一层构建的,新的层只包含与前一层的差异部分。 + +2. **镜像层的特点** + + - **只读性**:镜像层是只读的,一旦创建就不能修改。如果需要修改镜像层中的内容,必须通过构建新的镜像层来实现。 + - **共享性**:多个容器可以共享同一个镜像层,因为镜像层是不可变的,这大大节省了磁盘空间。 + - **不可变性**:镜像层的不可变性保证了镜像的一致性和可重复性,无论在什么环境下运行,基于同一镜像启动的容器都具有相同的文件系统结构。 + +3. **镜像层的作用** + + - **构建高效**:通过分层构建,Docker 可以缓存中间层,避免重复构建相同的操作。例如,如果基础镜像层和安装 Nginx 的层已经构建过,再次构建时可以直接使用缓存的层,而不是重新执行命令。 + - **节省空间**:多个容器可以共享镜像层,减少了磁盘空间的占用。例如,10 个基于同一个基础镜像的容器,只需要存储一份基础镜像层,而不是每份都单独存储。 + - **便于分发**:镜像层的结构使得镜像可以方便地分发和共享。用户可以从 Docker Hub 等镜像仓库拉取镜像,而无需关心镜像的具体构建过程。 + +##### 2.2.2 二、容器可写层 + +容器可写层是容器运行时特有的一个层,它是可写的,用于存储容器运行时产生的所有变更。 + +1. **容器可写层的生成** + - 当你启动一个容器时,Docker 会在镜像的最顶层添加一个新的可写层。这个可写层是容器独有的,用于存储容器运行时的文件系统变更。 + - 例如,如果你在容器中创建了一个新文件、修改了一个现有文件或删除了一个文件,这些操作都会反映在容器可写层中,而不会影响到镜像层。 +2. **容器可写层的特点** + - **可写性**:容器可写层是可写的,容器运行时的所有文件系统操作(如创建、修改、删除文件)都在这个层中进行。 + - **独立性**:每个容器都有自己的可写层,容器之间的可写层是隔离的。一个容器的变更不会影响到其他容器。 + - **临时性**:容器可写层的内容在容器被删除时也会被删除。如果需要持久化数据,需要将数据存储在外部存储(如卷)中。 +3. **容器可写层的作用** + - **隔离性**:容器可写层保证了容器之间的隔离性。每个容器在自己的可写层中进行操作,不会影响到其他容器或镜像层。 + - **灵活性**:容器可写层允许容器在运行时动态地修改文件系统,而不会影响到镜像的原始状态。这使得容器可以灵活地运行各种应用程序。 + - **数据持久化**:虽然容器可写层的内容在容器删除时会被删除,但你可以通过挂载卷(Volumes)将数据持久化到宿主机或其他存储设备中,从而实现数据的持久化存储。 + +##### 2.2.3 三、镜像层与容器可写层的关系 + +镜像层和容器可写层通过联合文件系统(UnionFS)联合起来,形成了容器的完整文件系统视图。 + +1. **联合挂载** + - Docker 使用联合文件系统将镜像层和容器可写层联合挂载到同一个目录下。从容器的角度来看,它看到的是一个完整的文件系统,包含了镜像层和容器可写层的内容。 + - 例如,当你在容器中访问一个文件时,Docker 会先在容器可写层中查找该文件。如果找不到,就会在镜像层中查找。如果在镜像层中找到了文件,就会将该文件的内容返回给容器。 +2. **写时复制(Copy-on-Write)** + - 当容器需要修改一个文件时,Docker 会使用写时复制机制。具体来说,Docker 会将文件从镜像层复制到容器可写层,然后在可写层中进行修改。这样,镜像层保持不变,而容器可写层存储了修改后的文件。 + - 例如,假设镜像层中有一个文件 `/etc/nginx/nginx.conf`,容器需要修改这个文件。Docker 会将该文件从镜像层复制到容器可写层,然后在可写层中进行修改。从容器的角度来看,它看到的是修改后的文件,而镜像层中的文件保持不变。 +3. **删除操作** + - 当容器删除一个文件时,Docker 会在容器可写层中记录一个删除操作,而不是真正删除镜像层中的文件。这样,镜像层保持不变,而容器可写层记录了文件的删除状态。 + - 例如,假设容器删除了一个文件 `/etc/nginx/nginx.conf`,Docker 会在容器可写层中记录一个删除标记。从容器的角度来看,该文件已经被删除,而镜像层中的文件仍然存在。 + +##### 2.2.4 总结 + +- **镜像层**:是 Docker 镜像的组成部分,是只读的、不可变的,多个容器可以共享镜像层。镜像层通过分层构建,提高了构建效率、节省了磁盘空间,并保证了镜像的一致性和可重复性。 +- **容器可写层**:是容器运行时的可写层,用于存储容器运行时的文件系统变更。容器可写层是独立的、可写的、临时的,保证了容器之间的隔离性和运行时的灵活性。 +- **联合文件系统(UnionFS)**:将镜像层和容器可写层联合挂载,形成了容器的完整文件系统视图。通过写时复制机制,Docker 在不影响镜像层的情况下,允许容器在可写层中进行文件系统操作。 + +#### 2.3 查看镜像的详细信息 + +##### 2.3.1 一、查看镜像数据信息 + +```bash +[root@localhost nginx]# docker inspect nginx_games:v1 +"Architecture": "amd64", + "Os": "linux", + "Size": 685997316, + "GraphDriver": { + "Data": { + "LowerDir": "/var/lib/docker/overlay2/ilm8ifbi2gcrqg156w7kbu22f/diff:/var/lib/docker/overlay2/u51fr5eul9csiwghxmnm1acsi/diff:/var/lib/docker/overlay2/lo6sgoxbliga9l2qqqxcu2tvp/diff:/var/lib/docker/overlay2/bi4orr0yujicfufabnw7u8tym/diff:/var/lib/docker/overlay2/e51d5c1c74a99e1b1e41980bb9270fcba562976e40ae7dbf65ff585689a783d2/diff", + "MergedDir": "/var/lib/docker/overlay2/talgtlohecyw3kt8d8idpzw4g/merged", + "UpperDir": "/var/lib/docker/overlay2/talgtlohecyw3kt8d8idpzw4g/diff", + "WorkDir": "/var/lib/docker/overlay2/talgtlohecyw3kt8d8idpzw4g/work" + +LoweDir:image镜像层本身(只读) +UpperDir:容器的上层读写层 +MergeDir:容器的文件系统,使用Union FS(联合文件系统)将镜像层和容器层合并给容器使用 +WorkDir:容器在宿主机的工作目录 +``` + +##### 2.3.2 二、查看镜像层构建过程 + +```bash +[root@localhost nginx]# docker history nginx_games:v1 +IMAGE CREATED CREATED BY SIZE COMMENT +9c86d96dfba0 25 hours ago CMD ["nginx" "-g" "daemon off;"] 0B buildkit.dockerfile.v0 + 25 hours ago EXPOSE map[443/tcp:{} 80/tcp:{}] 0B buildkit.dockerfile.v0 + 25 hours ago ADD games.tar.gz /usr/local/nginx/html/ # bu… 164MB buildkit.dockerfile.v0 + 25 hours ago RUN /bin/sh -c useradd -s /sbin/nologin ngin… 297kB buildkit.dockerfile.v0 + 25 hours ago RUN /bin/sh -c cd /usr/local/src/nginx-1.22.… 16.6MB buildkit.dockerfile.v0 + 25 hours ago ADD nginx-1.22.0.tar.gz /usr/local/src/ # bu… 6.46MB buildkit.dockerfile.v0 + 25 hours ago RUN /bin/sh -c yum install -y vim wget unzip… 323MB buildkit.dockerfile.v0 + 25 hours ago MAINTAINER Eagle_nls 2898485992@qq.com 0B buildkit.dockerfile.v0 + 16 months ago CMD ["/bin/bash"] 0B buildkit.dockerfile.v0 + 16 months ago ADD layer.tar.xz / # buildkit 176MB buildkit.dockerfile.v0 +``` + +如果想要缩小所构建镜像的大小,我们可以尝试少创建镜像层,在一层中多做一些事情,尽可能减少**RUN命令** + +### 3. 数据卷 + +#### 3.1 什么是数据卷? + +数据卷实际上就是宿主机上的目录或者是文件,可以被直接mount到容器当中使用。 + +实际生产环境中,需要针对不同类型的服务、不同类型的数据存储要求做相应的规划,最终保证服务的可扩展性、稳定性以及数据的安全性。 + +![img](05.Docker数据管理/u=1718952600,4159508250&fm=26&fmt=auto&gp=0.jpg) + +#### 3.2 数据卷案例 + +- 创建目录并准备页面 + +```bash +[root@docker-server1 ~]# mkdir -p /data/web +[root@docker-server1 ~]# echo 'eaglslab nginx test!' > /data/web/index.html +[root@docker-server1 ~]# cat /data/web/index.html +eaglslab nginx test +``` + +- 启动两个容器并验证数据 + +```bash +[root@docker-server1 ~]# docker run -d -it --name web1 -v /data/web/:/usr/share/nginx/html/ -p 8080:80 nginx +588c494dc9098e0a43e15bce3162c34676dd981609edc32d46bf4beb59b9cf19 +[root@docker-server1 ~]# docker run -d -it --name web2 -v /data/web/:/usr/share/nginx/html/ -p 8081:80 nginx +ff6b3731a9ba3e0f91d2c8d89bb6573eb5e5a9b840163bc1122a9e5678d108b7 +[root@docker-server1 ~]# curl 192.168.175.10:8080 +eaglslab nginx test! +[root@docker-server1 ~]# curl 192.168.175.10:8081 +eaglslab nginx test! +[root@docker-server1 ~]# echo 'hello world!' > /data/web/index.html +[root@docker-server1 ~]# curl 192.168.175.10:8080 +hello world! +[root@docker-server1 ~]# curl 192.168.175.10:8081 +hello world! +``` + +- 进入到容器内测试写入数据 + +```bash +[root@docker-server1 ~]# docker exec -it web1 bash +root@588c494dc909:/# echo 'docker test!' > /usr/share/nginx/html/index.html +[root@docker-server1 ~]# curl 192.168.175.10:8080 +docker test! +[root@docker-server1 ~]# curl 192.168.175.10:8081 +docker test! +``` + +- 尝试只读挂载 + +```bash +# 删除容器的时候不会删除宿主机的目录 +[root@docker-server1 ~]# docker rm -fv web1 +web1 +[root@docker-server1 ~]# docker rm -fv web2 +web2 +[root@docker-server1 ~]# cat /data/web/index.html +docker test! +# 通过只读方式挂载以后,在容器内部是不允许修改数据的 +[root@docker-server1 ~]# docker run -d -it --name web1 -v /data/web/:/usr/share/nginx/html/:ro -p 8080:80 nginx +a395b27958ca0cdcf52a86bd17813dcbcda4ed774895adcc99e85fc114ab84ff +[root@docker-server1 ~]# docker exec -it web1 bash +root@a395b27958ca:/# echo 123 > /usr/share/nginx/html/index.html +bash: /usr/share/nginx/html/index.html: Read-only file system + +``` + +- 文件挂载 + +```bash +[root@docker-server1 ~]# docker run -d -it --name web2 -v /data/web/index.html:/usr/share/nginx/html/index.html:ro -p 8081:80 nginx +4b34c957372d314cdb0f85d7e2c65b095615adfe3051ae6b4266b7bacd50f374 +[root@docker-server1 ~]# curl 192.168.175.10:8081 +docker test! +``` + +#### 3.3 数据卷特点 + +1. 数据卷是宿主机的目录或者文件,并且可以在**多个容器之间共同使用** +2. 在宿主机对数据卷更改数据后会在所有容器里面会**立即更新** +3. 数据卷的数据可以**持久保存**,即使删除使用该数据卷卷的容器也不影响 +4. 在容器里面写入数据不会影响到镜像本身(**隔离性**)。 +5. 需要挂载多个目录或者文件的时候可以使用多个-v参数指定 +6. 数据卷使用场景包括日志输出、静态web页面、应用配置文件、多容器间目录或文件共享 + +#### 3.4 数据卷容器 + +##### 3.4.1 什么是数据卷容器 + +数据卷容器是一个普通的容器,专门用于提供数据卷供其他容器挂载。它允许用户创建一个专门用于数据存储的容器,并将其数据卷挂载到其他容器中。数据卷容器的主要用途是将数据卷的生命周期与应用容器分离,使数据可以在容器之间共享和持久化。 + +##### 3.4.2 数据卷容器的用途 + +1. **数据持久化**:数据卷容器可以确保数据即使在容器被删除后也不会丢失。例如,对于数据库应用,数据卷容器可以持久化数据库文件,避免因容器删除而导致数据丢失。 +2. **数据共享**:多个容器可以通过挂载同一个数据卷容器来共享数据。这在多容器应用中非常有用,例如在微服务架构中,多个服务容器可以共享数据库数据。 +3. **备份与恢复**:数据卷容器可以用于备份和恢复数据。通过将数据卷容器中的数据卷备份到宿主机或其他存储设备,可以在需要时恢复数据。 +4. **迁移数据**:数据卷容器可以方便地迁移数据。通过将数据卷容器中的数据卷迁移到其他主机,可以快速实现数据的迁移。 + +##### 3.4.3 数据卷容器与本地数据挂载的区别 + +| 特性 | 数据卷容器 | 本地数据挂载 | +| :--------------------- | :----------------------------------------------------------- | :----------------------------------------------------------- | +| **目录来源** | Docker 自动创建的目录 | 宿主机上已存在的目录 | +| **适用场景** | 数据持久化、容器间共享数据 | 开发调试、快速文件同步 | +| **容器间共享** | 支持 | 不支持 | +| **宿主机文件系统依赖** | 无依赖 | 依赖宿主机文件系统 | +| **数据持久化** | 数据卷的生命周期独立于容器,即使容器被删除,数据卷仍然存在 | 如果容器被删除,挂载的目录和文件仍然存在,但需要手动管理 | +| **数据初始化** | 如果宿主机没有对应的文件,数据卷容器会自动将容器运行所需的文件复制到数据卷中 | 如果宿主机没有对应的文件,容器可能会因缺少运行所需的文件而出错 | +| **数据覆盖** | 数据卷中的数据会覆盖容器内的数据 | 容器内的数据会覆盖宿主机上的数据 | + +##### 3.4.4 实例演示 + +- 先启动一个卷容器Server + +```bash +[root@docker-server1 ~]# docker run -d --name nginx-web -v /data/web/:/usr/share/nginx/html/:ro -p 8081:80 nginx +``` + +- 启动两个客户端容器 + +```bash +[root@docker-server1 ~]# docker run -d --name web1 -p 8082:80 --volumes-from nginx-web nginx:latest +ac22faa405ec07c065042465cd7f9d456be891effdd5d13d9571b96ef9c550f7 +[root@docker-server1 ~]# docker run -d --name web2 -p 8083:80 --volumes-from nginx-web nginx:latest +e084845475b01dedfdae7362f6fbece7b5ab57ff6289c8c9bf08251f5ba448ed +``` + +- 访问测试 + +```bash +[root@docker-server1 ~]# curl 192.168.175.10:8081 +docker test! +[root@docker-server1 ~]# curl 192.168.175.10:8082 +docker test! +[root@docker-server1 ~]# curl 192.168.175.10:8083 +docker test! +``` + +- 停止卷容器可以创建新容器 + +```bash +[root@docker-server1 ~]# docker stop nginx-web +nginx-web +[root@docker-server1 ~]# docker run -d -it --name web3 -p 8084:80 --volumes-from nginx-web nginx:latest +6ebd95c132ee1a9e4b43d1849efc628ca7185187a59d70b3816ff16dd47b6e8e +[root@docker-server1 ~]# curl 192.168.175.10:8084 +docker test! +``` + +- 删除卷容器之后不可以再创建新容器 + +```bash +[root@docker-server1 ~]# docker rm -fv nginx-web +nginx-web +[root@docker-server1 ~]# docker run -d -it --name web4 -p 8085:80 --volumes-from nginx-web nginx:latest +docker: Error response from daemon: No such container: nginx-web. +See 'docker run --help'. +# 但是之前已经创建好的容器不会有任何影响 +[root@docker-server1 ~]# curl 192.168.175.10:8082 +docker test! +``` + +##### 3.4.5 总结 + +在当前环境下,即使把提供卷的容器Server删除,已经运行的容器Client依然可以使用挂载的卷,因为容器是通过挂载的方式访问数据的,但是无法创建新的卷容器客户端,但是再把卷容器Server创建后即可正常创建卷容器client,此方式可以用于线上共享数据目录等环境,因为即使数据卷容器被删除了,其他已经运行的容器依然可以挂载使用 + +数据卷容器可以作为共享的方式为其他容器提供文件共享,可以在容器生成中启动一个实例挂载本地的目录,然后其他的容器分别挂载此容器的目录,即可保证各个容器之间的数据一致性。 + diff --git a/00.基础阶段/02.Linux基础/15.Docker/05.Docker数据管理/u=1718952600,4159508250&fm=26&fmt=auto&gp=0.jpg b/00.基础阶段/02.Linux基础/15.Docker/05.Docker数据管理/u=1718952600,4159508250&fm=26&fmt=auto&gp=0.jpg new file mode 100644 index 0000000..5f84108 Binary files /dev/null and b/00.基础阶段/02.Linux基础/15.Docker/05.Docker数据管理/u=1718952600,4159508250&fm=26&fmt=auto&gp=0.jpg differ diff --git a/00.基础阶段/02.Linux基础/15.Docker/06.Docker网络管理.md b/00.基础阶段/02.Linux基础/15.Docker/06.Docker网络管理.md new file mode 100644 index 0000000..35e0517 --- /dev/null +++ b/00.基础阶段/02.Linux基础/15.Docker/06.Docker网络管理.md @@ -0,0 +1,363 @@ +# 06.Docker网络管理 + +## 06.Docker网络管理 + +### 1. 容器之间的互联 + +在同一个宿主机上的容器之间可以通过端口映射的方式,经过宿主机中转进行互相访问,也可以通过docker0网桥互相访问 + +#### 1.1 直接互联 + +- 启动两个容器 + +```bash +[root@localhost ~]# docker run -d -it nginx +[root@localhost ~]# docker run -d -it nginx +``` + +- 安装相关工具包 + +```bash +root@855ab8d0bd74:/# apt update +root@855ab8d0bd74:/# apt install net-tools -y +root@855ab8d0bd74:/# apt install iputils-ping -y +root@855ab8d0bd74:/# apt install procps -y + +``` + +- 检测网络连通性 + +```bash +root@855ab8d0bd74:/# ping 172.17.0.3 -c 2 +PING 172.17.0.3 (172.17.0.3) 56(84) bytes of data. +64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.052 ms +64 bytes from 172.17.0.3: icmp_seq=2 ttl=64 time=0.081 ms + +--- 172.17.0.3 ping statistics --- +2 packets transmitted, 2 received, 0% packet loss, time 1ms +rtt min/avg/max/mdev = 0.052/0.066/0.081/0.016 ms +``` + +#### 1.2 使用名称互联 + +- 启动两个容器 + +```bash +[root@localhost ~]# docker run -d -it --name web1 nginx:1.8 +[root@localhost ~]# docker run -d -it --name web2 --link web1 nginx:1.8 +``` + +- 查看web2容器的hosts文件,发现已经实现名称解析 + +```bash +[root@localhost ~]# docker exec -it web2 bash +root@8a3e9cee9e37:/# cat /etc/hosts +127.0.0.1 localhost +::1 localhost ip6-localhost ip6-loopback +fe00::0 ip6-localnet +ff00::0 ip6-mcastprefix +ff02::1 ip6-allnodes +ff02::2 ip6-allrouters +172.17.0.2 web1 622eff54876f +172.17.0.3 8a3e9cee9e37 +``` + +- 连通性测试 + +```bash +root@8a3e9cee9e37:/# ping web1 -c 2 +PING web1 (172.17.0.2) 56(84) bytes of data. +64 bytes from web1 (172.17.0.2): icmp_seq=1 ttl=64 time=0.068 ms +64 bytes from web1 (172.17.0.2): icmp_seq=2 ttl=64 time=0.045 ms + +--- web1 ping statistics --- +2 packets transmitted, 2 received, 0% packet loss, time 1ms +rtt min/avg/max/mdev = 0.045/0.056/0.068/0.013 ms +``` + +#### 1.3 使用别名互联 + +自定义的容器名称可能后期会发生变化,那么一旦发生变化也会带来一些影响,这个时候如果每次都更改名称又比较麻烦,这个时候可以使用定义别名的方式解决,即容器名称可以随意更改,只要不更改别名即可。 + +- 启动一个容器 + +```bash +[root@localhost ~]# docker run -d -it --name web3 --link web1:nginx-web1 nginx:1.8 +``` + +- 查看容器web3的hosts文件 + +```bash +[root@localhost ~]# docker exec -it web3 bash +root@c85c73ebf00b:/# cat /etc/hosts +127.0.0.1 localhost +::1 localhost ip6-localhost ip6-loopback +fe00::0 ip6-localnet +ff00::0 ip6-mcastprefix +ff02::1 ip6-allnodes +ff02::2 ip6-allrouters +172.17.0.2 nginx-web1 622eff54876f web1 +172.17.0.4 c85c73ebf00b +``` + +- 连通性测试 + +```bash +root@c85c73ebf00b:/# ping nginx-web1 -c2 +PING nginx-web1 (172.17.0.2) 56(84) bytes of data. +64 bytes from nginx-web1 (172.17.0.2): icmp_seq=1 ttl=64 time=0.112 ms +64 bytes from nginx-web1 (172.17.0.2): icmp_seq=2 ttl=64 time=0.055 ms + +--- nginx-web1 ping statistics --- +2 packets transmitted, 2 received, 0% packet loss, time 2ms +rtt min/avg/max/mdev = 0.055/0.083/0.112/0.029 ms + +``` + +### 2. Docker网络 + +#### 2.1 四类网络模式 + +| Docker网络模式 | 配置 | 说明 | +| -------------- | ------------------------- | ------------------------------------------------------------ | +| host模式 | –net=host | 容器和宿主机共享Network namespace。 | +| container模式 | –net=container:NAME_or_ID | 容器和另外一个容器共享Network namespace。 kubernetes中的pod就是多个容器共享一个Network namespace。 | +| none模式 | –net=none | 容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配veth pair 和网桥连接,配置IP等。 | +| bridge模式 | –net=bridge | (默认为该模式) | + +Docker服务安装完成之后,默认在每个宿主机会生成一个名称为docker0的网卡,其ip地址都是172.17.0.1/16,并且会生成三种不同类型的网络 + +```bash +[root@localhost ~]# ifconfig +docker0: flags=4099 mtu 1500 + inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255 + ether 02:42:14:75:bf:4c txqueuelen 0 (Ethernet) + RX packets 0 bytes 0 (0.0 B) + RX errors 0 dropped 0 overruns 0 frame 0 + TX packets 0 bytes 0 (0.0 B) + TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 + +ens33: flags=4163 mtu 1500 + inet 192.168.80.10 netmask 255.255.255.0 broadcast 192.168.80.255 + inet6 fe80::eaf3:dc40:2bf:6da2 prefixlen 64 scopeid 0x20 + ether 00:0c:29:f4:79:06 txqueuelen 1000 (Ethernet) + RX packets 13079 bytes 18637594 (17.7 MiB) + RX errors 0 dropped 0 overruns 0 frame 0 + TX packets 1747 bytes 124995 (122.0 KiB) + TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 + +lo: flags=73 mtu 65536 + inet 127.0.0.1 netmask 255.0.0.0 + inet6 ::1 prefixlen 128 scopeid 0x10 + loop txqueuelen 1 (Local Loopback) + RX packets 72 bytes 5776 (5.6 KiB) + RX errors 0 dropped 0 overruns 0 frame 0 + TX packets 72 bytes 5776 (5.6 KiB) + TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 + +[root@localhost ~]# docker network list +NETWORK ID NAME DRIVER SCOPE +787342a0d883 bridge bridge local +9a6d7244e807 host host local +beace8354cca none null local +``` + +在启动容器的时候可以使用--network参数去指定网络类型,默认使用的是bridge网络类型 + +#### 2.2 none网络类型 + +在使用none模式后,docker容器**不会进行任何网络配置**,其没有网卡、没有ip也没有路由,因此默认无法与外界进行通信,需要手动添加网卡配置ip等,所以**极少使用** + ![img](06.Docker网络管理/13618762-3fd41778faebcef5.png) + +```bash +[root@localhost ~]# docker run -d -it --name web4 --network none nginx:1.8 +``` + +#### 2.3 container网络类型 + +这个模式指定新创建的容器和**已经存在的一个容器共享**一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡(环回接口)设备通信。 + +![img](06.Docker网络管理/13618762-790a69a562a5b358.png) + +```bash +[root@localhost ~]# docker run -d -it --name web5 --network container:web1 nginx +83db4f9af6f3d9d42bbd57691fcf82ef06cbf1a5874750effa314a4ec242aaaa +``` + + + +#### 2.4 host网络类型 + +如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是**使用宿主机的IP和端口。** + +使用host模式的容器可以直接使用宿主机的IP地址与外界通信**,容器内部的服务端口也可以使用宿主机的端口**,不需要进行NAT,host最大的优势就是**网络性能比较好**,但是docker host上已经使用的端口就不能再用了,**网络的隔离性不好。** + +![img](06.Docker网络管理/13618762-a892da42b8ff9342.png) + +```bash +[root@localhost ~]# docker run -d -it --name web7 --network host nginx +e90cb3bfc1a3fbd187319ac3b995b116feb37422534b03662d624680e35eb2bb +[root@localhost ~]# docker exec -it web7 bash +root@localhost:/# ifconfig +docker0: flags=4163 mtu 1500 + inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255 + inet6 fe80::42:14ff:fe75:bf4c prefixlen 64 scopeid 0x20 + ether 02:42:14:75:bf:4c txqueuelen 0 (Ethernet) + RX packets 9647 bytes 394222 (384.9 KiB) + RX errors 0 dropped 0 overruns 0 frame 0 + TX packets 10932 bytes 43303360 (41.2 MiB) + TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 + +ens33: flags=4163 mtu 1500 + inet 192.168.175.10 netmask 255.255.255.0 broadcast 192.168.175.255 + inet6 fe80::eaf3:dc40:2bf:6da2 prefixlen 64 scopeid 0x20 + ether 00:0c:29:f4:79:06 txqueuelen 1000 (Ethernet) + RX packets 60855 bytes 81177548 (77.4 MiB) + RX errors 0 dropped 0 overruns 0 frame 0 + TX packets 17770 bytes 1472014 (1.4 MiB) + TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 + +lo: flags=73 mtu 65536 + inet 127.0.0.1 netmask 255.0.0.0 + inet6 ::1 prefixlen 128 scopeid 0x10 + loop txqueuelen 1 (Local Loopback) + RX packets 72 bytes 5776 (5.6 KiB) + RX errors 0 dropped 0 overruns 0 frame 0 + TX packets 72 bytes 5776 (5.6 KiB) + TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 +``` + + + +#### 2.5 bridge网络类型(默认) + +当Docker进程启动时,会在主机上创建一个名为**docker0的虚拟网桥**,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。 + +从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备,Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中。可以通过brctl show命令查看。 + +bridge模式是docker的**默认网络模式**,不写--network参数,就是bridge模式。**使用docker run -p时,docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL查看。** + +![img](06.Docker网络管理/13618762-f1643a51d313a889.png) + + + +### 3. 创建自定义网络 + +可以基于docker命令创建自定义网络,自定义网络可以自定义ip地址范围和网关等信息。 + +- 创建一个网络 + +```bash +[root@localhost ~]# docker network create -d bridge --subnet 10.10.0.0/16 --gateway 10.10.0.1 eagleslab-net +74ee6ecdfc0382ac0abb1b46a3c90e3c6a39f0b7388aa9ba99fddc6bac72e8ce +[root@localhost ~]# docker network list +NETWORK ID NAME DRIVER SCOPE +787342a0d883 bridge bridge local +74ee6ecdfc03 eagleslab-net bridge local +9a6d7244e807 host host local +beace8354cca none null local +``` + +- 使用自定义网络创建容器 + +```bash +[root@localhost ~]# docker run -d -it --name web8 --network eagleslab-net nginx +``` + +- 检查网络 + +```bash +[root@localhost ~]# docker exec -it web8 bash +root@a7edddb4114e:/# ifconfig +eth0: flags=4163 mtu 1500 + inet 10.10.0.2 netmask 255.255.0.0 broadcast 10.10.255.255 + ether 02:42:0a:0a:00:02 txqueuelen 0 (Ethernet) + RX packets 1064 bytes 8764484 (8.3 MiB) + RX errors 0 dropped 0 overruns 0 frame 0 + TX packets 738 bytes 41361 (40.3 KiB) + TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 +root@a7edddb4114e:/# ping www.baidu.com -c2 +PING www.a.shifen.com (112.34.112.83) 56(84) bytes of data. +64 bytes from 112.34.112.83 (112.34.112.83): icmp_seq=1 ttl=127 time=37.8 ms +64 bytes from 112.34.112.83 (112.34.112.83): icmp_seq=2 ttl=127 time=36.9 ms + +--- www.a.shifen.com ping statistics --- +2 packets transmitted, 2 received, 0% packet loss, time 3ms +rtt min/avg/max/mdev = 36.865/37.320/37.776/0.494 ms + +``` + +- iptables会生成nat的相应规则 + +```bash +[root@localhost ~]# iptables -t nat -vnL +Chain PREROUTING (policy ACCEPT 12 packets, 759 bytes) + pkts bytes target prot opt in out source destination + 2 136 DOCKER all -- * * 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL + +Chain INPUT (policy ACCEPT 0 packets, 0 bytes) + pkts bytes target prot opt in out source destination + +Chain OUTPUT (policy ACCEPT 1 packets, 76 bytes) + pkts bytes target prot opt in out source destination + 0 0 DOCKER all -- * * 0.0.0.0/0 !127.0.0.0/8 ADDRTYPE match dst-type LOCAL + +Chain POSTROUTING (policy ACCEPT 1 packets, 76 bytes) + pkts bytes target prot opt in out source destination + 12 759 MASQUERADE all -- * !br-74ee6ecdfc03 10.10.0.0/16 0.0.0.0/0 + 32 1940 MASQUERADE all -- * !docker0 172.17.0.0/16 0.0.0.0/0 + +Chain DOCKER (2 references) + pkts bytes target prot opt in out source destination + 0 0 RETURN all -- br-74ee6ecdfc03 * 0.0.0.0/0 0.0.0.0/0 + 1 84 RETURN all -- docker0 * 0.0.0.0/0 0.0.0.0/0 +``` + +### 4. Docker一键搭建typecho博客 + +镜像选择:**80x86/typecho:latest** + +一、部署容器 + +```bash +[root@localhost ~]# docker run -d \ +--name=typecho \ +--restart always \ +-e PHP_TZ=Asia/Shanghai \ +-e PHP_MAX_EXECUTION_TIME=600 \ +-p 80:80 80x86/typecho:latest + +[root@localhost ~]# ss -nlt +State Recv-Q Send-Q Local Address:Port Peer Address:Port Process +LISTEN 0 4096 0.0.0.0:80 0.0.0.0:* +LISTEN 0 128 0.0.0.0:22 0.0.0.0:* +LISTEN 0 4096 [::]:80 [::]:* +LISTEN 0 128 [::]:22 [::]:* +``` + +二、浏览器访问初始化博客 + +![image-20250326222721074](06.Docker网络管理/image-20250326222721074.png) + +三、完善信息,数据库选择内置的SQL Lite方便一点 + +![image-20250326222739407](06.Docker网络管理/image-20250326222739407.png) + +四、安装完成 + +![image-20250326222830605](06.Docker网络管理/image-20250326222830605.png) + +五、更改主题,默认带了几个主题 + +![image-20250326222916277](06.Docker网络管理/image-20250326222916277-1750402570103-1070.png) + + + + + + + + + + + diff --git a/00.基础阶段/02.Linux基础/15.Docker/06.Docker网络管理/13618762-3fd41778faebcef5.png b/00.基础阶段/02.Linux基础/15.Docker/06.Docker网络管理/13618762-3fd41778faebcef5.png new file mode 100644 index 0000000..cd7b123 Binary files /dev/null and b/00.基础阶段/02.Linux基础/15.Docker/06.Docker网络管理/13618762-3fd41778faebcef5.png differ diff --git a/00.基础阶段/02.Linux基础/15.Docker/06.Docker网络管理/13618762-790a69a562a5b358.png b/00.基础阶段/02.Linux基础/15.Docker/06.Docker网络管理/13618762-790a69a562a5b358.png new file mode 100644 index 0000000..ee37bef Binary files /dev/null and b/00.基础阶段/02.Linux基础/15.Docker/06.Docker网络管理/13618762-790a69a562a5b358.png differ diff --git a/00.基础阶段/02.Linux基础/15.Docker/06.Docker网络管理/13618762-a892da42b8ff9342.png b/00.基础阶段/02.Linux基础/15.Docker/06.Docker网络管理/13618762-a892da42b8ff9342.png new file mode 100644 index 0000000..8e94baf Binary files /dev/null and b/00.基础阶段/02.Linux基础/15.Docker/06.Docker网络管理/13618762-a892da42b8ff9342.png differ diff --git a/00.基础阶段/02.Linux基础/15.Docker/06.Docker网络管理/13618762-f1643a51d313a889.png b/00.基础阶段/02.Linux基础/15.Docker/06.Docker网络管理/13618762-f1643a51d313a889.png new file mode 100644 index 0000000..cdf064d Binary files /dev/null and b/00.基础阶段/02.Linux基础/15.Docker/06.Docker网络管理/13618762-f1643a51d313a889.png differ diff --git a/00.基础阶段/02.Linux基础/15.Docker/06.Docker网络管理/image-20250326222721074.png b/00.基础阶段/02.Linux基础/15.Docker/06.Docker网络管理/image-20250326222721074.png new file mode 100644 index 0000000..8a6f57d Binary files /dev/null and b/00.基础阶段/02.Linux基础/15.Docker/06.Docker网络管理/image-20250326222721074.png differ diff --git a/00.基础阶段/02.Linux基础/15.Docker/06.Docker网络管理/image-20250326222739407.png b/00.基础阶段/02.Linux基础/15.Docker/06.Docker网络管理/image-20250326222739407.png new file mode 100644 index 0000000..5f10506 Binary files /dev/null and b/00.基础阶段/02.Linux基础/15.Docker/06.Docker网络管理/image-20250326222739407.png differ diff --git a/00.基础阶段/02.Linux基础/15.Docker/06.Docker网络管理/image-20250326222830605.png b/00.基础阶段/02.Linux基础/15.Docker/06.Docker网络管理/image-20250326222830605.png new file mode 100644 index 0000000..cb159b2 Binary files /dev/null and b/00.基础阶段/02.Linux基础/15.Docker/06.Docker网络管理/image-20250326222830605.png differ diff --git a/00.基础阶段/02.Linux基础/15.Docker/06.Docker网络管理/image-20250326222916277-1750402570103-1070.png b/00.基础阶段/02.Linux基础/15.Docker/06.Docker网络管理/image-20250326222916277-1750402570103-1070.png new file mode 100644 index 0000000..88aadee Binary files /dev/null and b/00.基础阶段/02.Linux基础/15.Docker/06.Docker网络管理/image-20250326222916277-1750402570103-1070.png differ diff --git a/00.基础阶段/02.Linux基础/15.Docker/07.Docker资源限制.md b/00.基础阶段/02.Linux基础/15.Docker/07.Docker资源限制.md new file mode 100644 index 0000000..fa62226 --- /dev/null +++ b/00.基础阶段/02.Linux基础/15.Docker/07.Docker资源限制.md @@ -0,0 +1,332 @@ +# 07.Docker资源限制 + +## 07.Docker资源限制 + +### 1. Docker 容器资源限制与 OOM 异常处理 + +#### 1.1 容器资源限制 + +默认情况下,容器没有资源限制,可以使用主机内核调度程序允许的尽可能多的给定资源。Docker 提供了控制容器可以使用多少内存或者 CPU 的方法,通过设置 `docker run` 命令的运行时配置标志来实现。 + +其中一些功能要求宿主机的内核支持 Linux 功能。要检查支持情况,可以使用 `docker info` 命令。如果内核中禁用了某项功能,可能会在输出结尾处看到警告。 + +#### 1.2 OOM 异常 + +对于 Linux 主机,如果没有足够的内存来执行其他重要的系统任务,将会抛出 OOM 异常(内存溢出、内存泄漏、内存异常)。随后系统会开始杀死进程以释放内存,凡是运行在宿主机上的进程都有可能被 kill,包括 `dockerd` 和其他的应用程序。如果重要的系统进程被 kill,会导致和该进程相关的服务全部宕机。 + +产生 OOM 异常时,`dockerd` 会尝试通过调整 Docker 守护程序上的 OOM 优先级来减轻这些风险,以便它比系统上的其他进程更不可能被杀死。但是,容器的 OOM 优先级未调整时,单个容器被杀死的可能性更大(不推荐调整容器的优先级这种方式)。 + +#### 1.3 Linux 进程 OOM 评分机制 + +Linux 会为每个进程计算一个分数,最终它会将分数最高的进程 kill 掉。相关文件说明如下: + +- `/proc/PID/oom_score_adj` + - 范围为 -1000 到 1000。 + - 值越高越容易被宿主机 kill 掉。 + - 如果将该值设置为 -1000,则进程永远不会被宿主机 kernel kill。 +- `/proc/PID/oom_adj` + - 范围为 -17 到 +15。 + - 取值越高越容易被干掉。 + - 如果是 -17,则表示不能被 kill。 + - 该设置参数的存在是为了和旧版本的 Linux 内核兼容。 +- `/proc/PID/oom_score` + - 这个值是系统综合进程的内存消耗量、CPU 时间(`utime + stime`)、存活时间(`uptime - start time`)和 `oom_adj` 计算出的进程得分。 + - 消耗内存越多得分越高,越容易被宿主机 kernel 强制杀死。 + +### 2. 容器的内存限制 + +Docker可以强制执行**硬性内存限制**,即只允许容器使用给定的内存大小 + +Docker也可以执行**非硬性内存限制**,即容器可以使用尽可能多的内存,除非内核检测到主机上的内存不够用了 + +#### 2.1 内存限制参数 + +##### 2.1.1 `-m` 或 `--memory` + +- **功能**:限制容器最大可用内存。 + +- **最小值**:4m。 + +- **示例**: + + ```bash + docker run -m 512m my_image + ``` + +##### 2.1.2 `--memory-swap` + +- **功能**:限制容器可用的内存 + swap 总量。 + +- **前提**:需先设置 `--memory`。 + +- **特殊值**:`-1` 表示不限制 swap 使用。 + +- **示例**: + + ```bash + docker run --memory 256m --memory-swap 512m my_image + ``` + +##### 2.1.3 `--memory-swappiness` + +- **功能**:控制容器使用 swap 的倾向性。 + +- **范围**:0(尽量不使用 swap)到 100(尽量使用 swap)。 + +- **示例**: + + ```bash + docker run --memory-swappiness 30 my_image + ``` + +##### 2.1.4 `--kernel-memory` + +- **功能**:限制容器使用的内核内存。 + +- **最小值**:4m。 + +- **注意事项**:不推荐设置,可能影响宿主机和其他容器。 + +- **示例**: + + ```bash + docker run --kernel-memory 64m my_image + ``` + +##### 2.1.5 `--memory-reservation` + +- **功能**:设置软内存限制,低于 `--memory`。 + +- **激活条件**:主机内存争用或不足时生效。 + +- **注意事项**:必须小于 `--memory`,且不保证容器一定不超过此限制。 + +- **示例**: + + ```bash + docker run --memory 1g --memory-reservation 512m my_image + ``` + +##### 2.1.6 `--oom-kill-disable` + +- **功能**:禁止 OOM 时杀死容器内进程。 + +- **前提**:必须与 `--memory` 一起使用。 + +- **注意事项**:若未设置 `--memory`,OOM 时仍可能杀死进程。 + +- **示例**: + + ```bash + docker run --memory 512m --oom-kill-disable my_image + ``` + +#### 2.2 内从限制案例 + +如果一个容器未作内存使用限制,则该容器可以利用到系统内存最大空间,默认创建的容器没有做内存资源限制 + +一、拉取容器压测工具镜像 + +```bash +[root@localhost ~]# docker pull tylersmith22/docker-stress-ng +[root@localhost ~]# docker run -it --rm tylersmith22/docker-stress-ng -help +``` + +二、使用压测工具开启两个工作进程,每个工作进程最大允许使用内存256M,且宿主机不限制当前容器的最大内存 + +```bash +[root@localhost nginx]# docker run -it --rm --name test1 tylersmith22/docker-stress-ng --vm 2 --vm-bytes 256m +stress-ng: info: [1] defaulting to a 86400 second run per stressor +stress-ng: info: [1] dispatching hogs: 2 vm + +# 新建窗口查看 +[root@localhost ~]# docker stats +CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS +3ca32774fc20 test1 185.16% 514.3MiB / 1.781GiB 28.21% 648B / 0B 0B / 0B 5 + +# 可以看到容器的内存占用大概为256的两倍,因为两个进程 +``` + +三、宿主机限制最大内存使用 + +```bash +[root@localhost nginx]# docker run -it --rm -m 256m --name test2 tylersmith22/docker-stress-ng --vm 2 --vm-bytes 256m +stress-ng: info: [1] defaulting to a 86400 second run per stressor +stress-ng: info: [1] dispatching hogs: 2 vm + +# 新建窗口查看 +[root@localhost ~]# docker stats +CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS +d612ce9b0776 test2 0.00% 255.9MiB / 256MiB 99.97% 1.02kB / 126B 4.83GB / 36.8GB 5 +``` + +#### 2.3 **内存软限制** + +软限制不会真正限制到内存的使用 + +```bash +[root@localhost ~]# docker run -it --rm -m 256m --memory-reservation 128m --name test1 tylersmith22/docker-stress-ng --vm 2 --vm-bytes 256m +[root@localhost ~]# docker stats +CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS +0ffb4b8fdbde test1 174.52% 255.9MiB / 256MiB 99.95% 648B / 0B 5.33GB / 18.1GB 5 +``` + +**交换分区限制** + +```bash +[root@localhost ~]# docker run -it --rm -m 256m --memory-swap 512m --name test1 tylersmith22/docker-stress-ng --vm 2 --vm-bytes 256m +``` + +### 3. 容器的CPU限制 + +一个宿主机,有几十个核心的cpu,但是宿主机上可以同时运行成百上千个不同的进程用以处理不同的任务,多进程共用一个cpu的核心依赖计数就是为可压缩资源,即一个核心cpu可以通过调度而运行多个进程,但是在同一个单位时间内只能由一个进程在cpu上运行,那么这么多的进程怎么在cpu上执行和调度的呢?(进程优先级) + +默认情况下,每个容器对主机cpu周期的访问权限是不受限制的,但是我们可以人为干扰 + +#### 3.1 CPU限制参数 + +##### 3.1.1 `--cpus` + +- **功能**:指定容器可以使用的 CPU 资源数量。 + +- **示例**:主机有 2 个 CPU,设置 `--cpus=1.5`,容器最多可使用 1.5 个 CPU。 + +- **示例命令**: + + ```bash + docker run --cpus 1.5 my_image + ``` + +##### 3.1.2 `--cpu-period` 和 `--cpu-quota` + +- **功能**:设置 CPU 调度周期和配额。 + +- **关系**:必须一起使用,计算方式为 `cpu-quota / cpu-period`。 + +- **示例**: + + ```bash + docker run --cpu-period 100000 --cpu-quota 50000 my_image + ``` + +##### 3.1.3 `--cpuset-cpus` + +- **功能**:指定容器运行的 CPU 编号(绑核)。 + +- **示例**:限制容器在 CPU 0 和 CPU 1 上运行。 + +- **示例命令**: + + ```bash + docker run --cpuset-cpus 0,1 my_image + ``` + +##### 3.1.4 `--cpuset-mems` + +- **功能**:设置容器使用的内存节点(仅对 NUMA 架构有效)。 + +- **示例**:限制容器使用内存节点 0。 + +- **示例命令**: + + ```bash + docker run --cpuset-mems 0 my_image + ``` + +##### 3.1.5 `--cpu-shares` + +- **功能**:设置容器的 CPU 时间片权重。 + +- **默认值**:1024。 + +- **范围**:最小 2,最大 262144。 + +- **示例**:容器 A 设置为 1024,容器 B 设置为 2048,容器 B 的 CPU 时间片是容器 A 的两倍。 + +- **示例命令**: + + ```bash + docker run --cpu-shares 2048 my_image + ``` + +#### 3.2 CPU限制案例 + +##### 3.2.1 **未限制容器cpu** + +- 启动1个进程,占用4核cpu,未限制容器会把cpu全部占完 + +```bash +# 查看我们宿主机的cup数量 +[root@localhost ~]# top +top - 21:32:49 up 43 min, 2 users, load average: 3.54, 1.82, 0.80 +Tasks: 186 total, 1 running, 185 sleeping, 0 stopped, 0 zombie +%Cpu0 : 0.0 us, 0.0 sy, 0.0 ni, 99.5 id, 0.0 wa, 0.5 hi, 0.0 si, 0.0 st +%Cpu1 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st +%Cpu2 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st +%Cpu3 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st + +[root@localhost ~]# docker run -it --rm --name test1 tylersmith22/docker-stress-ng --vm 1 --cpu 4 +stress-ng: info: [1] defaulting to a 86400 second run per stressor +stress-ng: info: [1] dispatching hogs: 4 cpu, 1 vm + +# 新建窗口查看 +[root@localhost ~]# docker stats +CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS +c6a795e4c09f test1 396.78% 282.6MiB / 1.703GiB 16.21% 876B / 126B 0B / 0B 7 + +# 可以看出CPU的使用率大概是400% 因为我们是4个核心,单个核心跑满是100% +``` + +##### 3.2.2 **限制容器cpu** + +```bash +[root@localhost ~]# docker run -it --rm --cpus 2 --name test1 tylersmith22/docker-stress-ng --vm 1 --cpu 4 +stress-ng: info: [1] defaulting to a 86400 second run per stressor +stress-ng: info: [1] dispatching hogs: 4 cpu, 1 vm + +[root@localhost ~]# docker stats +CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS +5b7dcb36d738 test1 200.65% 279.7MiB / 1.703GiB 16.04% 876B / 126B 0B / 0B 7 + +[root@localhost ~]# top +top - 21:36:15 up 47 min, 3 users, load average: 1.38, 1.92, 1.05 +Tasks: 198 total, 8 running, 190 sleeping, 0 stopped, 0 zombie +%Cpu0 : 50.7 us, 1.4 sy, 0.0 ni, 47.2 id, 0.0 wa, 0.7 hi, 0.0 si, 0.0 st +%Cpu1 : 52.9 us, 0.0 sy, 0.0 ni, 47.1 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st +%Cpu2 : 50.7 us, 0.0 sy, 0.0 ni, 48.6 id, 0.0 wa, 0.7 hi, 0.0 si, 0.0 st +%Cpu3 : 50.4 us, 0.0 sy, 0.0 ni, 48.9 id, 0.0 wa, 0.7 hi, 0.0 si, 0.0 st + +# 并且是平均使用所有的cup核心 +``` + +##### 3.2.3 将容器运行到指定的cpu上 + +```bash +[root@localhost ~]# docker run -it --rm --cpus 2 --cpuset-cpus 0,2 --name test1 tylersmith22/docker-stress-ng --vm 1 --cpu 4 + +[root@localhost ~]# docker stats +CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS +ee11d834dde5 test1 186.68% 1.488GiB / 1.781GiB 83.60% 648B / 0B 44.8GB / 95.7MB 25 + +[root@localhost ~]# top +top - 21:38:25 up 49 min, 3 users, load average: 0.92, 1.40, 0.96 +Tasks: 197 total, 6 running, 191 sleeping, 0 stopped, 0 zombie +%Cpu0 : 97.3 us, 2.0 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.7 hi, 0.0 si, 0.0 st +%Cpu1 : 0.3 us, 0.0 sy, 0.0 ni, 99.3 id, 0.0 wa, 0.0 hi, 0.3 si, 0.0 st +%Cpu2 : 98.3 us, 1.0 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.7 hi, 0.0 si, 0.0 st +%Cpu3 : 0.0 us, 0.3 sy, 0.0 ni, 99.3 id, 0.0 wa, 0.3 hi, 0.0 si, 0.0 st +MiB Mem : 1743.4 total, 457.2 free, 924.2 used, 531.4 buff/cache +MiB Swap: 2048.0 total, 2047.2 free, 0.8 used. 819.2 avail Mem +``` + +- 基于cpu-shares对cpu进行切分 + +```bash +[root@localhost ~]# docker run -it --rm -d --cpu-shares 1000 --name test1 tylersmith22/docker-stress-ng --vm 1 --cpu 4 +[root@localhost ~]# docker run -it --rm -d --cpu-shares 500 --name test2 tylersmith22/docker-stress-ng --vm 1 --cpu 4 + +[root@localhost ~]# docker stats +CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS +d6dd34edb722 test1 543.41% 819.6MiB / 1.781GiB 44.95% 648B / 0B 102MB / 154MB 13 +154b07a94e2f test2 241.15% 711.1MiB / 1.781GiB 39.00% 648B / 0B 406MB / 145MB +``` \ No newline at end of file diff --git a/新建 文本文档.txt b/00.基础阶段/index.md similarity index 100% rename from 新建 文本文档.txt rename to 00.基础阶段/index.md diff --git a/01.WEB网站开发/01.初识前端.md b/01.WEB网站开发/01.初识前端.md new file mode 100644 index 0000000..988e00d --- /dev/null +++ b/01.WEB网站开发/01.初识前端.md @@ -0,0 +1,108 @@ +# 初识前端 + +## Web、网页、浏览器 +### Web +Web(World Wide Web)即全球广域网,也称为万维网。 +我们常说的Web端就是网页端。 +### 网页 +**网页是构成网站的基本元素**。网页主要由文字、图像和超链接等元素构成。当然,除了这些元素,网页中还可以包含音频、视频以及Flash等。 +我们在浏览器上输入网址后,打开的任何一个页面,都是属于网页。 +### 浏览器 +浏览器是网页运行的平台,常见的浏览器有谷歌(Chrome)、Safari、火狐(Firefox)、IE、Edge、Opera等。 +关于浏览器的详细介绍,可以看下一篇文章:《[浏览器的介绍](https://github.com/qianguyihao/Web/blob/master/01-html/02-%E6%B5%8F%E8%A7%88%E5%99%A8%E7%9A%84%E4%BB%8B%E7%BB%8D.md)》 +## Web标准 +### W3C组织 +**W3C**:万维网联盟组织,用来制定web标准的机构(组织)。 +W3C 万维网联盟是国际最著名的标准化组织。1994年成立后,至今已发布近百项相关万维网的标准,对万维网发展做出了杰出的贡献。 +W3C 组织就类似于现实世界中的联合国。 +为什么要遵循WEB标准呢?因为很多浏览器的浏览器内核不同,导致页面解析出来的效果可能会有差异,给开发者增加无谓的工作量。因此需要指定统一的标准。 +### Web 标准 +**Web标准**:制作网页要遵循的规范。 +Web标准不是某一个标准,而是由W3C组织和其他标准化组织制定的一系列标准的集合。 +**1、Web标准包括三个方面**: + +- 结构标准(HTML):用于对网页元素进行整理和分类。 +- 表现标准(CSS):用于设置网页元素的版式、颜色、大小等外观样式。 +- 行为标准(JS):用于定义网页的交互和行为。 + +根据上面的Web标准,可以将 Web前端分为三层,如下。 +**2、Web前端分三层**: + +- HTML(HyperText Markup Language):超文本标记语言。从**语义**的角度描述页面的**结构**。相当于人的身体组织结构。 +- CSS(Cascading Style Sheets):层叠样式表。从**审美**的角度美化页面的**样式**。相当于人的衣服和打扮。 +- JS:JavaScript。从**交互**的角度描述页面的**行为**。相当于人的动作,让人有生命力。 + +**3、打个比方**:(拿黄渤举例) +HTML 相当于人的身体组织结构: +![image.png](01.初识前端/1667808217746-bff7dd46-5582-4ddf-a6a6-a91797a58460.png) +CSS 相当于人的衣服和打扮: +![image.png](01.初识前端/1667808217443-1ec79f65-f41e-4a09-aec1-a1b0abdb8eed.png) +JS 相当于人的行为: +![](01.初识前端/1667808217789-f2cb1b62-043a-4f12-a75f-b5b86be3da89.gif) +## +常见的浏览器 +浏览器是网页运行的平台,常见的浏览器有谷歌(Chrome)、Safari、火狐(Firefox)、IE、Edge、Opera等。如下图所示: +![image.png](01.初识前端/1667808281857-2bd7a870-ec04-4833-bc95-c4b4bd847e3e.png) +我们重点需要学习的是 Chrome 浏览器。 + +## 浏览器的市场占有份额 +浏览器的市场占有份额:[https://tongji.baidu.com/research/site?source=index#browser](https://tongji.baidu.com/research/site?source=index#browser) +![image.png](01.初识前端/1667808281966-8ff352a7-d9ba-43ed-8665-9965e364833e.png) +上面这张图的统计时间是2020年2月。 + +## 浏览器的组成 +浏览器分成两部分: + +- 1、渲染引擎(即:浏览器内核) +- 2、JS 引擎 +### 1、渲染引擎(浏览器内核) +浏览器所采用的「渲染引擎」也称之为「浏览器内核」,用来解析 HTML与CSS。渲染引擎决定了浏览器如何显示网页的内容以及页面的格式信息。 +**渲染引擎是浏览器兼容性问题出现的根本原因。** +渲染引擎的英文叫做 Rendering Engine。通俗来说,它的作用就是:读取网页内容,计算网页的显示方式并显示在页面上。 +常见浏览器的内核如下: + +| **浏览器** | **内核** | +| --- | --- | +| chrome | Blink | +| 欧鹏 | Blink | +| 360安全浏览器 | Blink | +| 360极速浏览器 | Blink | +| Safari | Webkit | +| Firefox 火狐 | Gecko | +| IE | Trident | + +备注:360的浏览器,以前使用的IE浏览器的Trident内核,但是现在已经改为使用 chrome 浏览器的 Blink内核。 +另外,移动端的浏览器内核是什么?大家可以自行查阅资料。 +### 2、JS 引擎 +也称为 JS 解释器。 用来解析网页中的JavaScript代码,对其处理后再运行。 +浏览器本身并不会执行JS代码,而是通过内置 JavaScript 引擎(解释器) 来执行 JS 代码 。JS 引擎执行时会逐行解释源码(转换为机器语言),然后由计算机去执行。 +浏览器本身并不会执行JS代码,而是通过内置 JavaScript 引擎(解释器) 来执行 JS 代码 。JS 引擎执行代码时逐行解释每一句源码(转换为机器语言),然后由计算机去执行。所以 JavaScript 语言归为脚本语言,会逐行解释执行。 +常见浏览器的 JS 引擎如下: + +| **浏览器** | **JS 引擎** | +| --- | --- | +| chrome / 欧鹏 | V8 | +| Safari | Nitro | +| Firefox 火狐 | SpiderMonkey(1.0-3.0)/ TraceMonkey(3.5-3.6)/ JaegerMonkey(4.0-) | +| Opera | Linear A(4.0-6.1)/ Linear B(7.0-9.2)/ Futhark(9.5-10.2)/ Carakan(10.5-) | +| IE | Trident | + +参考链接: + +- [主流浏览器内核及JS引擎](https://juejin.im/post/5ada727c518825670b33a584) +## 浏览器工作原理 +这一小段有些深入,小白可以暂时跳过,以后再来看。 +![image.png](01.初识前端/1667808281909-98403790-de53-4407-b09a-c700ba997c3a.png) +1、User Interface 用户界面,我们所看到的浏览器 +2、Browser engine 浏览器引擎,用来查询和操作渲染引擎 +3、Rendering engine 用来显示请求的内容,负责解析HTML、CSS +4、Networking 网络,负责发送网络请求 +5、JavaScript Interpreter(解析者) JavaScript解析器,负责执行JavaScript的代码 +6、UI Backend UI后端,用来绘制类似组合框和弹出窗口 +7、Data Persistence(持久化) 数据持久化,数据存储 cookie、HTML5中的sessionStorage +参考链接: + +- [https://www.2cto.com/kf/201202/118111.html](https://www.2cto.com/kf/201202/118111.html) + + + diff --git a/01.WEB网站开发/01.初识前端/1667808217443-1ec79f65-f41e-4a09-aec1-a1b0abdb8eed.png b/01.WEB网站开发/01.初识前端/1667808217443-1ec79f65-f41e-4a09-aec1-a1b0abdb8eed.png new file mode 100644 index 0000000..62b8101 Binary files /dev/null and b/01.WEB网站开发/01.初识前端/1667808217443-1ec79f65-f41e-4a09-aec1-a1b0abdb8eed.png differ diff --git a/01.WEB网站开发/01.初识前端/1667808217746-bff7dd46-5582-4ddf-a6a6-a91797a58460.png b/01.WEB网站开发/01.初识前端/1667808217746-bff7dd46-5582-4ddf-a6a6-a91797a58460.png new file mode 100644 index 0000000..3dc54fa Binary files /dev/null and b/01.WEB网站开发/01.初识前端/1667808217746-bff7dd46-5582-4ddf-a6a6-a91797a58460.png differ diff --git a/01.WEB网站开发/01.初识前端/1667808217789-f2cb1b62-043a-4f12-a75f-b5b86be3da89.gif b/01.WEB网站开发/01.初识前端/1667808217789-f2cb1b62-043a-4f12-a75f-b5b86be3da89.gif new file mode 100644 index 0000000..167b3f2 Binary files /dev/null and b/01.WEB网站开发/01.初识前端/1667808217789-f2cb1b62-043a-4f12-a75f-b5b86be3da89.gif differ diff --git a/01.WEB网站开发/01.初识前端/1667808281857-2bd7a870-ec04-4833-bc95-c4b4bd847e3e.png b/01.WEB网站开发/01.初识前端/1667808281857-2bd7a870-ec04-4833-bc95-c4b4bd847e3e.png new file mode 100644 index 0000000..a36206f Binary files /dev/null and b/01.WEB网站开发/01.初识前端/1667808281857-2bd7a870-ec04-4833-bc95-c4b4bd847e3e.png differ diff --git a/01.WEB网站开发/01.初识前端/1667808281909-98403790-de53-4407-b09a-c700ba997c3a.png b/01.WEB网站开发/01.初识前端/1667808281909-98403790-de53-4407-b09a-c700ba997c3a.png new file mode 100644 index 0000000..c8ac1e0 Binary files /dev/null and b/01.WEB网站开发/01.初识前端/1667808281909-98403790-de53-4407-b09a-c700ba997c3a.png differ diff --git a/01.WEB网站开发/01.初识前端/1667808281966-8ff352a7-d9ba-43ed-8665-9965e364833e.png b/01.WEB网站开发/01.初识前端/1667808281966-8ff352a7-d9ba-43ed-8665-9965e364833e.png new file mode 100644 index 0000000..fe7b259 Binary files /dev/null and b/01.WEB网站开发/01.初识前端/1667808281966-8ff352a7-d9ba-43ed-8665-9965e364833e.png differ diff --git a/01.WEB网站开发/02.HTML基础.md b/01.WEB网站开发/02.HTML基础.md new file mode 100644 index 0000000..af87609 --- /dev/null +++ b/01.WEB网站开发/02.HTML基础.md @@ -0,0 +1,338 @@ +# HTML基础 + +## HTML的概念 +**HTML** 全称为 HyperText Markup Language,译为**超文本标记语言**。 +HTML 不是一种编程语言,是一种描述性的**标记语言**。 +**作用**:HTML是负责描述文档**语义**的语言。 +### 概念:超文本 +所谓的超文本,有两层含义: +(1)图片、音频、视频、动画、多媒体等内容,成为超文本,因为它们超出了文本的限制。 +(2)不仅如此,它还可以从一个文件跳转到另一个文件,与世界各地主机的文件进行连接。即:超级链接文本。 +### 概念:标记语言 +HTML 不是一种编程语言,是一种描述性的**标记语言**。这主要有两层含义: +(1)**标记语言是一套标记标签**。比如:标签`` 表示超链接、标签`` 表示图片、标签`

` 表示一级标题等等,它们都是属于 HTML 标签。 +说的通俗一点就是:网页是由网页元素组成的,这些元素是由 HTML 标签描述出来,然后通过浏览器解析,就可以显示给用户看了。 +(2)编程语言是有编译过程的,而标记语言没有编译过程,HTML标签是直接由浏览器解析执行。 + +#### HTML是负责描述文档语义的语言 +HTML 格式的文件是一个纯本文文件(就是用txt文件改名而成),用一些标签来描述语义,这些标签在浏览器页面上是无法直观看到的,所以称之为“超文本标记语言”。 +接下来,我们需要学习 HTML 中的很多“标签对儿”,这些“标签对儿”能够给文本不同的语义。 +比如,面试的时候问你,`

` 标签有什么作用? + +- 正确答案:给文本增加主标题的语义。 +- 错误答案:给文字加粗、加黑、变大。 + +关乎“语义”的更深刻理解,等接下来我们学习了各种标签,就明白了。 +### HTML的历史 +![image.png](02.HTML基础/1667808374759-37418c94-e355-4dbc-b08e-49c80daf98de-20250509134342896.png) + +其中,我们专门来对XHTML做一个介绍。 +**XHTML介绍:**XHTML:Extensible Hypertext Markup Language,可扩展超文本标注语言。XHTML的主要目的是为了**取代HTML**,也可以理解为HTML的升级版。HTML的标记书写很不规范,会造成其它的设备(ipad、手机、电视等)无法正常显示。XHTML与HTML4.0的标记基本上一样。XHTML是**严格的、纯净的**HTML。 +我们稍后将对XHTML的编写规范进行介绍。 + +### HTML的专有名词 + +- 网页 :由各种标记组成的一个页面就叫网页。 +- 主页(首页) : 一个网站的起始页面或者导航页面。 +- 标记: 比如`

` 称为开始标记 ,`

` 称为结束标记,也叫标签。每个标签都规定好了特殊的含义。 +- 元素:比如`

` 内容`

` 称为元素. +- 属性:给每一个标签所做的辅助信息。 +- XHTML:符合XML语法标准的HTML。 +- DHTML:dynamic,动态的。javascript + css + html合起来的页面就是一个 DHTML。 +- HTTP:超文本传输协议。用来规定客户端浏览器和服务端交互时数据的一个格式。SMTP:邮件传输协议,FTP:文件传输协议。 +### 书写第一个 HTML 页面 +我们打开 VS Code 软件,新建一个文件,名叫test.html(注意,文件名是test,后缀名是html),保存到本地。 +紧接着,在文件里,输入html:5,然后按一下键盘上的Tab键,就可以自动生成如下内容: +```html + + + + + + Document + + + + + +``` +上面的内容,就是 html 页面的骨架。我们在此基础之上,新增几个标签,完整代码如下: +```html + + + + + + Document + + +

我是三级标题

+ +
我是超链接,可以点击一下 + + +``` +标签写完之后,我们用 chrome 浏览器打开上面这个test.html文件,看看页面效果: +到此,第一个简单的 HTML 页面就写完了。是不是很有成就感? +### HTML结构详解 +HTML标签通常是成对出现的(**双边标记**),比如 `
` 和 `
` ;也有少部分单标签(**单边标记**),如: +、`
` 和`` 等。 +属性与标记之间、各属性之间需要以空格隔开。属性值以双引号括起来。 + +#### html骨架标签分类 +| **标签名** | **定义** | **说明** | +| --- | --- | --- | +| `` | HTML标签 | 页面中最大的标签,我们成为根标签 | +| `` | 文档的头部 | 注意在head标签中我们必须要设置的标签是title | +| `` | 文档的标题 | 让页面拥有一个属于自己的网页标题 | +| `` | 文档的主体 | 元素包含文档的所有内容,页面内容 基本都是放到body里面的 | + +#### 快速生成 html 的骨架 +**方式1**:在 VS Code 中新建 html 文件,输入html:5,按 Tab键后,自动生成的代码如下: +```html + + + + + + + Document + + + + + +``` +**方式2**:在Sublime Text中安装Emmet插件。新建html文件,输入html:5,按Tab键后,自动生成的代码如下: +```html + + + + + Document + + + + + +``` +**方式3**:在Sublime Text中安装Emmet插件。新建html文件,输入html:xt,按Tab键后,自动生成的代码如下: +```html + + + + + Document + + + + + +``` +上面的方式2和方式3中,我们会发现,第一行的内容有些不太一样,这就是我们接下来要讲的**文档声明头**。 +#### 文档声明头 +任何一个标准的HTML页面,第一行一定是一个以`` 开头的语句。这一行,就是文档声明头,即 DocType Declaration,简称DTD。 +**DTD可告知浏览器文档使用哪种 HTML 或 XHTML 规范**。 + +##### HTML4.01有哪些规范呢? +**HTML4.01**这个版本是IE6开始兼容的。**HTML5是IE9开始兼容的**。如今,手机、移动端的网页,就可以使用HTML5了,因为其兼容性更高。 +说个题外话,html1 至 html3 是美国军方以及高等研究所用的,并未对外公开。 +HTML4.01里面有两大种规范,每大种规范里面又各有3种小规范。所以一共6种规范(见下图)。 +HTML4.01里面规定了**普通**和**XHTML**两大种规范。HTML觉得自己有一些规定不严谨,比如,标签是否可以用大写字母呢?`

` 所以,HTML就觉得,把一些规范严格的标准,又制定了一个XHTML1.0。在XHTML中的字母X,表示“严格的”。 +总结一下,HTML4.01一共有6种DTD。说白了,HTML的第一行语句一共有6种情况: + +![image.png](02.HTML基础/1667808374905-7ed621e7-cad8-47c2-a181-6d7c5da0e120.png) + +下面对上图中的三种小规范进行解释: +**strict**: +表示“严格的”,这种模式里面的要求更为严格。这种严格体现在哪里?有一些标签不能使用。比如,u标签,就是给一个本文加下划线,但是这和HTML的本质有冲突,因为HTML最好是只负责语义,不要负责样式,而u这个下划线是样式。所以,在strict中是不能使用u标签的。 +那怎么给文本增加下划线呢?今后将使用css属性来解决。 +XHTML1.0更为严格,因为这个体系本身规定比如标签必须是小写字母、必须严格闭合标签、必须使用引号引起属性等等。 +**Transitional**:表示“普通的”,这种模式就是没有一些别的规范。 +**Frameset**:表示“框架”,在框架的页面使用。 +在sublime输入的html:xt,x表示XHTML,t表示transitional。 +在HTML5中极大的简化了DTD,也就是说HTML5中就没有XHTML了。HTML5的DTD(文档声明头)如下: + +`` + +#### 页面语言 lang +下面这行标签,用于指定页面的语言类型: + `` +最常见的语言类型有两种: + + +- en:定义页面语言为英语。 +- zh-CN:定义页面语言为中文。 +#### 头标签 head +##### html5 的比较完整的骨架: +```html + + + + + + + + + + Document + + + + + +``` +面试题: + +- 问:网页的head标签里面,表示的是页面的配置,有什么配置? +- 答:字符集、关键词、页面描述、页面标题、IE适配、视口、iPhone小图标等等。 + +头标签内部的常见标签如下: + +- ``:指定整个网页的标题,在浏览器最上方显示。 +- `<base>` :为页面上的所有链接规定默认地址或默认目标。 +- `<meta>` :提供有关页面的基本信息 +- `<body>` :用于定义HTML文档所要显示的内容,也称为主体标签。我们所写的代码必须放在此标签內。 +- `<link>` :定义文档与外部资源的关系。 + +**meta 标签**: +meta表示“元”。“元”配置,就是表示基本的配置项目。 +常见的几种 meta 标签如下: +(1)字符集 charset: + `<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">` +字符集用meta标签中的charset定义,charset就是charactor set(即“字符集”),即**网页的编码方式**。 +**字符集**(Character set)是多个字符的集合。计算机要准确的处理各种字符集文字,需要进行字符编码,以便计算机能够识别和存储各种文字。 +上面这行代码非常关键, 是必须要写的代码,否则可能导致乱码。比如你保存的时候,meta写的和声明的不匹配,那么浏览器就是乱码。 +utf-8是目前最常用的字符集编码方式,常用的字符集编码方式还有gbk和gb2312等。关于“编码方式”,我们在下一段会详细介绍。 +(2)视口 viewport: +     `<meta name="viewport" content="width=device-width, initial-scale=1.0">` +width=device-width :表示视口宽度等于屏幕宽度。 +viewport 这个知识点,初学者还比较难理解,以后学 Web 移动端的时候会用到。 +(3)定义“关键词”: +举例如下: + `<meta name="Keywords" content="网易,邮箱,游戏,新闻,体育,娱乐,女性,亚运,论坛,短信" />` +这些关键词,就是告诉搜索引擎,这个网页是干嘛的,能够提高搜索命中率。让别人能够找到你,搜索到你。 +(4)定义“页面描述”: +meta除了可以设置字符集,还可以设置关键字和页面描述。 +只要设置Description页面描述,那么百度搜索结果,就能够显示这些语句,这个技术叫做**SEO**(search engine optimization,搜索引擎优化)。 +设置页面描述的举例: + `<meta name="Description" content="网易是中国领先的互联网技术公司,为用户提供免费邮箱、游戏、搜索引擎服务,开设新闻、娱乐、体育等30多个内容频道,及博客、视频、论坛等互动交流,网聚人的力量。" />` +效果如下: + +![image.png](02.HTML基础/1667808374850-e75ad910-6091-40fd-9d86-41aa8cea1a0f.png) + +上面的几种`<meta>` 标签都不用记,但是另外还有一个`<meta>` 标签是需要记住的: + `<meta http-equiv="refresh" content="3;http://www.baidu.com">` +上面这个标签的意思是说,3秒之后,自动跳转到百度页面。 +**title 标签**: +用于设置网页标题: +  `<title>网页的标题` +title标签也是有助于SEO搜索引擎优化的。 +**base标签**: + `` +base 标签用于指定基础的路径。指定之后,所有的 a 链接都是以这个路径为基准。 + +#### `` 标签 +`` 标签的属性有: + +- bgcolor:设置整个网页的背景颜色。 +- background:设置整个网页的背景图片。 +- text:设置网页中的文本颜色。 +- leftmargin:网页的左边距。IE浏览器默认是8个像素。 +- topmargin:网页的上边距。 +- rightmargin:网页的右边距。 +- bottommargin:网页的下边距。 + +`` 标签另外还有一些属性,这里用个例子来解释: + +![image.png](02.HTML基础/1667808375068-1a77af7a-3fd6-4e4d-871b-b7daa74b8429.png) + +上方代码中,当我们对点我点我这几个字使用超链时,link属性表示默认显示的颜色、alink属性表示鼠标点击但是还没有松开时的颜色、vlink属性表示点击完成之后显示的颜色。效果如下: + +![](02.HTML基础/1667808374629-462b0e02-4622-4369-82a8-d7ddc20c2ffb.gif) + + + +### 计算机编码介绍 +计算机,不能直接存储文字,存储的是编码。 +计算机只能处理二进制的数据,其它数据,比如:0-9、a-z、A-Z,这些字符,我们可以定义一套规则来表示。假如:A用110表示,B用111表示等。 +**ASCII码:**美国发布的,用1个字节(8位二进制)来表示一个字符,共可以表示2^8=256个字符。 美国的国家语言是英语,只要能表示0-9、a-z、A-Z、特殊符号。 +**ANSI编码:每个国家为了显示本国的语言,都对ASCII码进行了扩展**。用2个字节(16位二进制)来表示一个汉字,共可以表示2^16=65536个汉字。例如:中国的ANSI编码是GB2312编码(简体),对6763汉字进行编码,含600多特殊字符。另外还有GBK(简体)。日本的ANSI编码是JIS编码。台湾的ANSI编码是BIG5编码(繁体)。 +**GBK:**对GB2312进行了扩展,用来显示罕见的、古汉语的汉字。现在已经收录了2.1万左右。并提供了1890个汉字码位。K的含义就是“扩展”。 +**Unicode编码(统一编码):**用4个字节(32位二进制)来表示一个字符,想法不错,但效率太低。例如,字母A用ASCII表示的话一个字节就够,可用Unicode编码的话,得用4个字节表示,造成了空间的极大浪费。A的Unicode编码是0000 0000 0000 0000 0000 0000 0100 0000 +**UTF-8(Unicode Transform Format)编码:**根据字符的不同,选择其编码的长度。比如:一个字符A用1个字节表示,一个汉字用3个字节表示。 +毫无疑问,开发中,都用**UTF-8**编码吧,准没错。 +**中文能够使用的字符集两种:** + +- 第一种:UTF-8。UTF-8是国际通用字库,里面涵盖了所有地球上所有人类的语言文字,比如阿拉伯文、汉语、鸟语…… +- 第二种:GBK(对GB2312进行了扩展)。gb2312 是国标,是中国的字库,里面**仅**涵盖了汉字和一些常用外文,比如日文片假名,和常见的符号。 + +字库规模: UTF-8(字很全) > gb2312(只有汉字) +**重点1:避免乱码** +我们用meta标签声明的当前这个html文档的字库,一定要和保存的文件编码类型一样,否则乱码(重点)。 +拿 sublime编辑器举例,当我们不设置的时候,sublime默认类型就是UTF-8。而一旦更改为gb2312的时候,就一定要记得设置一下sublime的保存类型: 文件→ set File Encoding to → Chinese Simplified(GBK)。VS Code 的道理一样。 +**重点2:UTF-8和gb2312的比较** +保存大小:UTF-8(更臃肿、加载更慢) > gb2312 (更小巧,加载更快) +总结: + +- UTF-8:字多,有各种国家的语言,但是保存尺寸大,文件臃肿; +- gb2312:字少,只用中文和少数外语和符号,但是尺寸小,文件小巧。 + +列出2个使用情形: + +1) 你们公司是做日本动漫的,经常出现一些日语动漫的名字,网页要使用UTF-8。如果用gb2312将无法显示日语。 + +2) 你们公司就是中文网页,极度的追求网页的显示速度,要使用gb2312。如果使用UTF-8将每个汉字多一个byte,所以5000个汉字,多5kb。 +我们亲测: + +- qq网、网易、搜狐都是使用gb2312。这些公司,都追求显示速度。 +- 新华网藏语频道,使用的是UTF-8,保证字符集的数量。 + +我们是怎么查看网页的编码方式的呢?在浏览器中打开网页,右键,选择“查看网页源代码”,找到meta标签中的charset属性即可。 +那么,我们为什么可以查看网页的源代码呢?因为这个打开的html网页已经存到我的临时文件夹里了,临时文件夹里的html是纯文本文件,纯文本文件自然可以查看网页的源代码。 +### HTML的规范 + +- HTML不区分大小写,但HTML的标签名、类名、标签属性、大部分属性值建议统一用小写。 +- HTML页面的后缀名是html或者htm(有一些系统不支持后缀名长度超过3个字符,比如dos系统) +#### 编写XHTML的规范: +(1)所有标记元素都要正确的嵌套,不能交叉嵌套。正确写法举例:`

` +(2)所有的标记都必须小写。 +(3)所有的标签都必须闭合。 + +- 双标签:`` +- 单标签:`
` +- 建议写成 + +`
` 建议转成 `
` ,还有`` + +(4)所有的属性值必须加引号。`` +(5)所有的属性必须有值。`
` +(6)XHTML文档开头必须要有DTD文档类型定义。 + +#### HTML的基本语法特性 +##### HTML对换行不敏感,对tab不敏感 +HTML只在乎标签的嵌套结构,嵌套的关系。谁嵌套了谁,谁被谁嵌套了,和换行、tab无关。换不换行、tab不tab,都不影响页面的结构。 +也就是说,HTML不是依靠缩进来表示嵌套的,而是看标签的嵌套关系。但是,我们发现有良好的缩进,代码更易读。建议大家都正确缩进标签。 +百度为了追求极致的显示速度,所有HTML标签都没有换行、都没有缩进(tab),HTML和换不换行无关,标签的层次依然清晰,只不过程序员不可读了。如下图所示: + +![image.png](02.HTML基础/1667808375103-e56bf60f-7e58-46f6-bb90-48f9cfabcd7e.png) + + + +##### 空白折叠现象 +HTML中所有的**文字之间**,如果有空格、换行、tab都将被折叠为一个空格显示。 +举例如下: + +![image.png](02.HTML基础/1667808377335-da9e90a5-59f8-4dc2-b992-e577ff4a9c3d.png) + + + +##### 标签要严格封闭 +标签不封闭的结果是灾难性的。 +标签不封闭的举例如下: + +![image.png](02.HTML基础/1667808376343-8ee0be14-a7f4-4b3e-8fb1-1b1e5b9632ed.png) + + + + diff --git a/01.WEB网站开发/02.HTML基础/1667808374629-462b0e02-4622-4369-82a8-d7ddc20c2ffb.gif b/01.WEB网站开发/02.HTML基础/1667808374629-462b0e02-4622-4369-82a8-d7ddc20c2ffb.gif new file mode 100644 index 0000000..133840c Binary files /dev/null and b/01.WEB网站开发/02.HTML基础/1667808374629-462b0e02-4622-4369-82a8-d7ddc20c2ffb.gif differ diff --git a/01.WEB网站开发/02.HTML基础/1667808374759-37418c94-e355-4dbc-b08e-49c80daf98de-20250509134342896.png b/01.WEB网站开发/02.HTML基础/1667808374759-37418c94-e355-4dbc-b08e-49c80daf98de-20250509134342896.png new file mode 100644 index 0000000..8980331 Binary files /dev/null and b/01.WEB网站开发/02.HTML基础/1667808374759-37418c94-e355-4dbc-b08e-49c80daf98de-20250509134342896.png differ diff --git a/01.WEB网站开发/02.HTML基础/1667808374759-37418c94-e355-4dbc-b08e-49c80daf98de.png b/01.WEB网站开发/02.HTML基础/1667808374759-37418c94-e355-4dbc-b08e-49c80daf98de.png new file mode 100644 index 0000000..8980331 Binary files /dev/null and b/01.WEB网站开发/02.HTML基础/1667808374759-37418c94-e355-4dbc-b08e-49c80daf98de.png differ diff --git a/01.WEB网站开发/02.HTML基础/1667808374850-e75ad910-6091-40fd-9d86-41aa8cea1a0f.png b/01.WEB网站开发/02.HTML基础/1667808374850-e75ad910-6091-40fd-9d86-41aa8cea1a0f.png new file mode 100644 index 0000000..b661655 Binary files /dev/null and b/01.WEB网站开发/02.HTML基础/1667808374850-e75ad910-6091-40fd-9d86-41aa8cea1a0f.png differ diff --git a/01.WEB网站开发/02.HTML基础/1667808374905-7ed621e7-cad8-47c2-a181-6d7c5da0e120.png b/01.WEB网站开发/02.HTML基础/1667808374905-7ed621e7-cad8-47c2-a181-6d7c5da0e120.png new file mode 100644 index 0000000..a76ea61 Binary files /dev/null and b/01.WEB网站开发/02.HTML基础/1667808374905-7ed621e7-cad8-47c2-a181-6d7c5da0e120.png differ diff --git a/01.WEB网站开发/02.HTML基础/1667808375068-1a77af7a-3fd6-4e4d-871b-b7daa74b8429.png b/01.WEB网站开发/02.HTML基础/1667808375068-1a77af7a-3fd6-4e4d-871b-b7daa74b8429.png new file mode 100644 index 0000000..5637dc2 Binary files /dev/null and b/01.WEB网站开发/02.HTML基础/1667808375068-1a77af7a-3fd6-4e4d-871b-b7daa74b8429.png differ diff --git a/01.WEB网站开发/02.HTML基础/1667808375103-e56bf60f-7e58-46f6-bb90-48f9cfabcd7e.png b/01.WEB网站开发/02.HTML基础/1667808375103-e56bf60f-7e58-46f6-bb90-48f9cfabcd7e.png new file mode 100644 index 0000000..8890e49 Binary files /dev/null and b/01.WEB网站开发/02.HTML基础/1667808375103-e56bf60f-7e58-46f6-bb90-48f9cfabcd7e.png differ diff --git a/01.WEB网站开发/02.HTML基础/1667808376343-8ee0be14-a7f4-4b3e-8fb1-1b1e5b9632ed.png b/01.WEB网站开发/02.HTML基础/1667808376343-8ee0be14-a7f4-4b3e-8fb1-1b1e5b9632ed.png new file mode 100644 index 0000000..6b2dba7 Binary files /dev/null and b/01.WEB网站开发/02.HTML基础/1667808376343-8ee0be14-a7f4-4b3e-8fb1-1b1e5b9632ed.png differ diff --git a/01.WEB网站开发/02.HTML基础/1667808377335-da9e90a5-59f8-4dc2-b992-e577ff4a9c3d.png b/01.WEB网站开发/02.HTML基础/1667808377335-da9e90a5-59f8-4dc2-b992-e577ff4a9c3d.png new file mode 100644 index 0000000..12b51cf Binary files /dev/null and b/01.WEB网站开发/02.HTML基础/1667808377335-da9e90a5-59f8-4dc2-b992-e577ff4a9c3d.png differ diff --git a/01.WEB网站开发/03.常用标签.md b/01.WEB网站开发/03.常用标签.md new file mode 100644 index 0000000..a14d8ac --- /dev/null +++ b/01.WEB网站开发/03.常用标签.md @@ -0,0 +1,496 @@ +# 常用标签 + +## HTML文档结构 +最基本的HTML文档: + +```html + + + + + css样式优先级 + + + + + +``` + +1. `` 声明为HTML5文档。 +2. `` 、`` 是文档的开始标记和结束的标记。是HTML页面的根元素,在它们之间是文档的头部(head)和主体(body)。 +3. `` 、`` 定义了HTML文档的开头部分。它们之间的内容不会在浏览器的文档窗口显示。包含了文档的元(meta)数据。 +4. ``、`` 定义了网页标题,在浏览器标题栏显示。 +5. `` 、`` 之间的文本是可见的网页主体内容。 + +注意:对于中文网页需要使用 `` 声明编码,否则会出现乱码。有些浏览器会设置 GBK 为默认编码,则你需要设置为 ``。 +## HTML标签格式 + +- HTML标签是由尖括号包围的关键字,如`` , `
` 等 +- HTML标签通常是成对出现的,比如:`
` 和`
` ,第一个标签是开始,第二个标签是结束。结束标签会有斜线。 +- 也有一部分标签是单独呈现的,比如:`
` 、`
` 、`` 等。 +- 标签里面可以有若干属性,也可以不带属性。 + +**标签的语法:** + +- <标签名 属性1=“属性值1” 属性2=“属性值2”……>内容部分 +- <标签名 属性1=“属性值1” 属性2=“属性值2”…… /> + +**几个很重要的属性:** + +- id:定义标签的唯一ID,HTML文档树中唯一 +- class:为html元素定义一个或多个类名(classname)(CSS样式类名) +- style:规定元素的行内样式(CSS样式) +## HTML注释 +```html + +``` +## 标签 +`` 声明必须是 HTML 文档的第一行,位于 `` 标签之前。 +`` 声明不是 HTML 标签;它是指示 web 浏览器关于页面使用哪个 HTML 版本进行编写的指令。 +HTML常用标签 +head内常用标签 + + +| 标签 | 意义 | +| --- | --- | +| `` | 定义网页标题 | +| `` | 定义内部样式表 | +| `` | 定义JS代码或引入外部JS文件 | +| `` | 引入外部样式表文件 | +| `` | 定义网页原信息 | + +### Meta标签 +Meta标签介绍: + +- `` 元素可提供有关页面的元信息(mata-information),针对搜索引擎和更新频度的描述和关键词。 +- `` 标签位于文档的头部,不包含任何内容。 +- `` 提供的信息是用户不可见的。 + +meta标签的组成:meta标签共有两个属性,它们分别是http-equiv属性和name 属性,不同的属性又有不同的参数值,这些不同的参数值就实现了不同的网页功能。  + +1. http-equiv属性:相当于http的文件头作用,它可以向浏览器传回一些有用的信息,以帮助正确地显示网页内容,与之对应的属性值为content,content中的内容其实就是各个参数的变量值。 +```html + + + + + + +``` + + +2. name属性: 主要用于描述网页,与之对应的属性值为content,content中的内容主要是便于搜索引擎机器人查找信息和分类信息用的。 +```html + + +``` + +## body内常用标签 +### 基本标签(块级标签和内联标签) + +```html +加粗 +斜体 +下划线 +删除 + +

段落标签

+ +

标题1

+

标题2

+

标题3

+

标题4

+
标题5
+
标题6
+ + +
+ +
+``` + +## 特殊字符 +| 内容 | 对应代码 | +| --- | --- | +| 空格 | ` ` | +| > | `>` | +| < | `<` | +| & | `&` | +| ¥ | `¥` | +| 版权 | `©` | +| 注册 | `®` | + +### div标签和span标签 +div标签用来定义一个块级元素,并无实际的意义。主要通过CSS样式为其赋予不同的表现。 +span标签用来定义内联(行内)元素,并无实际的意义。主要通过CSS样式为其赋予不同的表现。 + +**块级元素与行内元素的区别:** +所谓块元素,是以另起一行开始渲染的元素,行内元素则不需另起一行。如果单独在网页中插入这两个元素,不会对页面产生任何的影响。 +这两个元素是专门为定义CSS样式而生的。 +**注意:** +关于标签嵌套:通常块级元素可以包含内联元素或某些块级元素,但内联元素不能包含块级元素,它只能包含其它内联元素。 +**p标签不能包含块级标签,p标签也不能包含p标签。** + +### img标签 +```html +图片未加载成功时的提示 +``` +### a标签 +超链接标签 +所谓的超链接是指从一个网页指向一个目标的连接关系,这个目标可以是另一个网页,也可以是相同网页上的不同位置,还可以是一个图片,一个电子邮件地址,一个文件,甚至是一个应用程序。 + +> 什么是URL? +> URL是统一资源定位器(Uniform Resource Locator)的缩写,也被称为网页地址,是因特网上标准的资源的地址。 +> URL举例 +> http://www.sohu.com/stu/intro.html +> http://222.172.123.33/stu/intro.html +> URL地址由4部分组成 +> 第1部分:为协议:http://、ftp://等 +> 第2部分:为站点地址:可以是域名或IP地址 +> 第3部分:为页面在站点中的目录:stu +> 第4部分:为页面名称,例如 index.html +> 各部分之间用“/”符号隔开。 + +```html +点我 +``` +href属性指定目标网页地址。该地址可以有几种类型: + +- 绝对URL - 指向另一个站点(比如 href="http://www.jd.com) +- 相对URL - 指当前站点中确切的路径(href="index.htm") +- 锚URL - 指向页面中的锚(href="#top") + + +target: + +- _blank表示在新标签页中打开目标网页 +- _self表示在当前标签页中打开目标网页 +### 列表 + +1. **无序列表** +```html +
    +
  • 第一项
  • +
  • 第二项
  • +
+``` +type属性: +disc(实心圆点,默认值) +circle(空心圆圈) +square(实心方块) +none(无样式) + +2. **有序列表** +```html +
    +
  1. 第一项
  2. +
  3. 第二项
  4. +
+``` +type属性: +1 数字列表,默认值 +A 大写字母 +a 小写字母 +Ⅰ大写罗马 +ⅰ小写罗马 + +3. **标题列表** +```html +
+
标题1
+
内容1
+
标题2
+
内容1
+
内容2
+
+``` +### 表格 +表格是一个二维数据空间,一个表格由若干行组成,一个行又有若干单元格组成,单元格里可以包含文字、列表、图案、表单、数字符号、预置文本和其它的表格等内容。 +表格最重要的目的是显示表格类数据。表格类数据是指最适合组织为表格格式(即按行和列组织)的数据。 +表格的基本结构: +```html + + + + + + + + + + + + + + + + + + + + +
姓名性别爱好
张三
李四
+``` +属性: +border: 表格边框. +cellpadding: 内边距 +cellspacing: 外边距. +width: 像素 百分比.(最好通过css来设置长宽) +rowspan: 单元格竖跨多少行 +colspan: 单元格横跨多少列(即合并单元格) +### form +**功能:** +表单用于向服务器传输数据,从而实现用户与Web服务器的交互 +表单能够包含input系列标签,比如文本字段、复选框、单选框、提交按钮等等。 +表单还可以包含textarea、select、fieldset和 label标签。 +**表单属性:** + +| 属性 | 描述 | +| --- | --- | +| accept-charset | 规定在被提交表单中使用的字符集(默认:页面字符集)。 | +| action | 规定向何处提交表单的地址(URL)(提交页面)。 | +| autocomplete | 规定浏览器应该自动完成表单(默认:开启)。 | +| enctype | 规定被提交数据的编码(默认:url-encoded)。 | +| method | 规定在提交表单时所用的 HTTP 方法(默认:GET)。 | +| name | 规定识别表单的名称(对于 DOM 使用:document.forms.name)。 | +| novalidate | 规定浏览器不验证表单。 | +| target | 规定 action 属性中地址的目标(默认:_self)。 | + +**表单元素** +**基本概念:** +HTML表单是HTML元素中较为复杂的部分,表单往往和脚本、动态页面、数据处理等功能相结合,因此它是制作动态网站很重要的内容。 +表单一般用来收集用户的输入信息 +**表单工作原理:** +访问者在浏览有表单的网页时,可填写必需的信息,然后按某个按钮提交。这些信息通过Internet传送到服务器上。   +服务器上专门的程序对这些数据进行处理,如果有错误会返回错误信息,并要求纠正错误。当数据完整无误后,服务器反馈一个输入完成的信息。 +### input +`` 元素会根据不同的 type 属性,变化为多种形态。 + +| type属性值 | 表现形式 | 对应代码 | +| --- | --- | --- | +| text | 单行输入文本 | `` | +| password | 密码输入框 | `` | +| date | 日期输入框 | `` | +| checkbox | 复选框 | `` | +| radio | 单选框 | `` | +| submit | 提交按钮 | `` | +| reset | 重置按钮 | `` | +| button | 普通按钮 | `` | +| hidden | 隐藏输入框 | `` | +| file | 文本选择框 | `` | + +**属性说明:** +name:表单提交时的“键”,注意和id的区别 +value:表单提交时对应项的值 +type="button", "reset", "submit"时,为按钮上显示的文本年内容 +type="text","password","hidden"时,为输入框的初始值 +type="checkbox", "radio", "file",为输入相关联的值 +checked:radio和checkbox默认被选中的项 +readonly:text和password设置只读 +disabled:所有input均适用 + +### select标签 + +```html +
+ +
+``` +**属性说明:** +multiple:布尔属性,设置后为多选,否则默认单选 +disabled:禁用 +selected:默认选中该项 +value:定义提交时的选项值 +### label标签 +定义:`