iptables в контейнере OpenVZ

Дело было такое — решил все-таки добить iptables в моем контейнере OpenVZ. Как-то я уже писал о своем контейнере на Debian Jessie, и вот теперь занялся безопасностью с оснований (хотя надо было об этом позаботиться с самого начала) — вернулся к проблеме с iptables. К сожалению, с OpenVZ в этом плане не все так просто, и есть о чем рассказать.
Проблема в общем-то простая — нет поддержки модуля iptables ip_conntrack в контейнерах, из-за чего проверка по state не работает. Если арендуете контейнер, то необходимо попросить хостера, чтобы тот настроил поддержку ip_conntrack в контейнерах. Но, поскольку хостеры на openvz предоставляют дешевые контейнеры по принципу «как есть, разбирайтесь сами», то я остался один на один с этой проблемой. Но, выход нашелся, что и хочу зафиксировать. Обо всем по порядку.
Прежде всего хочу поблагодарить проект Debian GNU/Linux за предоставленную информацию на вики-странице. Вся информация взята в основном оттуда, но с небольшими доработками.
Для начала необходимо выполнить подготовительные шаги — научить iptables читать правила с файла при загрузке системы. О чем я?
Создать пустой файл с настройками:

# :> /etc/iptables.up.rules

Далее, сделать скрипт для чтения настроек перед запуском сетевого интерфейса /etc/network/if-pre-up.d/iptables со следующим содержанием:

#!/bin/sh
/sbin/iptables-restore < /etc/iptables.up.rules;
exit 0;

Не забудьте сделать его исполняемым:

# chmod +x /etc/network/if-pre-up.d/iptables

А дальше, необходимо наполнить правилами файл /etc/iptables.up.rules:

*filter

# Здесь нужно указать порты удаленных машин,
# к которым мы подключаемся, делая им запрос,
# которые могут нам обратно отвечать. Поскольку
# у нас нет проверки на состояние соединения, то
# если мы закрываем INPUT, то удаленные машины
# не могут отвечать нам обратно. То есть,
# если бы у нас был state, то мы бы делали ACCEPT,
# если соединение ESTABLISHED, но у нас такого нет.
# Поэтому можно извратиться - тупо разрешить INPUT
# соединения с определенных портов - 53/udp (dns),
# 80/tcp (http), 443/tcp (https) и так далее.
# От кулхацкеров защита будет, а если будет целена-
# правленная атака по сканированию портов - тут и
# привет. Но, опять же - OpenVZ. Кто будет его
# использовать в боевых машинах? Хехе.
#
-A INPUT -p udp --sport 53 -j ACCEPT
-A INPUT -p tcp --sport 80 -j ACCEPT
-A INPUT -p tcp --sport 443 -j ACCEPT
-A INPUT -p tcp --sport 60606 -j ACCEPT
-A INPUT -p udp --sport 3000 -j ACCEPT

# Открываем порты сервисов
-A INPUT -p tcp --dport 22 -j ACCEPT
-A INPUT -p tcp --dport 80 -j ACCEPT

# И уже настройки с вики-страницы Debian
# Описание https://wiki.debian.org/iptables
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT
-A OUTPUT -j ACCEPT
-A INPUT -j REJECT
-A FORWARD -j REJECT

COMMIT

Как видно, для любой задачи можно найти решение. Пока.

Реклама

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

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s