# 为安全容器配置网络<a name="ZH-CN_TOPIC_0216616133"></a>

## tap设备网络支持<a name="zh-cn_topic_0182219836_section25241548181515"></a>

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

相关命令行如下：

1.  **为已经启动的容器添加一个tap网卡（interface）**

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

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

    ```
    {
        "device": "tap-test", 
        "name": "eth-test", 
        "IPAddresses": [
            {
                "address": "172.16.0.3", 
                "mask": "16"
            }
        ], 
        "hwAddr":"02:42:20:6f:a3:69",
        "mtu": 1500,
        "vhostUserSocket":"/usr/local/var/run/openvswitch/vhost-user1",
        "queues":5
    }
    ```

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

    <a name="zh-cn_topic_0182219836_table19254101817513"></a>
    <table><thead align="left"><tr id="zh-cn_topic_0182219836_row1254161815116"><th class="cellrowborder" valign="top" width="20.14%" id="mcps1.1.4.1.1"><p id="zh-cn_topic_0182219836_p1254171865115"><a name="zh-cn_topic_0182219836_p1254171865115"></a><a name="zh-cn_topic_0182219836_p1254171865115"></a>字段</p>
    </th>
    <th class="cellrowborder" valign="top" width="20.68%" id="mcps1.1.4.1.2"><p id="zh-cn_topic_0182219836_p5437983523"><a name="zh-cn_topic_0182219836_p5437983523"></a><a name="zh-cn_topic_0182219836_p5437983523"></a>是否可选</p>
    </th>
    <th class="cellrowborder" valign="top" width="59.18%" id="mcps1.1.4.1.3"><p id="zh-cn_topic_0182219836_p162548181514"><a name="zh-cn_topic_0182219836_p162548181514"></a><a name="zh-cn_topic_0182219836_p162548181514"></a>说明</p>
    </th>
    </tr>
    </thead>
    <tbody><tr id="zh-cn_topic_0182219836_row125471810511"><td class="cellrowborder" valign="top" width="20.14%" headers="mcps1.1.4.1.1 "><p id="zh-cn_topic_0182219836_p12254718115115"><a name="zh-cn_topic_0182219836_p12254718115115"></a><a name="zh-cn_topic_0182219836_p12254718115115"></a>device</p>
    </td>
    <td class="cellrowborder" valign="top" width="20.68%" headers="mcps1.1.4.1.2 "><p id="zh-cn_topic_0182219836_p1343710819525"><a name="zh-cn_topic_0182219836_p1343710819525"></a><a name="zh-cn_topic_0182219836_p1343710819525"></a>必选</p>
    </td>
    <td class="cellrowborder" valign="top" width="59.18%" headers="mcps1.1.4.1.3 "><p id="zh-cn_topic_0182219836_p925431811516"><a name="zh-cn_topic_0182219836_p925431811516"></a><a name="zh-cn_topic_0182219836_p925431811516"></a>设置网卡的主机端名字。支持字母、数字、下划线“_”、“-” 以及“.”字符，必须以字母开头，且长度不超过15。需要确保同一个宿主机上device不能重复。</p>
    </td>
    </tr>
    <tr id="zh-cn_topic_0182219836_row1254141812511"><td class="cellrowborder" valign="top" width="20.14%" headers="mcps1.1.4.1.1 "><p id="zh-cn_topic_0182219836_p4254111855111"><a name="zh-cn_topic_0182219836_p4254111855111"></a><a name="zh-cn_topic_0182219836_p4254111855111"></a>name</p>
    </td>
    <td class="cellrowborder" valign="top" width="20.68%" headers="mcps1.1.4.1.2 "><p id="zh-cn_topic_0182219836_p64371689527"><a name="zh-cn_topic_0182219836_p64371689527"></a><a name="zh-cn_topic_0182219836_p64371689527"></a>必选</p>
    </td>
    <td class="cellrowborder" valign="top" width="59.18%" headers="mcps1.1.4.1.3 "><p id="zh-cn_topic_0182219836_p11254161855115"><a name="zh-cn_topic_0182219836_p11254161855115"></a><a name="zh-cn_topic_0182219836_p11254161855115"></a>设置网卡的容器内名称。支持字母、数字、下划线“_”、“-” 以及“.”字符，必须以字母开头，且长度不超过15。需要确保同一个Sandbox内name不能重复。</p>
    </td>
    </tr>
    <tr id="zh-cn_topic_0182219836_row152541118155116"><td class="cellrowborder" valign="top" width="20.14%" headers="mcps1.1.4.1.1 "><p id="zh-cn_topic_0182219836_p112540187516"><a name="zh-cn_topic_0182219836_p112540187516"></a><a name="zh-cn_topic_0182219836_p112540187516"></a>IPAddresses</p>
    </td>
    <td class="cellrowborder" valign="top" width="20.68%" headers="mcps1.1.4.1.2 "><p id="zh-cn_topic_0182219836_p4437984520"><a name="zh-cn_topic_0182219836_p4437984520"></a><a name="zh-cn_topic_0182219836_p4437984520"></a>可选</p>
    </td>
    <td class="cellrowborder" valign="top" width="59.18%" headers="mcps1.1.4.1.3 "><p id="zh-cn_topic_0182219836_p1254151812510"><a name="zh-cn_topic_0182219836_p1254151812510"></a><a name="zh-cn_topic_0182219836_p1254151812510"></a>设置网卡的IP地址。暂时支持一张网卡配置一个IP，如果不配置IP，则不会在容器内部配置IP。</p>
    </td>
    </tr>
    <tr id="zh-cn_topic_0182219836_row11367141719564"><td class="cellrowborder" valign="top" width="20.14%" headers="mcps1.1.4.1.1 "><p id="zh-cn_topic_0182219836_p4368517175610"><a name="zh-cn_topic_0182219836_p4368517175610"></a><a name="zh-cn_topic_0182219836_p4368517175610"></a>hwAddr</p>
    </td>
    <td class="cellrowborder" valign="top" width="20.68%" headers="mcps1.1.4.1.2 "><p id="zh-cn_topic_0182219836_p13368417205615"><a name="zh-cn_topic_0182219836_p13368417205615"></a><a name="zh-cn_topic_0182219836_p13368417205615"></a>必选</p>
    </td>
    <td class="cellrowborder" valign="top" width="59.18%" headers="mcps1.1.4.1.3 "><p id="zh-cn_topic_0182219836_p16368111710561"><a name="zh-cn_topic_0182219836_p16368111710561"></a><a name="zh-cn_topic_0182219836_p16368111710561"></a>设置网卡的mac地址值。</p>
    </td>
    </tr>
    <tr id="zh-cn_topic_0182219836_row9462132017562"><td class="cellrowborder" valign="top" width="20.14%" headers="mcps1.1.4.1.1 "><p id="zh-cn_topic_0182219836_p12462142045618"><a name="zh-cn_topic_0182219836_p12462142045618"></a><a name="zh-cn_topic_0182219836_p12462142045618"></a>mtu</p>
    </td>
    <td class="cellrowborder" valign="top" width="20.68%" headers="mcps1.1.4.1.2 "><p id="zh-cn_topic_0182219836_p6462120115613"><a name="zh-cn_topic_0182219836_p6462120115613"></a><a name="zh-cn_topic_0182219836_p6462120115613"></a>必选</p>
    </td>
    <td class="cellrowborder" valign="top" width="59.18%" headers="mcps1.1.4.1.3 "><p id="zh-cn_topic_0182219836_p164629208564"><a name="zh-cn_topic_0182219836_p164629208564"></a><a name="zh-cn_topic_0182219836_p164629208564"></a>设置网卡的mtu值。允许范围为[46, 9600]之间</p>
    </td>
    </tr>
    <tr id="zh-cn_topic_0182219836_row16336324105610"><td class="cellrowborder" valign="top" width="20.14%" headers="mcps1.1.4.1.1 "><p id="zh-cn_topic_0182219836_p93363246566"><a name="zh-cn_topic_0182219836_p93363246566"></a><a name="zh-cn_topic_0182219836_p93363246566"></a>vhostUserSocket</p>
    </td>
    <td class="cellrowborder" valign="top" width="20.68%" headers="mcps1.1.4.1.2 "><p id="zh-cn_topic_0182219836_p73369248564"><a name="zh-cn_topic_0182219836_p73369248564"></a><a name="zh-cn_topic_0182219836_p73369248564"></a>可选</p>
    </td>
    <td class="cellrowborder" valign="top" width="59.18%" headers="mcps1.1.4.1.3 "><p id="zh-cn_topic_0182219836_p17336192420566"><a name="zh-cn_topic_0182219836_p17336192420566"></a><a name="zh-cn_topic_0182219836_p17336192420566"></a>设置dpdk轮询socket路径。路径最大长度128字节，命名规则支持数字、字母、“-”。必须以字母开头。</p>
    </td>
    </tr>
    <tr id="zh-cn_topic_0182219836_row27941415575"><td class="cellrowborder" valign="top" width="20.14%" headers="mcps1.1.4.1.1 "><p id="zh-cn_topic_0182219836_p87911143578"><a name="zh-cn_topic_0182219836_p87911143578"></a><a name="zh-cn_topic_0182219836_p87911143578"></a>queues</p>
    </td>
    <td class="cellrowborder" valign="top" width="20.68%" headers="mcps1.1.4.1.2 "><p id="zh-cn_topic_0182219836_p6791314185719"><a name="zh-cn_topic_0182219836_p6791314185719"></a><a name="zh-cn_topic_0182219836_p6791314185719"></a>可选</p>
    </td>
    <td class="cellrowborder" valign="top" width="59.18%" headers="mcps1.1.4.1.3 "><p id="zh-cn_topic_0182219836_p4798148572"><a name="zh-cn_topic_0182219836_p4798148572"></a><a name="zh-cn_topic_0182219836_p4798148572"></a>设置网卡多队列的队列数目。如果不配置，默认为0。</p>
    </td>
    </tr>
    </tbody>
    </table>

    >![](public_sys-resources/icon-note.gif) **说明：**   
    >当网卡添加成功时，如果为其指定了IP地址，则kata会为新添加的网卡添加一条destination为同网段地址的默认路由，如上例中添加网卡之后容器内有如下路由被添加：  
    >```  
    >[root@6ec7a98 /]# ip route  
    >172.16.0.0/16 dev eth-test proto kernel scope link src 172.16.0.3  
    >```  

