質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

firewalld

firewalldは、CentOS7からデフォルトになったパケットフィルタリングです。一時的なルールと永続的なルールが設定でき、通信の許可・拒否をコントロール。バージョン6まで利用されてきた「iptables」における課題をカバーしています。

Q&A

解決済

1回答

5493閲覧

firewalldのdirectルールについて

sho88

総合スコア19

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

firewalld

firewalldは、CentOS7からデフォルトになったパケットフィルタリングです。一時的なルールと永続的なルールが設定でき、通信の許可・拒否をコントロール。バージョン6まで利用されてきた「iptables」における課題をカバーしています。

0グッド

0クリップ

投稿2020/10/22 13:19

CentOS8です。
ゾーン(public,drop等)を使用せずに、firewalldのdirectルールのみでINPUT,OUTPUT,FORWARDの通信を管理したいです。

以下の手順でゾーンとdirectrルールを作成しました。
(1)新規ゾーンを作成(original)
(2)1のダイレクトルールを追加。

これで、HTTP通信は可能だと考えていたのですが、
2.で services:http を追加しないとHTTP接続できない状況です。

firewalldでは、OUTPUT通信も制御した場合、ゾーンとdirectと併せて運用するのが当然なのでしょうか。
上述の通り、できれば、directゾーンのみで制御したいです。

そもそも、originalゾーン作成していること自体が、間違っているかもしれませんが、
diretctルールのみで制御可能な方法がございましたら、ご教示いただけると幸いです。
3.4.はiptablesとnftの結果です。


1.[root@centos8 firewalld]# less direct.xml

<?xml version="1.0" encoding="utf-8"?> <direct> <rule ipv="ipv4" table="filter" chain="INPUT" priority="1">-p tcp --dport 80 -j ACCEPT</rule> <rule ipv="ipv4" table="filter" chain="INPUT" priority="1">-m state --state ESTABLISHED,RELATED -j ACCEPT</rule> </direct>

2.[root@centos8 ~]# firewall-cmd --list-all
original (active)
target: default
icmp-block-inversion: no
interfaces: enp0s3
sources:
services:
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

3.[root@centos8 firewalld]# iptables -L -n -v
Chain INPUT (policy ACCEPT 4 packets, 352 bytes)
pkts bytes target prot opt in out source destination
24 1536 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
1005 76204 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination

Chain OUTPUT (policy ACCEPT 594 packets, 71377 bytes)
pkts bytes target prot opt in out source destination

4.[root@centos8 firewalld]# nft list table filter
table ip filter {
chain INPUT {
type filter hook input priority 0; policy accept;
meta l4proto tcp tcp dport 80 counter packets 24 bytes 1536 accept
ct state related,established counter packets 716 bytes 54400 accept
}

chain FORWARD { type filter hook forward priority 0; policy accept; } chain OUTPUT { type filter hook output priority 0; policy accept; }

}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hentaiman

2020/10/23 00:02

directのみならfirewalld切ってiptables入れてiptables有効にすれば良いじゃない?
sho88

2020/10/23 14:11

お返事いただきありがとうございます。 おっしゃる通りなのですが、iptablesはいずれ使用されなくなる?ので、 折角なのでfirewalldを使用して実装したいと考えたからです。
hentaiman

2020/10/23 14:50

そうですね、質問文見ればそれらの事を把握しているだろうことは十分分かりましたがその上での案です。 iptables自体既に使用されていないので自分でインストールしないと使えないはずですが、iptablesも完成しているモノなのでデフォルトインストールから消えるだけで後から追加ならずっと出来そうな気もします
guest

回答1

0

ベストアンサー

バックエンドが nftables に変わって、ACCEPT の挙動が変わっているようです。

(firewalld.direct(5) より抜粋) Packet accept/drop precedence Due to implementation details of netfilter inside the kernel, if FirewallBackend=nftables is used direct rules that ACCEPT packets don't actually cause the packets to be immediately accepted by the system. Those packets are still be subject to firewalld's nftables ruleset. This basically means there are two independent firewalls and packets must be accepted by both (iptables and nftables). As an aside, this scenario also occurs inside of nftables (again due to netfilter) if there are multiple chains attached to the same hook - it's not as simple as iptables vs nftables.

マニュアルでは、この後に解決方法が 4 つ示されています。

  1. リッチルールを使う。→ダイレクトルールと異なり、ゾーンに紐付く。
  2. ネットワークインターフェースを trusted ゾーンにして、ダイレクトルールで許可/禁止すべて設定する。→firewalld を使わず、nftables か iptables を使った方がいいのでは?
  3. ゾーン側でも許可ルールを設定し、ダイレクトルールと併用する。
  4. バックエンドを nftables→iptables に変更する。

手っ取り早く解決するのであれば、4 番の方法、/etc/firewalld/firewall.confFirewallBackend=iptables に変更するといいです。

nftables のまま、いい感じに解決する方法はわかりませんでした。

考察

firewall-cmd で設定したものを nft -y list ruleset で確認すると、ダイレクトルールの設定(chain INPUT)が priority 0、ゾーンの設定(chain filter_INPUT)が priority 10 なので、ダイレクトルールが先に評価されますが、accept で終わりではなく、次のチェインに移動してルールが評価されているように思います。
nftables の用語でいうと、goto ではなく jump

(ダイレクトルールの設定、priority 0) table ip filter { chain INPUT { type filter hook input priority 0; policy accept; meta l4proto tcp tcp dport 80 counter packets 1 bytes 60 accept } (ゾーンの設定、priority 10) table inet firewalld { chain filter_INPUT { type filter hook input priority 10; policy accept; ct state { established, related } accept ct status dnat accept iifname "lo" accept jump filter_INPUT_ZONES_SOURCE jump filter_INPUT_ZONES ct state { invalid } drop reject with icmpx type admin-prohibited }

投稿2020/10/23 10:09

TaichiYanagiya

総合スコア12173

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sho88

2020/10/24 00:31

お返事いただきありがとうございました。 丁寧な解説までしてくださり、感謝申し上げます。 おっしゃる通り、 4.バックエンドを nftables→iptables に変更する。 で意図した動きを確認できました。 これからiptablesを使用するのは抵抗がありますが、 firewalldでOUTPUT通信も制御するのは仕様上無理なので、 OUTPUT通信も制御となるとiptablesで実装するしかないのですかね。 大変勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問