- Shell 99.3%
- Makefile 0.7%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
|
Some checks failed
CI / test (push) Has been cancelled
- クイックスタート(追加/一覧/テスト/削除)を冒頭に追加 - 目次を追加し、各節へアンカーリンク - サブコマンド(save/restore/status/show/set)を一覧表として新設 - 一覧表示の出力例を現行フォーマット(--columns 対応の桁)に修正 - -t の終了コードとスクリプト判定例を整理 - オプション表に長オプションの補足を追記 - 補足を nftables/unshare の説明に置き換え |
||
| .gitea/workflows | ||
| .github/workflows | ||
| completions | ||
| man | ||
| tests | ||
| .gitignore | ||
| .gitlab-ci.yml | ||
| ipf | ||
| ipf-test | ||
| Makefile | ||
| README.md | ||
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 フォワーディングが有効化されます。
目次
- ファイル構成
- 動作要件
- 概要
- 使用方法
- オプション
- サブコマンド
- プロトコル自動判定
- JSON 出力
- セキュリティポリシー(fail2ban 対策)
- 既知の制限
- 永続化 (save / restore)
- 状態表示 (status) / ルール詳細 (show) / ルール編集 (set)
- 回帰テスト / CI / 補完と man ページ
- バージョン履歴 / ライセンス
ファイル構成
| ファイル | 役割 |
|---|---|
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 # 復元
プロトコル自動判定
ルール追加時にターゲットへ実際にアクセスし、判定結果をコメントに保存します。
- Ollama API —
http(s)://<target>/api/tagsが"models"を返し、モデル名が既知の LLM パターンに一致 - Local AI(OpenAI 互換) —
http(s)://<target>/v1/modelsが"object"を返し、モデル ID が既知パターンに一致(llama.cpp / LM Studio / vLLM / LocalAI / Tabby など) - HTTP / HTTPS — 上記に該当せず、
/へのアクセスに応答がある場合 - DNS — UDP かつターゲットポート 53
- 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