一、云中网络
物理机的劣势:
1)一旦需要扩容 CPU、内存、硬盘,都需要去机房手动弄,非常麻烦
2)采购的机器往往动不动几百 G 的内存,而每个应用往往可能只需要 4 核 8G
3)一台机器,一旦一个用户不用了,给另外一个用户,那就需要重装操作系统
虚拟机的网路
- 网络共享和互通
在数据中心里面,采取的也是类似的技术,只不过都是 Linux,在每台机器上都创建网桥 br0,虚拟机的网卡都连到 br0 上,物理网卡也连到 br0 上,所有的 br0 都通过物理网卡出来连接到物理交换机上。
在这种方式下,不但解决了同一台机器的互通问题,也解决了跨物理机的互通问题,因为都在一个二层网络里面,彼此用相同的网段访问就可以了。但是当规模很大的时候,会存在问题。
你还记得吗?在一个二层网络里面,最大的问题是广播。一个数据中心的物理机已经很多了,广播已经非常严重,需要通过 VLAN 进行划分。如果使用了虚拟机,假设一台物理机里面创建 10 台虚拟机,全部在一个二层网络里面,那广播就会很严重,所以除非是你的桌面虚拟机或者数据中心规模非常小,才可以使用这种相对简单的方式。
- NAT
虚拟机是你的电脑,路由器和 DHCP Server 相当于家用路由器或者寝室长的电脑,物理网卡相当于你们宿舍的外网网口,用于访问互联网。所有电脑都通过内网网口连接到一个网桥 br0 上,虚拟机要想访问互联网,需要通过 br0 连到路由器上,然后通过路由器将请求 NAT 成为物理网络的地址,转发到物理网络。
如果是你自己登录到物理机上做个简单配置,你可以简化一下。例如将虚拟机所在网络的网关的地址直接配置到 br0 上,不用 DHCP Server,手动配置每台虚拟机的 IP 地址,通过命令 iptables -t nat -A POSTROUTING -o ethX -j MASQUERADE,直接在物理网卡 ethX 上进行 NAT,所有从这个网卡出去的包都 NAT 成这个网卡的地址。通过设置 net.ipv4.ip_forward = 1,开启物理机的转发功能,直接做路由器,而不用单独的路由器,这样虚拟机就能直接上网了。
- 隔离问题
如果一台机器上的两个虚拟机不属于同一个用户,怎么办呢?好在 brctl 创建的网桥也是支持 VLAN 功能的,可以设置两个虚拟机的 tag,这样在这个虚拟网桥上,两个虚拟机是不互通的。
但是如何跨物理机互通,并且实现 VLAN 的隔离呢?由于 brctl 创建的网桥上面的 tag 是没办法在网桥之外的范围内起作用的,于是我们需要寻找其他的方式。
有一个命令vconfig,可以基于物理网卡 eth0 创建带 VLAN 的虚拟网卡,所有从这个虚拟网卡出去的包,都带这个 VLAN,如果这样,跨物理机的互通和隔离就可以通过这个网卡来实现。
首先为每个用户分配不同的 VLAN,例如有一个用户 VLAN 10,一个用户 VLAN 20。在一台物理机上,基于物理网卡,为每个用户用 vconfig 创建一个带 VLAN 的网卡。不同的用户使用不同的虚拟网桥,带 VLAN 的虚拟网卡也连接到虚拟网桥上。
这样是否能保证两个用户的隔离性呢?不同的用户由于网桥不通,不能相互通信,一旦出了网桥,由于 VLAN 不同,也不会将包转发到另一个网桥上。另外,出了物理机,也是带着 VLAN ID 的。只要物理交换机也是支持 VLAN 的,到达另一台物理机的时候,VLAN ID 依然在,它只会将包转发给相同 VLAN 的网卡和网桥,所以跨物理机,不同的 VLAN 也不会相互通信。
二、软件定义网络(SDN)
可以这样比喻,云计算就像大家一起住公寓,要共享小区里面的基础设施,其中网络就相当于小区里面的电梯、楼道、路、大门等,大家都走,往往会常出现问题,尤其在上班高峰期,出门的人太多,对小区的物业管理就带来了挑战。
物业可以派自己的物业管理人员,到每个单元的楼梯那里,将电梯的上下行速度调快一点,可以派人将隔离健身区、景色区的栅栏门暂时打开,让大家可以横穿小区,直接上地铁,还可以派人将多个小区出入口,改成出口多、入口少等等。等过了十点半,上班高峰过去,再派人都改回来。
如果物业管理人员有一套智能的控制系统,在物业监控室里就能看到小区里每个单元、每个电梯的人流情况,然后在监控室里面,只要通过远程控制的方式,拨弄一个手柄,电梯的速度就调整了,栅栏门就打开了,某个入口就改出口了。
这就是软件定义网络(SDN)
OpenFlow 和 OpenvSwitch(SDN的实现方式)
OpenFlow 是 SDN 控制器和网络设备之间互通的南向接口协议,OpenvSwitch 用于创建软件的虚拟交换机。OpenvSwitch 是支持 OpenFlow 协议的,当然也有一些硬件交换机也支持 OpenFlow 协议。它们都可以被统一的 SDN 控制器管理,从而实现物理机和虚拟机的网络连通。
对于 OpenvSwitch 来讲,网络包到了我手里,就是一个 Buffer,我想怎么改怎么改,想发到哪个端口就发送到哪个端口。
下面我们实验一下通过 OpenvSwitch 实现 VLAN 的功能
在 OpenvSwitch 中端口 port 分两种。
在网络中,VLAN(虚拟局域网)用于将一个物理网络划分为多个逻辑网络,提供更好的管理、隔离和安全性。Open vSwitch(OVS)是一种用于管理和控制虚拟网络交换机的软件,可以实现VLAN功能。理解access port和trunk port的工作原理对于配置和管理VLAN至关重要。下面是对它们的通俗解释和举例说明:
Access Port
定义:
- Access port配置一个特定的VLAN tag。
- 从这个端口进来的网络包会被打上这个VLAN tag。
- 如果一个网络包本身带有的VLAN ID等于配置的tag,则会从这个port发出。
- 从access port发出的包不带VLAN ID。
举例:
假设你有一个Open vSwitch的端口port1,它被配置为VLAN 10的access port。
-
从port1进入的包:
- 一个无VLAN标签的包进入port1。
- OVS会给这个包打上VLAN 10的标签。
- 这个包现在是一个VLAN 10的包。
-
从port1发出的包:
- 一个带有VLAN 10标签的包从port1发出。
- OVS会移除VLAN标签,使其变为一个无标签的包。
- 这个包现在没有VLAN标签,发送到下一个目的地。
Trunk Port
定义:
- Trunk port不配置固定的VLAN tag,而是配置允许通过的VLAN ID(trunks)。
- 如果trunks为空,表示所有VLAN的包都可以通过,不限制。
- 如果trunks不为空,则只有配置的VLAN ID的包可以通过。
- Trunk port的包会保留其原有的VLAN ID。
举例:
假设你有一个Open vSwitch的端口port2,它被配置为trunk port,允许VLAN 10和VLAN 20通过。
-
从port2进入的包:
-
一个带有VLAN 10标签的包进入port2。
-
OVS检查这个包的VLAN ID,发现它在允许通过的范围内(VLAN 10和20)。
-
这个包继续保持其VLAN 10标签,传输到网络中的其他位置。
-
一个带有VLAN 30标签的包进入port2。
-
OVS检查这个包的VLAN ID,发现它不在允许通过的范围内(VLAN 10和20)。
-
这个包被丢弃,不会通过port2。
-
-
从port2发出的包:
- 一个带有VLAN 10标签的包从port2发出。
- OVS保持其VLAN 10标签,直接发送。
- 这个包到达另一个trunk port或其他设备时,仍然带有VLAN 10标签。
综合示例
假设我们有一个简单的网络,包含两个端口port1和port2,配置如下:
- port1:配置为VLAN 10的access port
- port2:配置为允许VLAN 10和VLAN 20的trunk port
-
接入设备A通过port1发送数据:
- 设备A发送一个没有VLAN标签的数据包到port1。
- OVS给这个包打上VLAN 10标签,并发送到网络中。
-
来自网络的VLAN 10包经过port2传输:
- 一个带有VLAN 10标签的数据包进入port2。
- OVS检查包的VLAN标签,发现允许通过。
- 包保持VLAN 10标签,继续传输到下一设备或端口。
-
来自网络的VLAN 30包经过port2传输:
- 一个带有VLAN 30标签的数据包进入port2。
- OVS检查包的VLAN标签,发现不允许通过。
- 包被丢弃,不会传输。
通过上述例子,可以看到access port主要用于将单个设备连接到特定的VLAN,而trunk port则用于在不同的VLAN之间传输数据,确保VLAN隔离和管理。
实验二:用 OpenvSwitch 模拟网卡绑定,连接交换机
为了高可用,可以使用网卡绑定,连接到交换机,OpenvSwitch 也可以模拟这一点。
三、云中网络安全
对于公有云上的虚拟机,我的建议是仅仅开放需要的端口,而将其他的端口一概关闭。这个时候,你只要通过安全措施守护好这个唯一的入口就可以了。采用的方式常常是用ACL(Access Control List,访问控制列表)来控制 IP 和端口。
设置好了这些规则,只有指定的 IP 段能够访问指定的开放接口,就算有个有漏洞的后台进程在那里,也会被屏蔽,黑客进不来。在云平台上,这些规则的集合常称为安全组。
当一个网络包进入机器
有了这个 Netfilter 框架就太好了,你可以在 IP 转发的过程中,随时干预这个过程,只要你能实现这些 hook 函数。
一个著名的实现,就是内核模块 ip_tables。它在这五个节点上埋下函数,从而可以根据规则进行包的处理。按功能可分为四大类:连接跟踪(conntrack)、数据包的过滤(filter)、网络地址转换(nat)和数据包的修改(mangle)。其中连接跟踪是基础功能,被其他功能所依赖。其他三个可以实现包的过滤、修改和网络地址转换。
在用户态,还有一个你肯定知道的客户端程序 iptables,用命令行来干预内核的规则。内核的功能对应 iptables 的命令行来讲,就是表和链的概念。
iptables的作用
当使用iptables时,通常会针对不同的需求和场景设置不同的规则。以下是一些针对上述提到的iptables功能的例子:
-
防火墙功能:
-
允许特定IP地址的访问:
iptables -A INPUT -s 192.168.1.100 -j ACCEPT
-
阻止特定IP地址的访问:
iptables -A INPUT -s 10.0.0.5 -j DROP
-
允许某个端口的访问,拒绝其他所有访问:
iptables -A INPUT -p tcp --dport 22 -j ACCEPT iptables -A INPUT -j DROP
-
-
网络地址转换(NAT):
-
将内部IP地址转换为外部IP地址:
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE
-
设置端口转发规则,将外部访问的某个端口转发到内部主机:
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.10:80
-
-
端口转发(Port Forwarding):
- 将外部访问的某个端口转发到内部主机的特定端口:
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.10:80
- 将外部访问的某个端口转发到内部主机的特定端口:
-
流量控制和限制:
-
限制某个IP地址的流量速率:
iptables -A INPUT -s 192.168.2.50 -m limit --limit 100/minute --limit-burst 200 -j ACCEPT
-
限制某个端口的总流量:
iptables -A INPUT -p tcp --dport 443 -m quota --quota 1000M -j ACCEPT
-
-
包过滤和监控:
-
监控特定端口的进出流量:
iptables -A INPUT -p tcp --dport 22 -j LOG --log-prefix "SSH Traffic: "
-
设置一个计数器来统计特定流量的包数量:
iptables -A INPUT -s 192.168.1.100 -p tcp --dport 80 -j ACCEPT iptables -A INPUT -s 192.168.1.100 -p tcp --dport 80 -j ACCEPT iptables -nvL
-
这些例子展示了如何使用iptables来实现防火墙、NAT、端口转发、流量控制和监控等功能。通过这些例子,可以更好地理解iptables的实际应用场景。
安全组
这些规则都可以在虚拟机里,自己安装 iptables 自己配置。但是如果虚拟机数目非常多,都要配置,对于用户来讲就太麻烦了,能不能让云平台把这部分工作做掉呢?
当然可以了。在云平台上,一般允许一个或者多个虚拟机属于某个安全组,而属于不同安全组的虚拟机之间的访问以及外网访问虚拟机,都需要通过安全组进行过滤。
我们会创建一系列的网站,都是前端在 Tomcat 里面,对外开放 8080 端口。数据库使用 MySQL,开放 3306 端口。
为了方便运维,我们创建两个安全组,将 Tomcat 所在的虚拟机放在安全组 A 里面。在安全组 A 里面,允许任意 IP 地址 0.0.0.0/0 访问 8080 端口,但是对于 ssh 的 22 端口,仅仅允许管理员网段 203.0.113.0/24 访问。
我们将 MySQL 所在的虚拟机在安全组 B 里面。在安全组 B 里面,仅仅允许来自安全组 A 的机器访问 3306 端口,但是对于 ssh 的 22 端口,同样允许管理员网段 203.0.113.0/24 访问。
这些安全组规则都可以自动下发到每个在安全组里面的虚拟机上,从而控制一大批虚拟机的安全策略。
所有从外网网口出去的,都转换成为这个 IP 地址。那又一个问题来了,都变成一个公网 IP 了,当 163 网站返回结果的时候,给谁呢,再 nat 成为哪个私网的 IP 呢?
这就是 Netfilter 的连接跟踪(conntrack)功能了。对于 TCP 协议来讲,肯定是上来先建立一个连接,可以用“源 / 目的 IP+ 源 / 目的端口”唯一标识一条连接,这个连接会放在 conntrack 表里面。当时是这台机器去请求 163 网站的,虽然源地址已经 Snat 成公网 IP 地址了,但是 conntrack 表里面还是有这个连接的记录的。当 163 网站返回数据的时候,会找到记录,从而找到正确的私网 IP 地址。
这是虚拟机做客户端的情况,如果虚拟机做服务器呢?也就是说,如果虚拟机里面部署的就是 163 网站呢?
这个时候就需要给这个网站配置固定的物理网的 IP 地址和公网 IP 地址了。这时候就需要显示的配置 Snat 规则和 Dnat 规则了。
当外部访问进来的时候,外网网口会通过 Dnat 规则将公网 IP 地址转换为私网 IP 地址,到达虚拟机,虚拟机里面是 163 网站,返回结果,外网网口会通过 Snat 规则,将私网 IP 地址转换为那个分配给它的固定的公网 IP 地址。
四、 云中的网络QoS 这一节细节没有研究
本来合租共享 WIFI,一个人狂下小电影,从而你网都上不去,是不是很懊恼?
在云平台上,也有这种现象,好在有一种流量控制的技术,可以实现QoS(Quality of Service),从而保障大多数用户的服务质量。
QoS的关键指标
带宽(Bandwidth):指网络能够提供的最大数据传输速率。
延迟(Latency):指数据包从源端到达目的端所需的时间。
抖动(Jitter):指数据包到达目的端的时间间隔的变动。
丢包率(Packet Loss):指数据包在传输过程中丢失的比例。
云中的流量控制主要通过队列进行的,队列分为两大类:无类别队列规则和基于类别的队列规则。
在云中网络 Openvswitch 中,主要使用的是分层令牌桶规则(HTB),将总的带宽在一棵树上按照配置的比例进行分配,并且在一个分支不用的时候,可以借给另外的分支,从而增强带宽利用率。
五、云中网络的隔离GRE、VXLAN 【没仔细看】
好的,让我尝试用一个简单的比喻来解释GRE和VXLAN这两种网络Overlay技术。
想象一下,你有一家大型公司,公司里有多个部门,比如销售部、市场部和研发部。每个部门都有自己的办公区域,员工们在各自的办公区域内可以互相交流。但是,有时候销售部的员工需要和市场部的员工交流,或者研发部的员工需要和市场部的员工交流。由于他们不在同一个办公区域,直接交流就不太方便。
这时候,你可以想象成每个部门是一个独立的网络(VLAN),但是由于物理空间(网络设备和端口数量)的限制,不能无限制地划分更多的独立网络。这时就需要一种方法来让不同部门的员工能够方便地交流,这就是Overlay网络技术发挥作用的地方。
GRE(Generic Routing Encapsulation Protocol)
GRE可以被看作是一种“点对点”的快递服务。就像你从一个部门给另一个部门发送一个包裹,你需要把这个包裹交给快递公司,快递公司会在包裹外面加一个外包装(封装),写上收件人和发件人的地址,然后通过他们的运输网络送到目的地。在这个例子中:
- 包裹 = 原始数据包
- 外包装 = GRE封装
- 快递公司 = 隧道(Tunnel)
- 运输网络 = 底层物理网络
GRE隧道的两端(Tunnel Endpoints)就像两个快递公司的分拣中心,负责把包裹加上外包装发送出去,或者接收包裹后去掉外包装,把原始的包裹交给正确的收件人。
VXLAN(Virtual Extensible Local Area Network)
VXLAN则可以被看作是一种更高级的快递服务,它支持“组播”的快递方式。这就像是你有一个包裹需要同时发送给多个部门的联系人。在VXLAN中:
- 包裹 = 原始数据包
- 外包装 = VXLAN封装
- 快递公司 = 隧道(Tunnel)
- 运输网络 = 底层物理网络
VXLAN的特点是可以在一个包裹上写多个收件人的地址,然后通过快递公司的网络(这里可以想象成支持组播的网络),一次性地将包裹的副本发送给所有指定的收件人。这样,即使这些收件人不在同一个物理位置,他们也能同时收到包裹。
在实际的网络环境中,GRE和VXLAN都是用来在不同网络之间创建逻辑上的连接,使得原本不能直接通信的设备能够互相通信,就像不同部门的员工能够互相交流一样。VXLAN相比于GRE,提供了更好的扩展性,可以支持更多的终端设备,并且更适合大规模的云计算环境。
六、容器网络
cgroup,也即明明整台机器有很多的 CPU、内存,而一个应用只能用其中的一部分。