How to Troubleshoot GeoIP Lookup Failures in Target Applications Using Loyalsoldier GeoIP Files
The most common causes of GeoIP lookup failures are corrupted generated files, incorrect CLI format flags, list priority conflicts in the container engine, or misconfigured application paths; verify your files with geoip lookup and check overwriteList settings to resolve them.
When target applications like V2Ray, mihomo, Clash, or Surge fail to resolve IPs to the expected GeoIP lists, the issue typically stems from one of four layers: file generation, CLI validation, container priority logic, or application integration. This guide walks you through systematic GeoIP lookup failures troubleshooting using the loyalsoldier/geoip source code, covering verification steps from the generated binary files down to the container's Lookup implementation in lib/container.go.
Verify the Generated GeoIP File Integrity
Start by confirming the generated file matches your target application's expected format and contains valid data.
Confirm the file format. The file must match the format specified in your application configuration, such as text, v2rayGeoIPDat, maxmindMMDB, mihomoMRS, or singboxSRS. Run geoip list to enumerate all supported formats as implemented in the CLI.
Check the checksum. Compare the file's SHA256 hash against the published release assets. A mismatched checksum indicates a truncated or corrupted download that will cause lookup failures.
Inspect the content. For text-based files, verify each line follows valid IP or CIDR syntax. For binary formats like geoip.dat or .mmdb, use the geoip lookup command in one-time mode to confirm the list is recognized (see the CLI validation section below).
Validate the CLI Lookup Command
Use the lookup command to isolate whether the failure originates in the file itself or the application layer. This command is defined in lookup.go and orchestrates the lookup via lib.NewInstance.
Understand the critical flags to avoid common pitfalls:
-f/--format: Specifies the input format (e.g.,text,v2rayGeoIPDat). Misspelling this triggers the "unsupported input format" error fromsupportedInputFormats(seelookup.golines 21-33).-u/--uri: Path or URL to the source file. Relative paths must be resolvable by the CLI.-d/--dir: Directory containing multiple source files. Omitting this when loading several lists results in empty results.--searchlist: Optional comma-separated filter (case-insensitive). Typos here cause the list to be silently ignored.- Positional argument: The IP or CIDR to lookup, validated by the
special.Lookupconverter inplugin/special/lookup.go(lines 40-44).
Typical failure patterns include:
- Output
"false"indicates the address is syntactically valid but not found in any loaded list. - Error "unsupported input format" means the
--formatflag does not match any supported type. - Error "please specify an IP or a CIDR as search target" signals an invalid address format (e.g.,
300.0.0.1).
Run a direct lookup against your generated file to verify functionality:
# Verify an IP in a single text list
geoip lookup -f text -u ./cn.txt 1.1.1.1
# Check which lists contain an IP in a v2rayGeoIPDat file
geoip lookup -f v2rayGeoIPDat -u ./geoip.dat 1.0.0.1
Inspect the Container Lookup Engine
If the CLI lookup succeeds but your application still fails, investigate the container's priority logic and IP parsing implementation.
The core lookup logic resides in lib/container.go. The Lookup method (lines 195-225) parses input strings as either a CIDR using netip.ParsePrefix or a plain IP using netip.ParseAddr. It then delegates to the private lookup method (lines 227-267), which iterates over all loaded entries, optionally filters by searchList, and checks containment using netipx.IPSet.
Critical troubleshooting points:
- List priority conflicts. If multiple lists contain the same IP, the later-written list wins according to the README §注意事项 (lines 92-95). Ensure your target list appears last in the output configuration, or use the
overwriteListoption to force priority. - Search list filtering. When using
--searchlist, the container builds a case-insensitive map (searchMap). Extra whitespace or incorrect casing causes the filter to silently exclude valid matches.
Check Application Integration Settings
Misconfigured application paths or incompatible formats are frequent sources of GeoIP lookup failures.
| Application | Expected Configuration | Common Gotchas |
|---|---|---|
| V2Ray / Xray | geoip: <url-or-path> pointing to the .dat file |
Using outdated URLs that reference previous releases; verify the path matches your generated file exactly. |
| mihomo | geodata-mode: true and geox-url.geoip pointing to .mmdb or .mrs |
Forgetting to enable geodata-mode (defaults to false), causing the application to skip GeoIP resolution. |
| Clash / Surge | rule-providers.<name>.url set to the generated rule-set |
Duplicate list names may be merged based on application-specific precedence rules, hiding your expected list. |
| sing-box | rule_set with format: binary and URL pointing to .srs |
Using format: yaml for a binary SRS file triggers parsing failures. |
Enable verbose logging in your target application (e.g., loglevel: debug) and search for messages like "GeoIP load failed", "cannot parse IP", or "list not found" to pinpoint the integration failure.
End-to-End Debugging Workflow
Follow this systematic process to isolate and resolve lookup failures:
-
Regenerate the file using
geoip convertwith the latest configuration to ensure you are testing current data. -
Run a direct CLI lookup against the regenerated file to confirm the IP/CIDR exists in the expected list.
-
Inspect application configuration to verify the exact path/URL matches the generated file and that
geodata-modeor equivalent is enabled. -
Check list priority in your conversion config. Add
overwriteList: ["<your-list>"]to the output section (seeconfiguration.md) and re-convert if multiple lists contain overlapping IPs. -
Clear application cache by deleting cached GeoIP data in the application's data directory and restarting the service.
Summary
- Verify file integrity by checking format, checksums, and content validity before testing applications.
- Use
geoip lookupwith correct--formatand--uriflags to isolate file-level issues from application issues. - Check
overwriteListsettings inlib/container.gologic when multiple lists contain overlapping IP ranges. - Validate application configs for correct paths, formats (
.dat,.mmdb,.srs), and enabled GeoIP modes. - Clear caches and regenerate files when checksums mismatch or data appears stale.
Frequently Asked Questions
Why does geoip lookup return "false" for an IP I know should be in the list?
The IP is syntactically valid but not found in the loaded lists according to the lookup method in lib/container.go (lines 227-267). Verify you are using the correct --format flag, the --uri points to the intended file, and that --searchlist (if used) matches the list name exactly without extra whitespace.
How do I fix overlapping IP ranges between multiple GeoIP lists?
Use the overwriteList option in your conversion configuration (documented in configuration.md). When specified, lists appearing earlier in overwriteList take precedence over later entries. After modifying the config, rerun geoip convert and reload the file in your application.
What causes "unsupported input format" errors when running lookup commands?
The --format flag does not match any entry in supportedInputFormats as defined in lookup.go (lines 21-33). Check available formats with geoip list and ensure you use valid identifiers like text, v2rayGeoIPDat, maxmindMMDB, or mihomoMRS exactly as implemented in the source.
Why does my application fail to load GeoIP data even though the CLI lookup works?
The application likely points to a different file path, uses an incorrect format setting (e.g., format: yaml for a binary .srs file in sing-box), or has disabled GeoIP modes (e.g., geodata-mode: false in mihomo). Verify the configuration matches the exact file generated by geoip convert and clear any application-specific GeoIP caches.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →