Вопрос или проблема
Я пытаюсь заблокировать весь трафик с помощью iptables
, но у меня есть некоторые исключения:
- DNS
- мой собственный сервер (я использую только порт 80)
- Teamviewer (порт 5938)
- порт 5555 для разрешения подключений adb
На данный момент у меня есть следующие строки кода, но они не работают так, как мне нужно:
// Разрешить мой собственный сервер - это, похоже, работает
iptables -A INPUT -s 1.1.1.1 -j ACCEPT
iptables -A OUTPUT -d 1.1.1.1 -j ACCEPT
// Разрешить DNS-запросы - не знаю, правильно ли это
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -A INPUT -p udp --dport 53 -j ACCEPT
// Разрешить Teamviewer - то же самое, не знаю, правильно ли это
iptables -A INPUT -p tcp --dport 5938 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 5938 -j ACCEPT
iptables -A OUTPUT -p udp --dport 5938 -j ACCEPT
iptables -A INPUT -p udp --dport 5938 -j ACCEPT
// Разрешить ADB - то же самое, не знаю, правильно ли это
iptables -A INPUT -p tcp --dport 5555 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 5555 -j ACCEPT
iptables -A OUTPUT -p udp --dport 5555 -j ACCEPT
iptables -A INPUT -p udp --dport 5555 -j ACCEPT
// Заблокировать все остальные запросы
iptables -P INPUT DROP
iptables -P OUTPUT DROP
Teamviewer не подключается, разрешение имен тоже не работает, adb также не подключается. Что-то не так, не знаю, что. Единственное, что работает, – это подключение к моему собственному серверу, если я жестко укажу домен в /etc/hosts
.
Может ли кто-то из гуру iptables
здесь помочь мне?
Что не работает? На самом деле, первая запись iptables разрешает весь трафик tcp/udp, если я прав. Так что другие правила тоже не будут срабатывать. Если вы хотите только HTTP-трафик, вам нужно разрешить только TCP-порт 80.
IPtables работают сверху вниз. Ваш сервер имеет IP-адрес 1.1.1.1, и все пакеты будут иметь адрес источника 1.1.1.1. В противном случае весь входящий трафик будет иметь адрес источника x.x.x.x и адрес назначения 1.1.1.1, поэтому ваши первые две записи будут соответствовать всему трафику. Для ваших нужд вам следует настроить это без первых двух правил. Трафик DNS будет разрешен следующим образом:
iptables -A OUTPUT -p udp --sport 1024:65535 --dport 53 -j ACCEPT
HTTP / HTTPS трафик для вашего сервера вы должны настроить следующим образом:
iptables -A OUTPUT -p tcp --sport 1024:65535 -m multiport --dports 80,443 -j ACCEPT
Teamviewer приоритетен для получения TCP-соединения через 5938, поэтому это должно выглядеть так:
iptables -A OUTPUT -o eth0 -p tcp --dport 5938 -m state --state NEW -j ACCEPT
Что касается ADB, я не уверен, потому что никогда с ним не работал. Но если это TCP-поток, вы должны сделать:
iptables -A OUTPUT -p tcp --dport 5555 -j ACCEPT
Вы правильно разрешаете исходящий трафик, но вы блокируете ответные пакеты, потому что путаете порты источника с портами назначения.
Когда вы подключаетесь к службе на удаленной системе, вы обычно открываете сокет с портом назначения этой службы, а порт источника оставляете неопределенным, что означает, что ядро случайно назначит вам порт источника. Ответы от удаленной службы затем будут отправлены обратно в сетевом пакете, который имеет ваш порт источника в качестве порта назначения, а ваш порт назначения в качестве порта источника. Однако ваши правила используют порт назначения службы в качестве порта назначения для обратного трафика, что не будет соответствовать фактическому трафику и, следовательно, не будет работать.
Хотя теоретически вы могли бы использовать --sport
, чтобы соответствовать порту источника в обратном трафике, я бы этого не рекомендовал. Это позволит любому отправлять трафик к любой службе на вашем сервере, если они убедятся, что используют порт 53 в качестве порта источника (или любую из других оставшихся открытыми служб).
Вместо этого я бы рекомендовал использовать модуль отслеживания соединений:
iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
Объяснение:
-m conntrack
: говорит iptables загрузить модульconntrack
, который отслеживает состояние известных соединений--ctstate RELATED,ESTABLISHED
: соответствовать только пакетам, которые отправляются как часть известного сетевого соединения (ESTABLISHED
) или которые создают новое, но ожидаемое соединение (RELATED
). RELATED полезен для таких вещей, как FTP, которые используют более одного сетевого соединения; я не думаю, что это актуально для протоколов, которые вы используете, так что вы можете его убрать, если хотите (но тогда я тоже не на 100% уверен, так что…)
После того, как вы добавите это правило, вам нужно будет беспокоиться только о добавлении правил для первоначального соединения:
iptables -A INPUT -m conntrack --ctstate NEW -p tcp --dport 5938 -j ACCEPT
(повторить для всех протоколов, которые вы хотите разрешить)
Обратите внимание, что вы можете использовать conntrack
и в цепочке OUTPUT, если хотите блокировать исходящий трафик.
Наконец, обратите внимание, что есть также состояние INVALID, на которое вы можете соответствовать. Оно будет срабатывать, когда пакет arrives, который заявляет, что является частью сетевого соединения, но для которого iptables
не может найти никакого состояния. Это может быть связано с тем, что таблица состояния исчерпала память, или это может быть связано с тем, что злоумышленник пытается обойти ваш фаервол. Вам, вероятно, нужно будет что-то зарегистрировать и отбросить пакет.
Ответ или решение
Для настройки iptables с целью блокировки всего входящего и исходящего трафика, кроме DNS (порт 53), TeamViewer (порт 5938), подключения к вашему серверу (порт 80) и ADB (порт 5555), необходимо учитывать некоторые ключевые аспекты при написании правил. Давайте рассмотрим правильный порядок и синтаксис правил iptables, чтобы достичь требований, описанных в вашем вопросе.
Шаг 1. Базовая настройка
Прежде всего, убедитесь, что вы устанавливаете правила в правильном порядке. Порядок правил в iptables имеет значение: пакеты обрабатываются сверху вниз, и как только пакет соответствует правилу, следующие правила не обрабатываются. Поэтому нам следует начать с разрешения нужного трафика, а затем блокировать все остальные пакеты.
Шаг 2. Разрешение входящего и исходящего трафика
Вот корректный набор правил для вашей конфигурации:
# Разрешаем исходящий трафик для DNS-запросов
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
# Разрешаем входящий трафик для ответов на DNS-запросы
iptables -A INPUT -p udp --sport 53 -j ACCEPT
# Разрешаем входящий и исходящий трафик для вашего сервера на порту 80
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 80 -m conntrack --ctstate ESTABLISHED -j ACCEPT
# Разрешаем входящий и исходящий трафик для TeamViewer на порту 5938
iptables -A INPUT -p tcp --dport 5938 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 5938 -m conntrack --ctstate ESTABLISHED -j ACCEPT
# Разрешаем входящий и исходящий трафик для ADB на порту 5555
iptables -A INPUT -p tcp --dport 5555 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 5555 -m conntrack --ctstate ESTABLISHED -j ACCEPT
# Разрешаем все пакеты, связанные с существующими соединениями
iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
# Блокируем весь остальной входящий и исходящий трафик по умолчанию
iptables -P INPUT DROP
iptables -P OUTPUT DROP
Примечания к правилам:
- DNS-запросы: Разрешите исходящие запросы (порт 53) и входящие ответы с динамически сгенерированным исходным портом.
- HTTP-трафик: Разрешите входящий трафик на порт 80 (сервер) и исходящий трафик, связанный с существующим подключением на том же порту.
- TeamViewer: Разрешите входящий клиентский запрос на порт 5938 и исходящие подключения, связанные с TeamViewer, через
RELATED,ESTABLISHED
. - ADB: Аналогично, разрешите входящие и исходящие соединения на порту 5555.
- Управление состояниями соединений: Используйте модуль
conntrack
, чтобы отслеживать и управлять состояниями соединений. Это исправляет проблему с блокировкой ответов на запрашиваемый трафик. - Блокировка по умолчанию: Убедитесь, что последние правила по умолчанию блокируют весь трафик, который не попадает в вышеуказанные категории.
Заключение
После того как вы примените эти настройки в конфигурации iptables, проверьте работоспособность входящих и исходящих подключений для всех упомянутых сервисов. Это подход обеспечит необходимый уровень безопасности, позволяя работать только с разрешенными соединениями, что минимизирует риски атак и нежелательного трафика.