Skip to content
/ uProxy Public

An asyncio-based, memory-efficient HTTP/HTTPS/SOCKS4/SOCKS5 forward proxy server for MicroPython, compatible with CPython

License

Notifications You must be signed in to change notification settings

shawwwn/uProxy

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

44 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

µProxy

A minimal, memory-efficient HTTP/HTTPS/SOCKS4/SOCKS5 proxy server designed to run in memory-constraint environments.
Originally written for MicroPython, now compatible with CPython.

Features

  • HTTP(S) protocol (GET/POST/CONNECT/...)
  • SOCKS4(a) protocol (CONNECT/BIND)
  • SOCKS5(h) protocol (CONNECT/BIND/UDP_ASSOCIATE)
  • Maximum connection limit
  • Modular architecture
  • CPython-compatiable

Usage (MicroPython):

import asyncio
import uproxy

# Run a HTTP(S) proxy server at port 8765
proxy = uproxy.uHTTP(ip='0.0.0.0', port=8765)
asyncio.run(proxy.run())

Change uHTTP into uSOCKS4 or uSOCKS5 if you want a SOCKS proxy.

Usage (CPython):

cproxy.py is a CPython-compatible wrapper of uproxy.py for running uproxy in console.

cproxy.py [-h] [-v] [--proto PROTO] [--ip IP] [--port PORT] [--bind BIND]
          [--bufsize BUFSIZE] [--maxconns N] [--backlog M]
          [--timeout TIMEOUT] [--loglevel LOGLEVEL]
          [--auth AUTH] [--upstream UPSTREAM]

Available values for argument --proto are HTTP,SOCKS4, and SOCKS5.
Rest of the arguments' values are the same as in api docs.

$ python3 cproxy.py --proto HTTP --ip 0.0.0.0 --port 8765
Listening on 0.0.0.0:8765
CONNECT 192.168.1.230:54309     ==>     ifconfig.me:443
GET     192.168.1.230:54312     ==>     ifconfig.me:80
CONNECT 192.168.1.230:54315     ==>     www.google.com:443

To use cproxy.py in code:

import asyncio
import cproxy
proxy = cproxy.uHTTP()
asyncio.run(proxy.run())

API docs:

  • uproxy.uHTTP(ip='0.0.0.0', port=8765, bind=None, bufsize=8192, maxconns=0, backlog=100, timeout=30, ssl=None, loglevel=1, acl_callback=None, auth=None, upstream=None)

    Initialize proxy server

    • ip - server ip
    • port - server port
    • bind - ip address for outgoing connections to bind to
    • bufsize - buffer size of each connection, in bytes
    • maxconns - max number of accepted connections server can handle, 0 to disable
    • backlog - max number of unaccepted connections waiting to be processed
    • timeout - connection timeout, in seconds
    • loglevel - log level (0-quiet, 1-info, 2-debug)
    • ssl - a SSLContext object to start a HTTPS server
    • acl_callback - access control callback function
    • auth - an 'user:password' pair that clients need to provide in order to authenticate with server
    • upstream - an 'ip:port' pair to connect to as an upstream proxy
  • uHTTP.run()

    Start proxy server.
    Need to run in an asyncio event loop

  • uHTTP.acl_callback

    The access control callback function takes a 4-tuple input (source ip/port and destination ip/port).
    Return True to allow current connection to pass, return False to block it.
    Default value None means always allow all connection to pass.

    def acl_callback(src_ip: str, src_port: int, dst_ip: str, dst_port: int) -> bool
  • uproxy.SOCKS4(...)

    • auth - an 'username' term (no colon) because socks4 does not support password

    Same as uHTTP

  • uproxy.SOCKS5(...)

    Same as uHTTP

Notes:

  • To use it with MicroPython, only copy uproxy/ directory.
  • To use it with CPython, copy both the directory and cproxy.py, start with the file.
  • When you are copying the module's directory, exclude <protocol_name>.py from directory if you have no use for it (e.g. remove socks4.py from uproxy/ so to go without SOCKS4 support). This helps reduce code size.
  • cproxy.py replaces some core logic of uproxy.py, making it run much faster, at the expense of 2x memory consumption.
  • The upstream parameter only forwards traffic to an upstream proxy with the same protocol. Mixing protocols is not supported.
  • A good set of paramters for uproxy to run in a memory-constraint environment should be maxconns=10, backlog=5, bufsize=512, timeout=5.
  • For detail usage, please refer to examples/

About

An asyncio-based, memory-efficient HTTP/HTTPS/SOCKS4/SOCKS5 forward proxy server for MicroPython, compatible with CPython

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy