ipf/README.md
2026-03-05 21:37:53 +09:00

108 lines
No EOL
4.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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/PORT>` | 指定したハンドル ID または : ポートでルールを削除 | `ipf -d 12` / `ipf -d :80` |
| `-d all` | すべてのルールを削除してテーブルを初期化 | `ipf -d all` |
| `-t <IP:PORT>` | 指定したターゲットの接続性とプロトコルをテスト | `ipf -t 10.10.100.1:80` |
| `-t <HANDLE>` | 既存ルールのハンドル ID を指定して疎通テストを実行 | `ipf -t 12345678` |
| `-u` | UDP プロトコルを使用(デフォルトは TCP<br>ルール追加時:`ipf -u 5353:10.0.0.1:53`<br>テスト時:`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