Skip to content


Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time


ROFLCopTor aims to be a comprehensive Tor control port filter daemon written in golang.


The Tor control port exposes powerful functionality, much more authority than most applications need when they talk to the Tor control port. In accordance with the principal of least authority each software module would ideally have authority over only the resources needed to perform its tasks. Here in the context of ROFLCopTor, we seek to eliminate excess authority from applications which utilize the Tor control port, therefore they will not be in the debian-tor group or otherwise have access to the tor control port UNIX domain socket or TCP listener. The only available access to the tor control port being via ROFLCoptor which exposes a TCP listener and or a UNIX domain socket listeners. Each listener has a filtration policy which is applied for bidirectional filtration of Tor control port commands and responses.


A simple usage:

./roflcoptor -help
Usage of ./roflcoptor:
   -config string
      configuration file
      watch-mode of operation will default to unfiltered-allow policy

Normally watch-mode is only used when creating new filter rule sets.


Until a debian package does this automatically, here are the steps to manually set things up.

First, create a new user.

adduser --system --group --disabled-password --disabled-login --home /etc/roflcoptor/ --no-create-home --quiet roflcoptor

In this configuration example tor's control port is NOT set to TCP port 9051, but instead listens on a UNIX domain socket which only the debian-tor group has read/write access to, therefore the roflcoptor user must be in the debian-tor group. After running the above commands, grep roflcoptor /etc/group should look like this:


Create directories and copy files from source repo:

mkdir /var/run/roflcoptor
chown roflcoptor:roflcoptor /var/run/roflcoptor
mkdir -p /etc/roflcoptor/filters
cp roflcoptor_config.json /etc/roflcoptor
cp filters/*json /etc/roflcoptor/filters

Here we also turn off cookie authentication because filesystem permissions are sufficient for limiting access. Configure your /etc/tor/torrc like this:

# ControlPort 9051 # disable this
ControlPort unix:/var/run/tor/control.socket GroupWritable
CookieAuthentication 0

Run roflcoptor as the roflcoptor user and group. Here's my systemd example. Place the systemd unit file for roflcoptor daemon in /etc/systemd/system/roflcoptor. It should look something like this:

Description=roflcoptor - onion router control port filtration daemon

ExecStartPre=-/bin/mkdir /var/run/roflcoptor
ExecStartPre=/bin/chown roflcoptor /var/run/roflcoptor
ExecStart=/usr/local/bin/roflcoptor -watch -config /etc/roflcoptor/roflcoptor_config.json

NOTE: The -watch flag was passed to roflcoptor so that applications which do not have a policy yet such as Oz sandboxed applications will operate in watch-mode where the policy is pass-thru and all other applications will have their filter policy applied. We must resolve ticket subgraph/oz#37 and implement the Oz UNIX domain socket proxy!

Create and chown the roflcoptor related directories:

mkdir -p /etc/roflcoptor/filters /var/run/roflcoptor
chown -R roflcoptor:roflcoptor /etc/roflcoptor /var/run/roflcoptor

The json configuration file, /etc/roflcoptor/roflcoptor_config.json should look like this:

    "FiltersPath" : "/etc/roflcoptor/filters",
    "TorControlNet" : "unix",
    "TorControlAddress" : "/var/run/tor/control",
    "Listeners" : [
	    "Net" : "unix",
	    "Address" : "/var/run/roflcoptor/roflcoptor.socket"
	    "Net" : "tcp",
	    "Address" : ""


ROFLCopTor is derived from @Yawning's or-ctl-filter and @david415's or-ctl-sieve which was derived from collaboration with Leif Ryge in making this proof of concept filter twistedcat-armfilter-hax.


Building from source is the same as any golang project. Provided with this project is a debian branch from which you can build packages:

apt install debhelper dh-golang dh-systemd golang-go tor adduser
# # To build the Debian package:
git clone -b debian
cd roflcoptor
## To build from stable
gbp buildpackage -us -uc
## To build from head
git checkout master
git checkout debian
gbp buildpackage -us -uc --git-upstream-tree=master
## Install the package
dpkg -i /tmp/build-area/roflcoptor-*_amd64.deb


Tor Control Port Filter and State Tracker Daemon







No packages published

Contributors 4