Linux Labs

Безопасность сервера / Ступень 1 из 10

Аудит слушающих служб

Не запущена Запускается обычно ~20 с
Выйти из урока

Шаг 4 из 7 · теория · 6 мин

Фильтр: пропускать только нужное

Не каждую службу можно перепривязать. Тогда порт закрывает фильтр на самом сервере — набор правил nftables.

Таблицы, цепочки и порядок правил разобраны в уроке «Разрешить нужное, сохранить запрет». Для сервера, который смотрит в интернет, набор строят от запрета: политика цепочки input — drop, а разрешения — списком. Так выглядит набор почтового сервера, которому снаружи нужны SSH и SMTP (порт 25):

text
#!/usr/sbin/nft -f
flush ruleset

table inet filter {
	chain input {
		type filter hook input priority filter; policy drop;
		iif lo accept
		ct state established,related accept
		tcp dport { 22, 25 } accept
	}
}

iif lo accept пропускает подключения самой машины к себе — так приложение дойдёт до базы на 127.0.0.1. ct state established,related accept по отслеживанию соединений пропускает ответы на подключения, которые начал сам сервер, и пакеты уже открытых сеансов: без этой строки сервер не получит ответа ни от одного внешнего сервера. Последнее правило — порты из описи, которые нужны снаружи.

Правила живут в ядре до перезагрузки. При загрузке их берёт из /etc/nftables.conf служба nftables: файл проверяют sudo nft -c -f /etc/nftables.conf, а службу включают sudo systemctl enable --now nftables.

Внимание

На удалённом сервере policy drop без разрешения для порта 22 закроет вход по SSH: новый сеанс уже не откроется, а без строки ct state оборвётся и текущий. Вернуть доступ можно будет только через консоль. Перед загрузкой проверь файл nft -c и не закрывай текущий сеанс, пока не войдёшь вторым.

Проверь себя 1 вопрос

Набор с policy drop загружен, порта 8080 в списке разрешений нет, админка по-прежнему слушает 0.0.0.0:8080. Что напечатает с чужой машины nc -zv -w 2 192.0.2.1 8080?

  • Фильтр решает раньше программы: пакет, отброшенный в hook input, до сокета не доходит.

  • Отказ присылает ядро сервера, когда пакет дошёл, а порт никто не слушает. Здесь админка слушает, но пакет отбросил фильтр, и ответа нет совсем.

Политика drop отбрасывает пакет молча, и чужая машина ждёт до тайм-аута. Connection refused ядро присылает, только когда пакет дошёл, а порт никто не слушает.

Главное в шаге

  • Набор «всё, что не разрешено, запрещено»: policy drop, iif lo accept, ct state established,related accept и список нужных портов.
  • Постоянные правила — файл /etc/nftables.conf и включённая служба nftables; файл проверяют nft -c -f.
Ubuntu 24.04
Загрузка…