# Setting up an onion service

## What is Tor?

Tor is a protocol that enables anonymous communication over internet by routing traffic through many volunteer operated servers known as relays.  
Tor provides anonymity by masking both client’s and the server’s IP addresses.

## What is Onion Service?

An Onion Service is a service hosted on the Tor network that is only accessible through the Tor network using a .onion address. These services are designed to provide the anonymity both for the users accessing the service and for the server hosting the service.

## Forwarding Tor Traffic to Local Server via Onion Address

### Step 1: Setting up Tor Network

Install tor on the machine

```bash
sudo apt update
sudo apt install tor
```

### Step 2: Configure tor Hidden Service

We will need to configure Tor to run hidden service

We need to edit */etc/tor/torrc file*

Add the following lines in the configuration

```plaintext
 # Setting up hidden service (Onion Service)
HiddenServiceDir /var/lib/tor/hidden_service/
HiddenServicePort 80 127.0.0.1:3000
```

* **HiddenServiceDir**: Tor will store the data of our hidden service in this directory.
    
* **HiddenServicePort:** This tells tor to redirect incoming traffic on port 80 of the .onion address to our local server running on port 3000
    

### Step 3: Restart Tor Service

We will need to restart the Tor service to load the new configuration

```bash
sudo systemctl restart tor
```

### Step 4: Retrieve .onion Address

After Tor has restarted, it will create the hidden service files in the directory that we have specified above. In our case it is */var/lib/tor/hidden\_service/.*

```bash
cat /var/lib/tor/hidden_service/hostname
```

Since it is not safe to share the .onion address of our hidden service publicly, we are going to use `examplexyz.onion` as our tor onion service url

### Step 5: Setup basic Flask Server

Before that, create a virtual environment using

```bash
python3 -m venv myenv
source myenv/bin/activate # to activate the environment
```

Install flask to setup flask server

```bash
pip install flask
```

Create a file `server.py` and write this script

```python
from flask import Flask

app = Flask(__name__)

@app.route('/')
def home():
    return {
        "message": "We are talking from on tor network",
        "status": "success"
    }

if __name__ == '__main__':
    app.run(debug=True, port=3000)
```

`python server.py`

### Step 6: Looking at the response

Go to the Tor address `examplexyz.onion` on any device with Tor installed, and you will see a response like this.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1736834920553/f7e192dd-1e2a-416c-97c0-87b848a7e607.png align="center")
