这是本节的多页打印视图。 点击此处打印.

返回本页常规视图.

Network

Network

Network

SDN(Software Defined Networking)是当前热门技术之一,目前已经普遍得到大家共识。本文整理了SDN实践中的一些基本理论和实践案例心得。

https://sdn.feisky.xyz/

https://learn.lianglianglee.com/%E6%9E%81%E5%AE%A2%E6%97%B6%E9%97%B4/%E8%B6%A3%E8%B0%88%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE.md

1 - 基础知识

网络基础概念

网络基础知识

vxlan

全称 Virtual extensible local area network,是用三层协议封装的二层协议,允许第二层数据包在第三层网络上传输。通过 Overlay 技术旨在扩展 vlan, 以解决大型云计算部署中虚拟网络数量不足的问题。

DSR(Direct Server Return)

默认情况下,cilium 的 BPF NodePort 实现以 SNAT 模式运行。也就是说,当节点外部流量到达且节点确定 NodePort 或者 xternallPs 服务的后端位于远程节点时,则 该节点通过执行 SNAT 代表其将请求重定向到远程后端。不需要额外的 MTU 更改,而代价是来自后端的答复。

cilium 下通过将 nodeport.mode 改成 dsr 更改此设置,使 Cilium 的 bpf nodeport实现在 dsr 模式下运行。

DSR 需要在 Native-Routing,不能再任何 tunneling 模式下工作。

XDP

express data path ,能够在网络包进入用户态直接对网络包进行过滤或者处理。XDP 依赖于 ebpf技术。

Encapsulation(封装)

使用基于 UDP 的封装协议 vxlan 形成一个 tunnel

优点简单,缺点是由于添加了 header,MTU过大低于本地路由。导致特定网络连接的最大吞吐率低,可以通过巨型帧缓解。

2 - 网络协议

网络协议

tcp: 流量控制 超时重传 拥塞控制

传输层的数据包大小超过 MSS (TCP最大报文段长度),就要将数据分块,这样即使中途有一个分块出问题,只需要重传这个分块,而不用重新发送整个数据包。 在 TCP 协议中,每个分块称为 TCP段

网络层最常用的是IP协议,将传输层的报文作为数据部分,再加上IP包头组装成IP报文,如果报文大小超过 MTU(以太网中一般为1500字节)就会再次进行分片,得到一个即将发送到网络的IP报文。

IP地址分成的两种意义:

  • 一是网络号,负责标识该IP地址是属于哪个【子网】;
  • 二是主机号,负责标识同一【子网】下的不同主机;

需要配合子网掩码才能计算出 IP地址的网络号和主机号。 如: 10.100.122.0/24 /24就是 255.255.255.0 子网掩码,二进制有24个1.

  • 计算网络号: 将IP与子网掩码做 AND 运算
  • 计算主机号: 将子网掩码取反后与IP地址进行与运算

网络接口层: 生成了 IP 头部之后,接下来要交给 网络接口层 在 IP 头部的前面加上 MAC 头部,并封装成数据帧发送到网络上。

可靠传输 TCP

TCP报文头部格式:

  • 源端口号 :确认应用
  • 目的端口号 :确认目的应用
  • 序号 :解决包乱序问题
  • 确认序号 :确认发出去对方是否收到,没收到就重新发送,解决丢包问题
  • 状态位 :SYN(发起一个连接) ACK(回复) RST(重新连接) FIN(结束连接),带有状态位的包的发送,引起双方状态变更。
  • 首部长度 :
  • 保留
  • 校验
  • 窗口大小 : TCP要控制流量,通信双方个声明一个窗口(缓存大小),表示当前处理的能力。还要拥塞控制,控制发送的速度。
  • 紧急指针
  • 选项

网络包 IP

IP 报文头部:

  • 版本
  • 首部长度
  • 服务类型
  • 协议 : http通过tcp传输,填写 06,表示协议为tcp
  • 校验
  • ttl
  • 源 IP 地址 :客户端输出的IP地址
  • 目标 IP 地址 : web 服务器 IP

MAC

MAC 头部:

  • 接收方 MAC 地址
  • 发送方 MAC 地址
  • 协议类型 :IP协议和 ARP协议

HTTP1.0 无状态、无连接

HTTP1.1 持久连接 请求管道化 增加缓存处理(新的字段如cache-control) 增加Host字段、支持断点传输等

HTTP2.0 二进制分帧 多路复用(或连接共享) 头部压缩 服务器推送

HTTPS 优化:

tls协议,目的是为了通过非对称加密握手协商或者交换出对称加密密钥。

