ИТ Блог. Администрирование серверов на основе Linux (Ubuntu, Debian, CentOS, openSUSE)
Понедельник, 31 марта, 2025
Сегодня у нас 1 праздник:
Международный День Резервного Копирования (World Backup Day). Пользователи сайта социальных новостей reddit предложили сделать дату 31.03 Международным днём резервного копирования, аргументируя это тем, что никогда заранее нельзя узнать, какие сюрпризы преподнесёт 1.04

Как обеспечить безопасность VPS на базе Ubuntu/Debian с помощью IPTABLES/Netfilter

Как обеспечить безопасность VPS на базе Ubuntu/Debian с помощью IPTABLES/Netfilter

Что такое Iptables?

Это прикладная программа, которая позволяет системному администратору настраивать таблицы, предоставляемые брандмауэром ядра Linux (реализованы в виде различных модулей Netfilter), цепей и правил.

Для того чтобы защищать от попыток взлома и фильтровать открытые порты на вашем виртуальном сервере, необходима правильная настройка брандмауэра.

Для того, чтобы сделать управление правилами брандмауэра вашего сервера проще, мы предоставим вам простой скрипт, который поможет с управлением правил брандмауэра. В принципе, всякий раз, когда вам необходимо изменить правила брандмауэра, вы будете использовать этот скрипт для добавления/удаления желаемого правила(ы).

Установка правил межсетевого экрана

Перед тем как записать правила в сценарии, давайте разобьем его на разделы, так что вы можете знать конструкцию брандмауэра и какие правила будут на месте.

Очистка старых правил

Правила брандмауэра могут быть сброшены с помощью следующих команд:

## iptables --flush
## iptables --delete-chain
## iptables --table nat --flush
## iptables --table nat --delete-chain

Сервис распознавания портов

Вы должны знать, какие порты у вас открыты, так что вы можете установить соответствующие правила для них. Один из способов найти какие порты прослушиваются можно с использованием команды netstat или ss:

## netstat -tunlp

or

## ss -tunlp

например, мы используем один из наших виртуальных серверов Ubuntu 12.04 LTS и следующий вывод команды netstat:

## netstat -tunlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      296/mysqld
tcp        0      0 0.0.0.0:587             0.0.0.0:*               LISTEN      449/sendmail: MTA:
tcp        0      0 0.0.0.0:110             0.0.0.0:*               LISTEN      261/dovecot
tcp        0      0 0.0.0.0:143             0.0.0.0:*               LISTEN      261/dovecot
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      590/apache2
tcp        0      0 209.135.140.77:53       0.0.0.0:*               LISTEN      353/named
tcp        0      0 127.0.0.1:53            0.0.0.0:*               LISTEN      353/named
tcp        0      0 0.0.0.0:21              0.0.0.0:*               LISTEN      173/vsftpd
tcp        0      0 0.0.0.0:5622            0.0.0.0:*               LISTEN      630/sshd
tcp        0      0 0.0.0.0:25              0.0.0.0:*               LISTEN      449/sendmail: MTA:
tcp        0      0 127.0.0.1:953           0.0.0.0:*               LISTEN      353/named
tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN      590/apache2
tcp        0      0 0.0.0.0:993             0.0.0.0:*               LISTEN      261/dovecot
tcp        0      0 0.0.0.0:995             0.0.0.0:*               LISTEN      261/dovecot
udp        0      0 209.135.140.77:53       0.0.0.0:*                           353/named
udp        0      0 127.0.0.1:53            0.0.0.0:*                           353/named

это означает, что мы открыли следующие порты для публики:

Установка политики

ОК, так что теперь мы можем настроить политику нашего брандмауэра, настроить на DROPINPUT и FORWARD и разрешить прохождение трафика в цепочке OUTPUT.

