ポートフォワーディングを手軽にする為のオレオレツール
  • Shell 99.3%
  • Makefile 0.7%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
joe 8073a21ef0
Some checks failed
CI / test (push) Has been cancelled
docs: README を整理(目次・クイックスタート・サブコマンド表・出力例を更新)
- クイックスタート(追加/一覧/テスト/削除)を冒頭に追加
- 目次を追加し、各節へアンカーリンク
- サブコマンド(save/restore/status/show/set)を一覧表として新設
- 一覧表示の出力例を現行フォーマット(--columns 対応の桁)に修正
- -t の終了コードとスクリプト判定例を整理
- オプション表に長オプションの補足を追記
- 補足を nftables/unshare の説明に置き換え
2026-09-24 22:42:13 +09:00
.gitea/workflows v2.1.5: CI を共通化し Gitea / GitLab 用の設定を追加 2026-09-24 20:11:06 +09:00
.github/workflows v2.1.5: CI を共通化し Gitea / GitLab 用の設定を追加 2026-09-24 20:11:06 +09:00
completions v2.3.7: 一覧の表示カラム選択 (--columns) を追加 2026-09-24 22:38:47 +09:00
man v2.3.7: 一覧の表示カラム選択 (--columns) を追加 2026-09-24 22:38:47 +09:00
tests v2.3.7: 一覧の表示カラム選択 (--columns) を追加 2026-09-24 22:38:47 +09:00
.gitignore -t 修正前 2026-02-04 09:55:44 +09:00
.gitlab-ci.yml v2.1.5: CI を共通化し Gitea / GitLab 用の設定を追加 2026-09-24 20:11:06 +09:00
ipf v2.3.7: 一覧の表示カラム選択 (--columns) を追加 2026-09-24 22:38:47 +09:00
ipf-test v2.1.0: ipf-test -q の完全互換と forwarding 有効化の整理 2026-09-24 19:12:27 +09:00
Makefile v2.1.5: CI を共通化し Gitea / GitLab 用の設定を追加 2026-09-24 20:11:06 +09:00
README.md docs: README を整理(目次・クイックスタート・サブコマンド表・出力例を更新) 2026-09-24 22:42:13 +09:00

ipf - nftables ベースのポートフォワーディング管理ツール

nftables のルールを操作する Bash スクリプトです。IP フォワーディングの追加・一覧表示・削除・疎通テストをコマンドラインから管理できます。TCP / UDP / ICMP のマルチプロトコルに対応し、7言語(日本語・中文・हिन्दी・Русский・Français・Italiano・English)のロケールを持ちます。

バージョン 2.3.7
日付 2026-09-24
ライセンス MIT
動作環境 Linux + nftables(要 root)

クイックスタート

# 外部 8080 を内部 10.10.100.1:80 へ転送(HTTP を自動判定して表示)
ipf 8080:10.10.100.1:80

# 一覧
ipf -l

# 疎通テスト(UP/DOWN と理由を表示)
ipf -t 10.10.100.1:80

# 削除
ipf -d :8080

初回実行時は非 root なら自動的に sudo で再実行され、IP フォワーディングが有効化されます。


目次


ファイル構成

ファイル 役割
ipf 本体(現行)
ipf-test ipf -t へ委譲する後方互換ラッパー(旧独立テスターの CLI を維持)
tests/run.sh 回帰テスト(隔離ネットワーク名前空間で実行)
Makefile make test / make lint / make check
.github/workflows/ci.yml GitHub Actions 用 CI 設定
.gitea/workflows/ci.yml Gitea / Forgejo Actions 用 CI 設定
.gitlab-ci.yml GitLab CI 用設定
tests/ci.sh CI エントリポイント(依存導入 + lint + test)
completions/ipf.bash bash 補完(ipf / ipf-test)
man/ipf.1 man ページ(本体)
man/ipf-test.1 man ページ(ラッパー)

旧版 ipf1.0.4 は git タグ v1.0.4 に保存されています(git show v1.0.4:ipf1.0.4)。


動作要件

  • Linux + nftables(nft)
  • 実行には root 権限が必要(非 root で実行すると自動的に sudo で再実行されます)
  • 任意: curl(プロトコル自動判定)、nc(疎通テスト)、ping(ICMP テスト)、getent / host / dig(ホスト名解決)、python3(NTP/SNMP プローブ)

概要

  • ルール追加時にターゲットへ実際にアクセスし、応答に応じて Ollama API / Local AI(OpenAI 互換)/ HTTP / HTTPS を自動判定
  • 判定結果を nftables ルールのコメント(ipf-id:<uuid>|<type>)に保存し、一覧表示時に http://host:port 形式で表示
  • TCP / UDP / ICMP に対応。ICMP は echo-request を対象に TTL・ペイロードサイズを指定可能
  • IPv6 ターゲットに対応
  • fail2ban と整合する SNAT モード(-F)と、シンプルな MASQUERADE モードを選択可能
  • -j / -v による JSON 出力、-T によるカスタムテーブル名に対応

使用方法

ルール形式

形式 例 意味
<LPORT>:<TIP>:<TPORT> ipf 8080:10.10.100.1:80 外部 8080 → 10.10.100.1:80
<LPORT>:<TIP>:<TPORT>(IPv6) ipf 8080:[2001:db8::1]:443 外部 8080 → IPv6 ターゲット
<LPORT>:<TPORT> ipf 80:8080 外部 80 → 127.0.0.1:8080
<PORT> ipf 22 外部 22 → 127.0.0.1:22
ICMP ipf -I 10.10.100.1 ICMP echo-request を転送

<TIP> にはホスト名も指定できます(getent / host / dig で解決)。

一覧表示

ipf            # 引数なしで一覧
ipf -l         # 明示的な一覧表示
ipf -p         # TYPE カラムを省いた簡易表示
ipf -l --proto tcp     # TCP のみ
ipf -l --sort port     # ローカルポート順
ipf -l --columns handle,target   # 表示カラムを選択
ipf -j -l --proto udp  # JSON で UDP のみ

出力例:

転送ルール一覧 (テーブル:ipf):
 HANDLE    PROTO LOCAL               TARGET                        TYPE
------------------------------------------------------------------------------------
 23        tcp    :9443               https://[2001:db8::1]:443     https
 17        tcp    :8080               http://127.0.0.1:80           http
 5         icmp   :                   10.0.0.1                      icmp

--columns でカラムを選択できます(例: ipf -l --columns handle,target)。

削除

ipf -d 12          # ハンドル 12 のルール群を削除
ipf -d :80         # ローカルポート 80 のルールを削除
ipf -d 12,15       # 複数ハンドルをまとめて削除
ipf -d all         # テーブルを初期化(確認あり。`-f` で確認スキップ)
ipf -u -d :53      # UDP 53 のみ削除(TCP 53 は残す)
ipf -I -d 10.0.0.1 # ICMP(ターゲット 10.0.0.1)のルールを削除

ハンドル指定では、そのルールに紐づく全チェーン(prerouting / output / forward / postrouting)のルールをまとめて削除します。ICMP はポートを持たないため、-I -d :ポート はエラーになります(-I -d <ターゲットIP> またはハンドルを指定してください)。削除対象が見つからないなど失敗した場合は終了コード 1 を返します(一部が成功しても失敗が含まれれば 1)。

疎通テスト

ipf -t 10.10.100.1:80        # ターゲットの接続性・プロトコルをテスト
ipf -t :11434                # 127.0.0.1:11434 をテスト
ipf -t 23                    # 既存ルールのハンドル 23 をテスト
ipf -u -t 10.0.0.1:53        # UDP としてテスト
ipf -I -t 10.0.0.1           # ICMP としてテスト
ipf -I -t example.com        # ICMP はホスト名も指定可能
ipf -t example.com:443       # ホスト名でもテスト可能
ipf -t 10.0.0.1:80,10.0.0.2:443   # カンマ区切りで一括テスト

ハンドル指定時は、実際にローカルポートへ接続して nftables のパケットカウンタ増分も確認します。

