/Distributed_Proxy_System

EECS4080 Project at York University. A distribute proxy system to circumvent content filtering firewall. Data units are randomly distributed to different proxies and routed though different paths to avoid detection, single points of failure, persisting connections, and bottlenecks.

Primary LanguageC++GNU General Public License v3.0GPL-3.0

Distributed Anti-Interference Proxy System

This is a EECS4080 Project at York University.

Research Paper: Junlin Chen and Uyen Trang Nguyen, A Robust Protocol for Circumventing Censoring Firewalls, 18th IEEE International Conference on Computer and Information Technology (CIT-2018), Halifax, Canada, July 30 - August 3, 2018.

DOI 10.1109/Cybermatics_2018.2018.00299

Compile & Run

You can compile this project using cmake or makefile in CentOS7. Please install libev before compile using

yum install libev libev-devel

To run this program is very simple. But to be notices that, there are three mode of this program

  • Client Application ./a.out client
  • Server Application ./a.out peer
  • SOCKS5 Server ./a.out socks5

That's it!

Configuration

Client Application

Please use the client_settings.txt. You can use space or line break to separate these values

  • Listen address
  • Listen port
  • Connection confirm password
  • List of the interfaces
    • IP address
    • Port
    • Password

Server Application

Please use the peer_settings.txt. You can use space or line break to separate these values

  • Connection confirm password
  • SOCKS5 server address
  • SOCKS5 server port
  • Fake HTTP response (Should be a *.jpg image)
  • List of the interfaces
    • Listen address
    • Port
    • Password (Password should be all different)

SOCKS Server

Please use the socks_settings.txt. You can use space or line break to separate these values

  • Listen address
  • Listen port

Documentation

Source Code Structure

  • connection
    This folder contains all the socket operation classes wrapped in a event-driven design.
    • Async_Accept: creates listener. It can accept connection.
    • Async_Connect: connects to a socket.
    • Async_Read: reads from a socket.
    • Async_Write: write to a socket.
  • interface
    Lets define that there are two faces that the client application and the server application have.
    Such that
    SOCKS Client <---> [A|Client Application|B] <===> [A|Server Application|B] <---> SOCKS Server <---> Internet
    • Client_A: handles the connection to SOCKS Client
    • Client_B: handles the connection to Server Application
    • Peer_A: handles the connection to Client Application
    • Peer_B: handles the connection to SOCKS Server
  • program
    We need a program that can manage two interface for a program.
    • Client_Core: manages Client_A and Client_B (Client Application)
    • Peer_Core: manages Peer_A and Peer_B (Server Application)
    • Socks_Core: manages the SOCKS server, including all the files in ./socks5/.
  • socks5
    Solely for SOCKS server
    • Channel: forwards SOCKS5 proxy traffic
    • Handshake: takes care of the SOCKS5 handshake procedure.
  • utility
    All the tools that need for this project
    • Command_Listener: We can type command to the console. (But I did not implement this feature, UNUSED)
    • Container: keeps important value while the program is running.
    • Encryption: has all the encryption algorithm.
    • File_Streamer: reads the file and sends to the socket.
    • Packet: prepares the data being transmit over the proxy network.
    • Proxy_Peer: stores the configuration of the interfaces of the server application.
    • Timeout_Listener: listens a timeout event, refreshes the console, prints useful information.

Please read detailed documentation in header files