linux内核网络子系统

来源:互联网 发布:如何看淘宝价格曲线 编辑:程序博客网 时间:2024/06/05 11:05
linux内核协议栈有哪些表?
     《linux内核协议栈源代码剖析》中特地强调了Route表与ARP表。arp命令操作arp表,这张表用于网段内的邻居,通过socket下发配置。route命令操作路由表,通过socket下发命令。ifconfig命令配置主机IP、端口、hostname等本机配置,也是通过socket下发命令。
     但注意这些是2.6内核以前的网络子系统,2.6内核之后网络子系统做了很大的改进,除了上述的网络模块之外,还增加了如下所说的功能,下述的功能代码如何实现还是要继续研究。


隧道、流量控制等功能如何实现?
     例如GRE、VXLAN这样的隧道主要通过内核加载模块来实现相关的功能,而这个加载模块也主要通过操作netdev结构实现功能。
     以OVS中的vxlan模块为例,在使用这个功能之前需要先安装vxlan.mod模块(忘了名字了),然后才可以下发vxlan功能。
     TC是linux内核自带的流量控制系统,不需要mod加载就可以使用,与RFC中描述一样,可以用于端口与队列。操作TC的工具可以使用新版iptables。


哪里获得这些功能?
     2.2以上linux内核提供的网络子系统中,包含了这三大部分功能:路由表与邻居表、可用于防火墙的Policy与iptable、流量整形TC。
     与旧版内核通过socket下发配置不同,新版内核通过netlink下发配置到内核,大体上来讲,netlink通过command方式下发配置,包括TC在内的所有新版网络功能都是用过netlink下发到内核。
     命令行方面,过去通过arp、ifconfig、route命令分别配置的功能在新版中使用ip命令同一配置了。


策略路由与多表?
     策略路由是将policy用于路由,可以实现QoS和防火墙等功能,在配置编译内核时候选择(IP: advanced router)。多表是虚拟路由实现,即多张路由表,根据策略,不同traffic使用不同的虚拟路由,在配置内核时选择(IP: Policy Routing)。
     这两个配合使用可以实现简单的源策略路由,通过配置用户定义的路由表,可以实现简单的策略路由、多ISP上连、通过定义weight实现负载均衡,见文档。


linux内核多表?
     参考(http://www.bkjia.com/xtzh/833906.html),linux内核多表支持256张,其中0号表表示未指定(unspec),253、254、255表示default、main、local,其余全部留给客户使用。unspec是所有表中route的集合,对于route可以增删查改,同时会影响到route所在的表,不要轻易清空。其余所有表都可以随意配置路由,没有级联或者从属关系,但是约定main是使用route等命令时候不指定表时候添加的目的表,其余的表中添加路由时候都要指定表名。同时由于所有表中路由要总和到unspec中,故路由不要重复。路由有LPM等概念,在同一张表中,如果包匹配到多个路由,使用哪个路由表项可以通过LPM解决。如果在多张表中匹配到,那么如何动作参考alexey关于ip-cref文档。
     一般约定,main中是系统添加的路由,local是本机所在子网的路由。字段含义参考(https://gist.github.com/batmancn/d7d47f7c97c9c735b2a8)或者(http://www.study-area.org/tips/adv-route/Adv-Routing-HOWTO-4.html)。


隧道设备?
     linux内核默认支持三种隧道设备,IPinIP、GRE、非内核隧道(例如PPTP,在用户层实现封装与解包)。另外也可以自定义其他隧道,例如VxLan,通过加载内核模块实现相关的功能。
     如何挖隧道:从两头开始挖;选择一种tunnel;最终在中间节点通过路由实现。


IPSEC?
     一种比较正规的IPSEC实现是FreeS/WAN,但是没有合并到linux内核代码中。linux内核代码中的IPSEC是CrypoAPI,2.5以上内核。具体使用方式见文档。
     

多播路由?
     编译内核模块时候需要选择相应的选项以支持多播路由,但是多播路由还是作为linux user mode程序做的,只需要内核支持即可。上层使用的多播路由一般有四中:DVMRP(RIP协议多播版,也就是算法与RIP一样,只是学习的路由是多播路由),MOSPF(OSPF的多播版),PIM-SM、PIM-DM。
     4中多播路由都要求内核启用(multicast与multicast routing),如果想使用PIM还需要启用PIMv1或者PIMv2。然后上层ip命令多了IGMP选项。具体配置见文档。


带宽管理?
     也就是QoS,可以见前述的文档,主要通过TC命令及其相应的模块实现,无法对接收数据限速,只能对发送数据限速。具体实现时候是在netdev将发送数据push到网卡队列之前增加了一层功能,这些功能通过调整报文进入发送队列顺序、丢弃报文、延迟报文进入队列时间等方式实现带宽管理。


分类队列?
     分类队列也就是class+qdisc。


可以对报文进行分类的高级过滤器?
     像之前那个文档里面说明的一样,filter可以连接class与qdisc,主要功能是对traffic进行分类然后赋予相应的QoS规则。有几个预先定义好的filter,主要是根据某些字段、或者前面的某些模块对报文的修改(例如防火墙)进行分类。


netfilter与iproute?
     有一张图显示了插入点。另外这里除了修改包头之外还可以使用--set-mark机制给数据包带metedata。
     一般这两种功能用来实现防火墙、标记策略,让后面路由或者其他模块使用。


IP反向过滤?
     规范中规定的IP反向过滤是安全的一种机制,即request报文的response应该从request出去的端口回来,放到这里就是网卡。在芯片中,反向过滤是在L3表中,通过比较response的源IP地址来进行过滤,但是在linux内核中不知道是不是这样做。文档中写了开启与关闭反向过滤功能。


有关ip的内核参数?
     在/proc/sys/net/ipv4/文件夹下有ipv4相关设置文件(内核使用文件管理这些配置),具体配置参见文档。
     在/proc/sys/net/ipv4/conf文件夹下有网卡的设置。
     在/proc/sys/net/ipv4/neigh/文件夹下有邻居策略的设置。
     在/proc/sys/net/ipv4/route/文件夹下有路由策略的设置,例如如何让内核刷新路由缓冲。


方便菜谱?
     就是模板化的内核配置,用来解决一类问题,一些上层应用会用到这些,例如Apache。在文档中有这些配置方法。


linux bridge?
     linux网桥,L2层,不支持iptables、NAT、tc filter。
     伪网桥,报文依然能够通过linux内核。
0 0
原创粉丝点击