終了コード: 0=UP / 1=DOWN / 2=テスト不能(ハンドル未検出・不正なターゲットなど)。複数指定時は 0=すべて UP / 1=DOWN を含む / 2=テスト不能を含む。

複数指定すると最後にサマリ(サマリ: N 件中 UP x / DOWN y / テスト不能 z)を出力します。-q を併用すると Target/Local の見出しとサマリを抑制し、結果のみを出力します。JSON は 1 行 1 オブジェクト(JSON Lines)で、複数指定時は最後に {"summary":{...}} を出力します。

# スクリプトでの判定例
if ipf -q -t 10.0.0.1:80; then echo reachable; else echo down; fi

UDP / ICMP

ipf -u 5353:10.0.0.1:53          # UDP 転送ルールを追加
ipf -I 10.0.0.1                  # ICMP 転送ルールを追加
ipf -I -t 32 10.0.0.1            # ICMP(TTL=32)を追加
ipf -I --payload-size 128 10.0.0.1   # ICMP(payload=128)を追加

-I と数値の -t を組み合わせた場合のみ TTL 指定として扱われ、それ以外の -t はテスト対象として扱われます。ICMP 転送は echo-request のみを対象とします(他の ICMP 種別は横取りしません)。

リセット

ipf -R        # テーブルを再作成(確認あり)
ipf -R -f     # 確認なしでリセット

オプション

オプション 説明 例
-l, -L, --list 現在の転送ルールを一覧表示(引数なしのデフォルト) ipf -l
--proto <tcp|udp|icmp> 一覧/状態表示をプロトコルで絞り込む ipf -l --proto tcp / ipf status --proto tcp
--sort <key> 一覧をソート(handle / port / target / proto) ipf -l --sort port
--columns <list> 一覧の表示カラムを選択(handle,proto,local,target,type) ipf -l --columns handle,target
-d <ID/PORT> ハンドル ID または :ポート で削除(カンマ区切り可。-u 併用時は UDP のみ、-I 併用時はターゲット IP) ipf -d 12 / ipf -d :80 / ipf -u -d :53 / ipf -I -d 10.0.0.1
-d all すべてのルールを削除してテーブルを初期化 ipf -d all
-t <HOST:PORT> 指定したターゲットの接続性とプロトコルをテスト(IP / ホスト名) ipf -t 10.10.100.1:80 / ipf -t example.com:443
-t <HANDLE> 既存ルールのハンドル ID で疎通テスト ipf -t 23
-u, --udp UDP プロトコルを使用(デフォルトは TCP) ipf -u 5353:10.0.0.1:53
-I, --icmp ICMP プロトコルを使用 ipf -I 10.0.0.1
-t <TTL> ICMP ping の TTL(-I と数値指定の組み合わせ時のみ) ipf -I -t 32 10.0.0.1
--payload-size <bytes> ICMP ping のペイロードサイズ ipf -I --payload-size 128 10.0.0.1
-R, --reset 設定リセット(テーブルを再作成) ipf -R
-f, -y, --force 確認なしで実行し、IP フォワーディングを強制有効化 ipf -f
-q, --quiet クワイエットモード(メッセージ抑制。-f 相当を含む) ipf -q 8080:10.0.0.1:80
-F, --snat SNAT モード(fail2ban 対応・クライアント IP を保持) ipf -F 8080:10.10.100.1:80
-p, --pretty 簡易表示(list は TYPE 省略、status は 1 行サマリ) ipf -p / ipf -p status
-v, --verbose 詳細モード(JSON 出力を有効化) ipf -v
-j, --json JSON 出力モード(ルール一覧・接続テスト) ipf -j -l
-T <name> カスタムテーブル名を設定(デフォルト: ipf) ipf -T ipf2 8080:10.0.0.1:80
-V, --version バージョンを表示 ipf -V
-h, --help ヘルプを表示 ipf -h

主要な長オプション(--test / --delete / --table)も短オプションと同様に受理されます。

注意(v2.0.1 での変更): -v は「詳細(JSON)モード」、バージョン表示は -V / --version です。v2.0.0 では -v がバージョン表示になっていました。


サブコマンド

