Skip to content

7.8 Программно-определяемый маршрутизатор (Edge)

Edge - это программно-определяемый маршрутизатор, ключевыми функциями которого являются NAT и firewall. В таблице 1 представлено описание объекта Edge.

Таблица 1. Описание объекта Edge
namevaluetype
idd57aede6-3ae4-11ec-b428-a6817c1fefc2UUID
modified1562760517timestamp (unix time)
deploy_ts1562760527timestamp (unix time)
oper_ts1562760520timestamp (unix time)
oper_status3integer
oper_progress100integer
ports
vdc_id1009integer

Свойство modified - время модификации программно-определяемого маршрутизатора.

Свойство deploy_ts - время применения правил программно-определяемого маршрутизатора.

Свойство oper_ts - время изменения свойства oper_status.

Свойство oper_status - фактическое состояние программно-определяемого маршрутизатора в соответствии со словарем из vm-statuses().

Свойство vdc_id - опциональная принадлежность программно-определяемого маршрутизатора к конкретному ВЦОД. В этом случае управлять данным маршрутизатором могут все пользователи, которым назначена роль Админа ВЦОД в указанном ВЦОД.

Описание объекта ports приведено в таблице 2.

Таблица 2. Описание объекта ports
namevaluetype
address10.20.30.40inet
ifname10293integer
ratelimit_mbits4096integer

Статические словари, используемые в запросах, представлены в таблицах ниже.

Таблица 3. Словарь direction
idname
1in
2out
Таблица 4. Словарь firewall action
idname
1block
2pass
Таблица 5. Словарь NAT action
idname
1SNAT
2DNAT
3biNAT
Таблица 6. Словарь protocol
idname
1icmp
2udp
3tcp
4ip

Методы

7.8.1 edge-create()

Данный метод позволяет создать программно-определяемый маршрутизатор.

Первым слотом должеть быть указан порт маршрутизируемой сети. В последующих слотах возможно указание внутренних сетей, для них обязательно отключение свойства ip_guard.

Запрос:

{
        "jsonrpc":      "2.0",
        "method":       "edge-create",
        "id":           "d10f8b0e-3ae4-11ec-a52e-80e47fd49235",
        "params": {
                "network_ports" : [
                        {
                                "network_id":           101,
                                "slot":                 1,
                "ratelimit_mbits":  512
                        },
                        {
                                "network_id":           161,
                                "slot":                 2,
                                "ip_guard":             false
                        },
                        {
                                "network_id":           162,
                                "slot":                 3,
                                "ip_guard":             false
                        }
                ]
        }
}

Ответ:

{
   "id":    "d10f8b0e-3ae4-11ec-a52e-80e47fd49235",
   "jsonrpc":   "2.0",
   "result": {
      "code":   1,
      "data": {
            "edge_id": "d57aede6-3ae4-11ec-b428-a6817c1fefc2"
      }
   }
}

Запрос с указанием принадлежности Edge к конкретному ВЦОД:

{
        "jsonrpc":      "2.0",
        "method":       "edge-create",
        "id":           "251542a8-debc-11ed-b792-89c4d554e1c8",
        "params": {
                "vdc_id":       14,
                "network_ports" : [
                        {
                                "network_id":           1,
                                "slot":                 1
                        },
                        {
                                "network_id":           812,
                                "slot":                 2,
                                "ip_guard":             0
                        }
                ]
        }
}

Ответ:

{
   "id" : "251542a8-debc-11ed-b792-89c4d554e1c8",
   "jsonrpc" : "2.0",
   "result" : {
      "code" : 1,
      "data" : {
         "edge_id" : "5d220190-debc-11ed-a74c-6112f8825f81"
      }
   }
}

7.8.2 edge-list()

С помощью метода edge-list() можно получить список маршрутизаторов, содержащий как индивидуальные объекты Edge, так и принадлежащие ВЦОД, в которых пользователю назначена роль Админа ВЦОД.

Запрос:

{
        "jsonrpc":      "2.0",
        "method":       "edge-list",
        "id":           "67254a90-df65-11ed-9e7a-dadcd554e1c8"
}

Ответ:

