pimvh.nftables
要件
- Ansibleのインストール:
sudo apt install python3
python3 -m ensurepip --upgrade
pip3 install ansible
必要な変数
defaultsに示されている変数を確認してください。
次の構造を使用して、ホスト(../host_vars/[host_name].yaml)やホストグループ(../group_vars/[group_name].yaml)の変数にファイアウォール定義を追加できます(例についてはmolecule.default.vars/test.yamlを参照):
# この変数はリモートホストにプッシュされるルールを指します
# これはテーブル、チェーン、ルールの辞書です。molecule/default/vars/test.yamlを参照してください。
nftables_ruleset:
# このキーはテーブルになります
# 必ず次の形式でなければなりません:
# ファイアウォールファミリーと名前、例: "inet firewall":
"inet firewall":
# テーブルの説明
comment: "デバイスのファイアウォール"
chains:
# respective chainの名前
input:
# このチェーンに入れたい変数の名前(nftables_rulesから)
- input_hook
- valid_connections
- ...
# 同じ構造の別のテーブル
# 有効なファミリーは、inet、inet6、netdev、inetなどです。
# nftablesのドキュメントで完全な参照を確認してください。
"inet foo":
# 可能なルールは`nftables_rules`の下で定義されます。
# 各ルールには2つの属性があります:
# -> def: 有効なnftables構文でのルール定義またはルールのセット
# -> depends_on: nftables_variablesからの変数のオプションの依存関係リスト
# 例についてはmolecule/default/vars/test.yamlを参照してください。
nftables_rules:
input_hook: >
type filter hook input priority 0; policy drop;
valid_connections:
def: |
ct state established, related accept
ct state invalid drop
new_connections:
def: |
ct state new accept
# これらは依存関係のある変数定義で、depends_onと共に含まれています
# キーが一致することを確認してください
# 例についてはmolecule/default/vars/test.yamlを参照してください。
nftables_variables:
tcp_ports:
comment: TCPポートの設定
def: |
{% if nftables_open_tcp_ports_global %}define OPEN_TCP_PORTS = { {{ nftables_open_tcp_ports_global | join(",") }} }{% endif +%}
{% if nftables_open_tcp_ports_local %}define LOCAL_OPEN_TCP_PORTS = { {{ nftables_open_tcp_ports_local | join(",") }} }{% endif +%}
{% if nftables_open_tcp_ports_vpn %}define VPN_TCP_PORTS = { {{ nftables_open_tcp_ports_vpn | join(",") }} }{% endif +%}
...
Ansibleプレイブックは、役割に正しい変数が渡されているかどうかをargument_specを使用して検証します。
例のプレイブック
最小限(他の場所で変数を渡したと仮定):
hosts:
- foo
roles:
- pimvh.nftables
TLDR - これを実行した場合の結果
- ルール/他の変数が定義されているかどうかを検証
- nftablesとPythonインターフェースをインストール
- 必要なnftableテーブルを作成
- 空のテーブルとして動的テーブルを作成
- 空のブロックリストを作成
- nftablesテンプレートをnftablesディレクトリにコピー
- nftablesサービスを編集して新しいファイルを指すようにする
- ファイアウォールを再読み込みするスクリプトを作成し、制御外のテーブルをファイルにダンプし、その後ファイアウォールを再読み込み
- nftables_abuseip_api_keyが定義されている場合、APIを使用してブロックリストを取得するスクリプトを追加し、それをsystemdサービスにする
- 要求があればnftableサービスを有効にする
- 要求があればiptablesをアンインストール
将来の改善
- 渡す必要のあるルールの構造を簡素化
nftables_variables
とnftables_ruleset
のargument_specsを改善