オプションのほかに、ルールの調査・編集・保存を行うサブコマンドがあります。

サブコマンド 説明 節
save [FILE] 現在のルールを nft スクリプトとして保存(- で標準出力) 永続化
restore [FILE] 保存したファイルからテーブルを復元 永続化
status テーブル/ルール数/IP forwarding 状態を表示 状態表示
show <handle> 指定ルールの詳細(種別・カウンタ)を表示 ルール詳細
set <handle> <newtarget> ルールのターゲットを変更(ローカルポートは維持) ルール編集
ipf status                     # 状態表示
ipf show 23                    # ルール詳細
ipf set 23 10.0.0.5:8080       # ターゲット変更
ipf save                       # 保存(既定: /etc/ipf/ipf.nft)
ipf restore                    # 復元

プロトコル自動判定

ルール追加時にターゲットへ実際にアクセスし、判定結果をコメントに保存します。

  1. Ollama API — http(s)://<target>/api/tags が "models" を返し、モデル名が既知の LLM パターンに一致
  2. Local AI(OpenAI 互換) — http(s)://<target>/v1/models が "object" を返し、モデル ID が既知パターンに一致(llama.cpp / LM Studio / vLLM / LocalAI / Tabby など)
  3. HTTP / HTTPS — 上記に該当せず、/ へのアクセスに応答がある場合
  4. DNS — UDP かつターゲットポート 53
  5. ICMP — -I 指定時

一覧の TYPE カラムは、コメントに保存された種別、またはポートから推定します。

プロトコル:ポート TYPE 表示 TARGET 表示例
HTTP 応答あり(任意ポート) http http://10.0.0.1:8080
HTTPS 応答あり(任意ポート) https https://10.0.0.1:443
Ollama / Local AI ollama / localai http://10.0.0.1:11434
TCP 22 ssh 10.0.0.1:22
UDP 53 dns 8.8.8.8:53
UDP 123 ntp 10.0.0.1:123
UDP 161 snmp 10.0.0.1:161
ICMP icmp 10.0.0.1

接続テスト(-t)では、SSH / FTP・SMTP / VNC / MySQL などのバナーも検出して表示します。


JSON 出力

ipf -j -l      # ルール一覧を JSON で出力
ipf -v -l      # 同上(詳細モード)

出力例:

[
{"handle":17,"protocol":"tcp","local_port":8080,"target":"http://127.0.0.1:80","type":"http"},
{"handle":5,"protocol":"icmp","target":"10.0.0.1"}
]

接続テストも JSON で出力できます(実際にテストを実行し、status は up / down、detail はテスト結果の詳細です)。

ipf -j -t 10.10.100.1:80    # ターゲットテスト
ipf -j -t 23                # ハンドルテスト
{"handle":null,"protocol":"tcp","local_port":null,"target":"10.10.100.1:80","status":"down","method":"http","rtt_ms":null,"detail":"DOWN"}
{"handle":23,"protocol":"tcp","local_port":8080,"target":"10.10.100.1:80","status":"down","method":"http","rtt_ms":null,"detail":"DOWN"}
{"handle":null,"protocol":"icmp","target":"10.10.100.1","status":"up","method":"icmp","rtt_ms":0.42,"detail":"ICMP ping テスト中 ... 応答あり (RTT: 0.42 ms)"}

method はプローブ方式(http/https/tcp/dns/ntp/snmp/udp/icmp)、rtt_ms は ICMP の RTT(該当しない場合は null)です。


セキュリティポリシー: fail2ban 対策

環境別挙動比較表

環境 デフォルト動作 SNAT モード (-F オプション) fail2ban 推奨設定
リアルマシン/VM MASQUERADE(ホスト IP で中継) ✅ クライアント IP を保持 -F を使用
コンテナ環境 MASQUERADE(ホスト IP で中継) ⚠️ スタンダードな動作 デフォルトで OK

SNAT と MASQUERADE の違い

# MASQUERADE(デフォルト): ホスト IP に置換(シンプル)
nft insert rule inet ipf postrouting ip daddr "$tip" tcp dport "$tp" masquerade comment "$comment"

