为安全容器配置网络

tap设备网络支持

安全容器技术是基于Qemu VM实现的,对于物理机系统来说,安全容器就相当于是一个VM,所以安全容器可以在Neutron网络中将VM通过TAP技术接入外部网络。我们这里不需要关心TAP设备的创建和网桥对接等问题,只需要将指定的TAP设备(host已经存在)热插进pause容器的VM,并更新网卡信息即可。

相关命令行如下:

  1. 为已经启动的容器添加一个tap网卡(interface)

    1. $ cat ./test-iface.json | kata-runtime kata-network add-iface 6ec7a98 -

    其中:6ec7a98是容器ID的截断,test-infs.json是描述网卡信息的文件,举例如下:

    1. {
    2. "device": "tap-test",
    3. "name": "eth-test",
    4. "IPAddresses": [
    5. {
    6. "address": "172.16.0.3",
    7. "mask": "16"
    8. }
    9. ],
    10. "hwAddr":"02:42:20:6f:a3:69",
    11. "mtu": 1500,
    12. "vhostUserSocket":"/usr/local/var/run/openvswitch/vhost-user1",
    13. "queues":5
    14. }

    上述json文件中各个字段的含义说明如下:

    字段

    是否可选

    说明

    device

    必选

    设置网卡的主机端名字。支持字母、数字、下划线“”、“-” 以及“.”字符,必须以字母开头,且长度不超过15。需要确保同一个宿主机上device不能重复。

    name

    必选

    设置网卡的容器内名称。支持字母、数字、下划线“”、“-” 以及“.”字符,必须以字母开头,且长度不超过15。需要确保同一个Sandbox内name不能重复。

    IPAddresses

    可选

    设置网卡的IP地址。暂时支持一张网卡配置一个IP,如果不配置IP,则不会在容器内部配置IP。

    hwAddr

    必选

    设置网卡的mac地址值。

    mtu

    必选

    设置网卡的mtu值。允许范围为[46, 9600]之间

    vhostUserSocket

    可选

    设置dpdk轮询socket路径。路径最大长度128字节,命名规则支持数字、字母、“-”。必须以字母开头。

    queues

    可选

    设置网卡多队列的队列数目。如果不配置,默认为0。

    kata-runtime kata-network add-iface添加网卡命令执行返回结果说明:

    • 命令执行成功:从命令的标准输出返回json格式插入网卡的信息,json格式内容和传入的网卡信息相同。

      例如:

      1. $ kata-runtime kata-network add-iface <container-id> net.json
      2. {"device":"tap_test","name":"eth-test","IPAddresses":[{"Family":2,"Address":"173.85.100.1","Mask":"24"}],"mtu":1500,"hwAddr":"02:42:20:6e:03:01","pciAddr":"01.0/00"}
    • 命令执行失败:从命令的标准输出返回字符串null。

      例如:

      1. $ kata-runtime kata-network add-iface <container-id> netbad.json 2>/dev/null
      2. null

    为安全容器配置网络 - 图1 说明:
    当网卡添加成功时,如果为其指定了IP地址,则kata会为新添加的网卡添加一条destination为同网段地址的默认路由,如上例中添加网卡之后容器内有如下路由被添加:

    1. [root@6ec7a98 /]# ip route
    2. 172.16.0.0/16 dev eth-test proto kernel scope link src 172.16.0.3
  2. 列出已经添加的网卡

    1. $ kata-runtime kata-network list-ifaces 6ec7a98
    2. [{"name":"eth-test","mac":"02:42:20:6f:a3:69","ip":["172.16.0.3/16"],"mtu":1500}]

    可以查询到我们刚才添加的网卡信息。

    kata-runtime kata-network list-ifaces列出已添加网卡命令执行返回结果说明:

    • 命令执行成功:从命令的标准输出返回json格式的Pod中所有插入网卡的信息。

      如果Pod中插入了多个网卡设备,返回的是一个json数组格式的网卡信息

      1. $ kata-runtime kata-network list-ifaces <container-id>
      2. [{"name":"container_eth","mac":"02:42:20:6e:a2:59","ip":["172.17.25.23/8"],"mtu":1500},{"name":"container_eth_2","mac":"02:90:50:6b:a2:29","ip":["192.168.0.34/24"],"mtu":1500}]

      如果Pod中没有插入任何网卡设备,从命令的标准输出返回字符串null。

      1. $ kata-runtime kata-network list-ifaces <container-id>
      2. null
    • 命令执行失败:从命令的标准输出返回字符串null,从命令的标准错误输出返回错误描述信息。

      例如:

      1. $ kata-runtime kata-network list-ifaces <container-id>
      2. null
  3. 为指定网卡添加一条路由

    1. $ cat ./test-route.json | kata-runtime kata-network add-route 6ec7a98 -
    2. [{"dest":"default","gateway":"172.16.0.1","device":"eth-test"}]

    kata-runtime kata-network add-route为指定网卡添加一条路由命令执行返回结果说明:

    • 命令执行成功:从命令的标准输出返回json格式的添加的路由信息。

      例如:

      1. $ kata-runtime kata-network add-route <container-id> route.json
      2. [{"dest":"177.17.0.0/24","gateway":"177.17.25.1","device":"netport_test_1"}]
    • 命令执行失败:从命令的标准输出返回字符串null,从命令的标准错误输出返回错误描述信息。

      例如:

      1. $ kata-runtime kata-network add-route <container-id> routebad.json 2>/dev/null
      2. null

    字段说明如下:

    • dest:设置路由对应的网段。格式为/必选。分如下3种情况:

      1. 配置/
      2. 只配置,则默认掩码为32;
      3. 若配置了”dest”:”default”,默认无dest,需传入gateway。
    • gateway:设置路由的下一跳网关。设置”dest”:”default”时,gateway必选;其他情况可选。

    • device:必选。设置路由对应的网卡名称,最长支持15字符。

    为安全容器配置网络 - 图2 说明:
    如果为容器内的回环设备lo添加路由时,路由配置文件中的”device”字段对应的设备名称为”lo”。

  4. 删除指定路由

    1. $ cat ./test-route.json | kata-runtime kata-network del-route 6ec7a98 -

    test-route.json字段与添加路由输入json文件的字段相同。

    kata-runtime kata-network del-route删除指定路由命令执行返回结果说明:

    • 命令执行成功:从命令的标准输出返回json格式的添加的路由信息。

      例如:

      1. $ kata-runtime kata-network del-route <container-id> route.json
      2. [{"dest":"177.17.0.0/24","gateway":"177.17.25.1","device":"netport_test_1"}]
    • 命令执行失败:从命令的标准输出返回字符串null,从命令的标准错误输出返回错误描述信息。

      例如:

      1. $ kata-runtime kata-network del-route <container-id> routebad.json 2>/dev/null
      2. null

    为安全容器配置网络 - 图3 说明:

    • 输入字段中dest为必选,device/gateway均为可选。kata根据不同字段进行模糊匹配,删除对应的路由规则。例如指定了dest为某个IP,则所有该IP的规则都会被删除。
    • 如果删除的是容器内回环设备lo的路由时,路由配置文件中的”device”字段对应的设备名称为”lo”。
  5. 删除已经添加的网卡

    1. $ cat ./test-iface.json | kata-runtime kata-network del-iface 6ec7a98 -

    为安全容器配置网络 - 图4 说明:
    删除网卡时,仅根据网卡容器内名称(name字段)来删除。即便填写其他字段,kata也不会使用。

    kata-runtime kata-network del-iface删除网卡命令执行返回结果说明:

    • 命令执行成功:从命令标准输出返回null字符串。

      例如:

      1. $ kata-runtime kata-network del-iface <container-id> net.json
      2. null
    • 命令执行失败:从命令标准输出返回删除失败网卡json格式的信息,从命令的标准错误输出返回错误描述信息。

      例如:

      1. $ kata-runtime kata-network del-iface <container-id> net.json
      2. {"device":"tapname_fun_012","name":"netport_test_1","IPAddresses":[{"Family":0,"Address":"177.17.0.1","Mask":"8"}],"mtu":1500,"hwAddr":"02:42:20:6e:a2:59","linkType":"tap"}

