man ufw-framework 日本語訳

``man ufw-framework`` の日本語訳。

# UFW FRAMEWORK(8)

May 2023 UFW FRAMEWORK(8)

## NAME

ufw-framework - ufw フレームワームの使用方法

## DESCRIPTION

ufw はネットフィルターファイアウォールを管理する為の
コマンドラインインターフェイスとフレームワームを提供します。
ufw コマンドが簡単に操作できるファイアウォールの管理インターフェイスを提供する一方、
ufw フレームワームは既定の動作とコマンドラインツールによってサポートされない
ルール群をカスタマイズする管理者向けの道具を提供します。
この方式において ufw は完全な Linux ネットフィルターの力と
柔軟性を利用することができます。

## OVERVIEW

フレームワームは以下を提供します。

* ブート時の初期化処理
* カスタムルール群を追加する為のルールファイル群
* ネットフィルターモジュール群を読み込む方法
* カーネルパラメータの設定
* IPv6 の設定

フレームワークは以下のファイル群から構成されます:

### /lib/ufw/ufw-init

初期化スクリプト

### /etc/ufw/before.init

ufw 初期化前に実行する初期化カスタマイズスクリプト

### /etc/ufw/after.init

ufw 初期化後に実行する初期化カスタマイズスクリプト

### /etc/ufw/before[6].rules

UI がルール群を登録する前に評価される
ルール群を記載したルールファイル

### /etc/ufw/user[6].rules

UI が登録したルール群を記載したルールファイル
(ufw コマンドで管理されるルール群)

### /etc/ufw/after[6].rules

UI がルール群を登録した後に評価される
ルール群を記載したルールファイル

### /etc/default/ufw

高レベルの設定

### /etc/ufw/sysctl.conf

調整可能なカーネルネットワーク

### /etc/ufw/ufw.conf

追加の高レベルの設定

## BOOT INITIALIZATION