# SNAT(-F): 送信元アドレスへの恒等 SNAT によりクライアント IP を保持(fail2ban 対応)
nft insert rule inet ipf postrouting ip daddr "$tip" tcp dport "$tp" counter snat ip to ip saddr comment "$comment"
手法 メリット デメリット
MASQUERADE(デフォルト) シンプル、パフォーマンス良好 fail2ban でクライアント IP を正しく検出できない
SNAT(-F) クライアント IP が保持され fail2ban と整合 MASQUERADE よりわずかに低速

転送先がループバックアドレス(127.0.0.0/8 / ::1)の場合、postrouting の NAT は不要なため付与しません(ローカル通信への影響を避けるため)。

v2.0.0 以前の -F は snat to type nat orig という無効な nft 構文を出力しており、postrouting ルールが生成されませんでした。v2.0.1 で修正済みです。

注意事項

  • ipf は fail2ban のログを正しく生成することを前提としていません。
  • コンテナ環境では、MASQUERADE で動作することを確認してください。

既知の制限

  • ICMP ルールは output チェーンにルールを作らないため、ローカルから実行したハンドルテストではルールのパケットカウンタを検証できません(ICMP は応答の有無で判定します)。
  • ICMP 転送は echo-request を DNAT するため、転送先がループバックアドレス(127.0.0.0/8 など)の場合、ローカルからの ping 応答が得られないことがあります。
  • -d :ポート は既定で同一ローカルポートの全プロトコル(TCP/UDP)のルールを削除します(-u 併用時は UDP のみ)。追加時の上書き判定はプロトコル単位です。
  • UDP の疎通テストは、DNS (53) は dig 等、NTP (123) / SNMP (161) は python3 で実際にリクエストを送って応答を確認します。その他のポートは python3 の接続ベース判定(無ければ nc)で、ICMP port unreachable を受信した場合のみ DOWN、応答が無い場合は到達可能とみなします(open|filtered は UP 扱い)。
  • ipf-test は ipf -t へ委譲するラッパーです。-q はターゲット表示(Target/Local 見出し)を抑制します。ICMP テストには ipf -I -t <IP> を使用してください。

永続化 (save / restore)

nftables のルールは再起動で失われるため、現在のルールを保存・復元できます。

ipf save                  # /etc/ipf/ipf.nft に保存 (IPF_DIR で保存先を変更可)
ipf save /path/rules.nft  # 保存先を指定
ipf save -                # 標準出力へ出力
ipf restore               # /etc/ipf/ipf.nft から復元
ipf restore /path/rules.nft
  • 保存形式は nft スクリプトで、そのまま nft -f で読み込めます
  • restore は同名テーブルを置換します(既存ルールは破棄)
  • -T <name> と併用すると任意テーブルを対象にできます

再起動時に自動復元するには、systemd ユニットの利用例:

# /etc/systemd/system/ipf-restore.service
[Unit]
Description=Restore ipf nftables rules
Before=network-pre.target
Wants=network-pre.target

[Service]
Type=oneshot
ExecStart=/usr/local/bin/ipf restore /etc/ipf/ipf.nft
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
systemctl enable --now ipf-restore.service

状態表示 (status)

ipf status             # テーブル/ルール数/IP forwarding 状態を表示
ipf status --proto tcp # TCP のみ集計
ipf -p status          # 1 行サマリ
ipf -j status          # JSON で表示
$ ipf status
ipf status (table: ipf)
  ip_forward: 1
  table_exists: 1
  rules: 3
  packets: 128
  bytes: 7680
  tcp: 1 rules, packets 128, bytes 7680
  udp: 1 rules, packets 0, bytes 0
  icmp: 1 rules, packets 0, bytes 0
  saved_at: 2026-09-24T19:53:11+09:00

packets / bytes は prerouting と output の DNAT カウンタ合算(受信とローカル生成は排他のため二重計上なし)、tcp / udp / icmp 行はプロトコル別のルール数とカウンタ、saved_at は save 済みファイルの更新日時です(未保存なら -)。--proto を併用すると対象プロトコルのみ集計します。JSON では traffic オブジェクトにプロトコル別カウンタを含みます。


