#port-mapping #upnp #igd #port-forwarding #nat

bin+lib oxy-upnp-igd

UPnP Internet Gateway Device (IGD) port mapping library and CLI with smol runtime

4 releases

0.1.3 Feb 11, 2026
0.1.2 Jan 25, 2026
0.1.1 Jan 23, 2026
0.1.0 Jan 23, 2026

#1002 in Network programming

AGPL-3.0-only

110KB
2K SLoC

oxy-upnp-igd

Minimal UPnP Internet Gateway Device (IGD) port mapping library for Rust.

crates.io,link="https://crates.io/crates/oxy-upnp-igd" Documentation,link="https://docs.rs/oxy-upnp-igd" License: AGPL-3.0,link="https://opensource.org/licenses/AGPL-3.0"

Features

  • UPnP gateway discovery via SSDP (discovers ALL available gateways)
  • Port mapping (Add/Delete) for TCP and UDP
  • Automatic port mapping renewal
  • External IP address retrieval
  • Smol runtime compatible
  • Minimal dependencies

CLI Tool

This package includes the oxyupnpc command-line tool for UPnP port management.

Installation

[source,bash]

cargo install oxy-upnp-igd

Or build from source:

[source,bash]

cargo build --release --bin oxyupnpc

The compiled binary will be at target/release/oxyupnpc.

Usage

[source,bash]

# Get external IP address
oxyupnpc -E

# List all port mappings
oxyupnpc -L

# Add a port mapping (external_port 8080 -> internal_port 8080 TCP)
oxyupnpc -r 8080 8080 TCP

# Add a port mapping with auto-selected external port
oxyupnpc -R 8080 TCP

# Delete a port mapping
oxyupnpc -d 8080 TCP

# Show help
oxyupnpc -h

Quick Start

[source,rust]
use oxy_upnp_igd::discover_gateways;
use std::time::Duration;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    smol::block_on(async {
        let gateways = discover_gateways(Duration::from_secs(3)).await?;

        if let Some(gateway) = gateways.first() {
            let external_ip = gateway.get_external_ip().await?;
            println!("External IP: {}", external_ip);
        }

        Ok(())
    })
}

## Documentation

Full API documentation: https://docs.rs/oxy-upnp-igd

## License

AGPL-3.0-only

Dependencies

~13–29MB
~322K SLoC