108 lines
No EOL
4.7 KiB
Markdown
108 lines
No EOL
4.7 KiB
Markdown
# 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 |