hana_shinのLinux技術ブログ

Linuxの技術情報を掲載しています。特にネットワークをメインに掲載していきます。

ufwコマンドの使い方



0 はじめに

以前書いた記事からアイキャッチ画像が削除できないので、改めて記事を作成しました。内容は変わりません。

1 ufwコマンドとは?

ufw(Uncomplicated FireWall)は、ファイアウォールの設定を行うコマンドです。ufwは、CentOS7のfirewall-cmd,openSUSEのSUSEfirewall2と同じ位置づけのコマンドです。図に書くと、以下のようになります。firewall-cmdコマンドの使い方は、firewall-cmdの使い方 - hana_shinのLinux技術ブログを参照してください。

     CentOS7         Ubuntu20.04         openSUSE(Leap42.3)
+--------------+    +------------+    +---------------------+   -*-
| firewall-cmd |    |     ufw    |    |    SUSEfirewall2    |    |
+--------------+    +------------+    +---------------------+    |
                                                               ユーザ空間
+-----------------------------------------------------------+    |
|                     iptables  command                     |    |
+-----------------------------------------------------------+   -*-

+-----------------------------------------------------------+   -*-
|                                                           |    |
|                    OS(netfilter)                          |  カーネル空間
|                                                           |    |
+-----------------------------------------------------------+   -*-

2 検証環境

Ubuntuの版数は以下のとおりです。

root@server:~# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 20.04.3 LTS
Release:        20.04
Codename:       focal

カーネル版数は以下のとおりです。

root@server:~# uname -r
5.4.0-91-generic

ufwの版数は以下のとおりです。

root@server:~# ufw --version
ufw 0.36
Copyright 2008-2015 Canonical Ltd.

3 オプション一覧

オプションは以下のとおりです。

root@server:~# ufw -h
ERROR: Invalid syntax

Usage: ufw COMMAND

Commands:
 enable                          enables the firewall
 disable                         disables the firewall
 default ARG                     set default policy
 logging LEVEL                   set logging to LEVEL
 allow ARGS                      add allow rule
 deny ARGS                       add deny rule
 reject ARGS                     add reject rule
 limit ARGS                      add limit rule
 delete RULE|NUM                 delete RULE
 insert NUM RULE                 insert RULE at NUM
 route RULE                      add route RULE
 route delete RULE|NUM           delete route RULE
 route insert NUM RULE           insert route RULE at NUM
 reload                          reload firewall
 reset                           reset firewall
 status                          show firewall status
 status numbered                 show firewall status as numbered list of RULES
 status verbose                  show verbose firewall status
 show ARG                        show firewall report
 version                         display version information

Application profile commands:
 app list                        list application profiles
 app info PROFILE                show information on PROFILE
 app update PROFILE              update PROFILE
 app default ARG                 set default application policy

4 ufwの起動、停止方法

4.1 起動方法

Ubuntuをインストールした直後、ufw は停止(inactive)しています。

root@server:~# ufw status verbose
Status: inactive

ufwを起動します。

root@server:~# ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup

ufwの状態を確認します。ufwが起動(active)したことがわかります。この状態だとsshへのアクセスが許可されていないので、OSを再起動するとsshでログインできなくなってしまいますので、sshへのアクセスを許可する必要があります。

root@server:~# ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip

sshログインを可能にするため、sshへのアクセスを許可するルールを追加します。

root@server:~# ufw allow 22
Rule added
Rule added (v6)

ufwの状態を確認します。sshへのアクセスを許可するルールが追加されたことがわかります。

root@server:~#  ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
22                         ALLOW IN    Anywhere
2                          ALLOW IN    Anywhere
22 (v6)                    ALLOW IN    Anywhere (v6)
2 (v6)                     ALLOW IN    Anywhere (v6)

sshへのアクセスを許可するルールを追加すると、iptablesのINPUTチェインにルールが登録されます。

root@server:~# iptables -nvL |grep -w 22
    1    52 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22
    0     0 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp dpt:22

4.2 停止方法

ufwを停止します。

root@server:~# ufw disable
Firewall stopped and disabled on system startup

ufwの状態を確認します。ufwが停止(inactive)したことがわかります

root@server:~# ufw status verbose
Status: inactive

ufwを停止すると、sshへのアクセス許可のルールが削除されたことがわかります。

root@server:~# iptables -nvL |grep -w 22
root@server:~#

5 ロギングについて