尽量序言用 ECDHE 密钥交换算法替代 RSA 算法,使用 tls1.3 (简化了握手的步骤,握手只要1RTT)

证书优化

会话复用

SYN seq = clinet_isn

ACK = seq + 1 SEQ = server_isn

ACK = server_isn + 1

三次握手建立连接的主要原因是防止历史连接 初始化了连接。

3 - 网关协议

网关协议

网关协议

kubernetes 需要安装 CNI 网络插件进行请求通信。遇到的问题如:

  • arp 地址不正确,服务请求返回异常
  • 开启 bgp 协议
  • 网卡的几种模式

路由器工作在 IP 层,其作用是根据 IP 地址将数据包传输到正确的目的地,因此路由器必须知道网络的“地图”才能正确投递,这个”地图“就是存储在路由表中的路由规则,简称路由。

根据获得路由的方式可以分为:

  • 静态路由:管理员配置的路由
  • 动态路由:路由器通过算法动态学习和调整得到的路由。常说的路由协议就是指 动态路由的学习算法

根据作用域不同可以分为:

  • 内部网关协议(IGP),通常包括 RIPOSPF
  • 边界网关协议(BGP)

bgp

BGP路由(边界网关协议)

Border Gateway Protocol
当网络过大时,会导致路由表过大而难以维护,这时候采用分治的方法,将一个大网络划分为若干个小网络,这些小网络称为自治系统(AS),BGP就是用于自治系统间的通信。

边界网关协议就像是互联网的邮政服务,当有人把信投进邮筒时,邮政服务会处理邮件,并选择一条高效的路线将信投递给收件人。 同样地,当有人通过互联网提交数据时,BGP负责寻找数据能传播的可用路径,并选择最佳路由,通常在自治系统之间跳跃。

并不是 是不是所有的 AS 之间的通信都需要 BGP ,当只有两 AS 间存在多条路径,需要做路由策略和选择才需要 BGP,如果AS只有一出口或者所有的出口指向一个 ISP 时,是不需要 BGP 的。

基本概念

BGP 允许基于策略的路由选择,策略与多种因素相关,有 AS 的网络管理者确定,人为影响的因素较大。

每个划分后的小网络称为 AS ,每个 AS 都有自己的 AS号码(ASN)。根据类型不同,也被分为不同类型的 AS 。

BGP 是运行在 TCP 协议之上的,BGP 的邻居关系(或称为对等实体 peer)是通过人工配置实现的,对等实体之间通过 TCP 端口 179 创建会话交换数据。 BGP 路由器会周期发送19自己的保持存活(keep-alive)消息维持连接。在各种路由协议中,只有 bgp 使用 TCP 作为传输层协议。

与其他路由协议对比:

bgp2

BGP 有两种邻居,其中在同一个 AS 内的 BGP 邻居称为 IBGP(Interior BGP),不同 AS 间的邻居称为 EBGP(Exterior BGP),无论是 IBGP 或者 EBGP,上面都运行着 BGP 协议,也就是说与 BGP 路由器直连的内部路由器不一定是它的 IBGP。

bgp3

注意: BGP 邻居不是自己发现的,而是手动配置的,原因是:

  1. 可以与对端设备用任何IP地址建立邻居,而不必限于某个固定的接口IP。这样当两台设备采用环回地址而非直连地址建立 BGP 邻居时,即时主链路断了,也可以切回到备份链路上,保持邻居不断。
  2. 可以跨越多台设备建立邻居。当一个 AS 有多个设备运行 BGP 建立域内全连接时,不必每台设备物理直连,只要用IGP保证建立邻居的地址可达,即可建立全网连接,减少不必要的链路。

路由注入及宣告

BGP路由器的路由注入和通告都是为了修改 BGP 路由表。

当路由器之间建立 BGP 邻居之后,可以相互交换 BGP 路由。一台运行了 BGP 协议的路由器,会将 BGP 得到的路由与普通的路由分开存放,所以 BGP 路由器会同时拥有两张路由表。 普通路由的称为 IGP路由表,用 show ip route 就能看到的路由表。IGP路由表的路由信息只能从 IGP 协议和手工配置获得,并且只能传递给 IGP 协议; 另一张是 BGP路由表,用命令 show ip bgp 查看。

初始状态下,BGP的路由表为空,没有任何路由,要让 BGP 传递相应的路由,只能先将该路由注入BGP路由表,之后才能在BGP邻居之间传递。注入的方式:

  1. 动态注入
  2. 半动态路由注入
  3. 静态路由注入