{
   "id" : "67254a90-df65-11ed-9e7a-dadcd554e1c8",
   "jsonrpc" : "2.0",
   "result" : {
      "code" : 1,
      "data" : {
         "4f3f3152-df65-11ed-803d-9b00f8825f81" : {
            "deploy_ts" : 1681986201,
            "modified" : 1681986174,
            "oper_progress" : 100,
            "oper_status" : 3,
            "oper_ts" : 1681986176,
            "ports" : {
               "1" : {
                  "address" : "10.78.28.32",
                  "ifname" : 21743,
                  "network_id" : 1,
                  "port_id" : 21743,
                  "ratelimit_mbits" : null,
                  "slot" : 5
               },
               "777" : {
                  "address" : "10.200.200.2",
                  "ifname" : 21744,
                  "network_id" : 777,
                  "port_id" : 21744,
                  "ratelimit_mbits" : null,
                  "slot" : 6
               }
            },
            "vdc_id" : null
         },
         "5d220190-debc-11ed-a74c-6112f8825f81" : {
            "deploy_ts" : 1681913724,
            "modified" : 1681913612,
            "oper_progress" : 100,
            "oper_status" : 3,
            "oper_ts" : 1681913614,
            "ports" : {
               "1" : {
                  "address" : "10.78.28.29",
                  "ifname" : 21740,
                  "network_id" : 1,
                  "port_id" : 21740,
                  "ratelimit_mbits" : null,
                  "slot" : 5
               },
               "812" : {
                  "address" : "10.200.200.2",
                  "ifname" : 21741,
                  "network_id" : 812,
                  "port_id" : 21741,
                  "ratelimit_mbits" : null,
                  "slot" : 6
               }
            },
            "vdc_id" : 14
         }
      }
   }
}

Ответ по умолчанию является словарем с ключом по идентификатору сети, что может быть неудобно для маршрутизатора с несколькими портами из одной сети. Для такого случая предусмотрен альтернативный вариант ответа со словарем по идентификатору порта.

Запрос:

{
        "jsonrpc":      "2.0",
        "method":       "edge-list",
        "id":           "933258a8-df65-11ed-8e85-f3ded554e1c8",
        "params": {
                "port_based":   1
        }

}

Ответ:

{
   "id" : "933258a8-df65-11ed-8e85-f3ded554e1c8",
   "jsonrpc" : "2.0",
   "result" : {
      "code" : 1,
      "data" : {
         "4f3f3152-df65-11ed-803d-9b00f8825f81" : {
            "deploy_ts" : 1681986286,
            "modified" : 1681986174,
            "oper_progress" : 100,
            "oper_status" : 3,
            "oper_ts" : 1681986176,
            "ports" : {
               "21743" : {
                  "address" : "10.78.28.32",
                  "ifname" : 21743,
                  "network_id" : 1,
                  "port_id" : 21743,
                  "ratelimit_mbits" : null,
                  "slot" : 5
               },
               "21744" : {
                  "address" : "10.200.200.2",
                  "ifname" : 21744,
                  "network_id" : 777,
                  "port_id" : 21744,
                  "ratelimit_mbits" : null,
                  "slot" : 6
               }
            },
            "vdc_id" : null
         },
         "5d220190-debc-11ed-a74c-6112f8825f81" : {
            "deploy_ts" : 1681913724,
            "modified" : 1681913612,
            "oper_progress" : 100,
            "oper_status" : 3,
            "oper_ts" : 1681913614,
            "ports" : {
               "21740" : {
                  "address" : "10.78.28.29",
                  "ifname" : 21740,
                  "network_id" : 1,
                  "port_id" : 21740,
                  "ratelimit_mbits" : null,
                  "slot" : 5
               },
               "21741" : {
                  "address" : "10.200.200.2",
                  "ifname" : 21741,
                  "network_id" : 812,
                  "port_id" : 21741,
                  "ratelimit_mbits" : null,
                  "slot" : 6
               }
            },
            "vdc_id" : 14
         }
      }
   }
}

7.8.3 edge-get()

Используя edge-get(), можно получить объект Edge.

Запрос:

{
        "jsonrpc":      "2.0",
        "method":       "edge-get",
        "id":           "d085aa7a-df65-11ed-93fc-92e3d554e1c8",
        "params": {
                "edge_id":      "5d220190-debc-11ed-a74c-6112f8825f81"
        }
}

Ответ:

