Назад | Перейти на главную страницу

Обход iptables и политики цепочки, ручное редактирование

Мне нравится редактировать файл 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» для этой цепочки вообще не указывается, а вместо них стоит прочерк (-).

Что меня еще больше сбивает с толку - как это работает?

  1. Политика встроенной цепочки определяет, что происходит с пакетами, которые проходят через все правила в цепочке, не сопоставляя ни одного с диспозитивной целью. В приведенном выше примере пакеты, которые проходят через FORWARD цепочка без сопоставления какого-либо правила с диспозитивной целью будет ACCEPTред, потому что политика сети ACCEPT.

  2. У определяемых пользователем цепочек не может быть политики. Пакеты, которые проходят весь путь через определяемую пользователем цепочку, не сопоставляя правила с диспозитивной целью, возвращаются в цепочку, из которой они были отправлены в определяемую пользователем цепочку («вызывающую цепочку») в правиле после того, которое отправило их там.

А диспозитивный 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

Теперь сначала обрабатываются исключительные приемы, затем обрабатываются и отбрасываются другие пакеты веб-сервера, которые не поступают с исключительного сервера, и, наконец, политика цепочки заботится обо всех других пакетах и ​​принимает их.