# ip2nginx [](https://www.paypal.com/donate/?hosted_button_id=JNFS79EFEM7C6)
**ip2nginx** is a lightweight and secure system for dynamically updating NGINX reverse proxy configurations based on public IP address changes, typically reported by edge devices like **pfSense**. It ensures that NGINX always routes traffic through the correct IP, even in dynamic environments. **Current Version:** `0.0.1` ## π Table of Contents - [π‘ Project Overview](#project-overview) - [βοΈ Features](#features) - [π Project Structure](#project-structure) - [π Update Process: update.php](#update-process-updatephp) - [π Update Process: updater.php](#update-process-updaterphp) - [β Example Entry in meta.json](#example-entry-in-metajson) - [β Example Entry in token.json](#example-entry-in-tokenjson) - [π‘ Security](#security) - [π Usage Example from pfSense](#usage-example-from-pfsense) - [π Cron Setup with run.sh](#cron-setup-with-runsh) - [β Dependencies](#dependencies) - [π License](#license) - [π€ Author](#author) --- ## βοΈ Features - Accepts remote updates via `update.php` using **token-authenticated** requests. - Supports both `POST` and `GET`, though **POST is preferred** to avoid token caching. - Updates only the `proxy_pass` line in the relevant `location` block of `nginx.conf`. - Automatically marks entries in `meta.json` as `"changed": 1` when input changes. - Logs all changes to `log.json` with timestamps. - Automatically reloads NGINX: `nginx -t && systemctl reload nginx` (requires root). - Built-in abuse protection: failed requests tracked and blocked. - `.htaccess` ensures that only `update.php` is externally accessible. --- ## π Project Structure ``` ip2nginx/ βββ index.php # Shared configuration and fallback error handler βββ update.php # Receives incoming remote IP update requests βββ updater.php # CLI-only: applies changes to nginx.conf if marked βββ run.sh # Wrapper script for cron automation βββ check_env.php # Environment validator and bootstrapper βββ .htaccess # Blocks unauthorized access, routes traffic βββ data/ β βββ meta.json # Stores current configuration state per domain β βββ token.json # Stores allowed tokens (auth) β βββ log.json # Stores audit log of changes β βββ blocklist.json # Temporarily blocked IPs (48h ban) β βββ failures.json # Tracks failed attempts per IP ``` --- ## β Example: `token.json` ```json { "domain1.to.com": "SECRET_TOKEN_8v73jDKsdLzAq9DkeUz1", "domain2.to.com": "SECRET_TOKEN_3im83jUj28mjo2mI23un" } ``` --- ## β Example: `meta.json` ```json { "domain1.to.com": { "domain": "domain.from.com", "ip": "192.0.2.4", "port": "443", "protocol": "https", "location": "/", "time": "2025-05-16T09:00:00+00:00", "changed": 1 } } ``` --- ## π Remote Update API: `update.php` Supports **POST** (preferred) and **GET** methods. | Parameter | Required | Description | |------------|----------|-----------------------------------------------------------------------------| | `name` | β | Identifier (e.g. `domain1.to.com`) | | `token` | β | Secret token assigned for this name | | `ip` | β | New public IP (default: auto-detected from request) | | `domain` | β | Backend domain to proxy to (default: same as IP) | | `port` | β | Port number (default: 443 for https, 80 for http) | | `protocol` | β | One of `http` or `https` (default: `http`) | | `location` | β | NGINX location block path to update (default: `/`) | Any change in `ip`, `domain`, `port`, or `protocol` triggers `"changed": 1` in `meta.json`. If **any parameter is received via GET**, then `ip` and `domain` will be overridden with the **clientβs real IP** for security. --- ## π§© Update Process: `updater.php` To apply updates made via `update.php`: 1. Load all entries from `meta.json` 2. Check for entries marked `"changed": 1` 3. Find `/var/www/vhosts/system/