# Servidor proxy transparent

Un **servidor proxy** és un intermediari entre els dispositius d'una xarxa local i Internet.

Quan un client (ordinador, mòbil, etc.) vol accedir a una pàgina web, en lloc de connectar-se directament al servidor de destinació, la petició passa primer pel proxy, que la reenvia en nom del client i retorna la resposta.

# 1. Per a què serveix?

**Control d'accés** — permet bloquejar webs per categoria, horari o usuari (com fèiem amb SquidGuard).

**Caché** — emmagatzema còpies locals del contingut més visitat, reduint el consum d'amplada de banda i accelerant la navegació.

**Seguretat** — filtra contingut maliciós, oculta les IP internes de la xarxa i pot inspeccionar el tràfic.

**Registre i auditoria** — guarda logs de tota l'activitat de navegació, útil en entorns corporatius o educatius.

**Anonimitat** — el servidor de destinació veu la IP del proxy, no la del client.

# 2. Tipus principals

- **Proxy explícit** — els clients el configuren manualment al navegador.
- **Proxy transparent** — intercepta el tràfic automàticament sense que els clients el sàpiguen (el que configuràvem amb Squid).
- **Proxy invers** — s'usa al costat del servidor per distribuir càrrega o protegir aplicacions web (ex: Nginx, HAProxy).


# 3. Instal·lació

```bash
sudo apt update
sudo apt install squid squidguard -y
```

# 4. Configuració d'Squid (/etc/squid/squid.conf)

```bash
# Edita el fitxer de configuració principal
sudo nano /etc/squid/squid.conf
```

Aquesta és una configuració bàsica per a proxy transparent:

```nano
# Port transparent (intercepta el tràfic HTTP)
http_port 3128
http_port 3129 intercept

# Port per a HTTPS transparent (si cal)
https_port 3130 intercept ssl-bump cert=/etc/squid/ssl_cert/myCA.pem key=/etc/squid/ssl_cert/myCA.key

# Xarxa local permesa
acl localnet src 192.168.1.0/24
http_access allow localnet
http_access allow localhost
http_access deny all

# Integració amb SquidGuard
url_rewrite_program /usr/bin/squidGuard -c /etc/squidguard/squidGuard.conf
url_rewrite_children 5

# Logs
access_log /var/log/squid/access.log squid
cache_log /var/log/squid/cache.log

# Cache
cache_dir ufs /var/spool/squid 1000 16 256
maximum_object_size 50 MB
```

# 5. Configuració d'SquidGuard (/etc/squidguard/squidGuard.conf)

```bash
sudo nano /etc/squidguard/squidGuard.conf
```

```nano
# Directori de bases de dades
dbhome /var/lib/squidguard/db
logdir /var/log/squidguard

# Definició de temps
time workhours {
    weekly mtwhf 08:00 - 18:00
}

# Definició de xarxes
src admin {
    ip 192.168.1.1
}

src users {
    ip 192.168.1.0/24
}

# Llistes negres (blacklists)
dest adult {
    domainlist blacklists/adult/domains
    urllist    blacklists/adult/urls
}

dest ads {
    domainlist blacklists/ads/domains
}

dest social {
    domainlist blacklists/social/domains
}

# Regles d'accés
acl {
    admin {
        pass all
    }

    users within workhours {
        pass !adult !ads all
    }

    users {
        pass !adult !ads !social all
    }

    default {
        pass none
        redirect http://192.168.1.1/blocked.html
    }
}
```

# 6. Descarregar llistes negres

Pots usar les llistes de **Shallalist** o **URLBlacklist**:

```bash
# Crear directori
sudo mkdir -p /var/lib/squidguard/db
cd /var/lib/squidguard/db

# Descarregar Shallalist (exemple)
sudo wget http://www.shallalist.de/Downloads/shallalist.tar.gz
sudo tar -xzf shallalist.tar.gz
sudo mv BL blacklists

# Compilar les bases de dades
sudo squidGuard -C all

# Ajustar permisos
sudo chown -R proxy:proxy /var/lib/squidguard/db
```

