Я пытаюсь добавить новое правило в цепочку 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
команда, которая делает то же самое, что и iptables
команда выше?firewall-cmd
и оставаться там даже после отключения демона брандмауэра?Ты используешь 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 имеют немного разные визуальные эффекты, они одинаково влияют на сетевой трафик.