Network
Network
SDN(Software Defined Networking)是当前热门技术之一,目前已经普遍得到大家共识。本文整理了SDN实践中的一些基本理论和实践案例心得。
Network
Network
SDN(Software Defined Networking)是当前热门技术之一,目前已经普遍得到大家共识。本文整理了SDN实践中的一些基本理论和实践案例心得。
网络基础知识
全称 Virtual extensible local area network,是用三层协议封装的二层协议,允许第二层数据包在第三层网络上传输。通过 Overlay 技术旨在扩展 vlan, 以解决大型云计算部署中虚拟网络数量不足的问题。
默认情况下,cilium 的 BPF NodePort 实现以 SNAT 模式运行。也就是说,当节点外部流量到达且节点确定 NodePort 或者 xternallPs 服务的后端位于远程节点时,则 该节点通过执行 SNAT 代表其将请求重定向到远程后端。不需要额外的 MTU 更改,而代价是来自后端的答复。
cilium 下通过将 nodeport.mode 改成 dsr 更改此设置,使 Cilium 的 bpf nodeport实现在 dsr 模式下运行。
DSR 需要在 Native-Routing,不能再任何 tunneling 模式下工作。
express data path ,能够在网络包进入用户态直接对网络包进行过滤或者处理。XDP 依赖于 ebpf技术。
使用基于 UDP 的封装协议 vxlan 形成一个 tunnel。
优点简单,缺点是由于添加了 header,MTU过大低于本地路由。导致特定网络连接的最大吞吐率低,可以通过巨型帧缓解。
tcp: 流量控制 超时重传 拥塞控制
传输层的数据包大小超过 MSS (TCP最大报文段长度),就要将数据分块,这样即使中途有一个分块出问题,只需要重传这个分块,而不用重新发送整个数据包。 在 TCP 协议中,每个分块称为 TCP段。
网络层最常用的是IP协议,将传输层的报文作为数据部分,再加上IP包头组装成IP报文,如果报文大小超过 MTU(以太网中一般为1500字节)就会再次进行分片,得到一个即将发送到网络的IP报文。
IP地址分成的两种意义:
需要配合子网掩码才能计算出 IP地址的网络号和主机号。 如: 10.100.122.0/24 /24就是 255.255.255.0 子网掩码,二进制有24个1.
网络接口层: 生成了 IP 头部之后,接下来要交给 网络接口层 在 IP 头部的前面加上 MAC 头部,并封装成数据帧发送到网络上。
TCP报文头部格式:
IP 报文头部:
MAC 头部:
HTTP1.0 无状态、无连接
HTTP1.1 持久连接 请求管道化 增加缓存处理(新的字段如cache-control) 增加Host字段、支持断点传输等
HTTP2.0 二进制分帧 多路复用(或连接共享) 头部压缩 服务器推送
tls协议,目的是为了通过非对称加密握手协商或者交换出对称加密密钥。
尽量序言用 ECDHE 密钥交换算法替代 RSA 算法,使用 tls1.3 (简化了握手的步骤,握手只要1RTT)
证书优化
会话复用
SYN seq = clinet_isn
ACK = seq + 1 SEQ = server_isn
ACK = server_isn + 1
三次握手建立连接的主要原因是防止历史连接 初始化了连接。
网关协议
kubernetes 需要安装 CNI 网络插件进行请求通信。遇到的问题如:
路由器工作在 IP 层,其作用是根据 IP 地址将数据包传输到正确的目的地,因此路由器必须知道网络的“地图”才能正确投递,这个”地图“就是存储在路由表中的路由规则,简称路由。
根据获得路由的方式可以分为:
根据作用域不同可以分为:
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 作为传输层协议。
与其他路由协议对比:
BGP 有两种邻居,其中在同一个 AS 内的 BGP 邻居称为 IBGP(Interior BGP),不同 AS 间的邻居称为 EBGP(Exterior BGP),无论是 IBGP 或者 EBGP,上面都运行着 BGP 协议,也就是说与 BGP 路由器直连的内部路由器不一定是它的 IBGP。
注意: BGP 邻居不是自己发现的,而是手动配置的,原因是:
BGP路由器的路由注入和通告都是为了修改 BGP 路由表。
当路由器之间建立 BGP 邻居之后,可以相互交换 BGP 路由。一台运行了 BGP 协议的路由器,会将 BGP 得到的路由与普通的路由分开存放,所以 BGP 路由器会同时拥有两张路由表。 普通路由的称为 IGP路由表,用 show ip route 就能看到的路由表。IGP路由表的路由信息只能从 IGP 协议和手工配置获得,并且只能传递给 IGP 协议; 另一张是 BGP路由表,用命令 show ip bgp 查看。
初始状态下,BGP的路由表为空,没有任何路由,要让 BGP 传递相应的路由,只能先将该路由注入BGP路由表,之后才能在BGP邻居之间传递。注入的方式:
在注入路由后, BGP 路由器之间会进行通告。通告要遵守以下规则:
检查 BGP 的命令:
在 AS 内部的协议,主要包括 RIP协议 和 OSPF协议。
距离向量协议,UDP协议,端口号为 520。
工作过程:
使用的是链路状态路由算法,直接使用IP协议,协议类型为89.
Linux 下控制网络的命令:
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为路由指定一个整数成本值,当在路由表的多个路由中进行选择时可以使用
$ 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 标志说明:
路由:数据从源主机到目标主机的转发过程(路径)。
路由器和交换机的区别:
路由器:能够将数据包转移到正确目的地,并在转交过程中选择最佳路径的设备。
根据路由表查找接口进行数据转发,相邻的路由器接收到数据包并且查看数据包的目标地址,再转发到网络接口和对应的主机。
路由表是路由器中维护的路由条目的集合,路由器根据路由表做路径选择。 路由表中有直连网段和非直连网段两种。
直连网段:路由器上配置了接口的 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
Docker的默认网络设置,此模式会为每一个容器分配 Network Namespace,设置ip等,并将一个主机上的 Docker 容器连接到一个虚拟网桥上(docker0)上。
启动容器时使用host模式,就不会获取一个独立的network Namespace,而是和宿主机公用一个 Network Namespace。 容器将不会虚拟出自己的网络,配置IP等,都是使用宿主机的IP和端口。
在 none 模式下,Docker容器拥有自己的 Network Namespace,但是,并不为docker容器进行任何网络配置。 也就是说这个docker容器没有网卡、IP、路由等信息。
这个模式是新创建的容器和已存在的容器共享一个 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
DNS(Domain Name System,域名系统)是因特网的一项服务,它用于将域名转换为IP地址,而域名又由各级域名服务器进行解析。
A记录用于将域名指向一个IPv4地址。每个域名可以有多个A记录,以支持负载均衡和冗余。
将一个域名别名映射到另一个域名。允许多个域名指向同一个IP地址或者主机名,通常用于子域名的重定向。
MX记录用于指定邮件服务器的域名。MX记录包含邮件服务器的优先级。
指定负责解析该域名的域名服务器。NS记录通常在域名注册商处设置。
CAA记录用于限制CA颁发证书的域名。指定哪些证书颁发机构(CAs)被授权为该域名颁发 SSL/TLS 证书。通过CAA记录可以防止中间人攻击和其他安全漏洞。
TXT记录用于存储文本信息。TXT记录可以包含任意的ASCII或UTF-8编码的文本。可以用于多用用途,如域验证、SPF记录(反垃圾邮件)、DMARC记录(邮件认证、报告和一致性)、DKIM记录(安全)等。
PTR记录用于将IP地址转换为域名。PTR记录通常由DNS服务器自动生成。
包含DNS区域的管理信息,如区域的原始名称服务器、区域管理员的电子邮件地址、区域的过期时间等。
用于将域名指向一个IPv6地址。每个域名可以有多个AAAA记录,以支持IPv6地址。
SRV记录用于指定特定服务的服务器。SRV记录包含服务的名称、协议、端口号、优先级和权重。
SPF记录用于指定哪些邮件服务器可以发送邮件。SPF记录通常由域名注册商设置。