Вопрос или проблема
У меня есть два VPS с точно такими же правилами iptables. VPS1 работает как нужно. VPS2 отбрасывает входящий трафик, я знаю это, потому что, когда я устанавливаю политику INPUT на ACCEPT, VPS2 начинает работать нормально.
Любой запрос ping
или apt update
работает хорошо на VPS1, но не на VPS2.
Ниже приведены мои правила iptables:
# Сгенерировано с помощью iptables-save v1.8.10 (nf_tables) в четверг, 13 февраля 2025 года, 08:23:05
*filter
:INPUT DROP [124:10599]
:FORWARD ACCEPT [30026868:6895187393]
:OUTPUT DROP [3854:392867]
-A INPUT -i enp21s0 -p udp -m udp --dport 53 -j ACCEPT
-A INPUT -i enp21s0 -p udp -m udp --sport 53 -j ACCEPT
-A INPUT -i enp21s0 -p tcp -m tcp --dport 53 -j ACCEPT
-A INPUT -i enp21s0 -p tcp -m tcp --sport 53 -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -i enp21s0 -p tcp -m tcp --dport 58644 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 2018 -j ACCEPT
-A INPUT -s 45.9.188.80/32 -i enp21s0 -p tcp -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A FORWARD -i enp21s0 -o tun+ -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i tun+ -o enp21s0 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -m string --string "BitTorrent" --algo bm -j DROP
-A FORWARD -m string --string "BitTorrent protocol" --algo bm -j DROP
-A FORWARD -m string --string "peer_id=" --algo bm -j DROP
-A FORWARD -m string --string ".torrent" --algo bm -j DROP
-A FORWARD -m string --string "announce.php?passkey=" --algo bm -j DROP
-A FORWARD -m string --string "torrent" --algo bm -j DROP
-A FORWARD -m string --string "announce" --algo bm -j DROP
-A FORWARD -m string --string "info_hash" --algo bm -j DROP
-A FORWARD -m string --string "tracker" --algo bm -j DROP
-A FORWARD -m string --string "get_peers" --algo bm -j DROP
-A FORWARD -m string --string "announce_peer" --algo bm -j DROP
-A FORWARD -m string --string "find_node" --algo bm -j DROP
-A FORWARD -o enp21s0 -p tcp -m tcp --dport 25 -j DROP
-A FORWARD -o enp21s0 -p tcp -m tcp --dport 587 -j DROP
-A FORWARD -o enp21s0 -p tcp -m tcp --dport 465 -j DROP
-A FORWARD -o enp21s0 -p tcp -m tcp --dport 588 -j DROP
-A FORWARD -o enp21s0 -p tcp -m tcp --dport 2525 -j DROP
-A OUTPUT -o enp21s0 -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
COMMIT
# Завершено в четверг, 13 февраля 2025 года, 08:23:05
# Сгенерировано с помощью iptables-save v1.8.10 (nf_tables) в четверг, 13 февраля 2025 года, 08:23:05
*nat
:PREROUTING ACCEPT [19257820:2553227857]
:INPUT ACCEPT [475708:24697295]
:OUTPUT ACCEPT [212006:15357977]
:POSTROUTING ACCEPT [212057:15361997]
-A POSTROUTING -s 10.8.0.0/24 -o enp21s0 -j MASQUERADE
COMMIT
# Завершено в четверг, 13 февраля 2025 года, 08:23:05
В чем может быть проблема? И как я могу это отладить?
Ответ или решение
Прежде чем приступить к обсуждению решения проблемы с iptables, важно понять контекст и ключевые моменты, изложенные в проблеме:
Теория
iptables — это мощный инструмент для управления правилами фильтрации пакетов в Linux. Он может быть использован для управления входящим и исходящим трафиком, а также для перекрытия или разрешения доступа на уровне сети.
Когда одна из ваших виртуальных машин VPS2 испытывает необъяснимое поведение, такое как блокировка входящего трафика, в то время как у другой (VPS1) все работает нормально при схожих условиях, это может свидетельствовать о ряде возможных проблем, начиная от ошибок в конфигурации, до различий в сетевом окружении или подстановках.
Примеры
В вашем случае, вы описали следующую конфигурацию:
-
Политика по умолчанию для входящих (INPUT) пакетов установлена на DROP, что означает, что весь незапрашиваемый входящий трафик будет отброшен, если нет явного правила его разрешить.
-
Вы описали правила для разрешения DNS трафика, разрешения пингов и некоторых других сервисов, которые должны функционировать на обеих машинах.
-
Вы сталкиваетесь с проблемой, что VPS2 не позволяет выполнять
ping
илиapt update
, в то время как VPS1 работает исправно.
Применение
Проанализируем список возможных причин и шагов для диагностики:
-
Сравнение iptables правил на обеих VPS: Хотя вы утверждаете, что правила идентичны, стоит внимательно проверить конфигурацию. Малейшая разница может вызвать проблемы. Убедитесь, что правила не только идентичны, но и применены в правильном порядке. Выполните
iptables-save
на обеих VPS и сравните вывод команд. -
Проверка интерфейсов: Убедитесь, что интерфейсы, указанные в правилах, действительно соответствуют установленным на VPS2. Команда
ip a
поможет в этом. Если, например, интерфейс на VPS называется неenp21s0
, а иначе, это объяснило бы блокировку. -
Логирование и отладка: Временно добавьте правила логирования перед вашими правилами DROP, чтобы записывать отброшенные пакеты и выяснить что именно блокируется. Используйте следующую конструкцию:
iptables -A INPUT -j LOG --log-prefix "iptables-drop: " --log-level 4
Это может помочь выявить пакеты, которые блокируются, и на основании этого вы сможете скорректировать правила.
-
Сетевые различия: Иногда проблемы могут вызывать настройки внешней сети или сетевой инфраструктуры, связанной с вашим VPS-провайдером. Проверьте, нет ли каких-либо специфических ограничений, которые могут быть наложены на VPS2.
-
Проверка состояния соединений: Использование команды
conntrack
поможет определить, какие соединения были созданы и закрываются, особенно полезно для проверки того, какие соединения были отвергнуты. -
Настройки DNS: Убедитесь, что DNS-запросы отдаются и принимаются корректно, так как это связано с проблемами в
apt update
. -
Системные обновления и версии: Проверьте, существует ли разница в версиях программного обеспечения, включая версию iptables, ядра, и других компонентов систем, которые могут косвенно влиять на поведение безопасности.
-
Синхронизация времени/часы: Хотя это маловероятно, но иногда проблемы из-за несинхронизированных часов/ NTP-сервиса могут влиять на анализ времени запроса и авторизации.
Заключение
Решение проблем с iptables требует внимательности к деталям и последовательного подхода в проверке и отладке. Рекомендуется фиксировать все изменения, сохранять резервные копии текущих конфигураций и использовать осторожный подход, чтобы исключить объединенные факторы, которые могут вызывать различия в работе между двумя системами. Это позволит не только разрешить текущую проблему, но и предотвратить появление аналогичных в будущем.