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

Добавление постоянного правила PREROUTING в iptables с помощью firewall-cmd

Я пытаюсь добавить новое правило в цепочку PREROUTING в iptables (NAT), используя firewall-cmd на RHEL 7:

$ firewall-cmd --permanent --direct --add-rule ipv4 nat PREROUTING 0 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8161

Затем я проверяю iptables через $ iptables -t nat -L:

...
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
PREROUTING_direct  all  --  anywhere             anywhere
PREROUTING_ZONES_SOURCE  all  --  anywhere             anywhere
PREROUTING_ZONES  all  --  anywhere             anywhere
...
Chain PREROUTING_direct (1 references)
target     prot opt source               destination
REDIRECT   tcp  --  anywhere             anywhere             tcp dpt:http redir ports 8161
...

Однако, если я запустил эквивалентную команду iptables следующим образом:

...
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
PREROUTING_direct  all  --  anywhere             anywhere
PREROUTING_ZONES_SOURCE  all  --  anywhere             anywhere
PREROUTING_ZONES  all  --  anywhere             anywhere
REDIRECT   tcp  --  anywhere             anywhere             tcp dpt:http redir ports 8161
...
Chain PREROUTING_direct (1 references)
target     prot opt source               destination
REDIRECT   tcp  --  anywhere             anywhere             tcp dpt:http redir ports 8161

Я получаю это дополнительное правило в Chain PREROUTING и это позволяет выполнять предварительную маршрутизацию, даже если брандмауэр отключен (т. е. отключение демона брандмауэра и запуск iptables команда).

Итак, у меня двоякий вопрос:

Ты используешь firewall-cmd с участием --direct параметр, что означает, что он принимает команду iptables. Итак, вы можете точно такие же варианты с iptables -t nat чтобы иметь тот же эффект, за одним исключением. С помощью firewall-cmd таким образом добавится правило NAT к PREROUTING_direct цепь при использовании iptables напрямую с добавлением правила в PREROUTING цепь.

На выходе iptables -t nat -L, вы добавили правило дважды: по одному в каждую цепочку.

Что касается второй части вопроса, служба firewalld удалит все определенные цепочки при остановке. Итак, правила добавлены в PREROUTING_direct больше не будет доступен. Короткий ответ - нет.

Я получил это дополнительное правило в цепочке PREROUTING, и это позволяет предварительной маршрутизации работать, даже если брандмауэр отключен.

Так что я не совсем уверен, что это правда.

Если PREROUTING больше не работает, когда вы останавливаете firewalld (и я не понимаю, зачем вы это делаете), то я предполагаю, что это потому, что firewalld удаляет всю свою политику (например, iptables -F/iptables -X). В этом случае тот факт, что вы вручную добавили другую версию того же правила, не имеет большого значения. iptables -F все равно удалите это.

Ваша (первая) команда должна давать вам постоянное правило предварительной маршрутизации, как вы хотели, пока вы не остановите firewalld. Я склонен думать, что этого должно быть достаточно, но я вполне могу упустить что-то в ваших потребностях.

Чтобы было ясно: нет практичный разница между тем, чтобы ваше правило предварительной маршрутизации было в цепочке PREROUTING_DIRECT или цепочке PREROUTING. Оба подхода работают одинаково, имеют одинаковый эффект и при отсутствии других изменений в вашей политике брандмауэра должны делать то, что вам нужно.

Единственная разница в том, что firewalld, по сути, делает за вас небольшую админку и размещает ваши актуальный правило в цепочке, определенной пользователем, а не в системе, определенной системой.

tl; dr: Я бы просто оставил firewalld работающим и использовал его команды для создания ваших правил и управления ими. Хотя команды firewall-cmd и 'raw' iptables имеют немного разные визуальные эффекты, они одинаково влияют на сетевой трафик.