AlmaLinux 8 の利用: firewalld に代え nftables を活用

May 25, 2021 – 6:45 pm

前回のエントリーに書いたように Linux distribution を CentOSから AlmaLinuxへ移行する作業を進めている。

移行作業は、ほぼ完了し、この記事自体はAlmaLinux8.3を搭載したサーバー上で書いている。この移行作業に合わせてパケットフィルタリングを firewalldに代えnftablesの使用に変更したので、この設定内容などについてメモしておくことにした。

RHEL8 以降、 iptablesに変え、nftablesが導入され、firewalld のバックエンドとしてnftablesが使用されるようになった。この変更により、 これまで使用してきたipsetユーティリティが使えなくなってしまったことなど、パケットフィルタリング方式を見直す必要が生じた。firewalldに代え nftablesを活用することにより、ipsetユーティリティと同等な機能を実現できるとともに、より高度なパケットフィルタリングが導入することを期待。

firewalld の停止と nftableの起動
停止、起動時のログ:

# systemctl stop firewalld
# systemctl disable firewalld
# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:firewalld(1)

# systemctl start nftables
# systemctl enable nftables
# systemctl status nftables
● nftables.service - Netfilter Tables
   Loaded: loaded (/usr/lib/systemd/system/nftables.service; enabled; vendor preset: disabled)
   Active: active (exited) since Tue 2021-05-25 14:47:23 JST; 2h 20min ago
     Docs: man:nft(8)
  Process: 852 ExecStart=/sbin/nft -f /etc/sysconfig/nftables.conf (code=exited, status=0/SUCCESS)
 Main PID: 852 (code=exited, status=0/SUCCESS)
    Tasks: 0 (limit: 101077)
   Memory: 0B
   CGroup: /system.slice/nftables.service

May 25 14:47:21 server01.yamasnet.com systemd[1]: Starting Netfilter Tables...
May 25 14:47:23 server01.yamasnet.com systemd[1]: Started Netfilter Tables.

netftables スクリプト

/etc/nftables/server_rule.nft:

#!/usr/sbin/nft -f

# drop any existing nftables ruleset
flush ruleset

include "/etc/nftables/block_list"

table inet filter {
        set blockipv4 {
           type ipv4_addr; flags interval;
           elements = {
                  $blockipv4
           }
        }
        set blockipv6 {
           type ipv6_addr; flags interval;
           elements = {
                  $blockipv6
           }
        } 

        chain input {
                type filter hook input priority 0;

                # allow established/related connections
                ct state { established, related } accept

                # early drop of invalid connections
                ct state invalid drop

                # allow from loopback
                iif "lo" accept

                # allow icmp
                ip protocol icmp accept
                ip6 nexthdr icmpv6 accept

                # reject ip(ipv6) addresses pooled
                ip saddr @blockipv4 reject
                ip6 saddr @blockipv6 reject
 
                # allow ssh only from local area 
                ip saddr 192.168.11.0/24 tcp dport 22 accept

                # allow http, https, smtp, smtps, submission port, imap 
                tcp dport { 80, 443, 587, 143, 993, 465, 25 } accept

                #everything else
                reject with icmp type port-unreachable
        }

        chain FORWARD {
          type filter hook forward priority 0; policy drop;
        }

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

/etc/nftables/block_list:
ブロック対象とするipv4, ipv6 アドレス
以下、例示に過ぎない。

define blockipv4 = {
  107.158.176.0/24,
  5.188.0.0/16,
  202.0.0.0/8,
  185.220.0.0/16,
  51.77.0.0/16,
  51.83.0.0/16,
  162.247.74.0/24,
  23.129.64.0/24,
  51.75.0.0/16,
  142.93.173.214
}

define blockipv6 = {
  2600:1f14:b62::/48,
  2a00:1768:2001::/48,
  2a01:4f8::/24
}

サーバ起動時にスクリプトを動作させる
/etc/sysconfig/nftables.conf 最終行に以下を追記:

include "/etc/nftables/server_rule.nft"

参考にした資料

   
   


Post a Comment