2.  **列出已经添加的网卡**

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

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

3.  **为指定网卡添加一条路由**

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

    字段说明如下：

    -   dest：设置路由对应的网段。格式为<ip\>/<mask\>，<ip\>必选。分如下3种情况：
        1.  配置<ip\>/<mask\>；
        2.  只配置<ip\>，则默认掩码为32；
        3.  若配置了"dest":"default"，默认无dest，需传入gateway。

    -   gateway：设置路由的下一跳网关。设置"dest":"default"时，gateway必选；其他情况可选。
    -   device：必选。设置路由对应的网卡名称，最长支持15字符。

    >![](public_sys-resources/icon-note.gif) **说明：**   
    >如果为容器内的回环设备lo添加路由时，路由配置文件中的"device"字段对应的设备名称为"lo"。  

4.  **删除指定路由**

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

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

    >![](public_sys-resources/icon-note.gif) **说明：**   
    >-   输入字段中dest为必选，device/gateway均为可选。kata根据不同字段进行模糊匹配，删除对应的路由规则。例如指定了dest为某个IP，则所有该IP的规则都会被删除。  
    >-   如果删除的是容器内回环设备lo的路由时，路由配置文件中的"device"字段对应的设备名称为"lo"。  

5.  **删除已经添加的网卡**

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

    >![](public_sys-resources/icon-note.gif) **说明：**   
    >删除网卡时，仅根据网卡容器内名称（name字段）来删除。即便填写其他字段，kata也不会使用。  