以上为常用场景和命令行示例,具体命令行接口“附录 > 接口列表”。

kata IPVS子系统

安全容器提供添加ipvs命令的接口,支持对容器设置ipvs规则。功能包含对虚拟服务的添加/编辑/删除、对真实服务器的添加/编辑/删除、查询ipvs服务信息、设置连接超时、清理系统连接缓存,并支持对规则的批量导入。

  1. 为容器添加一个虚拟服务地址

    1. kata-runtime kata-ipvs ipvsadm --parameters "--add-service --tcp-service 172.17.0.7:80 --scheduler rr --persistent 3000" <container-id>
  2. 修改容器虚拟服务参数

    1. kata-runtime kata-ipvs ipvsadm --parameters "--edit-service --tcp-service 172.17.0.7:80 --scheduler rr --persistent 5000" <container-id>
  3. 删除容器虚拟服务地址

    1. kata-runtime kata-ipvs ipvsadm --parameters "--delete-service --tcp-service 172.17.0.7:80" <container-id>
  4. 为虚拟服务地址添加一个真实服务器

    1. kata-runtime kata-ipvs ipvsadm --parameters "--add-server --tcp-service 172.17.0.7:80 --real-server 172.17.0.4:80 --weight 100" <container-id>
  5. 修改容器真实服务器参数

    1. kata-runtime kata-ipvs ipvsadm --parameters "--edit-server --tcp-service 172.17.0.7:80 --real-server 172.17.0.4:80 --weight 200" <container-id>
  6. 删除容器真实服务器

    1. kata-runtime kata-ipvs ipvsadm --parameters "--delete-server --tcp-service 172.17.0.7:80 --real-server 172.17.0.4:80" <container-id>
  7. 查询服务信息

    1. kata-runtime kata-ipvs ipvsadm --parameters "--list" <container-id>
  8. 逐条导入耗时太久,可将规则写入文件后,批量导入

    1. kata-runtime kata-ipvs ipvsadm --restore - < <规则文件路径> <container-id>

    为安全容器配置网络 - 图5 说明:
    单条添加时默认使用NAT模式,批量导入时添加真实服务器需手动添加-m参数使用NAT模式。
    规则文件内容示例:
    -A -t 10.10.11.12:100 -s rr -p 3000
    -a -t 10.10.11.12:100 -r 172.16.0.1:80 -m
    -a -t 10.10.11.12:100 -r 172.16.0.1:81 -m
    -a -t 10.10.11.12:100 -r 172.16.0.1:82 -m

  9. 清理系统连接缓存

    1. kata-runtime kata-ipvs cleanup --parameters "--orig-dst 172.17.0.4 --protonum tcp" <container-id>
  10. 为tcp/tcpfin/udp连接设置超时

    1. kata-runtime kata-ipvs ipvsadm --parameters "--set 100 100 200" <container-id>

    为安全容器配置网络 - 图6 说明:

    1. 每个容器支持iptables规则数量最大为20000条(5k service,3个server/service),add-service和add-server都算作规则。
    2. 批量导入前需清空已有规则。
    3. 不存在并发测试场景。
    4. 以上为常用命令示例,具体命令行接口请参见“附录 > 接口列表”。