# ipf - nftables ベースのポートフォワーディング管理ツール 完全機能な IP フォワーダーで、マルチプロトコル検出(SSH/HTTP/HTTPS など)、日本語・英語ローカリゼーションに対応。 --- ## 概要 `nftables` のルールを編集するスクリプトです。IP フォワーディングを管理し、fail2ban などのセキュリティツールと整合した設定を実現。 --- ## セキュリティポリシー: fail2ban 対策 ipf は転送先のセキュリティ(fail2ban など)との整合性を考慮した設計をしていませんが、以下のように実装可能です。 ### 環境別挙動比較表 | 環境 | デフォルト動作 | SNAT モード (`-F` オプション) | fail2ban 推奨設定 | |------|---------------|-------------------------------|------------------| | **リアルマシン/VM** | MASQUERADE(ホスト IP で中継) | ✅ SNAT でクライアント IP 保持 | `-F` を使用 | | **コンテナ環境** | MASQUERADE(ホスト IP で中継) | ⚠️ スタンダードな動作 | デフォルトで OK | ### SNAT と MASQUERADE の違い ```bash # MASQUERADE: ホスト IP に置換(シンプル) nft insert rule inet ipf postrouting daddr "$tip" ... masquerade comment "simple" # SNAT (orig): クライアント IP を保持(fail2ban 対応) nft insert rule inet ipf postrouting daddr "$tip" ... snat to type nat orig comment "client-ip" ``` #### 各手法のメリット・デメリット | 手法 | メリット | デメリット | |------|----------|-----------| | **MASQUERADE**(デフォルト) | シンプル、パフォーマンス良好 | fail2ban でクライアント IP を正しく検出できない | | **SNAT (orig)** (`-F` オプション) | fail2ban と整合し、クライアント IP が保持される | スケジューリング処理が発生し、少し遅い(現代の CPU では差は微々たるもの) | --- ## 使用方法 **基本コマンド:** ```bash # ポート転送ルールを追加(例:外部 8080 を内部 80 へ) ipf 8080:10.10.100.1:80 # 失敗のリスクを減らすため、デフォルトでは MASQUERADE を使用します ``` **ルール形式:** - `<ローカルポート>:<ターゲット IP>:<ターゲットポート>` 例:`ipf 8080:10.10.100.1:80`(外部アクセス 8080 を内部 80 へ) - `<ローカルポート>:<ターゲットポート>` 例:`ipf 80:8080`(外部 80 をローカル 8080 へ、ターゲットは 127.0.0.1) - `<ポート番号>` 例:`ipf 22`(外部 22 をローカル 22 へ、ターゲットは 127.0.0.1) --- ## オプション | オプション | 説明 | 例 | |-----------|------|-----| | `-l, -L` | 現在の転送ルールを一覧表示 | `ipf -l` | | `-d ` | 指定したハンドル ID または : ポートでルールを削除 | `ipf -d 12` / `ipf -d :80` | | `-d all` | すべてのルールを削除してテーブルを初期化 | `ipf -d all` | | `-t ` | 指定したターゲットの接続性とプロトコルをテスト | `ipf -t 10.10.100.1:80` | | `-t ` | 既存ルールのハンドル ID を指定して疎通テストを実行 | `ipf -t 12345678` | | `-u` | UDP プロトコルを使用(デフォルトは TCP)
ルール追加時:`ipf -u 5353:10.0.0.1:53`
テスト時:`ipf -u -t 10.0.0.1:53` | `ipf -u 5353:10.0.0.1:53` | | `-R` | 設定リセット(テーブルを再作成) | `ipf -R` | | `-f, -y` | 確認なしで実行し、IP フォワーディングを強制有効化 | `ipf -f` | | `-q` | クワイエットモード(メッセージ出力を抑制) | `ipf -q` | | `-h, --help` | この詳細ヘルプを表示 | `ipf -h` | --- ## セキュリティへの配慮 ### fail2ban との整合性 転送先に fail2ban が稼働している場合、`masquerade` を使用するとクライアント IP がログされません。以下の方法で回避します: 1. **デフォルト設定(MASQUERADE)**: シンプルで無難 2. **`-F` オプション**: クライアント IP を保持し、fail2ban と整合させる **失敗のリスク低減のため、デフォルトでは MASQUERADE を使用します。** ### 注意事項 - ipf は fail2ban のログを正しく生成することを前提としていません。 - SNAT モード(`-F` オプション)を使用する場合のみ、クライアント IP が保持されます。 - コンテナ環境では、MASQUERADE で動作することを確認してください。 --- ## 補足 このスクリプトは `qwen3/gpt-oss/gemini-2.5-pro` と `krasherjoe` によって作成されました。 --- ## ライセンス MIT License に基づくライセンスです。 **権利者**: krasherjoe **日付**: 2026-01-22