ルール詳細 (show)

ipf show 23       # ハンドル 23 の詳細
ipf -j show 23    # JSON
$ ipf show 23
handle: 23
protocol: tcp
local_port: 8080
target: 127.0.0.1:80
type: http
packets: 128
bytes: 7680

type はコメントに保存された種別(無ければポートから推定)、packets / bytes はそのルール群(全チェーン)のカウンタ合算です。未検出のハンドルは終了コード 2 を返します。


ルール編集 (set)

ipf set 23 10.0.0.5:8080   # ローカルポートは維持してターゲットを変更
ipf set 23 9090            # ポートのみ指定(ターゲット IP は維持)
ipf set 42 10.0.0.9        # ICMP ルールのターゲット IP を変更
ipf set 23,24 10.0.0.5:8080  # 複数ハンドルに同じターゲットを適用

指定したハンドルのルールを削除し、同じローカルポート・プロトコルで新しいターゲットに再追加します(ハンドル番号は変わります)。未検出のハンドルは終了コード 2、引数不足は 1 を返します。


回帰テスト

tests/run.sh に、隔離ネットワーク名前空間(unshare -rn)を使った回帰テストを同梱しています。ホストの firewall(nftables)には影響しません。

tests/run.sh

または make test でも実行できます。

  • root 不要(ユーザー名前空間が必要。root の場合は unshare -n にフォールバック)
  • nft / unshare が必要。JSON の厳密検証には python3 があると確実
  • 検証範囲: 一覧・追加(TCP/UDP/IPv6/ICMP)・同一ポート上書き・削除(:ポート / ハンドル / all)・疎通テスト(ターゲット / ハンドル / ICMP)・ICMP TTL/payload・JSON 出力・カスタムテーブル・SNAT(IPv4/IPv6)・保存/復元(save / restore)・状態表示(status)・異常系・ipf-test ラッパー
  • 失敗があれば終了コード 1 を返します

CI

Makefile と各プラットフォーム用の CI 設定を同梱しています。

make lint    # bash -n + shellcheck (error レベル)
make test    # tests/run.sh (隔離 netns)
make check   # lint + test
make ci      # CI 用 (依存を導入して lint + test)
ファイル プラットフォーム
.github/workflows/ci.yml GitHub Actions
.gitea/workflows/ci.yml Gitea / Forgejo Actions
.gitlab-ci.yml GitLab CI

いずれも tests/ci.sh を呼び出し、nftables / shellcheck を導入して make lint と make test を実行します。

コンテナ型ランナー(Docker executor / act_runner)で netns テストを実行するには、ネットワーク名前空間を作成する権限が必要です(--privileged 相当、または CAP_SYS_ADMIN + CAP_NET_ADMIN)。VM ランナー(GitHub の ubuntu-latest 等)ではそのまま動作します。


補完と man ページ

# bash 補完
install -Dm644 completions/ipf.bash /usr/share/bash-completion/completions/ipf
# もしくは現在のシェルで有効化
source completions/ipf.bash

# man ページ
install -Dm644 man/ipf.1 /usr/local/share/man/man1/ipf.1
install -Dm644 man/ipf-test.1 /usr/local/share/man/man1/ipf-test.1
man ipf
man ipf-test

バージョン履歴

