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"
参考にした資料:
- A basic nftables config. Only accept ssh, http and https. · GitHub
- 第6章 NFTABLES の使用 (ネットワークのセキュリティー保護(RedHat 8 doc))