Для защиты сервера после начальной настройки система Ubuntu предоставляет стандартный фаервол iptables. В целом, брандмауэр Ubuntu изначально настроен, но эти настройки небезопасны, так как разрешают весь входящий и исходящий трафик. Чтобы защитить сервер от нежелательного трафика, нужно добавить несколько основных правил iptables.
Правила фаервола iptables – это, по сути, набор опций, который может изменяться в зависимости от целей конкретного процесса. Каждый пакет, который проходит через брандмауэр, проверяется каждым правилом по порядку. Если пакет отвечает правилу, фаервол выполняет соответствующее действие, в противном случае пакет переходит к следующему правилу.
Примечание: Данное руководство охватывает безопасность IPv4. В системах Linux безопасность IPv6 поддерживается отдельно от IPv4. Так, брандмауэр iptables обслуживает только IPv4, а для поддержки безопасности IPv6 существует отдельный инструмент ip6tables. Если виртуальный выделенный сервер настроен для поддержки IPv6, нужно защитить и IPv4. Подробнее о IPv6 читайте в статье «Настройка и использование IPv6 на сервере Linux».
Команды iptables
Данное руководство охватывает только основные команды iptables для настройки базовой безопасности, однако даже на таком начальном уровне есть множество нюансов, которые нужно учитывать при настройке конкретного поведения. Ниже приведены некоторые наиболее популярные команды для настройки брандмауэра; имейте в виду, что это только краткий список, и существует множество других опций.
-A: (Append), adds a rule to iptables
-L: (List), shows the current rules
-m conntrack: allows rules to be based on the current connection state, elaborated in the the --cstate command.
--cstate: explains the states that connections can be in, there are 4: New, Related, Established, and Invalid
-p: (protocol), refers to the the protocol of the rule or of the packet to check.The specified protocol can be one of tcp, udp, udplite, icmp, esp, ah, sctp or the special keyword "all".
--dport: (port), refers to the the port through which the machine connects
-j: (jump), this command refers to the action that needs to be taken if something matches a rule perfectly. It translates to one of four possibilities:
-ACCEPT: the packet is accepted, and no further rules are processed
-REJECT: the packet is rejected, and the sender is notified, and no further rules are processed
-DROP: the packet is rejected, but the sender is not notified, and no further rules are processed
-LOG: the packet is accepted but logged, and the following rules are processed
-I: (Insert), adds a rule between two previous ones
-I INPUT 3: inserts a rule to make it the third in the list
-v: (verbose), offers more details about a rule
Создание правил iptables
Чтобы просмотреть текущие правила iptables, введите:
sudo iptables -L
Они выглядят так:
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Чтобы сбросить набор правил или обновить их, используйте следующую команду, чтобы вернуть правила по умолчанию:
sudo iptables -F
Чтобы ускорить работу iptables, нужно добавить в команду флаг –n. Эта опция отключает DNS-запросы и поиск обратных IP в наборе правил. Например, чтобы просмотреть правила, можно ввести:
iptables -L -n
Базовый фаервол
Изначально текущие правила разрешают все входящие и исходящие соединения. Такое поведение подвергает сервер опасности. При разработке таблицы правил следует помнить о том, что как только пакет принят (ACCEPTED), отклонён (REJECTED) или сброшен (DROPPED), он не будет проверяться остальными правилами. То есть правила, которые находятся в начале таблицы, имеют приоритет над остальными.
Во время создания правил нужно иметь в виду риск заблокировать себя на собственном сервере (например, запретив подключения SSH).
Для начала нужно разрешить все текущие соединения.
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
Данная команда состоит из следующих опций:
- -A добавляет правило в таблицу.
- INPUT определяет это правило в цепочку input.
- m conntrack вместе с опцией –cstate ESTABLISHED,RELATED применяет результат данной команды к текущим соединениям и связанным с ними разрешённым соединениям.
- -j ACCEPT переносит пакет в accept и принимает текущие соединения.
Теперь текущие соединения сервера не будут заблокированы. Можно приступить к блокировке опасных подключений.
К примеру, чтобы заблокировать весь исходящий трафик, кроме портов 22 (SSH) и 80 (трафик веб-сервера), нужно сначала разрешить подключения к этим портам:
sudo iptables -A INPUT -p tcp --dport ssh -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
Опция -p в этих командах задаёт протокол, при помощи которого будут созданы подключения (в данном случае – tcp), а опция –dport указывает порт, по которому будет передаваться пакет.
Разрешив трафик на эти порты, можно заблокировать остальной трафик. Поскольку это правило будет находиться в конце списка, любой трафик, отвечающий предыдущим правилам, не будет затронут.
Чтобы заблокировать остальной трафик, создайте правило:
sudo iptables -P INPUT DROP
Итак, теперь список правил выглядит так:
sudo iptables -L
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
ACCEPT tcp -- anywhere anywhere tcp dpt:http
Осталось добавить всего одно правило, которое настроит кольцевую проверку (или loopback). Имейте в виду, что без следующих опций это попадёт в конец списка и никогда не будет использовано, поскольку оно будет идти после правила блокировки всего трафика.
Чтобы избежать этого, нужно сделать это правило первым в списке при помощи опции INPUT.
sudo iptables -I INPUT 1 -i lo -j ACCEPT
- -I INPUT 1 помещает правило в начало списка.
- lo пропускает пакеты, которые используют интерфейс loopback.
- -j ACCEPT будет принимать трафик loopback.
Итак, теперь все правила брандмауэра настроены. Полный список правил выглядит так (опция –v выведет дополнительные сведения):
sudo iptables -L -v
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- lo any anywhere anywhere
1289 93442 ACCEPT all -- any any anywhere anywhere ctstate RELATED,ESTABLISHED
2 212 ACCEPT tcp -- any any anywhere anywhere tcp dpt:ssh
0 0 ACCEPT tcp -- any any anywhere anywhere tcp dpt:http
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 157 packets, 25300 bytes)
pkts bytes target prot opt in out source destination
Однако правила iptables действительны в течение одной сессии и будут сброшены после перезагрузки сервера.
Сохранение правил iptables
Текущий набор правил достаточно эффективен, однако после перезапуска сервера он будет автоматически сброшен. Чтобы сохранить правила iptables и использовать их на постоянной основе, обратитесь к пакету iptables-persistent.
Чтобы установить этот пакет, введите:
sudo apt-get install iptables-persistent
Во время установки программа спросит, нужно ли сохранить текущие правила iptables для IPv4 и IPv6; выберите yes.
После этого правила будут сохранены в /etc/iptables/rules.v4 и /etc/iptables/rules.v6.
После завершения установки запустите iptables-persistent:
sudo service iptables-persistent start
Теперь набор правил будет автоматически восстановлен после перезапуска сервера.