Вопрос или проблема
Я пытаюсь научиться работать с iptables
.
Я пытался остановить весь трафик по http и https.
Мои цепочки INPUT и OUTPUT были пустыми.
Изначально я сделал следующее:
sudo iptables -A OUTPUT -p tcp --dport 80 -j DROP
sudo iptables -A OUTPUT -p tcp --dport 443 -j DROP
Тем не менее, я все еще мог заходить на новые веб-страницы, такие как https://systemd.io/ или https://fr.euronews.com/, но не https://unix.stackexchange.com/
Так как этого было недостаточно, я решил также добавить аналогичные правила для цепочки OUTPUT…
sudo iptables -A INPUT -p tcp --sport 80 -j DROP
sudo iptables -A INPUT -p tcp --sport 443 -j DROP
Я все еще мог заходить на эти веб-сайты… Я не уверен, как это было возможно.
В цепочке FORWARD у меня есть 3 правила (повторенные много раз),
ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED
DOCKER all -- anywhere anywhere
ACCEPT all -- anywhere anywhere
Я не уверен, влияют ли они на цепочки INPUT или OUTPUT…
Ответ или решение
Ваша проблема с iptables связана с тем, как работает сам брандмауэр и как сетевой трафик может обходить ваши правила. Давайте разберем это поэтапно.
Теория
iptables — это инструмент для управления правилами фильтрации пакетов в ядре Linux. Он позволяет управлять входящими, исходящими и перенаправленными пакетами на основе заданных вами правил.
Существует несколько основных цепочек в iptables:
- INPUT – цепочка для обработки входящих пакетов.
- OUTPUT – цепочка для обработки исходящих пакетов.
- FORWARD – цепочка для обработки перенаправленных пакетов (обычно используется в маршрутизаторах).
Также важным понятием является состояние соединения (state), который используется в модулях, таких как conntrack. Возможные состояния включают NEW, ESTABLISHED, RELATED и INVALID.
Пример
Вы создали следующие правила:
-
В цепочке OUTPUT вы блокировали трафик с адресами назначения на порты 80 (HTTP) и 443 (HTTPS):
sudo iptables -A OUTPUT -p tcp --dport 80 -j DROP sudo iptables -A OUTPUT -p tcp --dport 443 -j DROP
-
Вы добавили аналогичные правила в цепочку INPUT, блокируя трафик по источникам на порты 80 и 443:
sudo iptables -A INPUT -p tcp --sport 80 -j DROP sudo iptables -A INPUT -p tcp --sport 443 -j DROP
Несмотря на это, веб-страницы продолжали открываться. Вероятно, причиной этому является использование правил ESTABLISHED в цепочке FORWARD, которыми разрешается трафик в уже установленных соединениях.
- В цепочке FORWARD у вас есть правило:
ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED
Это правило в цепи FORWARD разрешает весь трафик, который является частью уже установленных или связанных соединений. Однако, путем необходимости пересмотра понимаемой структурой сетевых таблиц iptables, вероятно, это напрямую не оказывает влияние на INPUT и OUTPUT цепочки, когда не используется натавление данных из FORWARD цикла. Серьёзная ошибка может заключаться в определении маршрутизирования или использования каких-либо прокси-сервисов или контейнерных консолей, например, Docker, который может обходить ваши запретительные правила.
Применение
Чтобы решить проблему, нужно предпринять следующие шаги:
-
Проверить наличие других приложений или процессов, которые могут обходить стандартные правила iptables.
- Docker и другие контейнеры могут создавать собственные правила брандмауэра, которые могут влиять на ваш трафик. Используйте команду
sudo iptables -S
иsudo iptables -L -v -n
для тщательной инвентаризации существующих правил.
- Docker и другие контейнеры могут создавать собственные правила брандмауэра, которые могут влиять на ваш трафик. Используйте команду
-
Пересмотрите цепочки правил и последовательность их применения.
Начните с удаления всех правил, чтобы убедиться, что действительно у вас нет скрытых процессов управления iptables:
sudo iptables -F
Затем добавьте правила блокировки сначала в INPUT и OUTPUT одна за другой и проверяйте результаты.
-
Блокируйте соединения с использованием модулей netfilter с setstate(NEW,RELATED,ESTABLISHED):
Установите политики отказа для INPUT и OUTPUT:
sudo iptables -P INPUT DROP sudo iptables -P OUTPUT DROP
Добавьте правила на разрешение:
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT sudo iptables -A OUTPUT -m conntrack --ctstate NEW,ESTABLISHED,RELATED -j ACCEPT
-
Логирование traffic перед принятием важных решений.
Добавьте правила для ведения логов, это поможет понять, почему пакеты всё ещё передаются.
sudo iptables -A INPUT -j LOG --log-prefix "INPUT DROP: " sudo iptables -A OUTPUT -j LOG --log-prefix "OUTPUT DROP: "
-
Перезапустите сетевые интерфейсы и сервера.
Загрузка новой конфигурации iptables иногда требует перезагрузки сетевых интерфейсов или полного перезапуска для применения корректных изменений, особенно после модификации связанных контейнеров и маршрутизирующего ПО.
Тщательное следование этим шагам позволит вам понять, где ваша конфигурация не отвечает ожиданиям и открыть полноценный контроль доступа к сети. Это требование, чтобы обеспечить обозримость сетевого трафика и особое внимание к принудительному блокированию всех несанкционированных соединений по заданным портам.