This repository contains torsocks-netns, a small wrapper script for
torsocks which creates an empty network namespace to run torsocks
inside it, blocking all connections except to the tor socks port.
This is a quick prototype for a network-namespace-based torsocks:
- https://gitlab.torproject.org/tpo/community/hackweek
- https://gitlab.torproject.org/tpo/community/hackweek/-/blob/main/network-namespace-based-torsocks.md
torsocks-netns can work in 3 different modes.
In the torsocks mode (default) it will:
- run
socatto listen on a UNIX socket in$tmp_dir/torsocks.sockand connect it withlocalhost:9050 - create a user and network namespace
- run
socatinside the new namespace to connectlocalhost:9050with the UNIX socket in$tmp_dir/torsocks.sock - run the selected command with
torsocksinside the new namespace
In the redsocks mode it will:
- run
socatto listen on a UNIX socket in$tmp_dir/torsocks.sockand connect it withlocalhost:9050 - if the
--DNSPortoption is used, runsocatto listent on a UNIX socket in$tmp_dir/DNSPort.sockand connect withlocalhost:$DNSPort(in udp). - create a user and network namespace
- run
socatinside the new namespace to connectlocalhost:9050with the UNIX socket in$tmp_dir/torsocks.sock - if the --DNSPort option is used, run
socatinside the new namespace to connectlocalhost:53(udp) with the UNIX socket in$tmp_dir/DNSPort.sock - run
redsocksand set some iptables rules to redirect all connections to redsocks, which is configured to redirect connections to the socks proxy onlocalhost:9050. If the--DNSPortoption is used we also redirect all udp requests on port 53 to127.0.0.1:53. If the--DNSPortoption is not used, the DNS will not work. - run the selected command inside the new namespace (without using
torsocks)
In the slirp4netns mode (not working yet) it will:
- create a user and network namespace
- use
slirp4netnsto add a new network device to the new network namespace and enable networking - set some iptable rules to redirect all connections to Tor. This part is still missing.
- run the selected command inside the new namespace (without using
torsocks)
If you are using Debian, the following packages need to be installed:
- socat
- uidmap
- libpath-tiny-perl
- libfindbin-libs-perl
You can use this command:
# apt install socat uidmap libpath-tiny-perl libfindbin-libs-perl
With the Debian kernel the user_namespaces(7) are disabled by default.
You can enable them with the following command as root:
# sysctl -w kernel.unprivileged_userns_clone=1
If using the slirp4netns mode you will also need the slirp4netns
package.
If using the redsocks mode you will also need the redsocks package.
Usage of this script is:
torsocks-netns [OPTIONS] -- [TORSOCKS-OPTIONS] [COMMAND [ARG...]]
Options:
--help
Print this message.
--mode=<torsocks|redsocks|slirp4netns>
Default mode is torsocks.
--SocksPort=<port>
Set Tor Socks port (default: 9050).
--TransPort=<port>
Set Tor transparent proxy port (TransPort in torrc). When this is set,
instead of using torsocks we use some iptable rules to redirect all
connections to Tor. This requires setting the --DNSPort option too.
Using this option automatically selects the slirp4netns mode.
--DNSPort=<port>
Set Tor DNSPort. This can only be used in redsocks and slirp4netns modes.
Using the torsocks mode (default):
$ ./torsocks-netns wget https://torproject.org/ --2021-03-29 19:52:04-- https://torproject.org/ Resolving torproject.org (torproject.org)... 95.216.163.36 Connecting to torproject.org (torproject.org)|95.216.163.36|:443... connected. HTTP request sent, awaiting response... 301 Moved Permanently Location: https://www.torproject.org/ [following] --2021-03-29 19:52:05-- https://www.torproject.org/ Resolving www.torproject.org (www.torproject.org)... 95.216.163.36 Connecting to www.torproject.org (www.torproject.org)|95.216.163.36|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 18381 (18K) [text/html] Saving to: ‘index.html’ index.html 100%[=====================================================================================>] 17.95K --.-KB/s in 0.08s 2021-03-29 19:52:06 (231 KB/s) - ‘index.html’ saved [18381/18381]
In the torsocks mode, if we unset LD_PRELOAD, connections are not working anymore:
$ ./torsocks-netns bash
# ip link
1: lo: mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
# wget https://torproject.org/
--2021-03-29 19:54:48-- https://torproject.org/
Resolving torproject.org (torproject.org)... 95.216.163.36
Connecting to torproject.org (torproject.org)|95.216.163.36|:443... connected.
HTTP request sent, awaiting response... 301 Moved Permanently
Location: https://www.torproject.org/ [following]
--2021-03-29 19:54:49-- https://www.torproject.org/
Resolving www.torproject.org (www.torproject.org)... 95.216.163.36
Connecting to www.torproject.org (www.torproject.org)|95.216.163.36|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 18381 (18K) [text/html]
Saving to: ‘index.html’
index.html 100%[=====================================================================================>] 17.95K --.-KB/s in 0.05s
2021-03-29 19:54:50 (348 KB/s) - ‘index.html’ saved [18381/18381]
# unset LD_PRELOAD
# wget https://torproject.org/
--2021-03-29 19:54:54-- https://torproject.org/
Resolving torproject.org (torproject.org)... failed: Temporary failure in name resolution.
wget: unable to resolve host address ‘torproject.org’
In the redsocks mode, the DNSPort option should be added to the
torrc file, and the --DNSPort option used (if not, DNS won't be
working):
$ ./torsocks-netns --DNSPort=9053 --mode=redsocks -- wget -q -O- https://check.torproject.org/ | grep Congratulations
Congratulations. This browser is configured to use Tor.
Congratulations. This browser is configured to use Tor.
In the redsocks mode, LD_PRELOAD is not used:
$ ./torsocks-netns --DNSPort=9053 --mode=redsocks -- bash
# unset LD_PRELOAD
# wget -q -O- https://check.torproject.org/ | grep Congratulations
Congratulations. This browser is configured to use Tor.
Congratulations. This browser is configured to use Tor.
Because we use a user namespace, the program we run inside the user namespace will think it is running as root. Maybe some programs will not like that. The files owned by the same user are seen as owned by root, and the files owned by other users are seen as owned by nobody/nogroup. Unfortunately it seems it is not possible to create a network namespace without creating at the same time a user namespace as an unprivileged user.
The slirp4netns mode doesn't currently work: connections are not going
through Tor when using this mode.
If a program is using namespaces itself, it will maybe not work with
torsocks-netns, because of problems creating nested namespaces.
-
The user's uid is currently mapped to the root uid inside the namespace. Maybe we can change the mapping so that the user's uid is matching inside and outside the namespace, so that it doesn't look like the program is running as root.
-
In the
redsocksmode, when the--DNSPortoption is not used, there is no DNS working. Maybe we can find some way to make that work. -
The
slirp4netnsmode is not working currently. We are missing some iptables rules to redirect connections to Tor. We should remove this mode if we can't make it work. -
We can add a
--stream-isolateoption forredsocksmode, setting a random username and password for the SOCKS5 authentication (similar to torsocks'-i).
orjail is an other tool that seems to be doing something similar, using firejail.
Files in this repository are public domain (or CC0, see COPYING file).