A professional tool to verify network reachability, TLS configurations, and firewall settings.
πΊ O HAI! I can haz reachability? I checkz if ur ports are open so u don't haz to guess. It's like ping but fancy. Kthxbye!
π Check it out here: https://cgnat.admon.me π
If you find this tool helpful, consider supporting its development:
Can I Haz Reachability? (also known as the Reflector Server) is a robust Go-based service designed to verify if specific ports on a client's IP address are reachable from the internet. It acts as an external "mirror," attempting to connect back to the requestor to validate port forwarding, detect Carrier-Grade NAT (CGNAT), and analyze firewall configurations.
Beyond simple connectivity, it offers advanced features like TLS certificate analysis and service banner grabbing, making it an essential tool for network troubleshooting and verification.
- π Port Reachability Check β Verifies TCP connectivity to specified ports on the requestor's public IP.
- π TLS/SSL Analysis β Performs a detailed inspection of SSL certificates on port 443 (validity, chain, cipher suites).
- π΅οΈ Banner Grabbing β Identifies running services (e.g., SSH versions) by retrieving their initial connection banner.
- π‘οΈ Reflector Challenge β Supports a token-based challenge system to verify ownership of the target server.
- π Rate Limiting β Includes built-in, IP-based rate limiting to prevent abuse.
- π Privacy Focused β Logs are strictly anonymized. Private/internal IP ranges are blocked by default.
| Requirement | Details |
|---|---|
| Container Engine | Docker or Podman (recommended for deployment) |
| Language | Go 1.25+ (if building from source) |
| Architecture | x86_64, arm64 (multi-arch support via Docker) |
docker run -d \
--name can-i-haz-reachability \
-p 8080:8080 \
admonstrator/can-i-haz-reachability:latestThe API will be available at http://localhost:8080.
| Tag | Description |
|---|---|
latest |
Latest stable build from main |
sha-<commit> |
Pinned build for a specific commit |
| Architecture | Description |
|---|---|
linux/amd64 |
x86-64 (Intel/AMD) |
linux/arm64 |
ARM 64-bit (Raspberry Pi 4/5, Apple Silicon, etc.) |
-
Navigate to the deployment directory:
cd deploy/docker -
Start the service:
docker-compose up -d --build
-
Build the image:
podman build -t reflector-server -f deploy/docker/Dockerfile . -
Copy the
.containerfile and create the environment file:mkdir -p ~/.config/containers/systemd/ cp deploy/podman/reflector.container ~/.config/containers/systemd/ cp env.example ~/.config/containers/systemd/reflector.env
-
(Optional) Edit the environment file to customize settings:
nano ~/.config/containers/systemd/reflector.env -
Reload and start the service:
systemctl --user daemon-reload systemctl --user start reflector
The service is configured using environment variables. These can be set in docker-compose.yml or a .env file.
| Variable | Description | Default |
|---|---|---|
REFLECTOR_PORT |
The TCP port the server listens on. | 8080 |
REFLECTOR_TIMEOUT |
Connection timeout for reachability checks. | 5s |
REFLECTOR_ALLOWED_PORTS |
Comma-separated list of ports allowed to be tested. | 80,443,8080,8443 |
REFLECTOR_RATE_LIMIT_PER_MIN |
Maximum number of requests per IP per minute. | 10 |
REFLECTOR_LOG_DIR |
Directory where application logs are stored. | /logs |
Example with custom configuration:
docker run -d \
--name can-i-haz-reachability \
-p 8080:8080 \
-e REFLECTOR_ALLOWED_PORTS="22,80,443,8080" \
-e REFLECTOR_RATE_LIMIT_PER_MIN=20 \
-v /var/log/reflector:/logs \
admonstrator/can-i-haz-reachability:latestPerforms a comprehensive scan of the requested ports.
Query Parameters:
ports: Comma-separated list of ports to check (e.g.,80,443).tls_analyze: Set totrueto enable TLS certificate analysis (Port 443 only).banner: Set totrueto attempt banner grabbing.
Example:
curl "http://localhost:8080/check?ports=80,443&tls_analyze=true"Returns a concise "yes" or "no" string, ideal for automated scripts.
Query Parameters:
port: The single port to check (default: 80).
Example:
curl "http://localhost:8080/simple?port=443"
# Output: yesReturns the service status and basic runtime statistics.
This service is designed with privacy in mind. Access logs automatically anonymize client IP addresses (e.g., masking the last octet) to ensure user privacy while allowing for basic diagnostics. Additionally, the service refuses to scan private or internal IP ranges (RFC 1918) to prevent misuse as an internal network scanner.
Need assistance or have questions?
- π¬ Join the discussion on GL.iNet Forum β Community support
- π¬ Join GL.iNet Discord β Real-time chat
- π Report issues on GitHub β Bug reports and feature requests
- π§ Contact via forum private message β For private inquiries
This script is provided as-is without any warranty. Use it at your own risk.
It may potentially:
- π₯ Break your router, computer, or network
- π₯ Cause unexpected system behavior
- π₯ Even burn down your house (okay, probably not, but you get the idea)
You have been warned!
Always read the documentation carefully and understand what a script does before running it.
This project is licensed under the MIT License β see the LICENSE file for details.
This project is part of a comprehensive collection of tools for GL.iNet routers.
Explore more tools and utilities:
Discover AdGuard Home Updater, ACME Certificate Manager, and more community-driven projects!
Made with β€οΈ by Admon for the GL.iNet Community
β If you find this useful, please star the repository!
Last updated: 2026-04-12