fire-scope 0.1.7

This tool is a CLI application and library that collects and aggregates corresponding IP addresses by specifying country codes and AS numbers, and outputs them to a file in TXT or nftables format.It supports RIR file download and whois AS number query, and also has a function to extract overlapping parts of country codes and AS numbers in CIDR units.
Documentation
## fire-scope
各地域インターネットレジストリ (RIR) が提供する最新のアドレス割り当てファイルを取得し、指定された国コードに合致するIPv4/v6アドレスブロックをテキストファイルにまとめて出力するためのCLIアプリです。
また、指定されたAS番号も取得し、同様にテキストファイルに出力できます。

## 特徴
- 複数のRIR(AFRINIC, LACNIC, RIPE, APNIC, ARIN)から最新のデータをダウンロード
- 最大10回までのリトライと指数バックオフ+ランダムスリープで安定取得を試行
- 国コードごとにフィルタし、重複のないサブネットリスト(IPv4 / IPv6)を出力
- Tokioを使用した高速なダウンロード・処理
- 出力ファイルはIPv4_XX.txt / IPv6_XX.txt (XX は国コード)として自動生成

## 出力形式
- IPv4_XX.txt / IPv6_XX.txt
  - XXは任意の国コードです。
- 1行に1つのサブネットが記載されています。
- 最初の1行目には実行日時が記載されます。

## 情報の取得元
- `-c`を指定した場合の取得元
  - [AFRINIC]https://ftp.afrinic.net/pub/stats/afrinic/delegated-afrinic-extended-latest
  - [LACNIC]https://ftp.lacnic.net/pub/stats/lacnic/delegated-lacnic-extended-latest
  - [RIPE NCC]https://ftp.ripe.net/pub/stats/ripencc/delegated-ripencc-extended-latest
  - [APNIC]https://ftp.apnic.net/pub/stats/apnic/delegated-apnic-extended-latest
  - [ARIN]https://ftp.arin.net/pub/stats/arin/delegated-arin-extended-latest

- `-a`を指定した場合の取得元
  - RIPEstat Announced Prefixes API(優先)
  - ARIN RDAP OriginAS networks(フォールバック)

## 使い方
### インストール
```bash
$ cargo install fire-scope
```

### 実行例
- **注意**
  - `-c``-a`のどちらか一方は必ず指定してください。
  - 指定しなかった場合はエラーが発生します。
```bash
$ fire-scope -c jp us
```

```bash
$ fire-scope -a 0000 1234
```

```bash
$ fire-scope -c jp us -a 0000 1234 -o
```

### オプション
- `-c` : 国コードを指定します。複数指定可能です。
- `-a` : AS番号を指定します。複数指定可能です。
- `-h` : ヘルプを表示します。
- `-v` : バージョンを表示します。
- `-o` : 指定された国コードとAS番号のIPv4/v6アドレスのうち、重複している部分のIPアドレスを出力します。
  - 性質上、`-c``-a`の両方の指定が必須事項です。

- 取得/実行の調整用オプション
  - `--format {txt|nft}`: 出力形式(既定: `txt`  - `--max-retries <N>`: HTTPリトライ回数(既定: 6)
  - `--max-backoff-sec <SEC>`: 指数バックオフの最大秒数(既定: 16)
  - `--http-timeout-secs <SEC>`: HTTPの総合タイムアウト秒(既定: 20)
  - `--connect-timeout-secs <SEC>`: 接続タイムアウト秒(既定: 10)
  - `--concurrency <N>`: ASクエリの同時実行数(既定: 5)
  - `--continue-on-partial`: RIRダウンロードに一部失敗しても成功分で処理を続行します(既定: 無効=厳格)

### 一部失敗時の挙動(重要)
- 既定では、RIRファイルのダウンロードに1つでも失敗するとエラー終了します。
- `--continue-on-partial`を付けると、成功したRIRファイルのみで処理を続行します(警告を表示)。
- どちらのモードでも「全て失敗」の場合はエラー終了します。

### nftablesでの利用例
1) nft形式で出力
```bash
fire-scope -c jp --format nft
```
`IPv4_JP.nft` / `IPv6_JP.nft` が生成され、それぞれ
`define IPv4_JP = { ... }` / `define IPv6_JP = { ... }` が含まれます。

2) nftables設定へ取り込み(例)
```nft
include "/etc/nftables/IPv4_JP.nft"
include "/etc/nftables/IPv6_JP.nft"

table inet filter {
  chain input {
    type filter hook input priority 0;
    ip  saddr $IPv4_JP accept   # IPv4定義の参照
    ip6 saddr $IPv6_JP accept   # IPv6定義の参照
  }
}
```
生成ファイルを適切なパスに配置してから`include`してください。

### 終了コード
- 0: 正常終了
- 非0: 無効な引数(`-c`/`-a`未指定など)、ネットワーク/HTTP失敗(厳格モード)、RIRファイルが1つも利用不可、ファイル書込失敗 など

- **注意事項**<br>
`-c``-a`のどちらか一方は必ず指定してください。
指定しなかった場合はエラーで非0終了します。

- 既存の出力ファイルがある場合は常に上書きします。

## セキュリティ補足
- RIRのダウンロードはストリーミングで読み込むため、`Content-Length`ヘッダが無い場合でも32MiB超で即中断します。
- RIPEstat/ARINのJSON応答もストリーミングで読み込み、8MiBを上限に制限します。

## 既知の制限
- ASの発表プレフィックスはRIPEstatを優先し、失敗時はARIN RDAPへフォールバックします。
- 現時点ではRPKI検証はデフォルト無効です(内部コードはありますがCLI未公開)。
- 外部API/ファイルの可用性に依存します。`--max-retries`/`--max-backoff-sec`で調整可能です。

## 動作条件
- 最新の安定版Rust(Edition 2024対応)を推奨します。`rustup update stable`で更新してください。

## 推奨オプション例
- 取得安定性を保ちつつ迅速化:
  - `fire-scope -c jp us --max-retries 3 --max-backoff-sec 8 --continue-on-partial`
- AS問い合わせを並列に高速化:
  - `fire-scope -a 1234 65000 -C 10`

## ライセンス
[MPL-2.0](./LICENSE.txt)