以上为常用场景和命令行示例，具体命令行接口见附录[接口列表](接口列表.md#ZH-CN_TOPIC_0184808188)。

## kata IPVS子系统<a name="zh-cn_topic_0182219836_section135961247151620"></a>

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

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

    ```
    kata-runtime kata-ipvs ipvsadm --parameters "--add-service --tcp-service 172.17.0.7:80 --scheduler rr --persistent 3000" <container-id>
    ```

2.  修改容器虚拟服务参数

    ```
    kata-runtime kata-ipvs ipvsadm --parameters "--edit-service --tcp-service 172.17.0.7:80 --scheduler rr --persistent 5000" <container-id>
    ```

3.  删除容器虚拟服务地址

    ```
    kata-runtime kata-ipvs ipvsadm --parameters "--delete-service --tcp-service 172.17.0.7:80" <container-id>
    ```

4.  为虚拟服务地址添加一个真实服务器

    ```
    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.  修改容器真实服务器参数

    ```
    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.  删除容器真实服务器

    ```
    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.  查询服务信息

    ```
    kata-runtime kata-ipvs ipvsadm --parameters "--list" <container-id>
    ```

8.  逐条导入耗时太久，可将规则写入文件后，批量导入

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

    >![](public_sys-resources/icon-note.gif) **说明：**   
    >单条添加时默认使用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.  清理系统连接缓存

    ```
    kata-runtime kata-ipvs cleanup --parameters "--orig-dst 172.17.0.4 --protonum tcp" <container-id>
    ```

10. 为tcp/tcpfin/udp连接设置超时

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

    >![](public_sys-resources/icon-note.gif) **说明：**   
    >1.  每个容器支持iptables规则数量最大为20000条（5k service，3个server/service），add-service和add-server都算作规则。  
    >2.  批量导入前需清空已有规则。  
    >3.  不存在并发测试场景。  
    >4.  以上为常用命令示例，具体命令行接口见附录[接口列表](接口列表.md#ZH-CN_TOPIC_0184808188)。  


