Мне нравится редактировать файл iptables вручную, но что-то меня немного смущает.
Насколько я понял из руководства iptables, он просматривает правила сверху вниз, и если совпадение невозможно, оно будет зарегистрировано и отклонено правилами по умолчанию внизу.
Все хорошо.
Но что это значит:
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
<accept ssh, ssl, etc>
<log all, deny all>
Цепочки вверху имеют политику по умолчанию "accept" - это только способ сказать, что мы принимаем пакеты в filter
таблица, для последующего сопоставления? После прочтения руководства мне кажется, что он примет все, а затем не прочитает правила, потому что именно так правила работают по умолчанию - если что-то соответствует, он перестанет читать правила и затем сделает то, что говорится в политике. Любая документация об этом поведении? Я не могу найти ничего достаточно конкретного.
Я тоже видел это после *filter
стол:
*filter
:RH-Firewall-1-INPUT - [0:0]
Это дает возможность добавлять свои собственные цепочки и направлять другие цепочки в эту цепочку:
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
Но здесь «ACCEPT» или «DROP» для этой цепочки вообще не указывается, а вместо них стоит прочерк (-).
Что меня еще больше сбивает с толку - как это работает?
Политика встроенной цепочки определяет, что происходит с пакетами, которые проходят через все правила в цепочке, не сопоставляя ни одного с диспозитивной целью. В приведенном выше примере пакеты, которые проходят через FORWARD
цепочка без сопоставления какого-либо правила с диспозитивной целью будет ACCEPT
ред, потому что политика сети ACCEPT
.
У определяемых пользователем цепочек не может быть политики. Пакеты, которые проходят весь путь через определяемую пользователем цепочку, не сопоставляя правила с диспозитивной целью, возвращаются в цепочку, из которой они были отправлены в определяемую пользователем цепочку («вызывающую цепочку») в правиле после того, которое отправило их там.
А диспозитивный target - это тот, который избавляется от пакета; примеры включают DROP
, ACCEPT
, и MASQUERADE
; недиспозитивные цели включают LOG
, и нулевой целевой объект (вполне законно иметь правило без цели). Когда пакет соответствует правилу с целевой целью, пакет считается удаленным, и дальнейшая обработка правила не происходит. Когда пакет соответствует правилу без целевой цели, обработка пакета продолжается на следующем правиле.
Важным следствием этой логики сопоставления целей и расположения является то, что выигрывает первый диспозитивный матч. Слишком часто мы видим вопросы о научной фантастике, когда у людей есть цепочка, в которой говорится, например,
Chain INPUT (policy ACCEPT 210 packets, 22621 bytes)
pkts bytes target prot opt in out source destination
3224K 1330M DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
который содержит одно правило для блокировки доступа к веб-серверу (tcp dpt:80
). Они хотят разрешить один внешний IP-адрес, например 1.2.3.4
, чтобы получить доступ к этому веб-серверу, поэтому они добавляют правило с
iptables -A INPUT -p tcp --dport 80 -s 1.2.3.4 -j ACCEPT
и у них получается такая цепочка
Chain INPUT (policy ACCEPT 210 packets, 22621 bytes)
pkts bytes target prot opt in out source destination
3224K 1330M DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
0 0 ACCEPT tcp -- * * 1.2.3.4 0.0.0.0/0 tcp dpt:80
Как видите, количество пакетов в этом последнем правиле равно нулю - и они всегда будут нулевыми. Ни один пакет не может соответствовать этому последнему правилу, если не совпал предыдущий и тот, который был перед ним диспозитивным (DROP
), поэтому ни один пакет никогда не достигнет этого последнего правила.
Правильный способ справиться с этим - убедитесь, что ваши исключения предшествуют вашим правилам, как это:
Chain INPUT (policy ACCEPT 210 packets, 22621 bytes)
pkts bytes target prot opt in out source destination
20 875 ACCEPT tcp -- * * 1.2.3.4 0.0.0.0/0 tcp dpt:80
3224K 1330M DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
Теперь сначала обрабатываются исключительные приемы, затем обрабатываются и отбрасываются другие пакеты веб-сервера, которые не поступают с исключительного сервера, и, наконец, политика цепочки заботится обо всех других пакетах и принимает их.