UFW(Uncomplicated FireWall)は、ファイアウォールの操作や管理をするiptablesの難しさを簡単に行うためのツールです。
検証した環境
$ cat /etc/os-release
PRETTY_NAME="Ubuntu 22.04.4 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.4 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy
$ uname -r
5.15.0-102-generic
$ ufw --version
ufw 0.36.1
Copyright 2008-2021 Canonical Ltd.
初期状態
OSのインストールを完了した時点で、UFWは起動していますが、特に通信の制御はされていません。
$ sudo systemctl status ufw.service
● ufw.service - Uncomplicated firewall
Loaded: loaded (/lib/systemd/system/ufw.service; enabled; vendor preset: e>
Active: active (exited) since Thu 2024-04-11 16:18:08 UTC; 15h ago
Docs: man:ufw(8)
Main PID: 628 (code=exited, status=0/SUCCESS)
CPU: 1ms
Apr 11 16:18:08 ubuntu systemd[1]: Starting Uncomplicated firewall...
Apr 11 16:18:08 ubuntu systemd[1]: Finished Uncomplicated firewall.
$ sudo ufw status
Status: inactive
通信制御の設定(ssh通信の許可)
UFWの通信制御はデフォルト動作として、「deny(拒否)」であるため、UFWを有効化にするとすべての通信を通しません。そのため、リモートでの操作ができなくなるのを防ぐため、「ssh(22)」の通信をとりあえず「allow(許可)」します。
$ sudo ufw allow from any to any port 22 proto tcp ・・・ ポート22の通信を許可
Rules updated
Rules updated (v6)
$ sudo ufw enable ・・・ UFWの有効化
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup
$ sudo ufw status verbose ・・・ UFWの状態確認
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)
通信制御の許可と拒否の方法
https通信のポートである443/tcpを許可をして拒否をする方法です。この操作が基本となります。
$ sudo ufw allow from any to any port 443 proto tcp ・・・ ポート443の通信を許可
$ sudo ufw status numbered ・・・ 番号付きでUFWの状態確認
Status: active
To Action From
-- ------ ----
[ 1] 22/tcp ALLOW IN Anywhere
[ 2] 443/tcp ALLOW IN Anywhere
[ 3] 22/tcp (v6) ALLOW IN Anywhere (v6)
[ 4] 443/tcp (v6) ALLOW IN Anywhere (v6)
$ sudo ufw delete 2 ・・・ 番号を指定して削除
Deleting:
allow 443/tcp
Proceed with operation (y|n)? y
Rule deleted
$ sudo ufw status numbered
Status: active
To Action From
-- ------ ----
[ 1] 22/tcp ALLOW IN Anywhere
[ 2] 22/tcp (v6) ALLOW IN Anywhere (v6)
[ 3] 443/tcp (v6) ALLOW IN Anywhere (v6)
$ sudo ufw delete 3
Deleting:
allow 443/tcp
Proceed with operation (y|n)? y
Rule deleted (v6)
$ sudo ufw status numbered
Status: active
To Action From
-- ------ ----
[ 1] 22/tcp ALLOW IN Anywhere
[ 2] 22/tcp (v6) ALLOW IN Anywhere (v6)
通信制御の初期化
通信制御を初期化して、UFWの無効化をします。
$ sudo 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)
$ sudo ufw reset ・・・ 通信制御の初期化(UFWの無効化)
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.20240412_183940'
Backing up 'before.rules' to '/etc/ufw/before.rules.20240412_183940'
Backing up 'after.rules' to '/etc/ufw/after.rules.20240412_183940'
Backing up 'user6.rules' to '/etc/ufw/user6.rules.20240412_183940'
Backing up 'before6.rules' to '/etc/ufw/before6.rules.20240412_183940'
Backing up 'after6.rules' to '/etc/ufw/after6.rules.20240412_183940'
$ sudo ufw status verbose
Status: inactive
$ sudo ufw enable ・・・ UFWの有効化
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup
$ sudo ufw status verbose ・・・ 初期化されているか確認
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip
$ sudo ufw allow from any to any port 22 proto tcp ・・・ ポート22の通信を許可
Rule added
Rule added (v6)
$ sudo 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)
連続した接続が行われたら拒否
30秒間に連続して6回の接続が行われたら拒否をすることもできます。
$ sudo 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)
$ sudo ufw limit from any to any port 22 proto tcp
Rule updated
Rule updated (v6)
$ sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip
To Action From
-- ------ ----
22/tcp LIMIT IN Anywhere
22/tcp (v6) LIMIT IN Anywhere (v6)
$ sudo ufw limit from any to any port 22 proto tcp comment 'Rate limit for openssh server' ・・・ コメントを入れることも可能
Rule updated
Rule updated (v6)
$ sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip
To Action From
-- ------ ----
22/tcp LIMIT IN Anywhere # Rate limit for openssh server
22/tcp (v6) LIMIT IN Anywhere (v6) # Rate limit for openssh server
$ sudo ufw allow from any to any port 22 proto tcp ・・・ もとに戻す
Rule updated
Rule updated (v6)
$ sudo 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でログの設定を行います。ログレベルは下記の通り。
通常は、「low」か「medium」で十分でしょう。
パラメーター | 説明 |
---|---|
off | ログの出力をしない |
low | 定義されたポリシーに一致しないすべての拒否された通信をログに記録する |
medium | 定義されたポリシーに一致しない拒否/許可された通信および、不正なパケット、新規の接続をログに記録する |
high | mediumで流量制御(Limit)を抜いたものをログに記録する |
full | すべての通信を記録する |
$ sudo ufw status verbose
Status: active
Logging: on (low) ・・・ デフォルトでは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)