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='コーヒーを買ってください' />

[![Moleculeテストステータス](https://badges.ansibleguy.net/infra_nftables.molecule.svg)](https://github.com/ansibleguy/_meta_cicd/blob/latest/templates/usr/local/bin/cicd/molecule.sh.j2)
[![YamlLintテストステータス](https://badges.ansibleguy.net/infra_nftables.yamllint.svg)](https://github.com/ansibleguy/_meta_cicd/blob/latest/templates/usr/local/bin/cicd/yamllint.sh.j2)
[![PyLintテストステータス](https://badges.ansibleguy.net/infra_nftables.pylint.svg)](https://github.com/ansibleguy/_meta_cicd/blob/latest/templates/usr/local/bin/cicd/pylint.sh.j2)
[![Ansible-Lintテストステータス](https://badges.ansibleguy.net/infra_nftables.ansiblelint.svg)](https://github.com/ansibleguy/_meta_cicd/blob/latest/templates/usr/local/bin/cicd/ansiblelint.sh.j2)
[![Ansible Galaxy](https://badges.ansibleguy.net/galaxy.badge.svg)](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

ドキュメンテーション

トラブルシューティング


使用法

シンプルな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/セット) は、一般的なディストリビューションカーネルでサポートされない場合があります

    参照: トラブルシューティングガイド - 'Unsupported Operation'

  • 情報: フックと優先順位を構成するタイミングや方法については、フックドキュメントをお読みください!

  • 情報: ルールは、例で見るように辞書形式で提供できます。

    利用可能なフィールドとエイリアスは次のとおりです:

    機能 キー 注記
    ルールの順序 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
ライセンス
other
ダウンロード
4.4k
所有者
[email protected] | GPG: https://badges.ansibleguy.net/public.gpg