Add the public VPN server lists, with is_vpn and vpn_providers #246

Merged
clawbot merged 1 commits from issue-235-vpn-lists into next 2026-11-10 12:15:32 +01:00
Collaborator

Closes #235.

The IP lookup now checks the public VPN server lists of Mullvad, NordVPN, Private Internet Access and IVPN, plus X4BNet's community list. Each is downloaded once a day. List gains VPN; each result gains flags.is_vpn and vpn_providers ([] when there are none).

Real downloads gave: ivpn 264 addresses, mullvad 1,143, nordvpn 7,033, pia 1,653, x4bnet 3,330,492 (6,898 ranges), x4bnet_v6 465 ranges.

Beyond the diff:

  • vpn_providers holds list names, so an address in X4BNet's IPv6 file shows x4bnet_v6.
  • Listing.VPN is not serialised, so ip_lists entries keep their three fields.
  • The v2ray addresses of Mullvad and IVPN count as server addresses. An IVPN host's ipv6 object holds only an address inside the VPN, so it is not read.

Disclosures:

  • Judgement call: X4BNet publishes IPv4 and IPv6 in two files, so they are two lists, following spamhaus_drop and spamhaus_dropv6.
  • Judgement call: Private Internet Access's signature is neither read nor checked.
  • Judgement call: a document with no addresses fails the parse, as Onionoo's does.
  • Rule suppressed: tagliatelle on the structs holding the publishers' field names.

Model: opus-5-5

Closes https://git.eeqj.de/sneak/routewatch/issues/235. The IP lookup now checks the public VPN server lists of Mullvad, NordVPN, Private Internet Access and IVPN, plus X4BNet's community list. Each is downloaded once a day. `List` gains `VPN`; each result gains `flags.is_vpn` and `vpn_providers` (`[]` when there are none). Real downloads gave: `ivpn` 264 addresses, `mullvad` 1,143, `nordvpn` 7,033, `pia` 1,653, `x4bnet` 3,330,492 (6,898 ranges), `x4bnet_v6` 465 ranges. Beyond the diff: - `vpn_providers` holds list names, so an address in X4BNet's IPv6 file shows `x4bnet_v6`. - `Listing.VPN` is not serialised, so `ip_lists` entries keep their three fields. - The v2ray addresses of Mullvad and IVPN count as server addresses. An IVPN host's `ipv6` object holds only an address inside the VPN, so it is not read. Disclosures: - Judgement call: X4BNet publishes IPv4 and IPv6 in two files, so they are two lists, following `spamhaus_drop` and `spamhaus_dropv6`. - Judgement call: Private Internet Access's signature is neither read nor checked. - Judgement call: a document with no addresses fails the parse, as Onionoo's does. - Rule suppressed: `tagliatelle` on the structs holding the publishers' field names. Model: opus-5-5
clawbot added the needs-review label 2026-11-10 11:56:38 +01:00
clawbot self-assigned this 2026-11-10 11:56:38 +01:00
clawbot added 1 commit 2026-11-10 11:56:38 +01:00
The IP lookup now checks Mullvad, NordVPN, Private Internet Access, IVPN and X4BNet's community list, each downloaded once a day. Each result has `flags.is_vpn` and `vpn_providers`.

Judgement call: X4BNet publishes IPv4 and IPv6 as two files, so they are two lists, `x4bnet` and `x4bnet_v6`.
Judgement call: Private Internet Access's signature is not read or checked.
Rule suppressed: `tagliatelle` on the structs holding the publishers' field names.

Model: opus-5-5
Author
Collaborator

PASS: the VPN server lists, flags.is_vpn and vpn_providers meet the definition of done of the VPN lists issue and the repo's policies.

Model: opus-5-5

PASS: the VPN server lists, `flags.is_vpn` and `vpn_providers` meet the definition of done of [the VPN lists issue](https://git.eeqj.de/sneak/routewatch/issues/235) and the repo's policies. Model: opus-5-5
clawbot merged commit 28ef0275ba into next 2026-11-10 12:15:32 +01:00
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: sneak/routewatch#246