Всё в порядке, мы живы. Начинаем вкатываться в новый год.
Допустим у нас есть внешний сервер для проведения пентестов, редтимов и всего этого, и мы хотим его спрятать от посторонних глаз ботов и сок-аналитиков. Звучит просто, но что, если на сервере висит открытый порт? Как с ним быть?
1️⃣ Начну с пинга. По умолчанию популярные linux-дистрибутивы имеют службу, отвечающую за обработку ICMP-пакетов.
Убрать это просто. Достаточно добавить правило блокировки пакетов в межсетевой экран
nft add rule inet filter input icmp type echo-request drop
2️⃣ Порты. Нужно постоянно держать в голове, что 24/7 по нашему серверу бегают боты и сканеры.
Для начала на всякий случай стоит добавить правила на дроп всех соединений. VPS-провайдеры любят вместе с дистрибутивом ставить какой-нибудь агент заббикса. В этом случае лучше написать правила на блокировку всего трафика и потом по мере необходимости добавлять белые списки:
# Очистка текущих правил
sudo nft flush ruleset
# Создание таблицы и цепочек
nft add table inet filter
nft add chain inet filter input { type filter hook input priority 0; policy drop; }
nft add chain inet filter output { type filter hook output priority 0; policy drop; }
nft add chain inet filter forward { type filter hook forward priority 0; policy drop; }
# Исключение для lo
nft add rule inet filter input iif lo accept
nft add rule inet filter output oif lo accept
# Разрешение трафика для 22/tcp порта
nft add rule inet filter input ct state established,related accept
nft add rule inet filter output ct state established,related accept
nft add rule inet filter input tcp dport 22 ct state new accept
nft add rule inet filter output tcp sport 22 accept
nft list ruleset > /etc/nftables.conf
Для скрытия открытого порта достаточно переместить его на нестандартный (например, tcp/64022 вместо tcp/22). Это можно сделать, не изменяя конфигурацию сервиса, на котором открыт сокет:
nft add chain ip nat prerouting { type nat hook prerouting priority 0; } nft add chain ip nat postrouting { type nat hook postrouting priority 100; }
nft add rule ip nat prerouting tcp dport 64022 dnat to :22Или, если не хочется возится с правилами, можно использовать socat:
socat TCP-LISTEN:64022,fork TCP:localhost:22
Но можно сделать еще лучше — фильтровать соединения от всех IP-адресов, которые не выполнили заданные условия. Я сделал для этого небольшой 🔗 PoC (гифка оттуда), использующий nftables для фильтрации и временной разблокировки конкретного адреса ко всем портам, если с него поступил HTTP-запрос. Есть также 🔗 похожее популярное решение . Таким образом боты и аналитики soc не смогут увидеть открытый порт, так как не придет TCP SYN+ACK пакет.