📋 Bitácora: montaje de imlauer.github.io en Tor, I2P y Freenet

Fecha: 2026-09-16 · Sistema: Arch Linux · Servidor: $HOME/imlauer.github.io (sitio estático) Resultado final: el sitio publicado en Tor, I2P y Freenet (Hyphanet), más el enlace a los mirrors agregado al index.

Este archivo es el registro de todo lo que se hizo. El “cómo” paso a paso está en tutorial-sitios-ocultos.md.


1) Resumen

Red URL pública ¿Tu PC tiene que estar encendida?
Tor (onion v3) http://5n2dh4gafm6qskpd6wm4us2m7zsxbwj4yicmmyowy7n7i34d4jkq5uid.onion/
I2P (eepsite) http://lj5uiypfgrbuelzguwlb7smx6lqmxrzyd2o6rbu5sdyjahsznyxq.b32.i2p/
Freenet (freesite) USK@GUETDi8oxvuY5VWnnpAIUa-FPKooO0bj-OBM0BgwYGw,CIhMEUnz1-SeZqd0UT0JpgleOzQ7y0Rv5r0rrUx-lAU,AQACAAE/imlauer/0/ No (vive en la red)

2) Servidor web estático (base común para Tor e I2P)

  • Se creó /etc/systemd/system/imlauer-static.service sirviendo ~/imlauer.github.io en 127.0.0.1:8100.
  • No se usa el puerto 8080: está ocupado por qbittorrent.
  • Comandos:
    sudo systemctl daemon-reload
    sudo systemctl enable --now imlauer-static.service
    curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8100/   # → 200
    

3) Tor (onion service v3)

  1. tor ya venía instalado.
  2. Se agregó al final de /etc/tor/torrc:
    HiddenServiceDir /var/lib/tor/imlauer_site/
    HiddenServicePort 80 127.0.0.1:8100
    HiddenServiceVersion 3
    
  3. Se preparó el directorio (sin esto Tor no arranca):
    sudo install -d -o tor -g tor /var/lib/tor/imlauer_site
    sudo chmod 700 /var/lib/tor/imlauer_site
    
  4. Se arrancó y leyó el hostname:
    sudo systemctl reload tor     # aplica el torrc nuevo
    sudo cat /var/lib/tor/imlauer_site/hostname
    
    5n2dh4gafm6qskpd6wm4us2m7zsxbwj4yicmmyowy7n7i34d4jkq5uid.onion
  5. Verificación:
    curl --socks5-hostname 127.0.0.1:9050 -s -o /dev/null -w '%{http_code}\n' \
      http://5n2dh4gafm6qskpd6wm4us2m7zsxbwj4yicmmyowy7n7i34d4jkq5uid.onion/   # → 200
    
  6. Se habilitó el servicio para el boot: sudo systemctl enable tor.

Problema encontrado: tras un fallo previo Tor tiraba Job for tor.service failed (...) because a configured service was not started. Se resolvió con sudo systemctl reset-failed tor && sudo systemctl start tor.


4) I2P (eepsite con i2pd)

  1. Instalación:
    sudo pacman -S i2pd    # extra/i2pd 2.61.0
    
  2. Se agregó al final de /etc/i2pd/tunnels.conf:
    [imlauer-site]
    type = server
    host = 127.0.0.1
    port = 8100
    keys = imlauer-site.dat
    
  3. Arranque y habilitación:
    sudo systemctl enable --now i2pd
    
  4. La dirección .b32.i2p se obtuvo de la consola web http://127.0.0.1:7070/?page=i2p_tunnels (túnel imlauer-site): → lj5uiypfgrbuelzguwlb7smx6lqmxrzyd2o6rbu5sdyjahsznyxq.b32.i2p
  5. Verificación:
    curl -x http://127.0.0.1:4444 -s -o /dev/null -w '%{http_code}\n' \
      http://lj5uiypfgrbuelzguwlb7smx6lqmxrzyd2o6rbu5sdyjahsznyxq.b32.i2p/   # → 200
    

Nota: el primer intento dio 000: era warm-up del router (genera claves y encuentra peers los primeros minutos). Al reconectar dio 200.


