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 disableufw disableしても,設定したルールは残されています.次回有効にしたときに以前設定したファイアウォールルールを再利用することができます.
ufw status
設定と動作状況を確認したい場合は ufw status コマンドを実行します.コマンド実行により以下の内容が確認できます
- ファイアウォールの動作状況:
activeorinactive - 設定されているルール一覧
# 設定と動作状況を表示
% 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|fullrsyslogが設定されているシステムでは,/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 80ufw 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.5ufw 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.100ufw 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 443ufw + 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 outgoingverboseを用いて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.000000001: 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