block-beta columns 1 block:RULE1 A["ネットワーク層"] B["許可されたIPアドレスからのパケット以外は受け取らない"] end space block:RULE2 C["トランスポート層"] D["決められたポート宛のパケット以外はReject"] end space block:RULE3 E["アプリケーション層"] F["決められた形式以外のファイルはReject"] end blockArrowId6<[" "]>(down) G["通信の受取"] RULE1 --> RULE2 RULE2 --> RULE3 style B fill:#428CE6,stroke:#428CE6,color:#FFFFFF,stroke-width:2px style D fill:#428CE6,stroke:#428CE6,color:#FFFFFF,stroke-width:2px style F fill:#428CE6,stroke:#428CE6,color:#FFFFFF,stroke-width:2px
🎯 ゴール
ufw
を用いてUbuntu 22.04用のファイアウォールルールを設定する
Prerequisites
条件 | 備考 |
---|---|
ufw インストール済み |
apt-get install ufw |
ufw 有効化 |
sudo ufw enable |
ufwとは?
Definition 1 ufw(Unbcomplicated Firewall)
- Ubuntu のファイアウォール設定ツール
- iptablesのフロントエンド
- 初期状態では無効になっており,ユーザーが手動で有効にする必要がある
- 設定内容は
/etc/ufw/user.rules
(IPv4) と/etc/ufw/user6.rules
(IPv6) に保存される - ファイル形式のようなアプリケーション層のコンテンツ制御は直接はできない
ufwは,netfilter を管理するためのフレームワークと,ファイアウォールを操作するためのCLIを提供してくれるソフトです.
Linuxカーネルには,Netfilterというパケットフィルタリング機能があります.パケットの通過の可否の判断は,基本的に通信経路,IPアドレス,ポート番号,ポリシーの組み合わせで行われます. なお,デフォルトでは外部からは必要最低限のネットワーク通信しか受け付けないようにファイアウォールが設定されています.
通信経路
通信経路 | 説明 |
---|---|
入力(Incoming) | 外部からLinuxへ入ってくる通信経路 |
出力(Outgoing) | Linuxから外部へ出ていく通信経路 |
転送(Routed) | 別ホストへ転送する通信経路 |
IPアドレス
- 特定のクライアントのみに接続を許可したい場合のルール
- 不特定多数に提供するサービスのサーバーでは設定が困難
特定のIPからだけ3000ポートへの入力を許可する場合は
sudo ufw allow from 192.168.1.100 to any port 3000
送信先ポート番号
入力方向(IN)の場合,任意の送信元IPからポート3000へのアクセス許可をする場合は
sudo ufw allow to any port 3000
ポリシー
ポリシー | 説明 |
---|---|
allow | ルールにマッチしなかった通信を許可 |
deny | 通信を破棄 |
reject | 通信を拒否してエラーを返す |
ufw default
の設定書式
Syntax
ufw default allow|deny|reject [incomming|outgoing|routed]
- 通常は内部から外部へのOutgoingのみallowにすることを推奨
ufwコマンドを用いたファイヤーウォール設定
ファイル | 説明 |
---|---|
/etc/ufw/ufw.conf |
ufwの有効ステータス及びLOGLEVELの設定ファイル |
/etc/ufw/user.rules |
IPv4に関連するufwルールの設定ファイル |
/etc/ufw/user6.rules |
IPv6に関連するufwルールの設定ファイル |
- 基本的には以下で解説するコマンド経由の設定で十分
- きめ細かい設定をする場合を上記のファイルを直接編集
ufw enable/disable
# ufwを有効にしたい場合
sudo ufw enable
# ufwを無効にしたい場合
sudo ufw disable
ufw disable
しても,設定したルールは残されています.次回有効にしたときに以前設定したファイアウォールルールを再利用することができます.
ufw status
設定と動作状況を確認したい場合は ufw status
コマンドを実行します.コマンド実行により以下の内容が確認できます
- ファイアウォールの動作状況:
active
orinactive
- 設定されているルール一覧
# 設定と動作状況を表示
% sudo ufw status
Status: active
To Action From
-- ------ ----
Anywhere on tailscale0 ALLOW Anywhere
22/tcp LIMIT Anywhere
Anywhere (v6) on tailscale0 ALLOW Anywhere (v6)
22/tcp (v6) LIMIT Anywhere (v6)
ルールを削除挿入する場合はルール番号がわかると便利です.ルール番号を表示させたい場合は
# ルール番号を表示する
% sudo ufw status numbered
Status: active
To Action From
-- ------ ----
[ 1] Anywhere on tailscale0 ALLOW IN Anywhere
[ 2] 22/tcp LIMIT IN Anywhere
[ 3] Anywhere (v6) on tailscale0 ALLOW IN Anywhere (v6)
[ 4] 22/tcp (v6) LIMIT IN Anywhere (v6)
ufw status verbose
ロギングモードやデフォルトポリシーを表示させる場合は ufw status verbose
を実行します
% sudo ufw status verbose
Status: active
Logging: on (high)
Default: deny (incoming), allow (outgoing), deny (routed)
New profiles: skip
To Action From
-- ------ ----
Anywhere on tailscale0 ALLOW IN Anywhere
22/tcp LIMIT IN Anywhere
Anywhere (v6) on tailscale0 ALLOW IN Anywhere (v6)
22/tcp (v6) LIMIT IN Anywhere (v6)
ufw logging
Syntax
ufw logging off|low|medium|high|full
rsyslog
が設定されているシステムでは,/var/log/ufw.log
にログが記録される- LEVEL(
off|low|medium|high|full
)を指定すると,logging頻度が設定される - defaultのlog levelは
low
パラメーター | 説明 |
---|---|
off |
ログを記録しない |
low |
定義されたポリシーに一致しないすべてのブロックされたパケット(レート制限付き) + ログルールに一致するパケットを記録 |
medium |
low に加え,ポリシーにマッチせず許可された通信,INVALIDなパケット,新規の接続をレート制限付きで記録 |
high |
medium レベルのログ(レート制限なし)に加え,すべてのパケットをレート制限付きでログに記録 |
full |
high レベルのログ(レート制限なし)をすべて記録 |
medium
より上のログレベルは,たくさんのログ出力を生成し,ディスクを短時間で使い切ってしまう可能性があります.ですので迷ったならば
- サーバー使用:
medium
- 個人用デスクトップ:
low
という設定で十分だと思います.
ufw allow
Synatx
ufw allow service|port|protocol|IP address
- 特定のポートやサービスへのアクセスを許可するルールを設定する際に使用
# SSH を許可
sudo ufw allow 22/tcp
# HTTP を許可
sudo ufw allow http
# 192.168.1.0/24の範囲からのアクセスを許可
sudo ufw allow from 192.168.1.0/24
# 192.168.1.0/24の範囲からport 80へのアクセスを許可
sudo ufw allow from 192.168.1.0/24 to any port 80
ufw deny
Syntax
ufw deny service|port|protocol|IP address
- 特定のポートやサービスへのアクセスを拒否するルールを設定する際に使用
# Telnet を拒否
sudo ufw deny 23/tcp
# 10.0.0.5からのアクセスを拒否
sudo ufw deny from 10.0.0.5
ufw delete
Syntax
ufw delete NUM|rule
- 既存のルールを削除する際に使用
- NUM は
ufw status numbered
で確認したルール番号
# 22番ポートの許可を削除
sudo ufw delete allow 22/tcp
# 23番ポートの拒否を削除
sudo ufw delete deny 23/tcp
# 23番ポートの制限許可を削除
sudo ufw delete limit 22/tcp
# ルール 5~9 を削除(降順にすること)
for n in 9 8 7 6 5; do ufw delete $n; done
ufw insert
Syntax
ufw insert NUM allow|deny service|port|protocol|IP address
- ルールを指定した順番に挿入する際に使用
- NUM は挿入する位置番号
# 80番ポート許可を最初のルールに挿入
sudo ufw insert 1 allow 80/tcp
# 192.168.1.100からのアクセス拒否ルールを2番に挿入
sudo ufw insert 2 deny from 192.168.1.100
ufw limit
Syntax
ufw limit service|port
- 指定したポートやサービスへのアクセスを制限(レート制限)する際に使用
- DoS 攻撃やブルートフォース攻撃対策に便利
# SSH に対して接続レート制限を設定
sudo ufw limit 22/tcp
# 192.168.1.0/24範囲からポート443への接続をレート制限
sudo ufw limit from 192.168.1.0/24 to any port 443
ufw + tailscaleの設定
- Tailscale以外のすべてのincoming通信を拒絶
- すべてのOutgoingトラフィックを許可
Prerequisites
- tailscaleがサーバー側でインストール済み
- ufwがサーバー側でインストール済み
- tailscale経由でssh接続可能
Defaultルールの設定
tailscale sshでサーバーにログインした後に,ufw defaultルールを設定します
# incoming rule
sudo ufw default deny incoming
# outgoing rule
sudo ufw default allow outgoing
verboseを用いてDefaultルール設定を確認します.Default
セクションについて,以下のような設定になっていればOKです
$ sudo ufw status verbose
Status: active
Logging: on (high)
Default: deny (incoming), allow (outgoing), deny (routed)
New profiles: skip
To Action From
-- ------ ----
...
次に,tailscale
のincoming設定をします
$ sudo ufw allow in on tailscale0
改めてルール設定を確認します
$ sudo ufw status
Status: active
To Action From
-- ------ ----
Anywhere on tailscale0 ALLOW Anywhere
Anywhere (v6) on tailscale0 ALLOW Anywhere (v6)
ルール設定後,ufwをリフレッシュして完了です
$ sudo ufw reload
📘 REMARKS
- 上記のufwルール設定ではincomingがデフォルトでdeny, tailscale経由のみをincomingアクセスを許可
- tailscaleを経由しないsshは拒絶されるが,tailscale + sshは機能するはずです
トラブルシューティング
/var/log/ufw.log
が生成されない
sudo ufw status verbose
でlogging on担っているにも関わらず,/var/log/ufw.log
が生成されない
原因調査
ufw.log
は rsyslog
経由で書き込まれるはずなので,rsyslog
自体のログを確認してみます.
sudo cat /var/log/syslog | grep "ufw"
ファイルを見てみると
rsyslogd: file '/var/log/ufw.log': open error: Permission denied [v8.2312.0 try https://www.rsyslog.com/e/2433 ]
というラインが登場したならば,Permissionの問題であると考えることができます.
対策
/var/log
のdefault permissonは
項目 | 設定値 |
---|---|
owner | root |
group | syslog |
permission | 755 (drwxr-xr-x ) |
/var/log
自体には 書き込み権限を付けないのが推奨及びデフォルトなので,個別ファイル(今回ならば /var/log/ufw.log
) に権限をつけることが対応策となります.従って,
# 空のlogファイル生成
sudo touch /var/log/ufw.log
# owner:groupの変更
sudo chown syslog:adm /var/log/ufw.log
もろもろがめんどくさい場合は sudo chmod 775 /var/log
を実行します.
Appendix 1: ファイアウォール
Definition 2 ファイアウォール
- パケットを制御する仕組みのこと
- 内部ネットワークと外部ネットワークの通信を監視・制御する
- セキュリティポリシーに従ってアクセスを許可/拒否する
基本的には(TCP/IPモデル)階層ごとにヘッダの内容に応じたチェック項目を設け,それらをクリアしたデータだけを上の階層に渡すという仕組みで通信を制御します.
Example 1
UFW が扱える階層
OSI階層 | TCP/IP階層 | UFWで可能なこと |
---|---|---|
L3: ネットワーク層 | インターネット層 | - IPアドレスの許可/拒否 - サブネット単位でのアクセス制御 |
L4: トランスポート層 | トランスポート層 | - ポート番号指定の許可/拒否 - TCP/UDP プロトコルごとの制御 |
Appendix 2: IPアドレスとサブネットマスク
Definition 3 IPアドレスの構成
IP address: 192.168.0.1
Subnet mask: 255.255.255.0
というIPv4アドレスはネットワークパートとホストパートの2つの要素によって構成されています:
- Newwork Identifier: デバイスがどのネットワークに属しているかを示す識別子
- Host Identifier: 属しているネットワーク上でデバイスに対して付与される識別子
サブネットマスクはIPアドレスの内,どのビットまでがNetwork Identifierなのかを示します.
IPv4アドレスは32-bitで定義されています.192.168.0.1
はそれを読みやすくしたものであり,binary表記と対応させると
192.168.0.1 =
11000000.10101000.00000000.00000001
サブネットマスクも同様で
255.255.255.0 =
11111111.11111111.11111111.00000000
1
: network portion0
: host portion
解釈すると,192.168.0
がネットワーク識別子で,1
がホスト識別子となります.
IPv4とサブネットマスクの解釈
Network ID | 192.168.0.0 |
|
Broadcast address | 192.168.0.255 |
同じネットワークに属するすべてのデバイスに一斉にメッセージを届けるための特別なIPアドレスのこと |
Valid hosts | 192.168.0.1 ~ 192.168.0.254 |
254個のデバイスが同一ネットワークに登録可能 |
0.0.0.0
Broadcast addressは通信の宛先アドレスですが,0.0.0.0
は宛先ではなく「このマシンが持つ全てのIPv4アドレスで待ち受ける」という意味になります.間隔としては,
0.0.0.0
: 自分の家の全てのドアを開けて待っている(誰でも入れる状態にする)192.168.0.255
: 町内の 全住人にスピーカーで呼びかける
アドレス | 意味 | 使い方 |
---|---|---|
0.0.0.0 |
「全ての自分のIPアドレスで待ち受ける」 | サーバープログラムのバインド用 |
192.168.0.255 |
「192.168.0.0/24 の全ホストに送信する」 | ブロードキャスト通信の宛先 |
CIDR表記
フルのサブネットマスク(255.255.255.0
)のように表記する代わりに,ネットワーク部に使うビット数だけを指定する方法をCIDR表記といいます.
192.168.1.10/24
:24
はネットワーク部が 24 ビットという意味(マスクは255.255.255.0
)10.0.0.1/8
:/8
はネットワーク部が 8 ビットという意味(マスクは255.0.0.0
)
Example 2
172.18.1.10/12
のネットワークの有効ホスト範囲とブロードキャストアドレスは
- 有効ホスト範囲:
172.16.0.1
~172.31.255.254
- ブロードキャストアドレス:
172.31.255.255