5) Freenet / Hyphanet (freesite insertado en la red)

5.1 Instalación (la parte más larga)

  1. Prueba 1: yay -S hyphanet falló compilando con JDK 26: Unsupported class file major version 70 (Gradle 8.14.3 no soporta Java 26).
  2. Solución: instalar JDK 21 y recompilar:
    sudo pacman -S jdk21-openjdk
    yay -S hyphanet      # hyphanet 0.7.5.1506-2 (AUR, compila desde fuente)
    
    Hubo que importar la GPG key del mantenedor (B41A6047FD6C57F9 de hyphanet.org) para que pacman validara las fuentes.
  3. Paquete instalado: hyphanet con servicio freenet.service.

5.2 Primer arranque y completar el wizard

sudo systemctl enable --now freenet.service

El nodo nuevo redirige a /wizard/; en vez del navegador se completó el formulario /wiz/ por curl (opennet, conecta solo):

FP=$(curl -s http://127.0.0.1:8888/wiz/ | grep -oE 'formPassword" type="hidden" value="[^"]*"' | sed 's/.*value="//;s/"$//')
curl -s -o /dev/null -X POST http://127.0.0.1:8888/wiz/ \
  --data-urlencode "formPassword=$FP" \
  --data-urlencode "connectToStrangers=on" \
  --data-urlencode "downLimit=4096" \
  --data-urlencode "upLimit=2048" \
  --data-urlencode "storage=1"

Resultado: hasCompletedWizard=true y opennet.enabled=true en /etc/freenet/freenet.ini.

5.3 Herramientas de inserción (pyFreenet)

python3 -m venv ~/.fcpvenv
~/.fcpvenv/bin/pip install git+https://github.com/freenet/pyFreenet

venv persistente en ~/.fcpvenv (no se borra). Quedan disponibles freesitemgr, fcpgenkey, fcpput, fcpgetdir, etc.

5.4 Preparar el freesite (versión reducida del sitio)

El repo completo pesa ~565 MB (incluye tinygrad-archive de ~301 MB), imposible para Freenet. Se armó /tmp/imlauer con solo lo publicable:

mkdir -p /tmp/imlauer/blog
cd ~/imlauer.github.io
cp *.html *.css /tmp/imlauer/
cd blog && cp $(ls *.txt | grep -vE '^ZZZ|^:w' | grep -v 'test_airesacondicionados.txt') /tmp/imlauer/blog/
  • Resultado: ~13 MB · 1050+ archivos (HTML + CSS + blogs de texto).
  • Excluidos a propósito: tinygrad-archive/, GeorgeHotzLinkedIn.png (6.1 MB), 2026geohot_comments_final.pdf (5.3 MB), george_hotz_linkedin.html (1.5 MB), algunos .txt con nombres raros/no publicables.
  • Límite de freesitemgr: manifiesto ~2 MB y ~896 archivos separados; copiamos el blog tanto como *.txt individuales como en algún caso por bulks; quedó OK.

5.5 Insertar el freesite

mkdir -p ~/.freesitemgr
printf '\n\n\n\n' > /tmp/respuestas.txt
setsid nohup ~/.fcpvenv/bin/freesitemgr -v -l ~/freesitemgr.log add /tmp/imlauer < /tmp/respuestas.txt &

Resultado: el freesite imlauer quedó configurado y las inserciones en cola (“All insert jobs are now on queue, ok”). Con 0 peers la subida real no progresa (ver §7 “estado pendiente”).

Datos (guardados en ~/.freesitemgr/imlauer):

  • clave pública: USK@GUETDi8oxvuY5VWnnpAIUa-FPKooO0bj-OBM0BgwYGw,CIhMEUnz1-SeZqd0UT0JpgleOzQ7y0Rv5r0rrUx-lAU,AQACAAE/imlauer/0
  • clave privada (SENSIBLE, no compartir): USK@AKZlTzozMx~WC3M2ibL7WtvaTzrO8AAEWlzJ7QhtFyRQ,CIhMEUnz1-SeZqd0UT0JpgleOzQ7y0Rv5r0rrUx-lAU,AQECAAE/imlauer/0

5.6 Errores/trucos de freesitemgr

  • freesitemgr -c dio un bug de directorios inconsistentes → se usa la config por defecto ~/.freesitemgr.
  • freesitemgr add pide respuestas por stdin → se usó printf '\n\n\n\n'.
  • La inserción es persistente: aunque se corte el proceso, las peticiones quedan en la cola del nodo y freesitemgr guarda el progreso.

6) Scripts/archivos creados