{
   "id" : "d085aa7a-df65-11ed-93fc-92e3d554e1c8",
   "jsonrpc" : "2.0",
   "result" : {
      "code" : 1,
      "data" : {
         "deploy_ts" : 1681913724,
         "edge_id" : "5d220190-debc-11ed-a74c-6112f8825f81",
         "modified" : 1681913612,
         "oper_progress" : 100,
         "oper_status" : 3,
         "oper_ts" : 1681913614,
         "owner" : 1,
         "ports" : {
            "1" : {
               "address" : "10.78.28.29",
               "ifname" : 21740,
               "ip_guard" : 1,
               "mac" : "ca:07:fd:95:87:99",
               "network_id" : "1",
               "port_id" : 21740,
               "ratelimit_mbits" : null,
               "slot" : 1
            },
            "812" : {
               "address" : "10.200.200.2",
               "ifname" : 21741,
               "ip_guard" : 0,
               "mac" : "ca:07:4e:85:9d:80",
               "network_id" : "812",
               "port_id" : 21741,
               "ratelimit_mbits" : null,
               "slot" : 2
            }
         },
         "vdc_id" : 14
      }
   }
}

Ответ по умолчанию является словарем с ключом по идентификатору сети, что может быть неудобно для маршрутизатора с несколькими портами из одной сети. Для такого случая предусмотрен альтернативный вариант ответа со словарем по идентификатору порта.

Запрос:

{
        "jsonrpc":      "2.0",
        "method":       "edge-get",
        "id":           "0b7800e2-df66-11ed-bf83-06e6d554e1c8",
        "params": {
                "edge_id":      "5d220190-debc-11ed-a74c-6112f8825f81",
                "port_based":   1
        }
}

Ответ:

{
   "id" : "0b7800e2-df66-11ed-bf83-06e6d554e1c8",
   "jsonrpc" : "2.0",
   "result" : {
      "code" : 1,
      "data" : {
         "deploy_ts" : 1681913724,
         "edge_id" : "5d220190-debc-11ed-a74c-6112f8825f81",
         "modified" : 1681913612,
         "oper_progress" : 100,
         "oper_status" : 3,
         "oper_ts" : 1681913614,
         "owner" : 1,
         "ports" : {
            "21740" : {
               "address" : "10.78.28.29",
               "ifname" : 21740,
               "ip_guard" : 1,
               "mac" : "ca:07:fd:95:87:99",
               "network_id" : 1,
               "port_id" : 21740,
               "ratelimit_mbits" : null,
               "slot" : 1
            },
            "21741" : {
               "address" : "10.200.200.2",
               "ifname" : 21741,
               "ip_guard" : 0,
               "mac" : "ca:07:4e:85:9d:80",
               "network_id" : 812,
               "port_id" : 21741,
               "ratelimit_mbits" : null,
               "slot" : 2
            }
         },
         "vdc_id" : 14
      }
   }
}

7.8.4 edge-start(), edge-stop(), edge-restart()

Данные методы позволяют соответственно запустить, остановить и перезагрузить маршрутизатор.

Запрос:

{
        "jsonrpc":      "2.0",
        "method":       "edge-restart",
        "id":           "ab8f4798-4f88-11ed-894d-5663b0b91e77",
        "params": {
                "edge_id":      "19b598bc-3a62-11ed-908c-9669add6c48b"
        }
}

Ответ:

{
    "jsonrpc":  "2.0",
    "id":       "ab8f4798-4f88-11ed-894d-5663b0b91e77",
    "result": {
        "code": "1",
        "data": {}
    }
}

7.8.5 edge-ratelimit()

С помощью этого метода можно установить ограничения производительности на порт маршрутизатора.

Запрос:

{
        "jsonrpc":      "2.0",
        "method":       "edge-ratelimit",
        "id":           "07b22b3c-4088-11ec-b6cd-ffa47ed49235",
        "params": {
                "edge_id":      "bd16d296-4071-11ec-ac9b-b05f7b1fefc2",
                "port_id":      1333,
                "ratelimit_mbits": 512
        }
}

Ответ:

{
   "id" : "07b22b3c-4088-11ec-b6cd-ffa47ed49235",
   "jsonrpc" : "2.0",
   "result" : {
      "code" : "1",
      "data" : {}
   }
}

7.8.6 edge-add-nat-rule()

edge-add-nat-rule() позволяет добавлять правила трансляции программно-определяемого маршрутизатора.

Запрос:

