一、基础知识
1.tap与tun
tap与tun都是操作系统(Linux)内核中的虚拟网络设备,等同于一个以太网设备,可以收发数据报文包。
tap与tun的定义相同,两者仅仅是通过一个Flag来区分。但二者所承担的功能差别较大:tap位于网络OSI模型的二层,tun位于网络的三层。
tap位于数据链路层,可以处理数据链路层的数据包,拥有 MAC 地址,可以与物理网卡做 bridge,支持 MAC 层广播,也可以给它设置 IP 地址。
tun是一个网络层(IP)的点对点设备,它启用了IP层隧道功能。通过它可以处理来自网络层的数据包,也就是 IP 数据包。由于它只模拟到了 IP 层,所以它无法与物理网卡做 bridge,也没有 MAC 地址,但是可以通过三层交换的方式来与物理网卡相互通信。
2.Namespace
Namespace提供了一种内核级别隔离系统资源的方法,通过将系统的全局资源放在不同的Namespace中,来实现资源隔离的目的。不同Namespace的程序,可以享有一份独立的系统资源。
目前Linux中提供了六类系统资源的隔离机制,分别是:
- **Mount:**隔离文件系统挂载点
- **UTS:**隔离主机名和域名信息
- **IPC:**隔离进程间通信
- **PID:**隔离进程的ID
- **Network:**隔离网络资源
- **User:**隔离用户和用户组的ID
3.veth pair
veth pair是一对设备,用于连接两个虚拟以太端口。
使用veth pair可以实现两个Namespace的互通,当三个及以上Namespcae之间想要实现互通,由于veth par只有一对tap无法胜任,则需要用到Bridge/Switch。
4.Bridge
在Linux的语境里,Bridge(网桥)与Switch(交换机)是一个概念。
Bridge是用纯软件实现的虚拟交换机,有着和物理交换机相同的功能,例如二层交换,MAC地址学习等。因此我们可以把tun/tap,veth pair等设备绑定到网桥上,就像是把设备连接到物理交换机上一样。
5.iptables
iptables是一个运行在用户空间的命令行工具,通过iptables相关命令可以实现防火墙、NAT等安全防护功能,但需注意真正实现这些功能的是运行在内核空间的netfilter模块
iptables内置了三张表:filter、nat和mangle。分别对应了防火墙、NAT、流量整形三种功能。
6.Firewall
iptables中的Firewall(防火墙)概念,属于网络防火墙的概念,iptables中的防火墙的规则就是基于TCP/IP协议栈的规则,所以我们称之为网络防火墙。
这些规则有:
- in-interface(入网络接口名),数据包从哪个网络接口进入;
- out-interface(出网络接口名),数据包从哪个网络接口输出;
- protocol(协议类型),数据包的协议,如TCP、UDP和ICMP等;
- source(源地址(或子网)),数据包的源IP地址(或子网);
- destination(目标地址(或子网)),数据包的目标IP地址(或子网);
- sport(源端口号),数据包的源端口号;
- dport(目的端口号),数据包的目的端口号。
7.NAT
NAT(Network Address Translation,网络地址转换),功能是将一个IP地址转换为另一个IP地址。发明NAT根本原因还是IP地址不够用的问题(另一种解决方法是IPv6)。大家使用NAT基本做的还是公网地址与私网地址的互相转换;如果一定要在公网地址之间互相转换,或者私网地址之间互相转换,技术上是支持的,只是这样的场景非常非常少。
NAT从实现技术角度来说,分为:静态NAT、动态NAT、端口多路复用三种方案。
7.1 静态NAT
私网IP地址与公网IP地址的转换规则是静态指定的,固定不变,比如10.10.10.1与192.168.10.1互相转换。
私网IP地址与公网IP地址的数量比是1∶1
7.2 动态NAT
动态NAT中私网IP与公网IP地址之间不是固定的转换关系,而是在IP报文处理过程中由NAT模块进行动态匹配。虽然,公网IP比私网IP地址少,但是,同时在线的私网IP需求小于等于公网IP数量,不然某些私网IP将得不到正确的转换,从而导致网络通信失败。
私网IP地址与公网IP地址的数量比是m∶n,一般m < n
7.3 端口多路复用
如果私网IP地址有多个,而公网IP地址只有一个,那么静态NAT与动态NAT都无法满足IP使用,就需要用到端口多路复用。多个私网IP映射到同一个公网IP,不同的私网IP利用端口号进行区分,这里的端口号指的是TCP/UDP端口号。所以端口复用又叫PAT(Port Address Translation)。
私网IP地址与公网IP地址的数量比是m∶1
7.4 SNAT/DNAT
SNAT(Source Network Address Translation,源地址转换)
内部地址要访问公网上的服务时(如Web访问),内部地址会主动发起连接,由路由器或者防火墙上的网关对内部地址做个地址转换,将内部地址的私有IP转换为公网的公有IP,网关的这个地址转换称为SNAT,主要用于内部共享IP访问外部。
DNAT(Destination Network Address Translation,目的地址转换)
当内部需要提供对外服务时(如对外发布Web网站),外部地址发起主动连接,由路由器或者防火墙上的网关接收这个连接,然后将连接转换到内部,此过程是由带有公网IP的网关替代内部服务来接收外部的连接,然后在内部做地址转换,此转换称为DNAT,主要用于内部服务对外发布。
8.mangle
mangle表主要用于修改数据包的ToS(Type of Service,服务类型)、TTL(Time to Live,生存周期)以及为数据包设置Mark标记,以实现QoS(Quality of Service,服务质量)调整以及策略路由等应用。
9.内核态、用户态、卸载态
主机采用不同的态模式,对网络而言内部流量略有不同,简单来说,linux内部空间分为内核空间和用户空间,内核态即为运行在内核空间的进程的状态,用户态即为运行在用户空间的状态。
内核态、用户态是操作系统的概念,卸载态是网卡概念,网卡offload机制。简单说主要是指将原本在协议栈中进行的IP分片、TCP分段、重组、checksum校验等操作,转移到网卡硬件中进行,降低系统CPU的消耗,提高处理性能。