在注入路由后, BGP 路由器之间会进行通告。通告要遵守以下规则:

  • BGP 路由器只把自己使用的路由通告给相邻体
  • BGP 路由器从 EBGP 获得的路由会向所有BGP相邻体通告
  • 从 IBGP 获得的路由不会向 IBGP 相邻体通告
  • 从 IBGP 获得的路由是否通告给 EBGP 相邻体要依 IGP 和 BGP 同步的情况而定。

检查 BGP 的命令:

bgp4

IGP (内部网关协议)

在 AS 内部的协议,主要包括 RIP协议OSPF协议

RIP

距离向量协议,UDP协议,端口号为 520。

工作过程:

  1. RIP 路由器中初始的路由表只有自己的直连路由;路由表中每一项为一个三元组,即目标网络,该条路由信息的下一条地址以及距离;距离定义为经过的路由器数。
  2. 每个路由器发起自己的更新周期,将自己的路由表信息发送给相邻的路由表,接受到该路由表信息的临接路由表更新自己的路由表信息;
  3. 存在路由环路问题

OSPF(Open Shortest Path First)

使用的是链路状态路由算法,直接使用IP协议,协议类型为89.

4 - 操作网络命令

操作网络命令

Linux 下控制网络的命令:

  • curl & wget
  • ping
  • tracepath & traceroute
  • mtr
  • host
  • whois
  • ifplugstatus 是否有网线插入网络设备接口, sudo apt-get install ifplugd
  • ifconfig
  • ifdown & ifup 启用或者禁用设备
  • dhclient
  • netstat

route 命令

route 命令用于显示和操作 IP路由表。
要实现两个不同的子网之间的通信,需要一台连接两个网络的路由器,或者同时位于两个网络的网关来实现。

在Linux系统中,设置路由通常是为了解决以下问题: Linux机器在局域网中,局域网有一个网关,能够让机器访问 Internet ,那么需要将这台机器的IP地址设置为Linux机器的默认路由。 直接执行route命令来添加路由,不会永久保存。当网卡重启或者机器重启之后,该路由会失效;可以在 /etc/rc.local 中添加 route 命令来保证该路由设置永久有效。

命令参数:

  • -c 显示更多信息

  • -n 不解析名字

  • -v 显示详细的处理信息

  • -F 显示发送信息

  • -C 显示路由缓存

  • -f 清除所有网关入口的路由表

  • -p 与 add 命令一起使用时使路由具有永久性

  • add:添加一条路由

  • del:删除一条路由

  • -net:目标地址是一个网络

  • -host:目标地址是一个主机

  • netmask:当添加一个网络路由时,需要使用网络掩码

  • gw:路由数据包通过网关。注意,指定的网关必须能够达到。

  • metric:设置路由跳数

  • Command 指定想运行的命令 (Add/Change/Delete/Print)

  • Destination 该路由的网络目标

  • mask Netmask 指定与网络目标的网络掩码(子网掩码)

  • Gateway 指定网络目标定义的地址集和子网掩码可以到达的前进或者下一跳跃点 IP 地址

  • metric Metric为路由指定一个整数成本值,当在路由表的多个路由中进行选择时可以使用

实例1

$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.25.64.1     0.0.0.0         UG    0      0        0 eth0
172.25.64.0     0.0.0.0         255.255.240.0   U     0      0        0 eth0

第二行表示主机所在网络的地址为 172.25.64.0,若数据传送目标是在本局域网内通信,则可以直接通过 eth0 转发数据包; 第一行表示传送的目标是访问 Internet,则由接口 eth0 将数据包发送到网关 172.25.64.1

其中 Flags 标志说明:

  • U Up表示此路由当前为启动状态
  • H Host表示此网关为一个主机
  • G Gateway 表示网关是一个路由器
  • R Reinstate Route,使用动态路由重新初始化的路由
  • D Dynamically 此路由是动态性地写入
  • M Modified 此路由是由路由守护程序或者导向器动态修改
  • ! 表示此路由当前为关闭状态

路由工作原理

路由:数据从源主机到目标主机的转发过程(路径)。

路由器和交换机的区别:

  • 数据在同一网段的转发用交换机。
  • 数据在不同网段的转发用路由器。

路由器:能够将数据包转移到正确目的地,并在转交过程中选择最佳路径的设备。

原理

根据路由表查找接口进行数据转发,相邻的路由器接收到数据包并且查看数据包的目标地址,再转发到网络接口和对应的主机。

路由表的形成

路由表是路由器中维护的路由条目的集合,路由器根据路由表做路径选择。 路由表中有直连网段和非直连网段两种。

直连网段:路由器上配置了接口的 IP 地址,并且状态是 Up 状态,由此产生直连路由。 非直连网段:没有跟路由器直接连接的网段,就是非直连网段。

对于非直连网段,需要静态路由和动态路由,将网段添加到路由表中。

静态路由和默认路由

  • 静态路由:由管理员手工配置,优点在于稳定且可以对路由的行为进行控制,是单向的,缺乏灵活性。
  • 默认路由:当路由器在路由表中找不到目标网络的路由条目时,路由器把请求转发到默认路由接口。

当路由表中存在静态路由和默认路由的时候,静态路由优先级最高,匹配上了会立刻转发;如果没有匹配上静态路由,则按照默认路由进行转发。

命令行查看路由表

route -n
netstat -rn
ip route show dev <interface>

设置网络接口

ifconfig netmask

#eg
ifconfig eth0 192.168.1.100 netmask 255.255.255.0

ifconfig 命令已经被新的 ip 命令所替代,建议在新的系统中使用 ip 命令来管理网络接口。

#新增一个IP地址
ip addr add 192.168.1.100/24 dev eth0
#查询
ip addr show eth0
#删除
ip addr del 192.168.1.100/24 dev eth0

5 - docker 四种网络模型

  • bridge: 使用 –network bridge 指定,默认使用 docker0 ;
  • host: 使用 –network host 指定;
  • none: 使用 –network none 指定;
  • container:使用 –network container:(name/id)指定。

Docker 四种网络模型:

1. bridge 模式

Docker的默认网络设置,此模式会为每一个容器分配 Network Namespace,设置ip等,并将一个主机上的 Docker 容器连接到一个虚拟网桥上(docker0)上。

2. host 模式

启动容器时使用host模式,就不会获取一个独立的network Namespace,而是和宿主机公用一个 Network Namespace。 容器将不会虚拟出自己的网络,配置IP等,都是使用宿主机的IP和端口。

3. none 模式

在 none 模式下,Docker容器拥有自己的 Network Namespace,但是,并不为docker容器进行任何网络配置。 也就是说这个docker容器没有网卡、IP、路由等信息。

4. container

这个模式是新创建的容器和已存在的容器共享一个 Network Namespace,而不是和宿主机共享。 新创建的容器不会创建自己相关的网卡,而是和指定的容器共享Ip,端口范围等。 同样,除了网络方面。在文件系统,进程列表等方面还是资源隔离的。

常用命令

docker network -h
docker network create my-bridge -d bridge --subnet=172.21.0.0/16
docker run -d --net my-bridge --name nginx nginx

6 - dns

DNS(Domain Name System,域名系统)是因特网的一项服务,它用于将域名转换为IP地址,而域名又由各级域名服务器进行解析。

常见的DNS记录类型:

1. A记录(Address Record)

A记录用于将域名指向一个IPv4地址。每个域名可以有多个A记录,以支持负载均衡和冗余。

2. CNAME记录(Canonical Name Record)

将一个域名别名映射到另一个域名。允许多个域名指向同一个IP地址或者主机名,通常用于子域名的重定向。

3. MX记录(Mail Exchange Record)

MX记录用于指定邮件服务器的域名。MX记录包含邮件服务器的优先级。

4. NS记录(Name Server Record)

指定负责解析该域名的域名服务器。NS记录通常在域名注册商处设置。

5. CAA记录(Certification Authority Authorization Record)

CAA记录用于限制CA颁发证书的域名。指定哪些证书颁发机构(CAs)被授权为该域名颁发 SSL/TLS 证书。通过CAA记录可以防止中间人攻击和其他安全漏洞。

6. TXT记录(Text Record)

TXT记录用于存储文本信息。TXT记录可以包含任意的ASCII或UTF-8编码的文本。可以用于多用用途,如域验证、SPF记录(反垃圾邮件)、DMARC记录(邮件认证、报告和一致性)、DKIM记录(安全)等。

7. PTR记录(Pointer Record)

PTR记录用于将IP地址转换为域名。PTR记录通常由DNS服务器自动生成。

8. SOA记录(Start of Authority Record)

包含DNS区域的管理信息,如区域的原始名称服务器、区域管理员的电子邮件地址、区域的过期时间等。

9. AAAA记录(IPv6 Address Record)

用于将域名指向一个IPv6地址。每个域名可以有多个AAAA记录,以支持IPv6地址。

10. SRV记录(Service Record)

SRV记录用于指定特定服务的服务器。SRV记录包含服务的名称、协议、端口号、优先级和权重。

11. SPF记录(Sender Policy Framework Record)

SPF记录用于指定哪些邮件服务器可以发送邮件。SPF记录通常由域名注册商设置。