Блокировка трафика с VPS на уровне ноды.

Итак, у нас есть 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) правила в цепочке.

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *