Edited at

ufwコマンドの使い方


1 はじめに

ufw(Uncomplicated FireWall)は、ファイアウォールの設定を行うコマンドです。

ufwは、CentOS7のfirewall-cmd,openSUSEのSUSEfirewall2と同じ位置づけのコマンドです。

図に書くと、以下のようになります。

       CentOS7         Ubuntu16.04        openSUSE(Leap 42.3)

+--------------+ +------------+ +---------------------+ -*-
| firewall-cmd | | ufw | | SUSEfirewall2 | |
+--------------+ +------------+ +---------------------+ |
ユーザ空間
+-----------------------------------------------------------+ |
| iptables command | |
+-----------------------------------------------------------+ -*-

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


2 環境

VMware Workstation 12 Player上の仮想マシンを使用しました。

root@server:~# cat /etc/issue

Ubuntu 16.04 LTS \n \l

root@server:~# cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04 LTS"

root@server:~# uname -a
Linux server 4.4.0-21-generic #37-Ubuntu SMP Mon Apr 18 18:33:37 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux


3 ufwの起動、停止の確認方法

ufwを起動する。

root@server:~# systemctl start ufw

ufwの状態を確認する。activeになったことがわかる。
root@server:~# systemctl is-active ufw
active

登録されているルール等が確認できる。
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)

ufwを停止する。
root@server:~# systemctl stop ufw

ufwの状態を確認する。inactiveになったことがわかる。
root@server:~# systemctl is-active ufw
inactive


4 ufwのログについて


4.1 ロギング機能の有効・無効化の方法

ufwのロギング機能を有効にする。

root@server:~# ufw logging on
Logging enabled

状態を確認する。ロギング機能が有効(★)になったことがわかる。
root@server:~# ufw status verbose
Status: active
Logging: on (low) ★
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip

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

ufwのロギング機能を無効にする。
root@server:~# ufw logging off
Logging disabled

状態を確認する。ロギング機能が無効(★)になったことがわかる。
root@server:~# ufw status verbose
Status: active
Logging: off ★
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip

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

root@server:~#


4.2 ログの場所

ufwのログは/var/log/ufw.logに格納されます。

root@server:~# cat /var/log/ufw.log

Nov 2 21:57:11 server kernel: [ 6975.349683] [UFW BLOCK] IN=eth0 OUT= MAC=00:0c:29:49:07:5d:00:0c:29:f4:7e:71:08:00 SRC=192.168.0.110 DST=192.168.0.220 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=19980 DF PROTO=TCP SPT=49966 DPT=80 WINDOW=29200 RES=0x00 SYN URGP=0


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


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

現在登録されているルールを確認する。numberedオプションを指定すると、左端に行番号が表示されます。

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

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

11111番ポート(TCP)へのアクセス許可のルールを設定する。
root@server:~# ufw allow 11111
Rule added
Rule added (v6)

状態を確認する。11111番ポート(TCP)へのアクセス許可のルール(★)が登録されたことがわかる。
root@server:~# ufw status numbered
Status: active

