Debian 10 (buster)のnftablesでアクセス制御

はじめに

Debian 10 のインストールはDebian 10 (buster)を用いたサーバ設定メモ - 発声練習

方針

Debian 10からアクセス制御をiptablesからnftablesで行うようになった。

  • Debian 9以前のiptablesの設定をテキストファイルに出力する
  • Debian 10上で iptables-restore-translate でiptablesの設定をnftablesの設定に変更する。
  • 編集したものを /etc/nftables.conf にコピーし、設定を反映させる。

(必要に応じて) iptablesの設定をテキストファイルに出力

% sudo iptables-save > iptables.conf

nftablesのインストール

% sudo apt install nftables
% sudo  systemctl enable nftables.service

現在の設定を表示する。

% sudo nft list ruleset

iptablesの設定をnftablesの設定へ変換

% sudo /usr/sbin/iptables-restore-translate -f iptables.conf > /tmp/nftables-temp.conf

/tmp/nftables-temp.conf を適宜編集する。/etc/nftables.conf の先頭2行は必ず追加しないといけない。編集したら/etc/nftables.confとして保存する。

% cd /etc
% sudo cp -p nftables.conf nftables.conf.org
% sudo cp /tmp/nftables-temp.conf nftables.conf
% sudo nft -f /etc/nftables.conf
% sudo nft list ruleset

設定例

元のiptablesの設定は そこそこセキュアなlinuxサーバーを作る - Qiitaを参考にしている。

#!/usr/sbin/nft -f

# 既存の設定をリセット
flush ruleset

table inet filter {
	chain input {
		type filter hook input priority 0;
	}
	chain forward {
		type filter hook forward priority 0;
	}
	chain output {
		type filter hook output priority 0;
	}
}

# 以下、iptables-restore-translateで変換したときに 
# INPUT, FORWARD, OUTPUTが大文字だったので小文字にした。
#
# また、 counter の後ろに ”packets 数字 bytes 数字" という記述があるがこれは削っても良いので削った。
# 以下は IPv4に対する設定。
table ip filter {
	chain input {
		type filter hook input priority 0; policy accept;
		
                # ICMPを許可 
		ip protocol icmp counter accept

                # 接続確立済みのTCPパケットを許可 
		ct state established,related counter accept

                # ローカルホスト(127.0.0.1)からのアクセス許可 
		iifname "lo" counter accept

                # ipspoofing対策
		ip saddr 10.0.0.0/8 counter drop
		ip saddr 172.16.0.0/12 counter drop
		#ip saddr 192.168.0.0/16 counter drop
		counter
		ip saddr 127.0.0.0/8 counter drop
		ip saddr 169.254.0.0/16 counter drop
		ip saddr 192.0.2.0/24 counter drop
		ip saddr 224.0.0.0/4 counter drop
		ip daddr 255.255.255.255 counter drop

                # SSH(22番ポート)へのアクセスは許可
		tcp dport ssh counter accept

                # HTTP(80番ポート)、HTTPS(443番ポート)へのアクセスは許可
		tcp dport http counter accept
		tcp dport https counter accept

                # SMTP(25番)へのアクセスは許可
		tcp dport smtp counter accept

		# SMTP AUTH on TLS(465)とPOP3S(995)へのアクセスは許可
		tcp dport urd counter accept
		tcp dport pop3s counter accept

                # muninへのアクセスはXX.XX.XX.XX/24の中からのみ許可
		ip saddr XX.XX.XX.XX/24 tcp dport munin counter accept

                # ポートスキャン対策
		meter portscan size 65535 { ip saddr limit rate 10/second burst 10 packets}  counter jump portscanner

               # 上記に当てはまらないTCP, UDPのパケットは不可
		ip protocol tcp counter reject with tcp reset
		ip protocol udp counter reject
		counter reject with icmp type prot-unreachable
	}

	chain forward {
		type filter hook forward priority 0; policy accept;
		counter reject
	}

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

	chain portscanner {
		counter  drop
	}
}

ポートの開き具合をチェックする。

設定したサーバ上で開いているポートを調べる。

% lsof -i

別のマシンからサーバで開いているポートを調べる(注意:これは攻撃の第一段階のポートスキャンにあたるので自分で管理しているサーバにだけおこなうこと)。なお、当該サーバのIPアドレスをYY.YY.YY.YY とする

% sudo nmap YY.YY.YY.YY  (TCPのポートをチェック)
% sudo nmap -sU YY.YY.YY.YY (UDPのポートをチェック)