Fork channel

Create a new channel as a copy of main.

Rename channel

Rename main to:

Delete channel

Delete main? This cannot be undone.

mode name
drwxr-xr-x app/
drwxr-xr-x scripts/
drwxr-xr-x src/
-rw-r--r-- .ignore
-rw-r--r-- README.md
-rw-r--r-- package.yaml
-rw-r--r-- proxy.cabal
-rw-r--r-- stack.yaml
-rw-r--r-- stack.yaml.lock
README

TProxy Controller

A Haskell service that manages Linux transparent proxy routing. It configures TPROXY rules, selects proxy servers, and coordinates network tools such as udp2raw and udpspeeder to route UDP traffic in a lossy environment camouflaged as TCP or ICMP.

Setup

The setup assumes you already have a proxy that accepts connections using TPROXY and can route everything through UDP. The setup has udp2raw connect to the internet over ICMP or a TCP port like 443, which then optionally connects to udpspeeder, which then connects to a proxy like xray (which can run over http 3).

Your configuration should be written in a config.yaml and you should start the controller with it as the argument like ./tproxy-controller servers.yaml. It doesn’t need root, but needs CAP_NET_ADMIN capability as it runs iptables. But it is designed to be installed as a service and run as another user to cleanly separate the packets.

You install the tproxy controller as a service and then use ./control.sh stop to delete the iptables rules and ./control.sh start to apply them again for the default server. You can switch servers with ./control.sh start [server]

The udp2raw and udpspeeder configs should be generated based on the current server in /run/tproxy/.env which the services read from for their own configuration. You should then automatically restart udp2raw and udpspeeder on config change.