From 3081356fb166201e6d1571190c580bf09f1ad9d3 Mon Sep 17 00:00:00 2001 From: Christophe Mehay Date: Mon, 11 Apr 2016 23:58:48 +0200 Subject: [PATCH] Display port with .onion --- README.md | 12 +++++++++--- assets/onions/onions/Onions.py | 22 +++++++++++++++++++--- assets/torrc | 4 +++- docker-compose.yml | 3 +++ 4 files changed, 34 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index a9b81dd..32a0be0 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,12 @@ $ docker run -ti --link something --volume /path/to/keys:/var/lib/tor/hidden_ser Look at the `docker-compose.yml` file to see how to use it. +### Setup port + +By default, ports are the same as linked containers, but a default port can be mapped using `PORT_MAP` environment variable. + +__Caution__: Using `PORT_MAP` with multiple ports on single service will cause `tor` to fail. + ### Tools A command line tool `onions` is available in container to get `.onion` url when container is running. @@ -27,12 +33,12 @@ A command line tool `onions` is available in container to get `.onion` url when ```sh # Get services $ docker exec -ti torhiddenproxy_tor_1 onions -hello: vegm3d7q64gutl75.onion -world: b2sflntvdne63amj.onion +hello: vegm3d7q64gutl75.onion:80 +world: b2sflntvdne63amj.onion:80 # Get json $ docker exec -ti torhiddenproxy_tor_1 onions --json -{"world": "b2sflntvdne63amj.onion", "hello": "vegm3d7q64gutl75.onion"} +{"hello": ["b2sflntvdne63amj.onion:80"], "world": ["vegm3d7q64gutl75.onion:80"]} ``` diff --git a/assets/onions/onions/Onions.py b/assets/onions/onions/Onions.py index f2e6c8a..27dac23 100644 --- a/assets/onions/onions/Onions.py +++ b/assets/onions/onions/Onions.py @@ -16,6 +16,23 @@ class Onions(object): if 'HIDDEN_SERVICE_DIR' in os.environ: self.hidden_service_dir = os.environ['HIDDEN_SERVICE_DIR'] + def _get_port_from_service(self, service, filename): + + with open(filename, 'r') as hostfile: + onion = str(hostfile.read()).strip() + + with open('/etc/tor/torrc', 'r') as torfile: + self.onions[service] = [] + for line in torfile.readlines(): + find = '# PORT {name}'.format(name=service) + if line.startswith(find): + self.onions[service].append( + '{onion}:{port}'.format( + onion=onion, + port=line[len(find):].strip() + ) + ) + def _get_onions(self): self.onions = {} for root, dirs, _ in os.walk(self.hidden_service_dir, @@ -25,13 +42,12 @@ class Onions(object): service=service, root=root ) - with open(filename, 'r') as hostfile: - self.onions[service] = str(hostfile.read()).strip() + self._get_port_from_service(service, filename) def __str__(self): if not self.onions: return 'No onion site' - return '\n'.join(['%s: %s' % (service, onion) + return '\n'.join(['%s: %s' % (service, ', '.join(onion)) for (service, onion) in self.onions.items()]) def to_json(self): diff --git a/assets/torrc b/assets/torrc index 245c3b5..fb9275e 100644 --- a/assets/torrc +++ b/assets/torrc @@ -1,7 +1,9 @@ {% for container in containers %} HiddenServiceDir /var/lib/tor/hidden_service/{{container.names[0]}} {% for link in container.links %} -HiddenServicePort {{link.port}} {{link.ip}}:{{link.port}} +{% set port = env['PORT_MAP'] if 'PORT_MAP' in env else link.port %} +# PORT {{container.names[0]}} {{port}} +HiddenServicePort {{port}} {{link.ip}}:{{link.port}} {% endfor %} {% endfor %} diff --git a/docker-compose.yml b/docker-compose.yml index 33c52b5..5845954 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,9 +2,12 @@ tor: image: goldy/tor-hidden-service + # build: . links: - hello - world + environment: + PORT_MAP: 80 # Map port to detected service hello: image: tutum/hello-world