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

4.7 KiB
Raw Permalink Blame History

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 がログされません。以下の方法で回避します:

  1. デフォルト設定MASQUERADE: シンプルで無難
  2. -F オプション: クライアント IP を保持し、fail2ban と整合させる

失敗のリスク低減のため、デフォルトでは MASQUERADE を使用します。

注意事項

  • ipf は fail2ban のログを正しく生成することを前提としていません。
  • SNAT モード(-F オプション)を使用する場合のみ、クライアント IP が保持されます。
  • コンテナ環境では、MASQUERADE で動作することを確認してください。

補足

このスクリプトは qwen3/gpt-oss/gemini-2.5-prokrasherjoe によって作成されました。


ライセンス

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