ポートフォワーディングを手軽にする為のオレオレツール
Find a file
2026-07-19 13:43:39 +09:00
.gitignore
ipf v1.9.3: ローカルAI検出追加 — llama.cpp/LM Studio/vLLM等のOpenAI互換APIを自動判定 2026-07-19 13:43:39 +09:00
ipf-test v1.9.3: ローカルAI検出追加 — llama.cpp/LM Studio/vLLM等のOpenAI互換APIを自動判定 2026-07-19 13:43:39 +09:00
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 を自動判定します。

動作フロー

  1. ルール追加 — ターゲットに curl で HTTP アクセスを試行
  2. HTTP 応答あり → コメントに |http を付与して保存
  3. HTTP 応答なし → HTTPS にフォールバック、応答ありなら |https を付与
  4. リスト表示 — 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 がログされません。以下の方法で回避します:

  1. デフォルト設定MASQUERADE: シンプルで無難
  2. -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-prokrasherjoe によって作成されました。


ライセンス

MIT License に基づくライセンスです。
権利者: krasherjoe
日付: 2026-01-22