ansibleguy.infra_nftables
<a href="https://netfilter.org/projects/nftables/index.html">
<img src="https://netfilter.org/images/netfilter-logo3.png" alt="NFTablesのロゴ" width="400"/>
</a>
# Ansibleロール - NFTables
LinuxサーバにNFTablesファイアウォールを設定するための役割です。
<a href='https://ko-fi.com/ansible0guy' target='_blank'><img height='35' style='border:0px;height:46px;' src='https://az743702.vo.msecnd.net/cdn/kofi3.png?v=0' border='0' alt='コーヒーを買ってください' />
[](https://github.com/ansibleguy/_meta_cicd/blob/latest/templates/usr/local/bin/cicd/molecule.sh.j2)
[](https://github.com/ansibleguy/_meta_cicd/blob/latest/templates/usr/local/bin/cicd/yamllint.sh.j2)
[](https://github.com/ansibleguy/_meta_cicd/blob/latest/templates/usr/local/bin/cicd/pylint.sh.j2)
[](https://github.com/ansibleguy/_meta_cicd/blob/latest/templates/usr/local/bin/cicd/ansiblelint.sh.j2)
[](https://galaxy.ansible.com/ui/standalone/roles/ansibleguy/infra_nftables)
Moleculeログ: [ショート](https://badges.ansibleguy.net/log/molecule_infra_nftables_test_short.log), [フル](https://badges.ansibleguy.net/log/molecule_infra_nftables_test.log)
**テスト済み:**
* Debian 11
* Debian 12
## インストール
```bash
# 最新版
ansible-galaxy role install git+https://github.com/ansibleguy/infra_nftables
# Galaxyから
ansible-galaxy install ansibleguy.infra_nftables
# またはカスタムロールパスにインストール
ansible-galaxy install ansibleguy.infra_nftables --roles-path ./roles
ドキュメンテーション
- NFTables: Wiki
- 例をご覧ください!
- 実用的なユースケース (Docker, Proxmox, ネットワークファイアウォール)
- トラブルシューティングガイド
トラブルシューティング
使用法
シンプルなAnsible GUIが必要ですか?私のAnsible WebUIをご覧ください。
設定
必要に応じて設定を定義します:
nftables:
# 有効にする: # 機能はカーネルでサポートされる必要があります
# sets: true
# nat: true
# deb11_backport: false # Debian 10に新しいバージョンをインストールするためのDebian 11バックポートリポジトリを使用
# bash_completion: false
_defaults: # すべてのテーブルとチェインによって継承されるデフォルト
table:
type: 'inet'
chain:
policy: 'drop'
type: 'filter'
priority: 0
log:
drop: true
rules:
_all: [] # すべてのテーブルのすべてのチェインに追加されるルール
incoming: [] # すべてのテーブルの'incoming'チェインに追加されるルール
tables:
example:
# type: 'inet' # ipv4 + ipv6
_defaults:
rules:
_all: [] # このテーブルのすべてのチェインに追加されるルール
vars:
dns_servers: ['1.1.1.1', '1.1.0.0', '8.8.8.8', '8.8.4.4']
private_ranges: ['192.168.0.0/16', '172.16.0.0/12', '10.0.0.0/8']
sets:
blacklist:
flags: ['dynamic', 'timeout']
settings:
timeout: '3m'
counters:
invalid_packages:
comment: '無効'
chains:
incoming:
hook: 'input'
rules:
- sequence: 1
raw: 'ct state invalid counter name invalid_packages log prefix "DROP invalid states" drop'
- seq: 2
raw: 'ct state {established, related} counter accept comment "セッションを許可"'
- s: 3
raw: 'iifname "lo" accept comment "ループバックトラフィックを許可"'
- {proto: 'icmp', type: 'echo-request', limit: 'rate 10/second', comment: 'icmp-pingを許可'}
- {proto: 'icmpv6', type: 'echo-request', limit: 'rate 10/second', comment: 'icmp-pingを許可'}
- {proto: 'icmp', code: 30, limit: 'rate 10/second', comment: 'icmp-tracerouteを許可'}
- {proto: 'icmpv6', limit: 'rate 10/second', comment: 'ipv6が動作するために必要なicmpv6タイプを許可',
type: ['nd-neighbor-solicit', 'nd-router-advert', 'nd-neighbor-advert']}
- {proto: 'udp', port: 46251, counter: 'invalid_packages'}
outgoing:
hook: 'output'
# policy: 'accept'
rules:
- {dest: '$dns_servers', proto: 'udp', port: 53}
- {dest: '$dns_servers', proto: 'tcp', port: [53, 853]}
- {proto: ['tcp', 'udp'], port: [80, 443]}
- {proto: ['icmp', 'icmpv6'], comment: 'アウトバウンドicmpを許可'}
route:
hook: 'forward'
translate:
hook: 'postrouting'
type: 'nat'
policy: 'accept'
rules:
- {'src': '$private_ranges', oif: 'eno2', masquerade: true} # 動的なアウトバウンドナット
- {'src': '$private_ranges', oif: 'eno3', snat: '192.168.0.1'} # 静的なアウトバウンドナット
グループルールとホストルールを統合する場合は、次のようにします:
# すべてのホストで使用される基本ルールセットを'fw_rules_all'として定義
# サービス固有のルールを'fw_rules_group'として定義
# ホスト固有のルールを'fw_rules_host'として定義
- name: NFTables
become: true
hosts: all
vars:
nftables:
tables:
example:
chains: "{{ fw_rules_all |
combine(fw_rules_group|default({}), recursive=true, list_merge='append') |
combine(fw_rules_host|default({}), recursive=true, list_merge='append') }}"
pre_tasks:
- debug:
var: nftables
roles:
- ansibleguy.infra_nftables
実行
プレイブックを実行します:
ansible-playbook -K -D -i inventory/hosts.yml playbook.yml
いくつかの便利なタグも利用可能です:
- config_table => 実際のルールセットのみを提供
- config
- purge
エラーをデバッグするには、実行時に'debug'変数を設定できます:
ansible-playbook -K -D -i inventory/hosts.yml playbook.yml -e debug=yes
機能
パッケージのインストール
- Ansible依存関係 (最小限)
- NFTables
設定
定義の可能性
- 変数をグローバルレベルで
- 変数、セット、カウンター、制限をテーブルレベルで
- 変数をチェインレベルで
構成は検証されます 書き込む前に
デフォルト設定:
- 有効な機能 (カーネルでサポートされている必要があります)
- セット
- NAT
- デフォルトでは、ルールは追加されません
- テーブル
- テーブルタイプ = inet
- チェイン
- チェインタイプ = filter
- チェインポリシー = drop
- 優先度 = 0
- カウンターを追加 = はい
- 暗黙のドロップをログ = はい
- セット
- セットタイプ = ipv4_addr
- カウンターを追加 = はい
- ルール
- ポリシー = accept (明示的に削除したい場合は'none'に設定)
- ドロップ時のロギング = はい
- 有効な機能 (カーネルでサポートされている必要があります)
デフォルトのオプトイン:
- '/etc/nftables.d/'に保存されている管理外の設定ファイルを削除します
デフォルトのオプトアウト:
- Debian 10で実行中の際にDebian 11バックポートからNFTablesをインストールすること (新しいバージョン)
- 'nft'コマンド用のbash-completionスクリプトの追加
情報
注意: ほとんどのロールの機能はオプションとして選択できます。
すべての利用可能なオプションは、メインデフォルトファイルにあるデフォルト設定を参照してください!
警告: 提供された設定/変数がすべて有効性を確認されるわけではありません。不正な設定によりロールが壊れる可能性があります!
情報: NFTablesにDNS解決とIPブロックリスト機能を追加するには、ansibleguy.addons_nftablesロールを使用してください!
警告: 一部のコア機能 (NAT/セット) は、一般的なディストリビューションカーネルでサポートされない場合があります。
情報: フックと優先順位を構成するタイミングや方法については、フックドキュメントをお読みください!
情報: ルールは、例で見るように辞書形式で提供できます。
利用可能なフィールドとエイリアスは次のとおりです:
機能 キー 注記 ルールの順序 s, id, seq, sequence ルールをチェイン内でソートするためのシーケンスID (整数)。提供されない場合は、1000から始まる自動生成されます。重複するシーケンスIDが提供されると、ロールの構成チェックが失敗します! 入力インターフェース if, iif, iifname - 出力インターフェース of, oif, oifname - プロトコル proto, pr, protocol - プロトコルのサブタイプ t, type - プロトコルのサブコード co, code - 宛先アドレス/ネットワーク d, dest, target, destination, 'ip daddr', d6, dest6, target6, 'ip6 daddr' - 宛先ポート dp, port, dport, dest_port - ソースアドレス/ネットワーク s, src, source, 'ip saddr', s6, src6, source6, 'ip6 saddr' - ソースポート sp, sport, sport, src_port - ロギング / ログメッセージ l, log, 'log prefix' 'True'に設定し、コメントが提供されている場合は、それがメッセージとして使用されます。他の場合はメッセージは使用されません トラフィックカウンター count, counter 'True'に設定すると、ルール固有のカウンターが使用されます。そうでない場合は、提供された事前定義のカウンターが使用されます。 トラフィックリミット lim, limit ルールに設定する制限。 匿名の制限および事前定義の制限を参照してください。 ルールのアクション a, action アクションが提供されない場合は、デフォルトで「accept」になります。 ソースNATマスカレード m, masque, masquerade NATマスカレードを使用するかどうか ソースNAT snat, src_nat, source_nat, outbound_nat, 'snat to' - 宛先NAT dnat, dest_nat, destination_nat, 'dnat to' - リダイレクト redir, redirect, 'redirect to' リダイレクトを使用することで、パケットがローカルマシンに転送されます ルールコメント c, cmt, comment - ユーザー user, uid 特定のユーザーから発信されたトラフィックのみを一致させます。 グループ group, gid 特定のグループから発信されたトラフィックのみを一致させます。 ファイアウォールマーク mark - 優先度 prio, priority - パケット長 len, length - タイムスタンプ time, timestamp パケット受信のタイムスタンプを一致させます。 曜日 day 週の日を一致させます (0 = 日曜日から6 = 土曜日または "月曜日", "火曜日" も "金曜日", "土曜日") 時間 hour 24時間形式の"HH:MM:SS"を一致させます(秒は省略可能)。 アクション、ソースNAT、マスカレード、宛先NATのいずれか1つのみが1つのルールに設定できます!
情報: 特殊または複雑なルールは、ルール辞書を使用して構成できません。
'raw'キーを使用して、カスタムルールを提供し、直接ルールセットに追加できます。
情報: テーブルレベルで変数、セット、カウンター、制限を定義できます。
- 変数はキーと値のペアです。
var-name: var-value var2-name: ['value1', 'value2']
- セットはこの構造を持ちます。
set-name: flags: [リスト・オブ・フラグ] # オプション settings: setting: value # オプション
- カウンターはこの構造を持ちます。
counter-name: comment: text # オプション
- 制限はこの構造を持ちます。
limit-name: rate: '1024バイト/秒を超えるバースト512バイト' comment: text # オプション
- 変数はキーと値のペアです。
警告: カウントのみのルールを追加したい場合は、'action'を明示的に'none'に設定する必要があります。そうでない場合は、デフォルト値である'accept'が追加されます!
情報: ルール翻訳にサポートされていないフィールドが提供されると、エラーが発生します。これは予期しない結果をもたらす可能性があります!
情報: Dockerはパッケージ依存関係としてIPTablesが必要な場合があります。
参照: ユースケースDockerホスト
```
Ansible Role to provision NFTables firewall on linux servers
ansible-galaxy install ansibleguy.infra_nftables