Итак, у нас есть KVM нода, на которой работает несколько VPS. Для работы сети поднят мост (vmbr0). Такую настройку использует, например VMmanager. Стоит задача — ограничить доступ на 25 порт для всех виртуальных серверов, и разрешить эту операцию только для нескольких VPS.
Использовать для решения задачи мы будем iptables. Прежде всего, для того что бы использовать фильтрацию трафика, который проходит через мост, добавим в sysctl.conf следующие опции:
net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-ip6tables = 1
Применим правила, добавленные в конфиг:
# sysctl -p
Проверим что бы нужный модуль ядра был загружен:
# lsmod | grep br_netfilter br_netfilter 22248 0 bridge 107106 1 br_netfilter
Теперь заблокируем на vmbr0 все исходящие на 25 порт:
# iptables -I FORWARD -o vmbr0 -p tcp --dport 25 -j DROP
Проверяем что бы правило появилось в цепочке FORWARD:
# iptables -L -n --line-numbers ... Chain FORWARD (policy ACCEPT) num target prot opt source destination 1 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:25 ...
Идём на VPS, и телнетом убеждаемся что соединения на 25 порт серверов не происходит. Если всё сделано верно, то теперь виртуальные серверы не смогут соединиться на 25 порт куда-либо. Но допустим, нам нужно разрешить определённому VPS с IP 11.12.13.14 такие соединения, для этого, используем следующее правило:
iptables -I FORWARD -o vmbr0 -p tcp -s 11.12.13.14 --dport 25 -j ACCEPT
Проверяем что правило находится в цепочке FORWARD:
# iptables -L -n --line-numbers ... Chain FORWARD (policy ACCEPT) num target prot opt source destination 1 ACCEPT tcp -- 11.12.13.14 0.0.0.0/0 tcp dpt:25 2 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:25 ...
После этого, при попытке соединиться на 25 порт с виртуального сервера 11.12.13.14 проблем с этим не возникнет.
На случай если мы захотим удалить правило разрешения для какого-то IP, либо удалить правило блокировки, то сделать это можно так…
Смотрим под какими номерами у нас в цепочке FORWARD находятся наши правила:
# iptables -L -n --line-numbers ... Chain FORWARD (policy ACCEPT) num target prot opt source destination 1 ACCEPT tcp -- 11.12.13.14 0.0.0.0/0 tcp dpt:25 2 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:25 ...
И удаляем их командой:
iptables -D FORWARD 1
Где 1 — это порядковый номер (num) правила в цепочке.
Вот так, достаточно просто можно определённым образом контролировать соединения с виртуальных серверов на уровне ноды.