ポートフォワーディングを手軽にする為のオレオレツール
| .gitignore | ||
| cockpit.py | ||
| ipf | ||
| ipf-safe-control.py | ||
| ipf1.0.4 | ||
| README.md | ||
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 の違い
# 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 では差は微々たるもの) |
使用方法
基本コマンド:
# ポート転送ルールを追加(例:外部 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) ルール追加時: 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 がログされません。以下の方法で回避します:
- デフォルト設定(MASQUERADE): シンプルで無難
-Fオプション: クライアント IP を保持し、fail2ban と整合させる
失敗のリスク低減のため、デフォルトでは MASQUERADE を使用します。
注意事項
- ipf は fail2ban のログを正しく生成することを前提としていません。
- SNAT モード(
-Fオプション)を使用する場合のみ、クライアント IP が保持されます。 - コンテナ環境では、MASQUERADE で動作することを確認してください。
補足
このスクリプトは qwen3/gpt-oss/gemini-2.5-pro と krasherjoe によって作成されました。
ライセンス
MIT License に基づくライセンスです。
権利者: krasherjoe
日付: 2026-01-22