В общем:
Для просмотра и изменения конфигурации брандмауэра требуются права администратора ( root
), как и открытие служб в ограниченном диапазоне номеров портов. Это означает, что вы должны войти в систему как пользователь root
или использовать его sudo
для запуска команды от имени пользователя root. Я постараюсь пометить такие команды как необязательные [sudo]
.
Содержание:
- Порядок имеет значение или разница между
-I
и-A
- Показать текущую конфигурацию брандмауэра
- Интерпретация результатов
iptables -L -v -n
- Знай свое окружение
- Цепочки INPUT и FORWARD
- Модули ядра
1. Порядок имеет значение или разница между -I
и-A
Следует помнить, что правила брандмауэра проверяются в порядке их перечисления. Ядро прекратит обработку цепочки, когда сработает правило, которое разрешит или запретит пакет или соединение.
Я думаю, что наиболее распространенная ошибка для начинающих администраторов брандмауэра заключается в том, что они следуют правильным инструкциям, чтобы открыть новый порт, такой как приведенный ниже:
[sudo] iptables -A INPUT -i eth0 -p tcp --dport 8080 -j ACCEPT
а затем обнаружите, что это не вступит в силу.
Причиной этого является то, что -A
опция добавляет это новое правило после всех существующих правил
и, поскольку очень часто последнее правило в существующем брандмауэре было таким, которое блокирует весь трафик, который явно не разрешен, что приводит к
...
7 2515K 327M REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
8 0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8080
Или эквивалент в iptables-save:
...
iptables -A INPUT -j REJECT
iptables -A INPUT -p tcp --dport 8080 -j ACCEPT
и новое правило, открывающее TCP-порт 8080, никогда не будет достигнуто. (О чем свидетельствуют счетчики упорно оставшихся в 0 пакетов и нулевых байт).
Вставка правила с -I
новым правилом была бы первой в цепочке и будет работать.
2. Показать текущую конфигурацию брандмауэра
Моя рекомендация для администратора брандмауэра состоит в том, чтобы взглянуть на фактическую конфигурацию ядра Linux, а не пытаться диагностировать проблемы брандмауэра с помощью удобных для пользователя инструментов. Часто, когда вы понимаете основные проблемы, вы можете легко решить их в вопросе, поддерживаемом этими инструментами.
Команда [sudo] iptables -L -v -n
твой друг (хотя некоторые люди любят iptables-save
лучше). Часто при обсуждении конфигураций полезно также использовать эту --line-numbers
опцию для нумерации строк. Ссылка на правило #X облегчает их обсуждение.
Примечание: правила NAT, включаются в iptables-save
выходной , но должны перечислены отдельно, добавив -t nat
опцию т.е. [sudo] iptables -L -v -n -t nat --line-numbers
.
Многократный запуск команды и проверка на приращение счетчиков могут быть полезными инструментами, чтобы увидеть, действительно ли запускается новое правило.
[root@host ~]# iptables -L -v -n
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 784K 65M fail2ban-SSH tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
2 2789K 866M ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
3 15 1384 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
4 44295 2346K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
5 40120 2370K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:80
6 16409 688K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:443
7 2515K 327M REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT 25 packets, 1634 bytes)
num pkts bytes target prot opt in out source destination
Chain fail2ban-SSH (1 references)
num pkts bytes target prot opt in out source destination
1 0 0 REJECT all -- * * 117.239.37.150 0.0.0.0/0 reject-with icmp-port-unreachable
2 4 412 REJECT all -- * * 117.253.208.237 0.0.0.0/0 reject-with icmp-port-unreachable
В качестве альтернативы вывод команды iptables-save
дает скрипт, который может восстановить указанную выше конфигурацию брандмауэра:
[root@host ~]# iptables-save
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [441:59938]
:fail2ban-SSH - [0:0]
-A INPUT -p tcp -m tcp --dport 22 -j fail2ban-SSH
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
-A fail2ban-SSH -s 117.239.37.150/32 -j REJECT --reject-with icmp-port-unreachable
-A fail2ban-SSH -s 117.253.208.237/32 -j REJECT --reject-with icmp-port-unreachable
COMMIT
Это вопрос предпочтения того, что вам будет легче понять.
3. Интерпретация результатов iptables -L -v -n
Политика устанавливает действие по умолчанию в цепи использование , когда нет четких правил спичек. В INPUT
цепочке, в которой установлено ПРИНЯТЬ весь трафик.
Первое правило в цепочке INPUT сразу интересное: оно отправляет весь трафик (источник 0.0.0.0/0 и пункт назначения 0.0.0.0/0), предназначенный для TCP-порта 22 ( tcp dpt:22
), порт по умолчанию для SSH, в пользовательскую цель ( fail2ban-SSH
) , Как следует из названия, это правило поддерживается fail2ban (продуктом безопасности, который, среди прочего, сканирует системные журналы на предмет возможных злоупотреблений и блокирует IP-адрес обидчика).
Это правило было бы создано с помощью командной строки iptables, аналогичной iptables -I INPUT -p tcp -m tcp --dport 22 -j fail2ban-SSH
или найденной в выходных данных iptables-save as -A INPUT -p tcp -m tcp --dport 22 -j fail2ban-SSH
. Часто вы можете найти любую из этих записей в документации.
Счетчики показывают, что это правило соответствует 784 000 пакетов и 65 мегабайтам данных.
Трафик, соответствующий этому первому правилу, затем обрабатывается fail2ban-SSH
цепочкой, которая в виде нестандартной цепочки попадает в список ниже цепочки OUTPUT.
Эта цепочка состоит из двух правил, по одному для каждого обидчика (IP-адрес источника 117.253.221.166 или 58.218.211.166), который заблокирован (с помощью a reject-with icm-port-unreachable
).
-A fail2ban-SSH -s 117.253.221.166/32 -j REJECT --reject-with icmp-port-unreachable
-A fail2ban-SSH -s 58.218.211.166/32 -j REJECT --reject-with icmp-port-unreachable
Пакеты SSH, которые не получены от этих заблокированных хостов, еще не разрешены и не запрещены, и теперь, когда пользовательская цепочка завершена, будет проверено второе правило в цепочке INPUT.
Все пакеты, которые не были предназначены для порта 22, прошли первое правило в цепочке INPUT и также будут оцениваться в правиле INPUT # 2.
Правило INPUT номер 2 делает его предназначенным для использования в качестве межсетевого экрана с полным состоянием , который отслеживает соединения. Это имеет некоторые преимущества, только пакеты для новых соединений должны проверяться по полному набору правил, но как только разрешены дополнительные пакеты, принадлежащие установленному или связанному соединению, принимаются без дальнейшей проверки.
Правило ввода № 2 соответствует всем открытым и связанным соединениям, а пакеты, соответствующие этому правилу, не требуют дальнейшей оценки.
Примечание: изменения правил в конфигурации брандмауэра с отслеживанием состояния будут влиять только на новые соединения, а не на установленные.
Напротив, простой фильтр пакетов проверяет каждый пакет на полный набор правил без отслеживания состояния соединения. В таком брандмауэре не будут использоваться ключевые слова состояния .
Правило INPUT # 3 довольно скучно, lo
разрешен весь трафик, соединяющийся с интерфейсом обратной связи ( или 127.0.0.1).
Правила INPUT 4, 5 и 6 используются для открытия TCP-портов 22, 80 и 443 (порты по умолчанию для SSH, HTTP и HTTPS соответственно) путем предоставления доступа к НОВЫМ соединениям (существующие соединения уже разрешены правилом 2 INPUT).
В брандмауэре без сохранения состояния эти правила будут отображаться без атрибутов состояния:
4 44295 2346K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0
5 40120 2370K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0
6 16409 688K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0
или
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
Последнее правило INPUT # 7 - это правило, которое блокирует весь трафик, которому НЕ был предоставлен доступ в правилах INPUT 1-7. Довольно распространенное соглашение: все, что не разрешено, отрицается. Теоретически это правило можно было бы опустить, установив ПОЛИТИКУ по умолчанию ОТКАЗАТЬСЯ.
Всегда исследуйте всю цепочку.
4. Знай свое окружение
4.1. Настройки в программном брандмауэре не влияют на параметры безопасности, поддерживаемые в других местах сети, то есть, несмотря на открытие сетевой службы с iptables
неизмененными списками контроля доступа на маршрутизаторах или других брандмауэрах в вашей сети, они все равно могут блокировать трафик ...
4.2. Когда ни одна служба не прослушивает, вы не сможете подключиться и получить ошибку отказа в соединении , независимо от настроек брандмауэра. Следовательно:
- Убедитесь, что служба прослушивает (на правильном сетевом интерфейсе / IP-адресе) и использует номера портов, которые вы ожидаете
[sudo] netstat -plnut
или альтернативно используете ss -tnlp
.
- Если ваши службы еще не должны работать, эмулируйте простой прослушиватель с помощью, например, netcat:
[sudo] nc -l -p 123
или openssl s_server -accept 1234 [options]
если вам нужен прослушиватель TLS / SSL (проверьте man s_server
параметры).
- Убедитесь, что вы можете подключиться с самого сервера, т. Е.
telnet <IP of Server> 123
Или echo "Hello" | nc <IP of Server> 123
или при тестировании защищенной службы TLS / SSL openssl s_client -connect <IP of Server>:1234
, прежде чем пытаться сделать это с удаленного хоста.
4.3. Понять протоколы, используемые вашими службами. Вы не можете правильно включить / отключить службы, которые вы недостаточно понимаете. Например:
- используется TCP или UDP или оба (как с DNS)?
- Служба использует фиксированный порт по умолчанию (например, что-то вроде TCP-порта 80 для веб-сервера)?
- в качестве альтернативы выбран динамический номер порта, который может варьироваться (например, службы RPC, такие как классическая NFS, которые регистрируются в Portmap)?
- Печально известный FTP даже использует два порта , как фиксированный, так и динамический номер порта, когда настроен на использование пассивного режима ...
- описание сервиса, порта и протокола
/etc/services
не обязательно совпадает с реальным сервисом, использующим порт.
4.4. Фильтр пакетов ядра - не единственное, что может ограничивать сетевое соединение:
- SELinux также может ограничивать сетевые сервисы.
getenforce
подтвердит, работает ли SELinux.
- Несмотря на то, что TCP Wrappers становятся немного неясными, они все же являются мощным инструментом для обеспечения безопасности сети. Проверьте с помощью
ldd /path/to/service |grep libwrap
и /hosts.[allow|deny]
контрольных файлов.
5. INPUT
или FORWARD
Цепи
Концепция цепочек объясняется здесь более подробно, но суть в следующем:
INPUT
Цепь , где вы открываете и / или закрыть сетевые порты для служб работают локально, на машине , где вы выдаете команды Iptables.
В этой FORWARD
цепочке вы применяете правила для фильтрации трафика, который ядро перенаправляет на другие системы, на реальные системы, а также на контейнеры Docker и серверы виртуальных гостевых серверов, когда ваша машина Linux работает как мост, маршрутизатор, гипервизор и / или выполняет сетевой адрес. перевод и переадресация портов.
Распространенным заблуждением является то, что, поскольку контейнер Docker или гость KVM работают локально, применяемые правила фильтрации должны быть в цепочке INPUT, но обычно это не так.
6. Ядро модулей
Поскольку фильтр пакетов работает в ядре Linux, он также может быть скомпилирован как динамический модуль, фактически несколько модулей. Большинство дистрибутивов включают netfilter в качестве модулей, и необходимые модули netfilter будут загружаться в ядро по мере необходимости, но для некоторых модулей администратор брандмауэра должен будет вручную убедиться, что они загружаются. Это в первую очередь относится к модулям отслеживания подключений, nf_conntrack_ftp
которые могут быть загружены с помощью insmod
.
Модули, загруженные в настоящее время в работающее ядро, могут отображаться с помощью lsmod
.
Способ обеспечения постоянной загрузки модулей при перезагрузке зависит от дистрибутива Linux.