# 7. Redirecció de trànsit amb iptables

Per fer el proxy **realment transparent**, has de redirigir el trànsit del port 80 cap a Squid:

```bash
# Redirigir HTTP (port 80) al port interceptor de Squid
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3129

# Permetre tràfic de Squid
sudo iptables -A INPUT -p tcp --dport 3129 -j ACCEPT

# Activar IP forwarding
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward

# Fer-ho persistent
sudo nano /etc/sysctl.conf
# Afegeix: net.ipv4.ip_forward = 1
```

Per fer les regles d'iptables persistents:

```bash
sudo apt install iptables-persistent -y
sudo netfilter-persistent save
```

# 8. Iniciar i habilitar els serveis

```bash
# Verificar configuració de Squid
sudo squid -k parse

# Reiniciar Squid
sudo systemctl restart squid
sudo systemctl enable squid

# Verificar estat
sudo systemctl status squid
```

# 9. Verificació

```bash
# Comprovar que Squid escolta als ports correctes
sudo ss -tlnp | grep squid

# Seguir els logs en temps real
sudo tail -f /var/log/squid/access.log
sudo tail -f /var/log/squidguard/squidGuard.log
```

# 10. Resum de ports

| Port | Funció |
|------|--------|
| 3128 | Proxy estàndard |
| 3129 | Intercepció HTTP transparent |
| 3130 | Intercepció HTTPS (SSL Bump) |

> **Nota:** Per interceptar HTTPS necessites configurar SSL Bump i distribuir el certificat CA als clients, cosa que té implicacions de privacitat i seguretat que cal tenir en compte.


# 11. Configurar SSL Bump a Squid

SSL Bump permet que Squid intercepti i inspeccioni tràfic HTTPS. Funciona com un "man-in-the-middle" legítim dins la teva xarxa.

## 11.1. Generar el certificat CA

```bash
# Crear directori per als certificats
sudo mkdir -p /etc/squid/ssl_cert
sudo chown proxy:proxy /etc/squid/ssl_cert
sudo chmod 700 /etc/squid/ssl_cert

cd /etc/squid/ssl_cert

# Generar clau privada
sudo openssl genrsa -out myCA.key 4096

# Generar certificat CA autosignat (10 anys)
sudo openssl req -new -x509 -days 3650 -key myCA.key -out myCA.pem -subj "/C=ES/ST=Catalunya/L=Barcelona/O=La meva organització/CN=Proxy CA"

# Ajustar permisos
sudo chown proxy:proxy myCA.key myCA.pem
sudo chmod 600 myCA.key
```

## 11.2. Preparar la caché SSL

```bash
# Crear directori per a la caché de certificats
sudo mkdir -p /var/spool/squid/ssl_db

# Inicialitzar la base de dades SSL
sudo /usr/lib/squid/security_file_certgen -c -s /var/spool/squid/ssl_db -M 4MB

# Ajustar permisos
sudo chown -R proxy:proxy /var/spool/squid/ssl_db
```

## 11.3. Configuració de Squid amb SSL Bump


```bash
# Edita el fitxer squid.conf
sudo nano /etc/squid/squid.conf
```


```nano
# Ports
http_port 3129 intercept
https_port 3130 intercept ssl-bump cert=/etc/squid/ssl_cert/myCA.pem key=/etc/squid/ssl_cert/myCA.key generate-host-certificates=on dynamic_cert_mem_cache_size=4MB

# Generador de certificats
sslcrtd_program /usr/lib/squid/security_file_certgen -s /var/spool/squid/ssl_db -M 4MB
sslcrtd_children 5

# Dominis que NO s'han d'interceptar (banques, etc.)
acl no_bump_domains ssl::server_name .bankinter.com
acl no_bump_domains ssl::server_name .caixabank.com
acl no_bump_domains ssl::server_name .lacaixa.com

# Estratègia SSL Bump
ssl_bump splice no_bump_domains   # Deixar passar sense inspeccionar
ssl_bump stare all                # Inspeccionar la resta
ssl_bump bump all

# Verificació de certificats del servidor
sslproxy_cert_error deny all
sslproxy_flags DONT_VERIFY_PEER   # Només si cal per compatibilitat

# Opcions SSL
tls_outgoing_options min-version=1.2
```

