Service to Service
Ресурс Service to Service представляет собой введенную нами абстракцию, позволяющая описывать правила между сервисами, которые открывают доступ одновременно с двух сторон.
- API
- nftables
Более подробную документацию по API можно посмотреть здесь.
Более подробно по организации БД можно посмотреть здесь.
Входные параметры
serviceRules.rules[]- Список описываемых правил.serviceRules.rules[].name- Имя создаваемого правила.serviceRules.rules[].svcFrom- Имя сервиса.serviceRules.rules[].svcTo- Имя сервиса.serviceRules.rules[].logs- Включить/отключить логирование.serviceRules.rules[].trace- Включить/отключить трассировку.serviceRules.rules[].action- Действие для пакетов в сформированных правил в цепочке.serviceRules.rules[].priority- Поле определяющее порядок применения правил в цепочке.syncOp- Поле определяющее действие с данными из запроса.
| название | обязательность | тип данных | значение по умолчанию |
|---|---|---|---|
| serviceRules.rules[] | да | Object[] | |
| serviceRules.rules[].name | да | String | |
| serviceRules.rules[].svcFrom | да | String | |
| serviceRules.rules[].svcTo | да | String | |
| serviceRules.rules[].logs | нет | Boolean | false |
| serviceRules.rules[].trace | нет | Boolean | false |
| serviceRules.rules[].action | да | ||
| serviceRules.rules[].priority.some | нет | Integer | -350 |
| syncOp | да | Enum("Delete", "Upsert", "FullSync") |
Ограничения
sgSgRules.rules[].svcFrom:- Длина значения поля не должна п ревышать 256 символов.
- Значение поля должно начинаться и заканчиваться символами без пробелов.
- Service должен быть зарегистрирован в SGroups
sgSgRules.rules[].svcTo:- Длина значения поля не должна превышать 256 символов.
- Значение поля должно начинаться и заканчиваться символами без пробелов.
- Service должен быть зарегистрирован в SGroups
sgSgRules.rules[].priority.some:- Значения должны находиться в интервале от -32768 до 32767
Пример использования
curl '127.0.0.1:9007/v2/sync' \
--header 'Content-Type: application/json' \
--data '{
"serviceRules": {
"rules": [{
"svcFrom": "svc-from-example",
"svcTo": "svc-to-example",
"logs": true,
"trace": true,
"action": "ACCEPT",
"priority": {
"some": -200
}
}]
},
"syncOp": "Upsert"
}'
Выходные параметры
| название | тип данных | описание |
|---|---|---|
| - | Object | в случае успеха возвращается пустое тело |
Возможные ошибки API
Пользователь указал некорректные значения агрументов
- HTTP code: 400
- gRPC code: INVALID_ARGUMENT
- gRPC number: 3
Не найден метод
- HTTP code: 404
- gRPC code: NOT_FOUND
- gRPC number: 5
Диаграмма последовательности
В этом разделе мы покажем, как правила фильтрации трафика, созданные с помощью Terraform и API, внедряются в настройки nftables. Это позволяет легко интегрировать сложные правила безопасности прямо в вашу систему фильтрации трафика.
$Trace- Включить/отключить трассировку.$SrcSgroup- Security Group, с которой устанавливаются правила взаимодействия.$DstGroup- Security Group, с которой устанавливаются правила взаимодействия.$Transport- Протокол L3/L4 уровня модели OSI.$NftRuleType- Характеристика описывающая, что принимается трафик типа ip.$IcmpTypeList- Список, определяющий допустимые типы ICMP запросов.$SrcPorts- Набор открытых портов отправителя.$DstPorts- Набор открытых портов получателя$NftCounter- Счетчик количества байтов и пакетов.$Log- Включить/отключить логирование.$NftRuleVerdict- Результат применения правила, определяющий действие, которое будет применено к пакету.
| шаблон параметра | структура параметра | значения | transport* | ||
|---|---|---|---|---|---|
| TCP | UDP | ICMP | |||
| $Trace | nftrace set |
| ✔ | ✔ | ✔ |
| $SrcSgroup | saddr | @${IPSet(sgName)} | ✔ | ✔ | ✔ |
| $DstSgroup | daddr | @${IPSet(sgName)} | ✔ | ✔ | ✔ |
| $Transport | tcp | udp | icmp | ✔ | ✔ | ✔ | |
| $NftRuleType | ip | ✔ | ✔ | ✔ | |
| $IcmpTypeList | type {} | Набор целочисленных значений от 0 до 255 | ✔ | ||
| $SrcPorts | sport {} | Набор целочисленных значений от 0 до 65535 | ✔ | ✔ | |
| $DstPorts | dport {} | Набор целочисленных значений от 0 до 65535 | ✔ | ✔ | |
| $NftCounter | counter | packets 0 bytes 0 | ✔ | ✔ | ✔ |
| $Log | log | level debug flags ip options | ✔ | ✔ | ✔ |
| $NftRuleVerdict | accept | $NftRuleVerdict определяет действие, которое будет применено к пакету в соответсвии с правилом. Это поле может принимать значение | ✔ | ✔ | ✔ |
Пример испо льзования
- TCP
- UDP
- ICMP
Шаблон
chain INGRESS-INPUT-host-$uuid {
# **********
${Trace} ${RuleType} ${SrcSgroup} ${Transport} ${SrcPorts} ${DstPorts} ${Counter} ${Log} ${Verdict}
# **********
}
chain EGRESS-POSTROUTING-host-$uuid {
# **********
${Trace} ${RuleType} ${DstSgroup} ${Transport} ${SrcPorts} ${DstPorts} ${Counter} ${Log} ${Verdict}
# **********
}
Пример использования
set NetIPv4-host-$uuid {
type ipv4_addr
flags constant,interval
elements = { 10.244.0.41, 127.0.0.1 } <- Host IPs
}
set NetIPv4-host-$uuid {
type ipv4_addr
flags constant,interval
elements = { 10.244.0.41, 127.0.0.1 } <- Host IPs
}
chain INGRESS-INPUT-host-$uuid {
# **********
nftrace set 1 ip saddr NetIPv4-sg-example-from tcp dport { 80, 443 } sport { 64231 } counter packets 0 bytes 0 log level debug flags ip options accept
nftrace set 1 ip saddr NetIPv6-sg-example-from tcp dport { 80, 443 } sport { 64231 } counter packets 0 bytes 0 log level debug flags ip options accept
# **********
}
chain EGRESS-POSTROUTING-host-$uuid {
# **********
nftrace set 1 ip daddr NetIPv4-sg-example-to tcp dport { 80, 443 } sport { 64231 } counter packets 0 bytes 0 log level debug flags ip options accept
nftrace set 1 ip daddr NetIPv6-sg-example-to tcp dport { 80, 443 } sport { 64231 } counter packets 0 bytes 0 log level debug flags ip options accept
# **********
}
Шаблон
chain INGRESS-INPUT-sgName {
# **********
${Trace} ${RuleType} ${SrcSgroup} ${Transport} ${SrcPorts} ${DstPorts} ${Counter} ${Log} ${Verdict}
# **********
}
chain EGRESS-POSTROUTING-sgName {
# **********
${Trace} ${RuleType} ${DstSgroup} ${Transport} ${SrcPorts} ${DstPorts} ${Counter} ${Log} ${Verdict}
# **********
}
Пример использования
~ # nft list ruleset
table inet main-1759252179 {
set NetIPv4-$localSG {
type ipv4_addr
flags constant,interval
elements = { 10.244.0.168, 10.244.0.169 }
}
set NetIPv6-$localSG {
type ipv6_addr
flags constant,interval
elements = { ::1,
fe80::d800:9bff:feba:8aae }
}
set NetIPv4-$targetSG {
type ipv4_addr
flags constant,interval
elements = { 10.244.0.168, 10.244.0.169 }
}
set NetIPv6-$targetSG {
type ipv6_addr
flags constant,interval
elements = { ::1,
fe80::d800:9bff:feba:8aae }
}
set NetIPv4-host-$UUID {
type ipv4_addr
flags constant,interval
elements = { 10.244.0.168 }
}
set NetIPv6-host-$UUID {
type ipv6_addr
flags constant,interval
elements = { ::1,
fe80::d800:9bff:feba:8aae }
}
chain INGRESS-MAIN {
type filter hook prerouting priority -130; policy drop;
ct state established,related counter packets 388 bytes 38040 accept
ip saddr { 0.0.0.0-255.255.255.254 } accept
ip daddr @NetIPv4-host-$UUID counter packets 0 bytes 0 goto INGRESS-host-$UUID
ip6 daddr @NetIPv6-host-$UUID counter packets 0 bytes 0 goto INGRESS-host-$UUID
counter packets 0 bytes 0
}
chain EGRESS-MAIN {
type filter hook postrouting priority 300; policy drop;
ct state established,related counter packets 454 bytes 43457 accept
ip daddr { 0.0.0.0-255.255.255.254 } accept
ip saddr @NetIPv4-host-$UUID counter packets 0 bytes 0 goto EGRESS-host-$UUID
ip6 saddr @NetIPv6-host-$UUID counter packets 1 bytes 56 goto EGRESS-host-$UUID
counter packets 0 bytes 0
}
chain INGRESS-host-$UUID {
ip saddr @NetIPv4-$targetSG tcp dport 80 counter packets 0 bytes 0 accept # svc1 -> svc-3
ip saddr @NetIPv4-$targetSG tcp dport 5432 counter packets 0 bytes 0 accept # svc2 -> svc-4
******** Пример разницы между svc2svc и sg2sg
ip saddr @NetIPv4-$targetSG tcp dport 80,5432 counter packets 0 bytes 0 accept # sg-1 -> sg:$targetSG
meta nftrace set 1 counter packets 0 bytes 0 log level debug flags ip options drop
}
chain EGRESS-host-$UUID {
ip daddr @NetIPv4-$targetSG tcp dport 80 counter packets 0 bytes 0 accept
ip6 daddr @NetIPv6-$targetSG tcp dport 80 counter packets 0 bytes 0 accept
meta nftrace set 1 counter packets 1 bytes 56 log level debug flags ip options drop
}
}
Шаблон
chain INGRESS-INPUT-sgName {
# **********
${Trace} ${RuleType} ${SrcSgroup} ${Transport} ${TypeList} ${Counter} ${Log} ${Verdict}
# **********
}
chain EGRESS-POSTROUTING-sgName {
# **********
${Trace} ${RuleType} ${DstSgroup} ${Transport} ${TypeList} ${Counter} ${Log} ${Verdict}
# **********
}
Пример использования
chain INGRESS-INPUT-sg-example-to {
# **********
nftrace set 1 ip saddr NetIPv4-v4-sg-example-from icmp type { 0, 8 } counter packets 0 bytes 0 log level debug flags ip options accept
nftrace set 1 ip saddr NetIPv6-v6-sg-example-from icmp type { 0, 8 } counter packets 0 bytes 0 log level debug flags ip options accept
# **********
}
chain EGRESS-POSTROUTING-sg-example-from {
# **********
nftrace set 1 ip daddr NetIPv4-sg-example-to icmp type { 0, 8 } counter packets 0 bytes 0 log level debug flags ip options accept
nftrace set 1 ip daddr NetIPv6-sg-example-to icmp type { 0, 8 } counter packets 0 bytes 0 log level debug flags ip options accept
# **********
}