ufwのログは、/var/log/ufw.logに記録されます。

root@server:~# cat /var/log/ufw.log
Jan 31 10:32:05 server kernel: [ 4547.943493] [UFW BLOCK] IN=ens33 OUT= MAC=xx:xx:xx:yy:yy:yy:a0:64:8f:a3:11:ce:08:00 SRC=192.168.2.12 DST=192.168.2.171 LEN=92 TOS=0x00 PREC=0x00 TTL=128 ID=13151 DF PROTO=TCP SPT=64266 DPT=22 WINDOW=4102 RES=0x00 ACK PSH URGP=0
-snip-

ufwを起動すると、ロギング機能が有効(Logging: on (low))になります。

root@server:~# ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
22                         ALLOW IN    Anywhere
22 (v6)                    ALLOW IN    Anywhere (v6)

ロギングを無効にするためには、以下のように実行します。

root@server:~# ufw logging off
Logging disabled

ロギングの状態を確認します。ロギングが無効(Logging: off)になっていることがわかります。

root@server:~# ufw status verbose
Status: active
Logging: off
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip

6 ルールの追加、削除方法

6.1 TCPポート番号の追加、削除方法

登録されているルールを確認します。sshのルールだけが登録されていることがわかります。なお、numberedオプションを指定すると、左端に行番号が表示されます。

root@server:~# ufw status numbered
Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 22                         ALLOW IN    Anywhere
[ 2] 22 (v6)                    ALLOW IN    Anywhere (v6)

TCPの11111番ポートへのアクセスを許可するルールを追加します。

root@server:~# ufw allow 11111
Rule added
Rule added (v6)

ルールを確認します。11111番ポートへのアクセスを許可するルールが追加されたことがわかります。

root@server:~# ufw status numbered
Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 22                         ALLOW IN    Anywhere
[ 2] 11111                      ALLOW IN    Anywhere
[ 3] 22 (v6)                    ALLOW IN    Anywhere (v6)
[ 4] 11111 (v6)                 ALLOW IN    Anywhere (v6)

次に、番号[2]のルールを削除します。

root@server:~# ufw delete 2
Deleting:
 allow 11111
Proceed with operation (y|n)? y
Rule deleted

ルールを確認します。番号[2]のルールが削除されたことがわかります。

root@server:~# ufw status numbered
Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 22                         ALLOW IN    Anywhere
[ 2] 22 (v6)                    ALLOW IN    Anywhere (v6)
[ 3] 11111 (v6)                 ALLOW IN    Anywhere (v6)

最後に、番号[3]のルールを削除します。

root@server:~# ufw delete 3
Deleting:
 allow 11111
Proceed with operation (y|n)? y
Rule deleted (v6)

ルールを確認します。番号[3]のルールが削除されたことがわかります。

root@server:~# ufw status numbered
Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 22                         ALLOW IN    Anywhere
[ 2] 22 (v6)                    ALLOW IN    Anywhere (v6)

6.2 UDPポート番号の追加、削除方法

UDPの11111番ポートへのアクセスを許可するルールを追加します。

root@server:~# ufw allow 11111/udp
Rule added
Rule added (v6)

ルールを確認します。UDPの11111番ポートへのアクセスを許可するルールが追加されたことがわかります。

root@server:~# ufw status numbered
Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 22                         ALLOW IN    Anywhere
[ 2] 11111/udp                  ALLOW IN    Anywhere
[ 3] 22 (v6)                    ALLOW IN    Anywhere (v6)
[ 4] 11111/udp (v6)             ALLOW IN    Anywhere (v6)

次に、番号[2]のルールを削除します。

root@server:~# ufw delete 2
Deleting:
 allow 11111/udp
Proceed with operation (y|n)? y
Rule deleted

ルールを確認します。番号[2]のルールが削除されたことがわかります。

root@server:~# ufw status numbered
Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 22                         ALLOW IN    Anywhere
[ 2] 22 (v6)                    ALLOW IN    Anywhere (v6)
[ 3] 11111/udp (v6)             ALLOW IN    Anywhere (v6)

最後に、番号[3]のルールを削除します。

root@server:~# ufw delete 3
Deleting:
 allow 11111/udp
Proceed with operation (y|n)? y
Rule deleted (v6)

ルールを確認します。番号[3]のルールが削除されたことがわかります。

root@server:~# ufw status numbered
Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 22                         ALLOW IN    Anywhere
[ 2] 22 (v6)                    ALLOW IN    Anywhere (v6)

