Skip to main content

A Python STUN client for getting NAT type and external IP (RFC 3489)

Project description

A Python STUN client for getting NAT type and external IP. Supports Python versions 2 and 3.

This project has been forked several times: - original project by gaohawk - taken over by jtriley - forked and patched to support py3 by zoumi - and, finally, forked by TalkIQ

PyStun follows RFC 3489. A server following STUN-bis hasn’t been found on internet so RFC3489 is the only implementation.


To install the latest version:

$ pip install pystun3

or download/clone the source and install manually using:

$ cd /path/to/pystun3/src
$ python install

If you’re hacking on pystun3 you should use the ‘develop’ command instead:

$ python develop

This will make a link to the sources inside your site-packages directory so that any changes are immediately available for testing.


From command line:

$ pystun3
NAT Type: Full Cone
External IP: <your-ip-here>
External Port: 54320

Pass –help for more options:

% pystun3 --help
usage: pystun3 [-h] [-d] [-H STUN_HOST] [-P STUN_PORT] [-i SOURCE_IP]
               [-p SOURCE_PORT] [--version]

optional arguments:
  -h, --help            show this help message and exit
  -d, --debug           Enable debug logging (default: False)
                        STUN host to use (default: None)
  -P STUN_PORT, --host-port STUN_PORT
                        STUN host port to use (default: 3478)
  -i SOURCE_IP, --interface SOURCE_IP
                        network interface for client (default:
                        port to listen on for client (default: 54320)
  --version             show program's version number and exit

From Python:

import stun
nat_type, external_ip, external_port = stun.get_ip_info()

This will rotate through an internal list of STUN servers until a response is found. If no response is found you will get "Blocked" as the nat_type and None for external_ip and external_port.

If you prefer to use a specific STUN server:

nat_type, external_ip, external_port = stun.get_ip_info(stun_host='')

If you prefer to use a specific STUN server port:

nat_type, external_ip, external_port = stun.get_ip_info(stun_port=3478)

You may also specify the client interface and port that is used although this is not needed:

sip = "" # interface to listen on (all)
port = 54320 # port to listen on
nat_type, external_ip, external_port = stun.get_ip_info(sip, port)

Read the code for more details…



Project details

Release history Release notifications

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Files for pystun3, version 1.0.0
Filename, size File type Python version Upload date Hashes
Filename, size pystun3-1.0.0-py2-none-any.whl (8.9 kB) File type Wheel Python version py2 Upload date Hashes View hashes
Filename, size pystun3-1.0.0-py3-none-any.whl (8.8 kB) File type Wheel Python version py3 Upload date Hashes View hashes
Filename, size pystun3-1.0.0.tar.gz (6.0 kB) File type Source Python version None Upload date Hashes View hashes

Supported by

Elastic Elastic Search Pingdom Pingdom Monitoring Google Google BigQuery Sentry Sentry Error logging AWS AWS Cloud computing DataDog DataDog Monitoring Fastly Fastly CDN SignalFx SignalFx Supporter DigiCert DigiCert EV certificate StatusPage StatusPage Status page