Archivo Propósito
~/montar-sitio-i2p.md Primer plan de I2P (y luego las 3 redes)
/etc/systemd/system/imlauer-static.service Servidor web estático :8100
/etc/tor/torrc (líneas agregadas) Hidden service Tor → :8100
/etc/i2pd/tunnels.conf (agregado) Túnel eepsite imlauer-site → :8100
/var/lib/tor/imlauer_site/ Claves + hostname del onion
/var/lib/i2pd/imlauer-site.dat Claves del eepsite
/etc/freenet/freenet.ini Config Hyphanet (la reescribe el nodo)
~/.fcpvenv/ venv con herramientas pyFreenet (freesitemgr)
~/.freesitemgr/imlauer Estado y claves del freesite imlauer
~/freesite-update.sh Script de re-insert del freesite (update imlauer)
/tmp/imlauer Staging del freesite (~13 MB, regenerable)
/tmp/freesitemgr.log (o ~/freesitemgr.log) Log de inserción
~/imlauer.github.io/tutorial-sitios-ocultos.md Tutorial con el paso a paso de las 3 redes
~/imlauer.github.io/BITACORA-montaje-sitios-ocultos.md Este documento

Servicios habilitados de arranque:

systemctl is-enabled imlauer-static tor i2pd freenet   # → enabled × 4

7) Estado pendiente (Freenet)

  • El nodo Hyphanet está conectado a 0 peers todavía (bootstrap de opennet; puede tardar hasta ~1 h). Es normal en un nodo nuevo.
  • El freesite está en cola; la subida real avanzará cuando el nodo consiga peers. Comando para chequear:
    curl -s http://127.0.0.1:8888/network/ | grep -oiE 'connected to [0-9]+'
    ~/.fcpvenv/bin/freesitemgr -l ~/freesitemgr.log status imlauer
    

8) Cambio en el index (último paso)

Se agregó al index principal ~/imlauer.github.io/index.html (después del párrafo de email) una línea de mirrors con los enlaces a las tres redes:

<p><strong>Mirrors:</strong> also available on <a ...>Tor</a>
(<code>5n2dh4gafm6qskpd6wm4us2m7zsxbwj4yicmmyowy7n7i34d4jkq5uid.onion</code>),
<a ...>I2P</a> (<code>lj5uiypfgrbuelzguwlb7smx6lqmxrzyd2o6rbu5sdyjahsznyxq.b32.i2p</code>)
and <a ...>Freenet</a>. They only resolve inside each respective network.</p>

Se verificó con curl -s http://127.0.0.1:8100/ | grep -c b32.i2p → aparece. Como Tor e I2P sirven la carpeta de git, este cambio ya quedó visible en las tres redes de forma inmediata (en Freenet se verá en la próxima re-insert).


9) Limpieza / notas

  • Se borraron carpetas accidentales que yay -G había descargado dentro del repo (hyphanet/, python-pyfreenet3-git/). git status quedó limpio salvo los archivos nuevos del tutorial y esta bitácora.
  • index2.html no se tocó.
  • Cómo ver cada red en el futuro:
    curl -s -o /dev/null -w 'TOR:%{http_code}\n' --socks5-hostname 127.0.0.1:9050 http://5n2dh4gafm6qskpd6wm4us2m7zsxbwj4yicmmyowy7n7i34d4jkq5uid.onion/
    curl -s -o /dev/null -w 'I2P:%{http_code}\n'  -x http://127.0.0.1:4444 http://lj5uiypfgrbuelzguwlb7smx6lqmxrzyd2o6rbu5sdyjahsznyxq.b32.i2p/
    

Registro verificado con valores reales del nodo del usuario (2026-09-16).