6.3 範囲指定したポート番号の追加、削除方法

TCPの11111番ポートから11112番ポートへのアクセスを許可するルールを追加します。

root@server:~#  ufw allow 11111:11112/tcp
Rule added
Rule added (v6)

ルールを確認します。TCPの11111番ポートから11112番ポートへのアクセスを許可するルールが追加されたことがわかります。

root@server:~# ufw status numbered
Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 22                         ALLOW IN    Anywhere
[ 2] 11111:11112/tcp            ALLOW IN    Anywhere
[ 3] 22 (v6)                    ALLOW IN    Anywhere (v6)
[ 4] 11111:11112/tcp (v6)       ALLOW IN    Anywhere (v6)

番号[2]のルールを削除します。

root@server:~# ufw delete 2
Deleting:
 allow 11111:11112/tcp
Proceed with operation (y|n)? y
Rule deleted

ルールを確認します。番号[2]のルールが削除されたことがわかります。

root@server:~# ufw status numbered
Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 22                         ALLOW IN    Anywhere
[ 2] 22 (v6)                    ALLOW IN    Anywhere (v6)
[ 3] 11111:11112/tcp (v6)       ALLOW IN    Anywhere (v6)

番号[3]のルールを削除します。

root@server:~# ufw delete 3
Deleting:
 allow 11111:11112/tcp
Proceed with operation (y|n)? y
Rule deleted (v6)

6.4 既存ルールの前にルールを挿入する方法(insert)

6.1の方法では、ルールは最終行の後に追加されます。insertオプションを指定すると、既存ルールの前にルールを挿入することができます。まず、現在のルールを確認します。sshにアクセスするルールだけが定義されていることがわかります。

root@server:~# ufw status numbered
Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 22                         ALLOW IN    Anywhere
[ 2] 22 (v6)                    ALLOW IN    Anywhere (v6)

番号[1]の前に、11111番ポートへのアクセス許可するルールを挿入します。

root@server:~#  ufw insert 1 allow 11111
Rule inserted
Rule inserted (v6)

ルールを確認します。元の番号[1]の前に、11111番ポートへのアクセス許可するルールが挿入されたことがわかります。

root@server:~# ufw status numbered
Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 11111                      ALLOW IN    Anywhere
[ 2] 22                         ALLOW IN    Anywhere
[ 3] 11111 (v6)                 ALLOW IN    Anywhere (v6)
[ 4] 22 (v6)                    ALLOW IN    Anywhere (v6)

7 登録されているルールを全てリセットする方法

現在のルールを確認します。sshにアクセスするルールと11111番ポートにアクセスするルールだけが定義されていることがわかります。

root@server:~# ufw status numbered
Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 11111                      ALLOW IN    Anywhere
[ 2] 22                         ALLOW IN    Anywhere
[ 3] 11111 (v6)                 ALLOW IN    Anywhere (v6)
[ 4] 22 (v6)                    ALLOW IN    Anywhere (v6)

登録されているルールを全てリセットします。

root@server:~# ufw reset
Resetting all rules to installed defaults. This may disrupt existing ssh
connections. Proceed with operation (y|n)? y
Backing up 'user.rules' to '/etc/ufw/user.rules.20220131_122424'
Backing up 'before.rules' to '/etc/ufw/before.rules.20220131_122424'
Backing up 'after.rules' to '/etc/ufw/after.rules.20220131_122424'
Backing up 'user6.rules' to '/etc/ufw/user6.rules.20220131_122424'
Backing up 'before6.rules' to '/etc/ufw/before6.rules.20220131_122424'
Backing up 'after6.rules' to '/etc/ufw/after6.rules.20220131_122424'

現在のルールを確認します。登録していたルールが全てリセットされたことがわかります。

root@server:~# ufw status numbered
Status: inactive

8 アプリケーション・インテグレーション(Application Integration)の使い方

アプリケーション・インテグレーションは、/etc/servicesに登録されていないアプリケーションのポート番号とサービス名を登録するときに使います。つまり、自身が作成したアプリケーションが使用するポート番号とサービス名を/etc/servicesに登録するのではなく、/etc/ufw/applications.d配下のファイルに登録することになります。/etc/ufw/applications.d配下に作成するファイルをプロファイルと呼びます。

8.1 プロファイルの作成方法

