Debian 9 Stretch で ufw による簡単ファイアウォール設定

Linux 環境でファイアウォールを構築するお話です。

Linux にはカーネルレベルでパケットフィルタや NAT を行う netfilter という仕組みがあり、それを設定するのが iptables です。iptables をそのまま扱えれば一番良いのですが、柔軟さ故に学習コストは高めです。そのため、firewalld や ufw といった iptables のフロントエンドが存在しています。今回は ufw を使います。

ufw は Uncomplicated Firewall の略で、Python で書かれた iptables のフロントエンドです。

以下、インストールと簡単な使い方です。

インストールと有効化

$ sudo apt install ufw
$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup
$ sudo ufw status
Status: active

SSH で作業しましたが、有効化しても切断されることはありませんでした。絶対に切断されないとは言い切れないので、念のため切断されたら八方塞りになる状況では止めておきましょう。

全てを deny して SSH のみ allow する

$ sudo ufw default deny
Default incoming policy changed to 'deny'
(be sure to update your rules accordingly)
$ sudo ufw allow ssh
Rule updated
Rule updated (v6)
atmark@dev:~$ sudo ufw status
Status: active

To Action From
-- ------ ----
22/tcp ALLOW Anywhere 
22/tcp (v6) ALLOW Anywhere (v6)

たったこれだけです。default を deny して、ssh を allow するだけ。簡単ですね。

アプリケーション単位で allow/deny する

ufw app list で有効なアプリケーションの一覧が表示されます。

$ sudo ufw app list
Available applications:
 AIM
 Bonjour
 CIFS
 DNS
 Deluge
 Dovecot IMAP
 Dovecot Secure IMAP
 IMAP
 IMAPS
 IPP
 KTorrent
 Kerberos Admin
 Kerberos Full
 Kerberos KDC
 Kerberos Password
 LDAP
 LDAPS
 LPD
 MSN
 MSN SSL
 Mail submission
 NFS
 OpenSSH
 POP3
 POP3S
 PeopleNearby
 Postfix
 Postfix SMTPS
 Postfix Submission
 SMTP
 SSH
 Socks
 Telnet
 Transmission
 Transparent Proxy
 VNC
 WWW
 WWW Cache
 WWW Full
 WWW Secure
 XMPP
 Yahoo
 qBittorrent
 svnserve

この名前をつかって deny/allow するだけです。

$ sudo ufw allow SSH
$ sudo ufw allow "WWW Full"
$ sudo ufw status
Status: active

To Action From
-- ------ ----
SSH LIMIT Anywhere 
WWW Full ALLOW Anywhere 
SSH (v6) LIMIT Anywhere (v6) 
WWW Full (v6) ALLOW Anywhere (v6)

ルールの削除

2 通りあります。まずは追加したルールをそのまま削除するやり方。

$ sudo ufw delete allow SSH

もう一つは現在のルール一覧を番号付けして、その番号で削除するやり方。

$ sudo ufw status numbered
Status: active

To Action From
-- ------ ----
[1] SSH LIMIT Anywhere 
[2] WWW Full ALLOW Anywhere 
[3] SSH (v6) LIMIT Anywhere (v6) 
[4] WWW Full (v6) ALLOW Anywhere (v6) 

$ sudo ufw delete 4
Deleting:
 allow 'WWW Full'
Proceed with operation (y|n)?

名前で指定するか、ポート番号で指定するか

ちょっとややこしかったので、軽くまとめておきます。

app list で表示される内容は /etc/ufw/applicatoin.d/ 以下に用意されています。例えば WWW 関係は次のようになっています。

$ cat /etc/ufw/application.d/ufw-webserver 
[WWW]
title=Web Server
description=Web server
ports=80/tcp

[WWW Secure]
title=Web Server (HTTPS)
description=Web Server (HTTPS)
ports=443/tcp

[WWW Full]
title=Web Server (HTTP,HTTPS)
description=Web Server (HTTP,HTTPS)
ports=80,443/tcp

[WWW Cache]
title=Web Server (8080)
description=Web Server (8080)
ports=8080/tcp

ルールを追加するときのポートの指定は 3 通りあって

  • ポート番号の直接指定 - 443/tcp
  • プロトコル名 - https
  • アプリケーション名 - WWW Secure

このうち、ポート番号の直接指定もプロトコル名も、ルールに登録されるのは数字のポート番号そのものです。allow https としても 443/tcp でルールに登録されます。

アプリケーション名で指定すると、指定した名前そのままで登録されます。

ここでややこしいのが、例えばアプリケーション名とプロトコル名が同じ SSH の場合。allow SSH と書くと名前で登録されますが、allow ssh とすると 22/tcp で登録されます。

接続制限 limit

$ sudo ufw limit ssh

もう一つ、limit というルールがあります。man には次のよう書かれています。

......
ufw will normally allow the connection
but will deny connections if an IP address attempts
to initiate 6 or more connections within 30 seconds
......

30 秒間に 6 回以上接続を試みた場合に接続を拒否するルールです。SSH などは総当りでログイン試行が来るので、limit をかけておいた方が良いでしょう。

参考