udp-over-tls-pool
Network wrapper which transports UDP packets over multiple TLS sessions (or plain TCP connections).
Client-side application listens UDP port and for each sending endpoint it establishes multiple connections to server-side application. Server side application maintains UDP endpoint socket for each group of incoming connections and forwards data to destination UDP socket.
udp-over-tls-pool can be used as a transport for Wireguard or other UDP VPN protocols in cases where plain UDP transit is impossible or undesirable.
❤️ ❤️ ❤️
You can say thanks to the author by donations to these wallets:
- ETH:
0xB71250010e8beC90C5f9ddF408251eBA9dD7320e - BTC:
- Legacy:
1N89PRvG1CSsUk9sxKwBwudN6TjTPQ1N8a - Segwit:
bc1qc0hcyxc000qf0ketv4r44ld7dlgmmu73rtlntw
- Legacy:
Features
- Based on proven TLS security
- Uses multiple connections for greater performance
- Cross-plaform: runs on Linux, macOS, Windows and other Unix-like systems.
Requirements
- Python 3.5.3+
Installation
From PyPI
pip3 install udp-over-tls-pool
From Snap Store
sudo snap install udp-over-tls-pool
Note that binaries installed by snap are named udp-over-tls-pool.server and udp-over-tls-pool.client.
Usage
Server example:
uotp-server -c /etc/letsencrypt/live/example.com/fullchain.pem \
-k /etc/letsencrypt/live/example.com/privkey.pem \
127.0.0.1 26611
where 26611 is a target UDP service port. By default server accepts connections on port 8443.
Client example:
uotp-client -a 0.0.0.0 example.com 8443
where 0.0.0.0 is a listen address (default is localhost only) and example.com 8443 is uotp-server host address and port. By default client listens UDP port 8911.
See Synopsis for more options.
Using as a transport for VPN
This application can be used as a transport for UDP-based VPN like Wireguard or OpenVPN.
In case when udp-over-tls-pool server address is covered by routing prefixes tunneled through VPN (for example, if VPN replaces default gateway), udp-over-tls-pool traffic must be excluded. Otherwise connections from uotp-client to uotp-server will be looped back to tunnel. There are at least two ways to resolve that loop.
Excluding uotp-client traffic with a static route
Classic solution is to define specific route to host with udp-over-tls-pool server. Here is an example Wireguard configuration for Linux:
[Interface]
Address = 172.21.123.2/32
PrivateKey = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
PreUp = ip route add 198.51.100.1/32 $(ip route show default | cut -f2- -d\ )
PostDown = ip route del 198.51.100.1/32
[Peer]
PublicKey = YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
Endpoint = 127.0.0.1:8911
AllowedIPs = 0.0.0.0/0
where 198.51.100.1 is an IP address of host with uotp-server.
Such solution should work on all platforms and operating systems, though it leaves all other traffic to uotp-server host unprotected.
Excluding uotp-client traffic with rule-based routing
Some VPN tunnels use rule-based routing on Linux to exclude own packets from tunnel itself. For example, Wireguard started with wg-quick command uses netfilter mark to distinguish tunnel carrier packets. uotp-client is capable to mark own TCP/TLS packets with nfmark as well. To enable this feature you may run uotp-client like this:
uotp-client --resolve-once --mark 0xca6c example.com 8443
where 0xca6c is default fwmark for Wireguard set by wg-quick. You may check this value with wg show INTERFACE fwmark. Once this is enabled no additional for Wireguard configuration is required.
Note that to use netfilter marks uotp-client has to be run as superuser or process has to be started with CAP_NET_ADMIN capability. You may set this capability for a process running as restricted user with systemd service file like one below:
# /etc/systemd/system/uotp-client.service
[Unit]
Description=UDP over TLS pool client
After=syslog.target network.target
[Service]
Type=notify
User=uotp-client
AmbientCapabilities=CAP_NET_ADMIN
ExecStart=/usr/local/bin/uotp-client --resolve-once --mark 0xca6c example.com 8443
Restart=always
KillMode=process
[Install]
WantedBy=multi-user.target
Synopsis
Server:
$ uotp-server --help
usage: uotp-server [-h] [-v {debug,info,warn,error,fatal}] [-l FILE]
[-a BIND_ADDRESS] [-p BIND_PORT] [--no-tls] [-c CERT]
[-k KEY] [-C CAFILE]
dst_address dst_port
UDP-over-TLS-pool. Server-side application.
positional arguments:
dst_address target hostname
dst_port target UDP port
optional arguments:
-h, --help show this help message and exit
-v {debug,info,warn,error,fatal}, --verbosity {debug,info,warn,error,fatal}
logging verbosity (default: info)
-l FILE, --logfile FILE
log file location (default: None)
listen options:
-a BIND_ADDRESS, --bind-address BIND_ADDRESS
TLS/TCP bind address (default: 0.0.0.0)
-p BIND_PORT, --bind-port BIND_PORT
TLS/TCP bind port (default: 8443)
TLS options:
--no-tls do not use TLS (default: True)
-c CERT, --cert CERT use certificate for server TLS auth (default: None)
-k KEY, --key KEY key for TLS certificate (default: None)
-C CAFILE, --cafile CAFILE
authenticate clients using following CA certificate
file (default: None)
Client:
$ uotp-client --help
usage: uotp-client [-h] [-v {debug,info,warn,error,fatal}] [-l FILE]
[-a BIND_ADDRESS] [-p BIND_PORT] [-e EXPIRE] [-n POOL_SIZE]
[-B BACKOFF] [-w TIMEOUT] [--no-tls] [-c CERT] [-k KEY]
[-C CAFILE]
[--no-hostname-check | --tls-servername TLS_SERVERNAME]
dst_address dst_port
UDP-over-TLS-pool. Client-side application.
positional arguments:
dst_address target hostname
dst_port target port
optional arguments:
-h, --help show this help message and exit
-v {debug,info,warn,error,fatal}, --verbosity {debug,info,warn,error,fatal}
logging verbosity (default: info)
-l FILE, --logfile FILE
log file location (default: None)
listen options:
-a BIND_ADDRESS, --bind-address BIND_ADDRESS
UDP bind address (default: 127.0.0.1)
-p BIND_PORT, --bind-port BIND_PORT
UDP bind port (default: 8911)
-e EXPIRE, --expire EXPIRE
UDP session idle timeout in seconds (default: 120.0)
pool options:
-n POOL_SIZE, --pool-size POOL_SIZE
connection pool size (default: 8)
-B BACKOFF, --backoff BACKOFF
delay after connection attempt failure in seconds
(default: 5.0)
-w TIMEOUT, --timeout TIMEOUT
server connect timeout in seconds (default: 4.0)
TLS options:
--no-tls do not use TLS (default: True)
-c CERT, --cert CERT use certificate for client TLS auth (default: None)
-k KEY, --key KEY key for TLS certificate (default: None)
-C CAFILE, --cafile CAFILE
override default CA certs by set specified in file
(default: None)
--no-hostname-check do not check hostname in cert subject. This option is
useful for private PKI and available only together
with "--cafile" (default: False)
--tls-servername TLS_SERVERNAME
specifies hostname to expect in server TLS certificate
(default: None)
Metadata
Release files for udp-over-tls-pool 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| udp_over_tls_pool-0.1.1.tar.gz | 16.2 kB | Without provenance | Details for udp_over_tls_pool-0.1.1.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| udp_over_tls_pool-0.1.1-py3-none-any.whl | Python 3 | none | any | Details for udp_over_tls_pool-0.1.1-py3-none-any.whl |
Total release size: 35.1 kB
Release files / udp_over_tls_pool-0.1.1.tar.gz
| Download URL | udp_over_tls_pool-0.1.1.tar.gz |
|---|---|
| Size | 16.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
00c5daeb9f84683ccde7e63b60430f1629271186a08d3557f030c71297e949b6
|
|
BLAKE2b-256 checksum How to use checksums |
75da68c723706ec7299f21cfa5cdbf3ca5455745ca105c24760d3a0e2e9aaf5d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/49.3.0 requests-toolbelt/0.9.1 tqdm/4.48.2 CPython/3.8.4
|
Release files / udp_over_tls_pool-0.1.1-py3-none-any.whl
| Download URL | udp_over_tls_pool-0.1.1-py3-none-any.whl |
|---|---|
| Size | 19.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
df05b301b66f5a12bc10057e0081f8115e0e68de82a01aecc76a20368490d31a
|
|
BLAKE2b-256 checksum How to use checksums |
cbe38bdcf6f39fc666b512652d2b9dba5cca3bc9e843549c48c18a0a0cc1c2a6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/49.3.0 requests-toolbelt/0.9.1 tqdm/4.48.2 CPython/3.8.4
|
Security for udp-over-tls-pool 0.1.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.