{
        "jsonrpc":      "2.0",
        "method":       "edge-add-nat-rule",
        "id":           "97bef0ea-3ae6-11ec-aeb7-679a7ed49235",
        "params": {
                "edge_id":              "d57aede6-3ae4-11ec-b428-a6817c1fefc2",
                "rule_number":          500,
                "rule_action":          1,
                "rule_ifname":          1329,
                "rule_proto":           3,
                "rule_from_host":       "192.168.0.0/16",
                "rule_dst_host":        "0.0.0.0/0",
                "rule_dst_port":        0,
                "rule_nat_host":        "10.78.27.27",
                "rule_nat_port":        0
        }
}

Ответ:

{
   "id" : "97bef0ea-3ae6-11ec-aeb7-679a7ed49235",
   "jsonrpc" : "2.0",
   "result" : {
      "code" : 1
   }
}

7.8.7 edge-add-fw-rule()

Используя edge-add-fw-rule(), можно добавить правила firewall.

Для действия block доступен переключатель rule_log, значение которого может быть равно 0 или 1, соответствующие логическим значениям Да и Нет. Этот переключатель упавляет логированием пакетов, попадающих под данное правило. Для других действий переключатель игнорируется.

Запрос:

{
        "jsonrpc":      "2.0",
        "method":       "edge-add-fw-rule",
        "id":           "a688623a-3ae8-11ec-b35d-dfea7ed49235",
        "params": {
                "edge_id":              "d57aede6-3ae4-11ec-b428-a6817c1fefc2",
                "rule_number":          900,
                "rule_action":          1,
        "rule_log":     1,
                "rule_direction":       1,
                "rule_ifname":          1329,
                "rule_proto":           3,
                "rule_from_host":       "10.20.30.0/24",
                "rule_from_port":       0,
                "rule_dst_host":        "0.0.0.0/24",
                "rule_dst_port":        0
        }
}

Ответ:

{
   "id" : "a688623a-3ae8-11ec-b35d-dfea7ed49235",
   "jsonrpc" : "2.0",
   "result" : {
      "code" : 1
   }
}

7.8.8 edge-list-rules()

С помощью данного метода можно получить список правил маршрутизатора.

Запрос:

{
        "jsonrpc":      "2.0",
        "id":           "1d6bbfd2-3ae9-11ec-82c8-6c117fd49235",
        "method":       "edge-list-rules",
        "params": {
                "edge_id":      "d57aede6-3ae4-11ec-b428-a6817c1fefc2"
        }
}

Ответ:

{
   "id" : "1d6bbfd2-3ae9-11ec-82c8-6c117fd49235",
   "jsonrpc" : "2.0",
   "result" : {
      "code" : 1,
      "data" : {
         "fw" : {
            "900" : {
               "rule_action" : 1,
               "rule_log" : 1,
               "rule_direction" : 1,
               "rule_dst_host" : "0.0.0.0/24",
               "rule_dst_port" : 0,
               "rule_from_host" : "10.20.30.0/24",
               "rule_from_port" : 0,
               "rule_ifname" : 1329,
               "rule_proto" : 3
            }
         },
         "incarnation" : 16357515057,
         "nat" : {
            "500" : {
               "rule_action" : 1,
               "rule_dst_host" : "0.0.0.0/0",
               "rule_dst_port" : 0,
               "rule_from_host" : "192.168.0.0/16",
               "rule_ifname" : 1329,
               "rule_nat_host" : "10.78.27.27",
               "rule_nat_port" : 0,
               "rule_proto" : 3
            }
         }
      }
   }
}

7.8.9 edge-deploy-rules()

Метод edge-deploy-rules() позволяет применять правила маршрутизатора.

Запрос:

{
        "jsonrpc":      "2.0",
        "id":           "8fcd6f8e-3aea-11ec-ac54-0f047fd49235",
        "method":       "edge-deploy-rules",
        "params": {
                "edge_id":      "d57aede6-3ae4-11ec-b428-a6817c1fefc2"
        }
}

Ответ:

{
   "id" : "8fcd6f8e-3aea-11ec-ac54-0f047fd49235",
   "jsonrpc" : "2.0",
   "result" : {
      "code" : 1,
      "data" : {
         "message" : "Deploy rules done"
      }
   }
}

7.8.10 edge-remove-nat-rule()

С помощью этого метода можно удалять правила NAT.

Запрос:

{
        "jsonrpc":      "2.0",
        "method":       "edge-remove-nat-rule",
        "id":           "025d70a4-3a45-11ec-b245-5ef27fd49235",
        "params": {
                "edge_id":              "d57aede6-3ae4-11ec-b428-a6817c1fefc2",
                "rule_number":          200
        }
}

