jackadmi 2020-06-27
3 Namespace
Namespace类似传统网络里的VRF,与VRF不同的是:VRF做的是网络层三层隔离。而namespace隔离的更彻底,它做的是整个协议栈的隔离,隔离的资源包括:UTS(UnixTimesharing System的简称,包含内存名称、版本、 底层体系结构等信息)、IPS(所有与进程间通信(IPC)有关的信息)、mnt(当前装载的文件系统)、PID(有关进程ID的信息)、user(资源配额的信息)、net(网络信息)。
从网络角度看一个namespace提供了一份独立的网络协议栈(网络设备接口、IPv4/v6、IP路由、防火墙规则、sockets等),而一个设备(Linux Device)只能位于一个namespace中,不同namespace中的设备可以利用vethpair进行桥接。
4 veth pair
veth pair不是一个设备,而是一对设备,以连接两个虚拟以太端口。操作vethpair,需要跟namespace一起配合,不然就没有意义。如图
5 Bridge
在Linux的语境里,Bridge(网桥)与Switch(交换机)是一个概念。因为一对veth pair只能连接两台device,因此如果需要多台设备互联则需要bridge。
如图:4个namespace,每个namespace都有一个tap,每个tap与网桥vb1的tap组成一对veth pair,这样,这4个namespace就可以二层互通了。
6 Router
Linux创建Router并没有像创建虚拟Bridge那样,有一个直接的命令brctl,而且它间接的命令也没有,不能创建虚拟路由器……因为它就是路由器(Router) !
如图:我们需要在router(也就是我们的操作系统linux上增加去往各NS的路由)。
7 tun
tun是一个网络层(IP)的点对点设备,它启用了IP层隧道功能。Linux原生支持的三层隧道。支持隧道情况:ipip(ipv4 in ipv4)、gre(ipv4/ipv6 over ipv4)、sit(ipv6 over ipv4)、isatap(ipv6/ipv4隧道)、vti(ipsec接口)。
学过传统网络GRE隧道的人更容易理解,如图:
NS1的tun1的ip 10.10.10.1与NS2的tun2的ip 10.10.20.2建立tun
NS1的tun的ip是10.10.10.1,隧道的外层源ip是192.168.1.1,目的ip是192.168.2.1,是不是跟GRE很像。
8 iptable
我们通常把iptable说成是linux的防火墙,实际上这种说法并不准确。实际上iptable只是一个运行在用户空间的命令行工具,真正实现防火墙功能的是内核空间的netfilter模块。
这里我们先知道防火墙执行模块netfilter位于内核空间,命令行iptable位于用户空间。我们在通过iptable配置的防火墙策略(包括NAT)会在netfilter执行。
iptables有5个链:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
? PREROUTING:报文进入网络接口尚未进入路由之前的时刻;
? INPUT:路由判断是本机接收的报文,准备从内核空间进入到用户空间的时刻;
? FORWARD:路由判断不是本机接收的报文,需要路由转发,路由转发的那个时刻;
? OUTPUT:本机报文需要发出去 经过路由判断选择好端口以后,准备发送的那一刻;
? POSTROUTING:FORWARD/OUTPUT已经完成,报文即将出网络接口的那一刻。
DNAT用的是PREROUTING,修改的是目的地址,SNAT用的是POSTROUTING,修改的是源地址。
Iptable有5个表:filter,nat,mangle,raw, security,raw表和security表不常用。主流文档都是说5链4表,没有包括security表。
? Raw表——决定数据包是否被状态跟踪机制处理
? Mangle表——修改数据包的服务类型、TTL、并且可以配置路由实现QOS
? Nat表——用于网络地址转换(IP、端口)
? filter表——过滤数据包
? security 表(用于强制访问控制网络规则,例如:SELinux)
4个表的优先级由高到低的顺序为:raw-->mangle-->nat-->filter。RAW表,在某个链上,RAW表处理完后,将跳过NAT表和 ip_conntrack处理,即不再做地址转换和数据包的链接跟踪处理了。RAW表可以应用在那些不需要做nat的情况下,以提高性能。如大量访问的web服务器,可以让80端口不再让iptables做数据包的链接跟踪处理,以提高用户的访问速度。
下面讲下数据包流向与处理: