Skip to content

[Bug] Internet-Check returns 0.0.0.0 when IPv6 is enabled and OpenDNS lookup fails #1845

Open

Description

@dangermouse501

What installation are you running?

Production (netalertx) 📦

Is there an existing issue for this?

The issue occurs in the following browsers. Select at least 2.

  • Firefox
  • Chrome
  • Edge
  • Safari (unsupported) - PRs welcome
  • N/A - This is an issue with the backend

Current Behavior

The built-in Internet-Check (INTRNT) plugin records 0.0.0.0 as the public internet IP when its primary OpenDNS lookup fails on a dual-stack IPv4/IPv6 network. Its curl fallback receives a valid public IPv6 address, rejects it with IPv4-only validation, and returns 0.0.0.0 despite working internet connectivity.

The observed run completes in approximately two seconds and reports SUCCESS, but the detected address remains 0.0.0.0.

Environment

  • Ubuntu 24.04 LTS
  • Docker Compose, host networking
  • Production image: ghcr.io/netalertx/netalertx
  • Image digest: sha256:0ee5cdcaa8a84bfd2f31354b4b30e603804d124821055b9942dcffb52d2ce4bc
  • dig version: 9.20.26
  • Working IPv4 and IPv6 connectivity
  • Local DNS resolver; direct external DNS queries restricted

Independent verification

This command was run inside the same NetAlertX container and successfully returned the correct public IPv4 address:

curl -4 -sS --connect-timeout 3 --max-time 8 https://ifconfig.me/ip

Normal DNS resolution through the local resolver also works. Public IP addresses are redacted from this report.

Cause identified

In server/plugins/internet_ip/script.py, fallback_check_ip() invokes:

subprocess.check_output(['curl', '-s', 'ifconfig.me/ip'], text=True).strip()

It then checks the response against an IPv4-only regular expression. The request does not force IPv4, specify HTTPS, or set request timeouts. When the service returns IPv6, the fallback rejects the response.

Related: #667 concerns OpenDNS timeouts; this report specifically concerns the fallback rejecting an IPv6 response.

Expected Behavior

Internet-Check should correctly retrieve the public IPv4 address when the primary OpenDNS lookup is unavailable and IPv4 internet connectivity is working. An IPv6 response from the fallback service should not cause a false 0.0.0.0 result. Ideally, IP lookup failures should be distinguished from confirmed internet outages.

Proposed upstream fix

Explicitly request IPv4 over HTTPS and bound connection and execution time:

subprocess.check_output(
    [
        'curl', '-4', '-fsS',
        '--connect-timeout', '3',
        '--max-time', '8',
        'https://ifconfig.me/ip'
    ],
    text=True
).strip()

The IPv4-over-HTTPS command shown in Current Behavior was tested successfully in the affected container; the proposed Python change has not been installed or tested as a complete plugin fix. Consider validating the result with ipaddress.IPv4Address as well.

Please incorporate the correction into the official image so it survives normal updates without maintaining a modified script inside the container.

Steps To Reproduce

  1. Run NetAlertX on a dual-stack network with working IPv4 and IPv6 connectivity.
  2. Use the OpenDNS public-IP lookup and the INTRNT settings below. The reduced DNS timeout/retries allow the fallback to run within the overall plugin timeout.
  3. Reproduce in an environment where direct DNS requests to OpenDNS do not succeed, while normal local DNS and outbound internet access remain available.
  4. Run Internet-Check and observe the curl fallback return a valid public IPv6 address.
  5. Observe 'Invalid IP received from fallback' and a recorded address of 0.0.0.0, although the plugin reports SUCCESS.
  6. Run the curl -4 HTTPS verification command inside the same container and observe that it returns the correct public IPv4 address.

Relevant app.conf settings

INTRNT_DIG_GET_IP_ARG='-4 myip.opendns.com @resolver1.opendns.com +time=1 +tries=1'
INTRNT_RUN_TIMEOUT=30
INTRNT_RETRIES=0

docker-compose.yml

# Relevant excerpt from the existing Compose configuration.
# Incomplete excerpt: other deployment settings and volume definitions omitted.
services:
  netalertx:
    container_name: netalertx
    image: ghcr.io/netalertx/netalertx@sha256:0ee5cdcaa8a84bfd2f31354b4b30e603804d124821055b9942dcffb52d2ce4bc
    network_mode: host
    restart: unless-stopped

Debug or Trace enabled

  • I have read and followed the steps in the wiki link above and provided the required debug logs and the log section covers the time when the issue occurs.

Relevant app.log section

Relevant captured INTRNT execution; the public IPv6 address is redacted. The configured LOG_LEVEL at capture time has not been confirmed.

20:31:06 [INTRNT] In script
20:31:06 [INTRNT] INTRNT_DIG_GET_IP_ARG: -4 myip.opendns.com @resolver1.opendns.com +time=1 +tries=1
20:31:06 [INTRNT] - Retrieving internet IP
20:31:07 [INTRNT] Current internet_IP : 0.0.0.0
20:31:07 [INTRNT] previous_IP : 0.0.0.0
20:31:08 [INTRNT] Invalid IP received from fallback
20:31:08 [INTRNT] Curl Fallback (new_internet_IP|cmd_output): 0.0.0.0 | Fallback via curl failed: "<valid public IPv6 address>"
20:31:08 [INTRNT] Finished
20:31:08 [Plugins] SUCCESS for INTRNT received 1 entries

Docker Logs

Separate Docker stdout/stderr logs were not included in the captured diagnostic record. The relevant INTRNT execution output is provided in the app.log section above. This field does not represent output from docker logs.

Activity

  1. added a commit that references this issue on Oct 17, 2026
    02557f0
  2. jokob-sk commented on Oct 17, 2026

    @jokob-sk
    Collaborator

    Thanks for the report!

    This should be available/fixed in the next release.

    It would be great if you could test the ghcr.io/netalertx/netalertx-dev-unsafe Docker image in ~15 minutes (or once the latest GitHub Action finishes).

    ⚠️ Please back up everything first, or ideally spin up a separate container (make sure you use a unique PORT and GRAPHQL_PORT if running instances concurrently) with its own DB and config (a copy of your current setup), as database changes may occur.

    After updating:

    • Click the 🔄 refresh button in the blue header at the top
    • Hard refresh your browser cache (shift + reload) to force js and css files reload

    👉 If I don’t receive confirmation that this works, I may revert the changes to avoid introducing bugs.

    Disclaimer: Running the dev container long-term may lead to data loss, as upgrade paths are not guaranteed.

    Thanks in advance,
    j

  3. added
    Waiting for reply⏳Waiting for the original poster to respond, or discussion in progress.
    next release/in dev image 🚀This is coming in the next release or was already released if the issue is Closed.
    on Oct 17, 2026
  4. added a commit that references this issue on Oct 17, 2026
    e8c214d
  5. dangermouse501 commented on Oct 19, 2026

    @dangermouse501
    Author

    Hi @jokob-sk,

    I've tested the fix from ghcr.io/netalertx/netalertx-dev-unsafe:unsafe (image SHA256: 2116c2626293e7d6936523a448d095ce6c7315fe0b1558abdf586134e233f925).

    Test environment:

    • Ubuntu 24.04.5 VM with working IPv4 and IPv6 connectivity.
    • Primary OpenDNS lookup fails because direct external DNS queries are restricted.
    • IPv6 HTTPS connectivity confirmed operational.

    Results:

    • Confirmed the development image contains the corrected fallback_check_ip() function.
    • Confirmed the updated curl command successfully retrieves a public IPv4 address.
    • Executed the actual corrected Python function extracted from the development image inside a restricted, temporary Docker container.
    • PASS: The function successfully returned a valid public IPv4 address rather than 0.0.0.0.

    The test used host networking to reproduce the dual-stack environment, but had no production volume mounts, ran without elevated Linux capabilities, and did not start the NetAlertX application.

    Limitation: This was a live function-level test, not a complete NetAlertX integration or database-upgrade test.

    My production NetAlertX remains running and healthy, with zero restarts.

    The results strongly indicate that the proposed fix resolves the original IPv4 fallback issue in my environment.

    Thanks for addressing this!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Waiting for reply⏳Waiting for the original poster to respond, or discussion in progress.bug 🐛Something isn't workingnext release/in dev image 🚀This is coming in the next release or was already released if the issue is Closed.

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions