文章归档

扩展net_cls子系统实现端口隔离

端口隔离的目的是要严格隔离不同容器所使用的端口段。我们通过扩展内核net_cls模块来达到此目的

  1. bind端口隔离:限制bind使用的端口范围,通过net_cls.bind_port_range配置文件设置
  2. connect端口隔离:限制进程能connect的端口范围,通过net_cls.connect_port_range配置文件设置

其中bind_port_range和connect_port_range配置文件的接口定义如下:

static struct cftype ss_files[] = {   {     .name = "bind_port_range",     .read_seq_string = port_range_read,     .write_string = port_range_write,     .max_write_len = 20U,     .private = FILE_BIND,   },   {     .name = "connect_port_range",     .read_seq_string = port_range_read,     .write_string = port_range_write,     .max_write_len = 20U,     .private = FILE_CONNECT,   },   //... }

通过port_range_read/port_range_write函数来实现配置参数的读写。我们重点关注cgrp_local_port_range()函数,这个函数取得当前进程所在的cgroup能使用的端口范围段,区分于是否是bind/connect:

/** * cgrp_local_port_range - get available local port range * * @connect: select port range */ int cgrp_local_port_range(int *low, int *high, int connect) {

»» 继续阅读全文

cgroup内核实现

cgroup模块里比较重要的数据结构是:struct cgroup, struct css_set, struct cg_cgroup_link,搞清楚这三个数据结构之间的关系,基本就可以了解内核是怎么管理cgroup的了。关于cgroup的一些资料,可以参考redhat写的介绍:

>> Relationships Between Subsystems, Hierarchies, Control Groups and Tasks

»» 继续阅读全文

第 2 页,共 2 页12