7.8 Программно-определяемый маршрутизатор (Edge)
Edge — это программно-определяемый маршрутизатор, ключевыми функциями которого являются NAT и firewall. В таблице 1 представлено описание объекта Edge.
| name | value | type | 
|---|---|---|
| id | d57aede6-3ae4-11ec-b428-a6817c1fefc2 | UUID | 
| modified | 1562760517 | timestamp (unix time) | 
| deploy_ts | 1562760527 | timestamp (unix time) | 
| oper_ts | 1562760520 | timestamp (unix time) | 
| oper_status | 3 | integer | 
| oper_progress | 100 | integer | 
| ports | ||
| vdc_id | 1009 | integer | 
Свойство modified — время модификации программно-определяемого маршрутизатора.
Свойство deploy_ts — время применения правил программно-определяемого маршрутизатора.
Свойство oper_ts — время изменения свойства oper_status.
Свойство oper_status — фактическое состояние программно-определяемого маршрутизатора в соответствии со словарём из vm-statuses().
Свойство vdc_id — опциональная принадлежность программно-определяемого маршрутизатора к конкретному ВЦОД. В этом случае управлять данным маршрутизатором могут все пользователи, которым назначена роль Админа ВЦОД в указанном ВЦОД.
Описание объекта ports приведено в таблице 2.
| name | value | type | 
|---|---|---|
| address | 10.20.30.40 | inet | 
| ifname | 10293 | integer | 
| ratelimit_mbits | 4096 | integer | 
Статические словари, используемые в запросах, представлены в таблицах ниже.
| id | name | 
|---|---|
| 1 | in | 
| 2 | out | 
| id | name | 
|---|---|
| 1 | block | 
| 2 | pass | 
| id | name | 
|---|---|
| 1 | SNAT | 
| 2 | DNAT | 
| 3 | biNAT | 
| id | name | 
|---|---|
| 1 | icmp | 
| 2 | udp | 
| 3 | tcp | 
| 4 | ip | 
Методы
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..."
      }
   }
}