ufw はブート時に [/lib/ufw/ufw-init](#libufwufw-init) を使用して起動します。
このスクリプトは、 ufw コマンドによって使用される
標準的な SysV 形式の起動スクリプトです。
修正はしないでください。
``/etc/before.init`` と ``/etc/after.init`` は、 ufw がまだサポートしていない
追加のファイアウォール設定を設定する時に使用されることがあります。
``/etc/before.init`` と ``/etc/after.init`` が存在して実行可能である場合、 
[ufw-init](#libufwufw-init) は ``before.init`` と ``after.init`` に記述された処理を実行します。
``before.init`` と ``after.init`` どちらかがエラー終了した場合、
[ufw-init](#libufwufw-init) はエラー終了します。
[ufw-init](#libufwufw-init) は下記の引数をサポートします:

### start

ファイアウォールを起動します。

### stop

ファイアウォールを停止します。

### restart

ファイアウォールを再起動します。

### force-reload

[restart](#restart) と同様です。

### status

ファイアウォールの基本的なステータスを表示します。

### force-stop

[stop](#stop) と同様です。
ただしファイアウォールが既に起動している場合でも確認を行いません。

### flush-all

組込みのチェインを削除し、非組込みのチェインを削除して
ポリシーを ``ACCEPT`` にリセットします。

### ufw-init

下記の実行時に ``before.init`` と ``after.init`` を呼び出します。

* [start](#start)
* [stop](#stop)
* [status](#status)
* [flush-all](#flush-all)

``before.init`` と ``after.init`` を使用する場合、
一般的には [start](#start) と [stop](#stop) の実装のみが必要です。

ufw は、組込みの iptables チェインに加えて、
ユーザーが定義したチェインをたくさん使用します。
[/etc/default/ufw](#etcdefaultufw) の ``MANAGE_BUILTINS`` に
``yes`` が設定されている場合、
停止時と再起動時に組込みチェインは削除されます。
``no`` に設定されている場合、停止時と再起動時に
ufw のユーザー定義チェインと組込みチェインは削除されます。
ufw の特定のチェインの削除に加えて、
組込みチェインは登録済みユーザー定義チェインと同じ順序で維持されます。
これにより独自のファイアウォールルールを管理する
他のソフトウェアと ufw を相互運用できるようになります。

ユーザーの定義したファイアウォールがブート時に読み込まれていることを保証するには、
ブートプロセスへ起動スクリプトを統合しなければなりません。
ufw がまだ統合されていない場合、ブートプロセスを正しく修正する為に
ディストリビューションのドキュメントを確認してください。

## RULES FILES

ufw は iptables-restore 向けフロントエンドの一つです。
ufw はルール群を下記へ保存します。

* [/etc/ufw/before.rules](#etcufwbefore6rules)
* [/etc/ufw/after.rules](#etcufwafter6rules)
* [/etc/ufw/user.rules](#etcufwuser6rules)

管理者は標準的な iptables-restore の構文を使用して
[before.rules](#etcufwbefore6rules) と [after.rules](#etcufwafter6rules) を望み通りにカスタマイズできます。
ルール群は次の順に評価されます:

1. [before.rules](#etcufwbefore6rules)
2. [user.rules](#etcufwuser6rules)
3. [after.rules](#etcufwafter6rules)

IPv6 ルール群も同様の順で評価されます:

1. [before6.rules](#etcufwbefore6rules)
2. [user6.rules](#etcufwuser6rules)
3. [after6.rules](#etcufwafter6rules)

``ufw status`` は ufw を使用して追加したルール群のみを表示します。
``/etc/ufw`` 配下のルールファイル群から取り込んだルール群は表示しません。

**重要:** ufw はデフォルトで ``*filter`` テーブルのみを使用します。
以下に示すような他のテーブルは必要に応じて追加してください。

* ``*nat``
* ``*raw``
* ``*mangle``

各テーブルに対応した ``COMMIT`` ステートメントが必須となります。

ルールファイル群を更新した後は、更新したルール群が効力を発揮する為に
ufw のリロードが必要となります。
ルールファイル群の一般的な使い方については [EXAMPLES](#examples) を参照してください。

## MODULES

ネットフィルターは数多くのコネクショントラッキングモジュールを有しています。
このモジュール群はプロトコルの基礎として認識されており、
管理者へルールセットの簡素化をもたらします。
ユーザーは [/etc/default/ufw](#etcdefaultufw) 配下の
``IPT_MODULES`` を調整することで、
どのネットフィルターモジュール群を読み込むか設定することができます。
よく使用されるモジュール群を例示します:

* nf_conntrack_ftp
* nf_nat_ftp
* nf_conntrack_irc
* nf_nat_irc
* nf_conntrack_netbios_ns
* nf_conntrack_pptp
* nf_conntrack_tftp
* nf_nat_tftp
* nf_conntrack_sane

条件を指定しないコネクショントラッキングモジュール群の読み込み記法(例: ``nf_contrack_*``)は非推奨です。
ufw は引き続き機能をサポートしますが、新しい構成には
サイトに必要な特定のモジュールのみを含める必要があります。
詳細は [CONNECTION HELPERS](#connection-helpers) を参照してください。

## KERNEL PARAMETERS

ufw が有効である場合、ブート時に [/etc/ufw/sysctl.conf](#etcufwsysctlconf) を読み込みます。
[/etc/ufw/sysctl.conf](#etcufwsysctlconf) はシステムの ``sysctl.conf`` (通常は ``/etc/sysctl.conf``)の値を上書きします。
管理者は [/etc/default/ufw](#etcdefaultufw) を修正することで ``sysctl.conf`` の上書きに使用するファイルを変更することができます。

## IPV6

IPv6 は既定で有効化されています。
無効化すると全ての受信パケット、送信パケット、転送パケットが、
ループバックインターフェイス上のトラフィック例外として棄却されます。
上記の挙動を変更するには [/etc/default/ufw](#etcdefaultufw) に記載されている ``IPV6`` へ ``yes`` を設定してください。
詳細は [ufw のマニュアルページ](https://qiita.com/JhonnyBravo/items/70d121338b2ffa384caf) を参照してください。

## EXAMPLES

前述の通り、 ufw は iptables-restore コマンドと
ip6tables-restore コマンドを使用して
カーネルへルールファイル群を読み込みます。
ufw ルールファイル群へ手動でルールの追加をしたいユーザーは、
ルールファイル群に加えて iptables コマンドと ip6tables コマンドにも
精通している必要があります。
以下に ufw ルールファイル群の一般的な使用例を示します。
使用例は IPv4 のみを前提とし、 [/etc/default/ufw](#etcdefaultufw) の
``DEFAULT_FORWARD_POLICY`` へ ``DROP`` が設定されているものとします。

### IP Masquerading

``eth1`` の ``10.0.0.0/8`` ネットワークから
``eth0`` の単一の IP アドレスへ共有する
IP マスカレードを許可するには [/etc/ufw/sysctl.conf](#etcufwsysctlconf) を編集します:

```bash
net.ipv4.ip_forward=1
```

[/etc/ufw/before.rules](#etcufwbefore6rules) の末尾、 ``*filter`` セクションの後に下記を追加します:

```bash
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 10.0.0.0/8 -o eth0 -j MASQUERADE
COMMIT
```

ファイアウォールに IPv6 トンネルや 6to4 を使用している場合、
あるいは NAT を使用している場合、プロトコル ``41`` (IPv6)パケットは転送しないでください。
上記の代わりに [/etc/ufw/before.rules](#etcufwbefore6rules) で設定する方法を例示します:

```bash
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 10.0.0.0/8 ! --protocol 41 -o  eth0
-j MASQUERADE
COMMIT
```

トラフィックの許可を ``ufw route`` ルールへ追加します:

```bash
ufw route allow in on eth1 out on eth0 from 10.0.0.0/8
```

### Port Redirections

``eth0`` の tcp ポート 80 番から ``10.0.0.2`` にあるウェブサーバーへ転送するには
[/etc/ufw/sysctl.conf](#etcufwsysctlconf) を編集します:

```bash
net.ipv4.ip_forward=1
```

[/etc/ufw/before.rules](#etcufwbefore6rules) の末尾、 ``*filter`` セクションの後に下記を追加します:

```bash
*nat
:PREROUTING ACCEPT [0:0]
-A PREROUTING -p tcp -i eth0 --dport 80 -j DNAT \
--to-destination 10.0.0.2:80
COMMIT
```

トラフィックの許可を ``ufw route`` ルールへ追加します:

```bash
ufw route allow in on eth0 to 10.0.0.2 port 80 proto tcp
```

### Egress filtering

``eth0`` から送信される RFC1918 アドレスを遮断するには
トラフィックを棄却するルール群を ``ufw route`` へ追加します:

```bash
ufw route reject out on eth0 to 10.0.0.0/8
ufw route reject out on eth0 to 172.16.0.0/12
ufw route reject out on eth0 to 192.168.0.0/16
```

### Full example

この例では、他の例を組み合わせて、単純なルーティングファイアウォールを示します。

**警告:** この設定は ufw フレームワークの機能を簡潔に単純な記法で示す為の例に過ぎません。
各所で何を行い、何を行っていないのか理解しないまま本番環境へ使用しないでください。
ファイアウォールは間違いなく、なるべく開いていないほうがよいでしょう。

このルーター/ファイアウォールは 2 つのインターフェイスを保有します:

* ``eth0`` (インターネットへ接続)
* ``eth1`` (インターナル LAN)

インターナルクライアントは ``10.0.0.0/8`` ネットワークのアドレスを持ち、
インターネット上のどこへでも接続できます。
インターネットからポート 80 番への接続は ``10.0.0.2`` へ転送されるべきです。
管理用ワークステーション(``10.0.0.100``)から
インターナルクライアントの ssh ポート 22 番への接続は許可されるべきです。
インターナルトラフィックはインターネットへ送信しないものとします。

[/etc/ufw/sysctl.conf](#etcufwsysctlconf) を編集します:

```bash
net.ipv4.ip_forward=1
```

[/etc/ufw/before.rules](#etcufwbefore6rules) の末尾、 ``*filter`` セクションの後へ下記を追加します:

```bash
*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A PREROUTING -p tcp -i eth0 --dport 80 -j DNAT \
--to-destination 10.0.0.2:80
-A POSTROUTING -s 10.0.0.0/8 -o eth0 -j MASQUERADE
COMMIT
```

必要な ufw ルール群を追加します:

```bash
ufw route reject out on eth0 to 10.0.0.0/8
ufw route reject out on eth0 to 172.16.0.0/12
ufw route reject out on eth0 to 192.168.0.0/16
ufw route allow in on eth1 out on eth0 from 10.0.0.0/8
ufw route allow in on eth0 to 10.0.0.2 port 80 proto tcp
ufw allow in on eth1 from 10.0.0.100 to any port 22 proto tcp
```

## CONNECTION HELPERS

ネットフィルターコネクショントラッキングヘルパーは
関連パケットを関連フローにグループ化し、ルールセットをより明確かつ正確にします。
使用に際して様々なプロトコルが必要です。
例えば、いくつかのカーネルモジュールといくつかのルールがあれば、
ルールセットは FTP ポート 21 番への接続を許可するだけで済みます。
カーネルはトラフィックを調べ、他の FTP データパケットを
最初の接続に関連するものとしてマークします。

ヘルパーが最初に導入されたとき、モジュールロードの一部としてのみ
モジュールを構成できました。
(例えば FTP サーバーが 21 番とは異なるポートで接続を待受けている場合、 ``nf_conntrack_ftp`` モジュールへ正しいポートを指定してロードする必要があります)
接続ヘルパーを無条件に使用すると、時間が経つにつれて
誤用につながる可能性があることが理解されました。
一部のプロトコルでは、望ましくない方法で
ファイアウォールを通過できるユーザー指定のデータが許可されているためです。
現行カーネル 4.7 では自動接続トラックヘルパーの割当(例: 特定のポートとすべてのIPアドレスのパケットの処理)は無効化されています。
(古い挙動は、 [/etc/ufw/sysctl.conf](#etcufwsysctlconf) へ ``net/netfilter/nf_contrack_helper=1`` を設定することで復元することができます)
ファイアウォールは、代わりに CT ターゲットを使用して
トラフィックを特定のヘルパーに関連付け、
ヘルパーを使用するように ``RELATED`` ルールを設定する必要があります。
これによりサイトはヘルパーの使用をカスタマイズし、不正使用を回避できます

一般的にヘルパーを安全に使用する為には、下記が必要となります:

1. ``net/netfilter/nf_conntrack_helper`` は ``0``  (既定値)に設定されるべきです。

2. 接続開始用のルールを作成します。(例えば FTP の場合はポート 21 番)

3. 接続とヘルパーを関連付けるヘルパールールを作成します。

4. 接続と ``RELATED`` フローを関連付けるヘルパールールを作成します。

5. 必要であれば対応する ``nf_conntrack_*`` モジュールを ``IPT_MODULES`` へ追加します。

6. 任意の対応する ``nf_nat_*`` モジュールを ``IPT_MODULES`` へ追加します。

一般的に、ルールセットのセキュリティ問題を回避するために、
接続ヘルパールールを可能な限り具体的にし、
サイトにスプーフィング防止が正しく設定されていることを確認することが望ましいです。
詳細は ``ANTI-SPOOFING`` と [Secure use of iptables and connection tracking helpers](https://home.regit.org/netfilter-en/secure-use-of-helpers/) を参照してください。

ヘルパールール群は、ルールファイル群を通じて管理が必須となります。
ufw の将来のバージョンでは、ヘルパールールを操作するための構文が導入される予定です。

## NOTES

ufw を libvirt を使用してブリッジを構成する場合、
パケットがブロックされることがあります。
libvirt チームは sysctl へブリッジのネットフィルターを
無効に設定することを推奨しています:

```bash
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0
```

ブリッジモジュールは上記の値が設定される前に
カーネルへ読み込まれなければならないことに留意してください。
ufw を使用してこの動作を正しく保証する一つの方法は、
[/etc/default/ufw](#etcdefaultufw) の ``IPT_MODULES`` へ ``bridge`` を登録し、
上記のルール群を [/etc/ufw/sysctl.conf](#etcufwsysctlconf) へ追加することです。

ブリッジのネットフィルターを無効化する方法もあります。
ブリッジを介して転送される全トラフィックを許可するように iptable へ設定することができます。
例えば [/etc/ufw/before.rules](#etcufwbefore6rules) の ``*filter`` セクションへ下記を追加します:

```bash
-I FORWARD -m physdev --physdev-is-bridged -j ACCEPT
```

## SEE ALSO

* [ufw(8)](https://qiita.com/JhonnyBravo/items/70d121338b2ffa384caf)
* iptables(8)
* ip6tables(8)
* iptables-restore(8)
* ip6tables-restore(8)
* sysctl(8)
* sysctl.conf(5)