openSUSE Leap 16

Nftables : サービスを有効化する2025/12/09

 

Nftables の基本操作です。

nftables は、従来の iptables, ip6tables, arptables, ebtables の機能を統合したツールです。

[1] nftables は Firewalld のデフォルトのバックエンドとして使用されています。
dlp:~ #
grep ^FirewallBackend /etc/firewalld/firewalld.conf

FirewallBackend=nftables
[2] nftables を使用する場合は、firewalld サービスは無効化します。
また、システムの再起動時にフィルタリングのルールセットを復元できるように、nftables のサービスを有効化しておきます。
dlp:~ #
systemctl disable --now firewalld

Removed '/etc/systemd/system/multi-user.target.wants/firewalld.service'.
Removed '/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service'.

dlp:~ #
systemctl enable --now nftables

Created symlink '/etc/systemd/system/multi-user.target.wants/nftables.service' → '/usr/lib/systemd/system/nftables.service'.

# [nftables.service] は起動時に [/etc/nftables/rules/main.nft] を読み込んでルールセットを復元するサービス

dlp:~ #
systemctl cat nftables.service

# /usr/lib/systemd/system/nftables.service
[Unit]
Description=nftables static rule set
Documentation=man:nftables.service(8)
Wants=network-pre.target
Before=network-pre.target shutdown.target
Conflicts=shutdown.target firewalld.service
DefaultDependencies=no
ConditionPathExists=/etc/nftables/rules/main.nft

[Service]
Type=oneshot
RemainAfterExit=yes
StandardInput=null
ProtectSystem=full
ProtectHome=true
ExecStart=/usr/sbin/nft 'flush ruleset; include "/etc/nftables/rules/main.nft"'
ExecReload=/usr/sbin/nft 'flush ruleset; include "/etc/nftables/rules/main.nft"'
ExecStop=/usr/sbin/nft flush ruleset

[Install]
WantedBy=sysinit.target
[3] Firewalld に設定したルールセットを引き継いで nftables サービスに切り替えたい合は、以下のように設定します。
# Firewalld の現在の設定確認 ( firewalld サービス稼働中が前提 )

dlp:~ #
firewall-cmd --list-all

public (default, active)
  target: default
  ingress-priority: 0
  egress-priority: 0
  icmp-block-inversion: no
  interfaces: enp1s0
  sources:
  services: dhcpv6-client ssh
  ports:
  protocols:
  forward: yes
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

# Firewalld バックエンドの nftables の現在のルールセットを全て表示

dlp:~ #
nft list ruleset

table inet firewalld {
        chain mangle_PREROUTING {
                type filter hook prerouting priority mangle + 10; policy accept;
                jump mangle_PREROUTING_POLICIES
        }

        chain mangle_PREROUTING_POLICIES {
                iifname "docker0" jump mangle_PRE_policy_allow-host-ipv6
                iifname "docker0" jump mangle_PRE_docker
                iifname "docker0" return
                iifname "enp1s0" jump mangle_PRE_policy_allow-host-ipv6
                iifname "enp1s0" jump mangle_PRE_public
                iifname "enp1s0" return
                jump mangle_PRE_policy_allow-host-ipv6
                jump mangle_PRE_public
                return
        }
.....
.....

# 現在のルールセットを書き出す

dlp:~ #
mkdir /etc/nftables/rules

dlp:~ #
nft list ruleset > /etc/nftables/rules/main.nft
# firewalld サービス停止 & nftables サービス起動

dlp:~ #
systemctl disable --now firewalld

dlp:~ #
systemctl enable --now nftables
# ルールセット表示

dlp:~ #
nft list ruleset

table inet firewalld {
        chain mangle_PREROUTING {
                type filter hook prerouting priority mangle + 10; policy accept;
                jump mangle_PREROUTING_POLICIES
        }

        chain mangle_PREROUTING_POLICIES {
                iifname "docker0" jump mangle_PRE_policy_allow-host-ipv6
                iifname "docker0" jump mangle_PRE_docker
                iifname "docker0" return
.....
.....

# 例えば [firewalld] で許可されていたサービス [services: dhcpv6-client ssh] は以下のように確認可

dlp:~ #
nft list chain inet firewalld filter_IN_public_allow

table inet firewalld {
        chain filter_IN_public_allow {
                tcp dport 22 accept
                ip6 daddr fe80::/64 udp dport 546 accept
        }
}
関連コンテンツ