ポートフォワーディングを手軽にする為のオレオレツール
- Shell 100%
| .gitignore | ||
| ipf | ||
| ipf-test | ||
| ipf1.0.4 | ||
| README.md | ||
ipf - nftables ベースのポートフォワーディング管理ツール
完全機能な IP フォワーダーで、HTTP/HTTPS 自動検出、マルチプロトコル対応(SSH/MySQL/Redis など)、日本語・英語ローカリゼーションに対応。
- バージョン: 1.9.2
- 日付: 2026-04-30
- ライセンス: MIT
概要
nftables のルールを操作する Bash スクリプトです。IP フォワーディングの追加・一覧表示・削除・接続テストをコマンドラインから管理できます。
主な特徴:
- ルール追加時にターゲットへ実際に HTTP/HTTPS アクセスし、応答があれば URL 形式で自動判定
- 判定結果を nftables ルールのコメントに保存、リスト表示時に
http://host:port形式で表示 - SSH / MySQL / PostgreSQL / Redis / MongoDB / DNS などのポートタイプも自動認識
- fail2ban 対応の SNAT モードとシンプルな MASQUERADE モードを選択可能
- UDP プロトコルにも対応
セキュリティポリシー: 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 では差は微々たるもの) |
使用方法
基本コマンド:
# ルールを追加すると、自動で HTTP/HTTPS 判定を行い URL 形式で表示
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)
ルール一覧表示:
# ルール一覧を表示(HTTP/HTTPS ルールは URL 形式で表示)
ipf -l
出力例:
転送ルール一覧 (テーブル:ipf):
HANDLE PROTO LOCAL TARGET
-----------------------------------------------------------------------------------
23 tcp :38082 http://10.10.100.220:8082
17 tcp :48085 https://10.10.100.220:8443
7 tcp :48082 http://10.10.100.220:8082
接続テスト:
# ターゲットの接続性をテスト
ipf -t 10.10.100.1:80
# 既存ルールのハンドル ID でテスト
ipf -t 23
オプション
| オプション | 説明 | 例 |
|---|---|---|
-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 |
-F |
SNAT モード(fail2ban 対応) | ipf -F 8080:10.10.100.1:80 |
-h, --help |
この詳細ヘルプを表示 | ipf -h |
HTTP/HTTPS 自動判定機能
ルール追加時にターゲットへ実際にアクセスし、HTTP/HTTPS を自動判定します。
動作フロー
- ルール追加 — ターゲットに
curlで HTTP アクセスを試行 - HTTP 応答あり → コメントに
|httpを付与して保存 - HTTP 応答なし → HTTPS にフォールバック、応答ありなら
|httpsを付与 - リスト表示 — nftables のコメントから種別を取得し
http://host:port形式で表示
判定されるポートタイプ
| ポート | 判定結果 | リスト表示例 |
|---|---|---|
| HTTP アクセス成功(任意のポート) | http |
http://10.0.0.1:8080 |
| HTTPS アクセス成功(任意のポート) | https |
https://10.0.0.1:443 |
| 22 | ssh |
10.0.0.1:22 |
| 53 | dns |
8.8.8.8:53 |
| 3306 | mysql |
10.0.0.1:3306 |
| 5432 | postgres |
10.0.0.1:5432 |
| 6379 | redis |
10.0.0.1:6379 |
| 27017 | mongodb |
10.0.0.1:27017 |
※ HTTP/HTTPS はポート番号ではなく実際の応答で判定します。他のポートでも HTTP レスポンスがあれば http:// として表示されます。
セキュリティへの配慮
fail2ban との整合性
転送先に fail2ban が稼働している場合、masquerade を使用するとクライアント IP がログされません。以下の方法で回避します:
- デフォルト設定(MASQUERADE): シンプルで無難
-Fオプション: クライアント IP を保持し、fail2ban と整合させる
失敗のリスク低減のため、デフォルトでは MASQUERADE を使用します。
注意事項
- ipf は fail2ban のログを正しく生成することを前提としていません。
- SNAT モード(
-Fオプション)を使用する場合のみ、クライアント IP が保持されます。 - コンテナ環境では、MASQUERADE で動作することを確認してください。
バージョン履歴
| バージョン | 日付 | 内容 |
|---|---|---|
| 1.9.0 | 2026-04-30 | ルール追加時に HTTP/HTTPS を実際に判定、コメントに保存してリストで URL 表示 |
| 1.8.1 | 2026-04-30 | ポート判定のワイルドカード化(8082/8085 等に対応) |
| 1.8.0 | 2026-04-30 | UUID 表示を廃止、ポートタイプを表示に変更 |
| 1.7.0 | 2026-03-05 | マルチプロトコル検出、Ollama API 対応、日本語・英語ローカリゼーション |
補足
このスクリプトは qwen3/gpt-oss/gemini-2.5-pro と krasherjoe によって作成されました。
ライセンス
MIT License に基づくライセンスです。
権利者: krasherjoe
日付: 2026-01-22