バージョン 日付 内容
2.3.7 2026-09-24 一覧の表示カラム選択(--columns)を追加
2.3.6 2026-09-24 status に --proto を反映(対象プロトコルのみ集計)し、nft 呼び出しを削減
2.3.5 2026-09-24 status に -p(1 行サマリ)を追加
2.3.4 2026-09-24 ループバック宛の postrouting NAT を省略(ローカル通信のハング解消、テスト 2分6秒→23秒)
2.3.3 2026-09-24 set で複数ハンドル(カンマ区切り)に同じターゲットを適用可能に
2.3.2 2026-09-24 ipf-test の man ページを追加し、補完を改善
2.3.1 2026-09-24 複数ターゲットの -t にサマリ出力を追加(JSON は {"summary":...})
2.3.0 2026-09-24 set <handle> <newtarget> サブコマンドを追加(ローカルポートを維持してターゲットを変更)
2.2.3 2026-09-24 -t の複数ターゲット一括テスト(カンマ区切り、JSON は JSON Lines)に対応
2.2.2 2026-09-24 一覧のフィルタ/ソート(--proto / --sort)を追加、JSON にも適用
2.2.1 2026-09-24 -d の失敗時(未検出など)に終了コード 1 を返すように変更
2.2.0 2026-09-24 show <handle> サブコマンドを追加(単一ルールの詳細とカウンタ、JSON 対応)
2.1.9 2026-09-24 status にプロトコル別カウンタ(tcp/udp/icmp の packets/bytes、JSON は traffic)を追加
2.1.8 2026-09-24 -t の JSON に method(プローブ方式)と rtt_ms(ICMP の RTT)を追加
2.1.7 2026-09-24 -I -d に対応(ターゲット IP 指定で ICMP ルールを削除、:ポート は明確なエラー)
2.1.6 2026-09-24 汎用 UDP プローブを python3 の接続ベース判定に変更(nc 実装差に非依存、無ければ nc フォールバック)
2.1.5 2026-09-24 CI を共通化(tests/ci.sh / make ci)し、Gitea・GitLab 用の設定を追加
2.1.4 2026-09-24 status にパケット/バイト合計と保存日時を追加(JSON 対応)
2.1.3 2026-09-24 bash 補完(completions/ipf.bash)と man ページ(man/ipf.1)を追加
2.1.2 2026-09-24 UDP プローブ拡張(NTP 123 / SNMP 161 を実リクエストで判定、TYPE に ntp/snmp を追加)
2.1.1 2026-09-24 CI 設定(Makefile / GitHub Actions 互換ワークフロー)を追加、shellcheck error を解消
2.1.0 2026-09-24 ipf-test -q の完全互換(テスト見出しの抑制)、forwarding 有効化をルール追加時のみに整理
2.0.9 2026-09-24 status サブコマンドを追加(テーブル/ルール数/IP forwarding 状態、JSON 対応)
2.0.8 2026-09-24 -t の終了コードを追加(0=UP / 1=DOWN / 2=テスト不能)
2.0.7 2026-09-24 -d :ポート のプロトコル指定に対応(-u 併用時は UDP のみ削除)
2.0.6 2026-09-24 UDP 疎通テストの高精度化(DNS は dig/nslookup/host で実問い合わせ、nc フォールバック)
2.0.5 2026-09-24 永続化サブコマンド save / restore を追加(IPF_DIR で保存先変更可)
2.0.4 2026-09-24 ICMP テストのホスト名対応、ヘルプの -t 表記を HOST:PORT に更新
2.0.3 2026-09-24 -t のホスト名対応、ICMP を echo-request に限定、nft 未検出時の明示エラー、JSON テスト出力の共通化
2.0.2 2026-09-24 疎通テストの JSON 実テスト化、ICMP ハンドルテストの判定改善、プロトコル単位の上書き、route_localnet 警告抑制
2.0.1 2026-09-24 CLI パーサ再設計: -t/-d/-T/-j/-v の機能欠落を修正、-F の SNAT 構文エラーを修正、ICMP 一覧表示改善、強制/静音モードの終了コード修正
2.0.0 2026-08-17 マルチプロトコル対応(TCP/UDP/ICMP)、ICMP TTL/payload 制御、JSON 出力、カスタムテーブル名(-T)
1.9.3 2026-07-19 7ヶ国語対応、IPv6 サポート、ローカル AI(llama.cpp / LM Studio / vLLM 等)検出
1.9.2 2026-07-19 IPv6 対応、ポート前方一致削除の修正、-d all の確認追加、Ollama 判定の高精度化
1.9.1 2026-04-30 README を大幅更新
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 対応、日本語・英語ローカリゼーション

補足

このツールは nftables(nft)を利用します。iptables 系ではありません。開発・検証は隔離ネットワーク名前空間(unshare -rn)で行っています。


ライセンス

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