таблица по умолчанию filter содержит три встроенных цепочки:

  1. Входящий трафик на имя самой машины попадает на входную цепочку.
  2. Outbound, локально сгенерированный трафик попадает в цепочку OUTPUT.
  3. Уходящий трафик, который не должен быть доставлен локально попадает в цепь FORWARD.

Проверить можно, набрав команду man 8 iptables для получения дополнительной информации.

Политику по умолчанию можно установить с помощью следующих команд:

## iptables -P INPUT DROP # <- не запускайте это через SSH, а то будете заперты
## iptables -P FORWARD DROP
## iptables -P OUTPUT ACCEPT

Установка правила межсетевого экрана

Следующее, что нужно сделать, это установить правила брандмауэра. В качестве INPUT цепь  DROPPED, мы должны создать белый список услуг, которые будут прослушиваться на портах:

## iptables -A INPUT -i lo -j ACCEPT
## iptables -A OUTPUT -o lo -j ACCEPT
## iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
## iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

Далее, давайте откроем наши порты служб с помощью правил брандмауэра, так:

### SSH
## iptables -A INPUT -p tcp --dport 5622  -m state --state NEW -j ACCEPT

### HTTP
## iptables -A INPUT -p tcp --dport 80  -m state --state NEW -j ACCEPT

### SMTP
## iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 25 -j ACCEPT

и так далее. После того, как все эти услуги будут занесены в белый список, необходимо разрешить ICMP-пакеты, LOG и DROP все остальное во входной цепи.

## iptables -A INPUT -p ICMP --icmp-type 8 -j ACCEPT
## iptables -A INPUT -j LOG
## iptables -A INPUT -j DROP

Сохранение/разворачивание правил межсетевого экрана

Правила брандмауэра не сохраняются по умолчанию, что означает, что они будут потеряны при перезагрузке виртуального сервера. Чтобы сохранить текущий брандмауэр /etc/fwall.rules вы должны использовать что — то вроде этого:

## iptables-save > /etc/fwall.rules

и для восстановления сохраненных правил, вы будете использовать что-то вроде:

## iptables-restore -c /etc/fwall.rules

Чтобы сделать правила автоматически восстанавливать на старте системы, вы должны либо использовать пакет с именем iptables-persistent или вы можете просто создать сценарий в /etc/network/if-pre-up.d в котором будет загружаться правила, сохраненные в /etc/fwall.rules, например:

## vim /etc/network/if-pre-up.d/iptables

#!/bin/bash
test -e /etc/fwall.rules && iptables-restore -c /etc/fwall.rules

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

Сценарий брандмауэра

Сохраним сценарий в /usr/local/bin/fwall-rules и сделаем его исполняемым

#!/bin/bash

IPTABLES=/sbin/iptables

echo " * удаление старых правил"
${IPTABLES} --flush
${IPTABLES} --delete-chain
${IPTABLES} --table nat --flush
${IPTABLES} --table nat --delete-chain

echo " * настройка политике по умолчанию"
${IPTABLES} -P INPUT DROP
${IPTABLES} -P FORWARD DROP
${IPTABLES} -P OUTPUT ACCEPT

echo " * разрешение loopback devices"
${IPTABLES} -A INPUT -i lo -j ACCEPT
${IPTABLES} -A OUTPUT -o lo -j ACCEPT

${IPTABLES} -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
${IPTABLES} -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

## здесь блокируются нежелательные IPs ##
#echo " * BLACKLIST"
#${IPTABLES} -A INPUT -s _ABUSIVE_IP_ -j DROP
#${IPTABLES} -A INPUT -s _ABUSIVE_IP2_ -j DROP

echo " * разрешение ssh по порту 5622"
${IPTABLES} -A INPUT -p tcp --dport 5622  -m state --state NEW -j ACCEPT

echo " * разрешение ftp по порту 21"
${IPTABLES} -A INPUT -p tcp --dport 21  -m state --state NEW -j ACCEPT