Ответ:

{
   "id" : "025d70a4-3a45-11ec-b245-5ef27fd49235",
   "jsonrpc" : "2.0",
   "result" : {
      "code" : 1
   }
}

7.8.11 edge-remove-fw-rule()

Данный метод позволяет удалять правила firewall маршрутизатора.

Запрос:

{
        "jsonrpc":      "2.0",
        "method":       "edge-remove-fw-rule",
        "id":           "6cd10b58-3a45-11ec-b1ce-108e7ed49235",
        "params": {
                "edge_id":              "d57aede6-3ae4-11ec-b428-a6817c1fefc2",
                "rule_number":          300
        }
}

Ответ:

{
   "id" : "6cd10b58-3a45-11ec-b1ce-108e7ed49235",
   "jsonrpc" : "2.0",
   "result" : {
      "code" : 1
   }
}

7.8.12 edge-add-nic()

Данный метод позволяет добавить сетевой интерфейс в маршрутизатор. Вполнение этой операции возможно только на остановленном маршрутизаторе.

Запрос:

{
        "jsonrpc":      "2.0",
        "id":           "a0e655d0-5392-11ed-a71a-8655afb91e77",
        "method":       "edge-add-nic",
        "params": {
                "edge_id":              "19b598bc-3a62-11ed-908c-9669add6c48b",
                "network_id":           213,
                "slot":                 4
        }
}

Ответ:

{
    "id":       "b3f31244-5392-11ed-a58c-9f0faed6c48b",
    "jsonrpc":  "2.0",
    "result": {
        "code": 1,
        "data": {
            "address":  "10.20.30.1",
            "mac":      "ca:09:7a:5c:e1:19",
            "network_id":   213,
            "port_id":  2072,
            "slot":     4
        }
    }
}

7.8.13 edge-remove-nic()

Используя edge-remove-nic(), можно удалить сетевой интерфейс в маршрутизаторе. Выполнение данной операции также возможно только на остановленном маршрутизаторе.

Запрос:

{
        "jsonrpc":      "2.0",
        "id":           "6535498c-5393-11ed-a04b-ba38afb91e77",
        "method":       "edge-remove-nic",
        "params": {
                "edge_id":              "19b598bc-3a62-11ed-908c-9669add6c48b",
                "port_id":              2072
        }
}

Ответ:

{
    "id":       "7f4734ac-5393-11ed-a58c-9f0faed6c48b",
    "jsonrpc":  "2.0",
    "result": {
        "code": 1,
        "data": null
    }
}

7.8.14 edge-remove()

Данный метод позволяет удалить программно-определяемый маршрутизатор.

Запрос:

{
        "jsonrpc":      "2.0",
        "method":       "edge-remove",
        "id":           "737d2366-3a3a-11ec-8f2f-83fc7ed49235",
        "params": {
                "edge_id":      "d57aede6-3ae4-11ec-b428-a6817c1fefc2"
        }
}

Ответ:

{
   "id" : "737d2366-3a3a-11ec-8f2f-83fc7ed49235",
   "jsonrpc" : "2.0",
   "result" : {
      "code" : 1
   }
}

7.8.15 edge-get-pfloggs()

Используя метод edge-get-pfloggs(), можно получить информацию о пакетах, блокированных правилами с флагом log в формате pcap. В поле result->data->message находится pcap-файл в формате base64. В случае отсутствия пакетов, попадающих под критерий выбора, поле message содержит пустую строку.

Параметр limit определяет максимальное количество пакетов, которое должен содержать ответ.

Параметры ts_start и ts_finish содержат временные отметки соответственно начала и окончания периода в формате unix-time.

Запрос:

{
        "jsonrpc":      "2.0",
        "method":       "edge-get-pfloggs",
        "id":           "b277fcde-0a87-11ee-935f-ffddd554e1c8",
        "params": {
                "edge_id":              "1a9ce152-09ad-11ee-a8fd-45511cb03f24",
                "limit":                1000,
                "ts_start":             0,
                "ts_finish":            0
        }
}

Ответ:

{
   "id" : "b277fcde-0a87-11ee-935f-ffddd554e1c8",
   "jsonrpc" : "2.0",
   "result" : {
      "code" : 1,
      "data" : {
         "message" : "1MOyoQ..."
      }
   }
}