To Action From
-- ------ ----
[ 1] 22/tcp ALLOW IN Anywhere
[ 2] 11111 ★ ALLOW IN Anywhere
[ 3] 22/tcp (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

状態を確認する。11111/tcpが削除されたことがわかる。
root@server:~# ufw status numbered
Status: active

To Action From
-- ------ ----
[ 1] 22/tcp ALLOW IN Anywhere
[ 2] 22/tcp (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)

状態を確認する。11111/tcp(v6)が削除されたことがわかる。
root@server:~# ufw status numbered
Status: active

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


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

11111番ポート(UDP)へのアクセス許可のルールを設定する。

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

状態を確認する。11111番ポート(UDP)へのアクセス許可のルール(★)が登録されたことがわかる。
root@server:~# ufw status numbered
Status: active

To Action From
-- ------ ----
[ 1] 22/tcp ALLOW IN Anywhere
[ 2] 11111/udp ★ ALLOW IN Anywhere
[ 3] 22/tcp (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

状態を確認する。11111/udpが削除されたことがわかる。
root@server:~# ufw status numbered
Status: active

To Action From
-- ------ ----
[ 1] 22/tcp ALLOW IN Anywhere
[ 2] 22/tcp (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)

状態を確認する。22/tcp (v6)が削除されたことがわかる。
root@server:~# ufw status numbered
Status: active

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


5.3 範囲指定したポート番号の追加方法

TCPの11111番ポートから11122番ポートへのアクセスを許可する。

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

状態を確認する。11111-11122番ポートへのアクセスが許可されていることがわかる。
root@server:~# ufw status numbered
Status: active

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

2番のルールを削除する。
root@server:~# ufw delete 2
Deleting:
allow 11111:11122/tcp
Proceed with operation (y|n)? y
Rule deleted

状態を確認する。11111-11122番ポートへのアクセス許可が削除されたことがわかる。
root@server:~# ufw status numbered
Status: active

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

3番のルールを削除する。
root@server:~# ufw delete 3
Deleting:
allow 11111:11122/tcp
Proceed with operation (y|n)? y
Rule deleted (v6)

状態を確認する。11111-11122番ポート(v6)へのアクセス許可が削除されたことがわかる。
root@server:~# ufw status numbered
Status: active

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


5.4 任意の場所にルールを追加する方法(insert)

状態を確認する。現在は22番ポートへのアクセスだけが許可されていることがわかる。

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番の前にルール(★)が追加されたことがわかる。
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)

さらに、1番の前に(22222番ポートへのアクセス許可)を追加する。
root@server:~# ufw insert 1 allow 22222
Rule inserted
Rule inserted (v6)

状態を確認する。元の1番の前にルール(★)が追加されたことがわかる。
root@server:~# ufw status numbered
Status: active

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


6 ルールのリセット方法

resetコマンドを使うと、登録されているルールを全てリセット(消去)することができます。

状態を確認する。TCP/UDPの11111番ポートへのアクセスが許可されていることがわかる。

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

To Action From
-- ------ ----
[ 1] 22/tcp ALLOW IN Anywhere
[ 2] 11111 ALLOW IN Anywhere
[ 3] 22/tcp (v6) ALLOW IN Anywhere (v6)
[ 4] 11111 (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 'after6.rules' to '/etc/ufw/after6.rules.20171102_224543'
Backing up 'before.rules' to '/etc/ufw/before.rules.20171102_224543'
Backing up 'after.rules' to '/etc/ufw/after.rules.20171102_224543'
Backing up 'user.rules' to '/etc/ufw/user.rules.20171102_224543'
Backing up 'user6.rules' to '/etc/ufw/user6.rules.20171102_224543'
Backing up 'before6.rules' to '/etc/ufw/before6.rules.20171102_224543'

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

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

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

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


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

アプリケーション・インテグレーションは、/etc/servicesに登録されていないアプリケーションの

ポート番号とサービス名を登録するときに使います。

つまり、自身が作成したアプリケーションが使用するポート番号とサービス名を/etc/servicesに

登録するのではなく、/etc/ufw/applications.d配下のファイルに登録することになります。

/etc/ufw/applications.d配下に作成するファイルをプロファイルと呼びます。


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

プロファイルを作成する。プロファイルの内容は、サービス名が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
Rule added
Rule added (v6)
root@server:~# ufw status numbered
Status: active

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


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

作成したプロファイルの内容を変更する場合に実行します。

プロファイルのupdateを行うと、プロファイルの設定内容がuser.rulesに保存されます。

そして、プロファイルのreloadを行うと、user.rulesの内容がiptablesに反映されます。

以下では、プロファイルに設定したポート番号の変更(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=11111/tcp

app1へのアクセスを許可する。
root@server:~# ufw allow app1
Rule added
Rule added (v6)

状態を確認する。app1へのアクセスが許可(★)されたことがわかる。
root@server:~# ufw status numbered
Status: active

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

user.rulesファイルを確認する。user.rulesの定義に11111番ポートへのアクセス許可が設定されたことがわかる。
root@server:~# cat /etc/ufw/user.rules|grep -e 11111 -e 22222
### tuple ### allow tcp 11111 0.0.0.0/0 any 0.0.0.0/0 app1 - in
-A ufw-user-input -p tcp --dport ★11111 -j ACCEPT -m comment --comment 'dapp_app1'

iptablesの設定内容を確認する。iptablesにも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' */

プロファイルの内容を変更する。ポート番号を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 ★

プロファイルのアップデートを行う。
root@server:~# ufw app update app1
Rules updated for profile 'app1'
Skipped reloading firewall

user.rulesファイルを確認する。user.rulesの定義が22222に変更されたことがわかる。
root@server:~# cat /etc/ufw/user.rules|grep -e 11111 -e 22222
### tuple ### allow tcp 22222 0.0.0.0/0 any 0.0.0.0/0 app1 - in
-A ufw-user-input -p tcp --dport ★22222 -j ACCEPT -m comment --comment 'dapp_app1'

iptablesの設定内容を確認する。ポート番号はまだ変更されていないことがわかる。
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:~# ufw reload
Firewall reloaded

iptablesの設定内容を確認する。reloadすることで、ポート番号が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' */


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

プロファイルの一覧を表示する。作成したapp1のプロファイル(★)が表示されていることがわかる。

root@server:~# ufw app list
Available applications:
Apache
Apache Full
Apache Secure
CUPS
OpenSSH
app1 ★

app1のプロファイルを確認する。
root@server:~# ufw app info app1
Profile: app1
Title: Application Server1
Description: This is used by Application Server1

Port:
11111/tcp


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


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

ビルトインチェインは以下の5つです。これらの設定内容を確認するときに使います。

- INPUT

- OUTPUT

- FORWARD

- PREROUTING

- POSTROUTING

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
6349 652157 ufw-before-logging-input all -- * * 0.0.0.0/0 0.0.0.0/0
6349 652157 ufw-before-input all -- * * 0.0.0.0/0 0.0.0.0/0
296 32446 ufw-after-input all -- * * 0.0.0.0/0 0.0.0.0/0
232 21954 ufw-after-logging-input all -- * * 0.0.0.0/0 0.0.0.0/0
232 21954 ufw-reject-input all -- * * 0.0.0.0/0 0.0.0.0/0
232 21954 ufw-track-input all -- * * 0.0.0.0/0 0.0.0.0/0

(filter) Chain ★FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ufw-before-logging-forward all -- * * 0.0.0.0/0 0.0.0.0/0
0 0 ufw-before-forward all -- * * 0.0.0.0/0 0.0.0.0/0
0 0 ufw-after-forward all -- * * 0.0.0.0/0 0.0.0.0/0
0 0 ufw-after-logging-forward all -- * * 0.0.0.0/0 0.0.0.0/0
0 0 ufw-reject-forward all -- * * 0.0.0.0/0 0.0.0.0/0
0 0 ufw-track-forward all -- * * 0.0.0.0/0 0.0.0.0/0
-以下、略-


8.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

Chain ufw-after-logging-input (1 references)
pkts bytes target prot opt in out source destination
0 0 LOG all -- * * 0.0.0.0/0 0.0.0.0/0 limit: avg 3/min burst 10 LOG flags 0 level 4 prefix "[UFW BLOCK] "

Chain ufw-before-logging-forward (1 references)
pkts bytes target prot opt in out source destination

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

Chain ufw-after-logging-forward (1 references)
pkts bytes target prot opt in out source destination
0 0 LOG all -- * * 0.0.0.0/0 0.0.0.0/0 limit: avg 3/min burst 10 LOG flags 0 level 4 prefix "[UFW BLOCK] "

Chain ufw-before-logging-output (1 references)
pkts bytes target prot opt in out source destination

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

Chain ufw-after-logging-output (1 references)
pkts bytes target prot opt in out source destination

Chain ufw-logging-allow (0 references)
pkts bytes target prot opt in out source destination
0 0 LOG all -- * * 0.0.0.0/0 0.0.0.0/0 limit: avg 3/min burst 10 LOG flags 0 level 4 prefix "[UFW ALLOW] "

Chain ufw-logging-deny (2 references)
pkts bytes target prot opt in out source destination
0 0 RETURN all -- * * 0.0.0.0/0 0.0.0.0/0 ctstate INVALID limit: avg 3/min burst 10
0 0 LOG all -- * * 0.0.0.0/0 0.0.0.0/0 limit: avg 3/min burst 10 LOG flags 0 level 4 prefix "[UFW BLOCK] "
-以下、略-


X 参考情報

UFW

Ubuntu で ufw を利用して ping を拒否する設定

how do you create an app profile for ufw?

Ubuntu 11.04 Server Guide