About | Log | Files | Refs
commit ddc495b53a04f3e41be1668be2f1e8fd093ef71e
parent 9be44070e11307f3a855a8ab6bb2c525930012e1
Author: Ben Connors <benconnors@outlook.com>
Date: Sat, 8 Aug 2026 17:40:54 -0400
Minor fix for handling interrupts; README update
Diffstat:
2 files changed, 4 insertions(+), 1 deletion(-)
diff --git a/README.md b/README.md
@@ -13,6 +13,8 @@ We do not use a sophisticated form of UDP holepunching: this is intended to be r
Our UDP packets do not attempt to mimic any legitimate protocol: any firewall with some sort of restrictive DPI will likely block these. UDP holepunching in general will always be susceptible to this since the established communication link between client and server will almost certainly be using non-standard UDP ports since applications do not in general have any control over what external port the NAT assigns.
+THe IP/port posted on the webserver are signed using an SSH key but are not encrypted to avoid pulling in any dependencies other than `ssh-keygen` on the client and server. This can be mitigated by choosing something long and random for the location of the file on the webserver.
+
## Requirements
### Intermediate
- Webserver
@@ -23,6 +25,7 @@ Our UDP packets do not attempt to mimic any legitimate protocol: any firewall wi
### Client and Server
- Modern Python with `requests`
- `cron` or similar on the server
+- SSH client (with `ssh-keygen`)
## Overview
On the network, the general procedure for holepunching is:
diff --git a/udp_holepunch.py b/udp_holepunch.py
@@ -306,7 +306,7 @@ rm {server_path}
## 6. Remove the poll file (nop)
## Run operations on the intermediate server
- server_thread = threading.Thread(target=server_ops)
+ server_thread = threading.Thread(target=server_ops, daemon=True)
server_thread.start()
## 3. Find our external port