現在のルールを確認します。sshにアクセスするルールが定義されていることがわかります。

root@server:~# ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
22                         ALLOW IN    Anywhere
22 (v6)                    ALLOW IN    Anywhere (v6)

次に、testという名前のプロファイルを作成します。プロファイルの内容は、サービス名がapp1、ポート番号が11111(tcp)になります。

root@server:~# vi /etc/ufw/applications.d/test
root@server:~# cat /etc/ufw/applications.d/test
[app1]
title=Application Server1
description=This is used by Application Server1
ports=11111/tcp

app1へのアクセスを許可します。

root@server:~# ufw allow app1
Rules updated
Rules updated (v6)

ルールを確認します。app1へのアクセスを許可するルールが追加されたことがわかります。

root@server:~# ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip

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

8.2 プロファイルの変更方法(update,reload)

プロファイルの内容を変更します。11111番ポートにアクセス許可するルールを22222番ポートにアクセス許可するルールに変更します。

root@server:~# vi /etc/ufw/applications.d/test
root@server:~# cat /etc/ufw/applications.d/test
[app1]
title=Application Server1
description=This is used by Application Server1
ports=22222/tcp

app1のプロファイルを更新します。

root@server:~# ufw app update app1
Rules updated for profile 'app1'
Skipped reloading firewall

iptablesのルールを確認します。まだ、TCPの11111番へのアクセスが許可されています。

root@server:~# iptables -nvL |grep -e 11111 -e 22222
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:11111 /* 'dapp_app1' */
root@server:~#

iptablesのルールをリロードします。

root@server:~# ufw reload
Firewall reloaded

iptablesのルールを確認します。TCPの22222番へのアクセスが許可されていることがわかります。

root@server:~# iptables -nvL |grep -e 11111 -e 22222
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22222 /* 'dapp_app1' */
root@server:~#

8.3 プロファイルの表示方法(list,info)

プロファイルの一覧を確認します。OpenSSHとapp1のプロファイルが作成されていることがわかります。

root@server:~# ufw app list
Available applications:
  OpenSSH
  app1

app1のプロファイルの内容を確認します。

root@server:~# ufw app info app1
Profile: app1
Title: Application Server1
Description: This is used by Application Server1

Port:
  11111/tcp

OpenSSHのプロファイルの内容を確認する。

root@server:~# ufw app info OpenSSH
Profile: OpenSSH
Title: Secure shell server, an rshd replacement
Description: OpenSSH is a free implementation of the Secure Shell protocol.

Port:
  22/tcp

9 iptablesの設定内容を表示する方法(show)

9.1 ビルトインチェインのルールを表示する方法(builtins)

ビルトインチェインはiptablesに組み込まれているデフォルトルールの集合です。以下の5つがあります。showオプションは、デフォルトルールの内容を確認するときに使います。

  • INPUT
  • OUTPUT
  • FORWARD
  • PREROUTING
  • POSTROUTING

ビルトインチェインを確認してみます。INPUTチェインのルールが表示されていることがわかります。

root@server:~# ufw show builtins
IPV4 (builtins):
(filter) Chain INPUT (policy DROP 0 packets, 0 bytes)
    pkts      bytes target     prot opt in     out     source               destination
    1694   123030 ufw-before-logging-input  all  --  *      *       0.0.0.0/0            0.0.0.0/0
    1694   123030 ufw-before-input  all  --  *      *       0.0.0.0/0            0.0.0.0/0
     406    25300 ufw-after-input  all  --  *      *       0.0.0.0/0            0.0.0.0/0
     406    25300 ufw-after-logging-input  all  --  *      *       0.0.0.0/0            0.0.0.0/0
     406    25300 ufw-reject-input  all  --  *      *       0.0.0.0/0            0.0.0.0/0
     406    25300 ufw-track-input  all  --  *      *       0.0.0.0/0            0.0.0.0/0
-snip-

9.2 ログターゲットが設定されているルールを表示する方法(logging-rules)

root@server:~# ufw show logging-rules
IPV4 (logging):
Chain ufw-before-logging-input (1 references)
    pkts      bytes target     prot opt in     out     source               destination

Chain ufw-user-logging-input (0 references)
    pkts      bytes target     prot opt in     out     source               destination

-snip-

Z 参考情報

私が業務や記事執筆で参考にした書籍を以下のページに記載します。
Linux技術のスキルアップをしよう! - hana_shinのLinux技術ブログ