echo " * разрешение dns по порту 53 udp"
${IPTABLES} -A INPUT -p udp -m udp --dport 53 -j ACCEPT

echo " * разрешение dns по порту 53 tcp"
${IPTABLES} -A INPUT -p tcp -m tcp --dport 53 -j ACCEPT

echo " * разрешение http по порту 80"
${IPTABLES} -A INPUT -p tcp --dport 80  -m state --state NEW -j ACCEPT

echo " * разрешение https по порту 443"
${IPTABLES} -A INPUT -p tcp --dport 443 -m state --state NEW -j ACCEPT

echo " * разрешение smtp по порту 25"
${IPTABLES} -A INPUT -p tcp -m state --state NEW -m tcp --dport 25 -j ACCEPT

echo " * разрешение submission по порту 587"
${IPTABLES} -A INPUT -p tcp -m state --state NEW -m tcp --dport 587 -j ACCEPT

echo " * разрешение imaps по порту 993"
${IPTABLES} -A INPUT -p tcp -m state --state NEW -m tcp --dport 993 -j ACCEPT

echo " * разрешение pop3s по порту 995"
${IPTABLES} -A INPUT -p tcp -m state --state NEW -m tcp --dport 995 -j ACCEPT

echo " * разрешение imap по порту 143"
${IPTABLES} -A INPUT -p tcp -m state --state NEW -m tcp --dport 143 -j ACCEPT

echo " * разрешение pop3 по порту 110"
${IPTABLES} -A INPUT -p tcp -m state --state NEW -m tcp --dport 110 -j ACCEPT

echo " * разрешение ping responses"
${IPTABLES} -A INPUT -p ICMP --icmp-type 8 -j ACCEPT

# DROP everything else and Log it
${IPTABLES} -A INPUT -j LOG
${IPTABLES} -A INPUT -j DROP

#
# Сохранение настроек
#
echo " * СОХРАНЕНИЕ ПРАВИЛ"

if [[ -d /etc/network/if-pre-up.d ]]; then
    if [[ ! -f /etc/network/if-pre-up.d/iptables ]]; then
        echo -e "#!/bin/bash" > /etc/network/if-pre-up.d/iptables
        echo -e "test -e /etc/iptables.rules && iptables-restore -c /etc/iptables.rules" >> /etc/network/if-pre-up.d/iptables
        chmod +x /etc/network/if-pre-up.d/iptables
    fi
fi

iptables-save > /etc/fwall.rules
iptables-restore -c /etc/fwall.rules
## chmod +x /usr/local/bin/fwall-rules

для активации правил вы подготовили сценарии, просто выполните его

## fwall-rules

из командной строки. Чтобы добавить или удалить правило, вам просто нужно просто открыть скрипт, добавить или удалить желаемое правило, сохранить и запустить его снова, например:

## fwall-rules
 * удаление старых правил
 * настройка политики по умолчанию
 * разрешение loopback devices
 * разрешение ssh по порту 5622
 * разрешение ftp по порту 21
 * разрешение dns по порту 53 udp
 * разрешение dns по порту 53 tcp
 * разрешение http по порту 80
 * разрешение https по порту 443
 * разрешение smtp по порту 25
 * разрешение submission по порту 587
 * разрешение imaps по порту 993
 * разрешение pop3s по порту 995
 * разрешение imap по порту 143
 * разрешение pop3 по порту 110
 * разрешение ping responses
 * СОХРАНЕНИЕ ПРАВИЛ

В следующей статье мы покажем вам, как вы можете обеспечить и защитить виртуальный сервер Ubuntu или Debian с помощью брандмауэра Iptables.

PS. Если вам понравился этот пост, поделитесь им с друзьями в социальных сетях помощью кнопок внизу поста или просто оставьте комментарий ниже. Заранее благодарю.

Как обеспечить безопасность VPS на базе Ubuntu/Debian с помощью IPTABLES/Netfilter

Exit mobile version