## 11.4. Regles iptables per a HTTPS

```bash
# Redirigir HTTP
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3129

# Redirigir HTTPS
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 3130

# Guardar regles
sudo netfilter-persistent save
```

## 11.5. Distribuir el certificat CA als clients

### Linux (Ubuntu/Debian)

```bash
# Copiar el certificat
sudo cp myCA.pem /usr/local/share/ca-certificates/proxy-ca.crt

# Actualitzar certificats del sistema
sudo update-ca-certificates

# Verificar
ls /etc/ssl/certs/ | grep proxy
```

### Windows (GPO per a dominis o manual)

**Manual:**
```powershell
# Importar via PowerShell (com a administrador)
Import-Certificate -FilePath "myCA.pem" `
    -CertStoreLocation Cert:\LocalMachine\Root
```

**Via GPO** (recomanat en entorns corporatius):

1. Obre `Administració de directives de grup`
2. Navega a `Configuració de l'equip -> Configuració de Windows -> Configuració de seguretat -> Directrius de clau pública`
3. Fes clic dret a `Autoritats de certificació arrel de confiança`
4. Importa `myCA.pem`

### macOS

```bash
# Via terminal
sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain myCA.pem
```

O manualment:

1. Obre **Accés a Clauer**
2. Arrossega `myCA.pem` a **Clauer del sistema**
3. Fes doble clic al certificat -> **Confiar** -> **Sempre confiar**

### Android

1. Copia `myCA.pem` al dispositiu
2. Ves a **Configuració -> Seguretat -> Instal·lar certificat**
3. Selecciona el fitxer i instal·la'l com a **Certificat CA**

> Android 7+ limita els certificats d'usuari per a apps. Necessites accés root o MDM per a una confiança total.

### iOS / iPadOS

1. Envia el fitxer `myCA.pem` per AirDrop o correu
2. Ves a **Configuració -> General -> VPN i gestió de dispositius**
3. Instal·la el perfil
4. Ves a **Configuració -> General -> Quant a -> Confiança de certificats arrel**
5. Activa el certificat

## 11.6. Verificar que SSL Bump funciona

```bash
# Reiniciar Squid
sudo systemctl restart squid

# Comprovar logs SSL
sudo tail -f /var/log/squid/access.log | grep CONNECT

# Provar des d'un client (hauria de mostrar l'emissor 
# com "La meva organització")
curl -v https://example.com 2>&1 | grep "issuer"
```

## 11.7. Consideracions importants

| Aspecte | Detall |
|---|----------|
| **Legalitat** | Informa sempre els usuaris que el tràfic és inspeccionat |
| **Privacitat** | Evita inspeccionar serveis bancaris, mèdics o personals |
| **Certificate Pinning** | Algunes apps (WhatsApp, etc.) fallaran perquè verifiquen el certificat directament |
| **HTTP/3 (QUIC)** | Squid no suporta QUIC; bloqueja el port UDP 443 si cal |


#### Versions d'aquest document

+ HTML - [proxy.html](https://proferamon.com/tic/proxy.html)
+ PDF - [proxy.pdf](https://proferamon.com/tic/docs/proxy.pdf)
+ ODT - [proxy.odt](https://proferamon.com/tic/odt/proxy.odt)
+ MD - [proxy.md](https://proferamon.com/tic/md/proxy.md)

[Domini Públic (CC0)](https://creativecommons.org/publicdomain/zero/1.0/deed.ca)
