-- Leo's gemini proxy

-- Connecting to gemini.astropirados.space:1965...

-- Connected

-- Sending request

-- Meta line: 20 text/gemini

    ____                 __     ____       __                __
   / __ \___  ________  / /_   / __ \___  / /_  ____  ____  / /_
  / /_/ / _ \/ ___/ _ \/ __/  / /_/ / _ \/ __ \/ __ \/ __ \/ __/
 / _, _/  __(__  )  __/ /_   / _, _/  __/ /_/ / /_/ / /_/ / /_
/_/ |_|\___/____/\___/\__/  /_/ |_|\___/_.___/\____/\____/\__/

Bloquear acceso a otras cápsulas de un proxy Kineto


Hace unos días, decidí ponerme a hacer funcionar un proxy Kineto, que permite acceder a ésta cápsula Gemini desde un navegador web clásico. Si queréis saber más sobre cómo instalarlo y hacerlo funcionar, os recomiendo el siguiente tutorial de lu1sdev


Instalar y configurar Kineto, un proxy HTTP-Gemini


La verdad es que funciona muy bien, pero Kineto permite algo que a mi, personalmente, me pone muy nervioso; permite acceder a otras cápsulas Gemini a través de los enlaces. Es, a todos los efectos, un proxy a Gemini sin ninguna clase de restricción.


En mi caso, me pone nervioso porque estoy permitiendo acceso a un proxy, sin control alguno, y enmascarando IPs de acceso de la gente sin un verdadero control sobre lo que sucede, permitiendo a un atacante intentar fastidiar a alguna cápsula Gemini a través de mi servidor, disfrazado de mi, y hacer toda clase de maldades.


Si te sucede lo mismo, y crees que restringir el acceso de Kineto a tu cápsula es buena idea, seguramente te pase como a mi; Kineto no tiene ninguna opción para hacer ese tipo de bloqueo.


Gracias a c3po, peloteando en el servidor #gemini_es de XMPP, ha surgido una buena solución, mientras planteo hacer una pull request a Kineto para añadir una opción en su código para ajustar este comportamiento. Básicamente, ya que servimos Kineto a través de un proxy inverso Nginx, podemos usar el propio Nginx para hacer el bloqueo.


¿Cómo funciona ésto? Si observamos cómo hace Kineto cuando pulsas un enlace que va a otra cápsula que no sea la tuya, es generar una url tipo https://tuurl.com/x/otra.capsula.gemini. No falla: Siempre estará esa /x/ cuando acceda a otra cápsula externa. Lo cual nos viene muy bien para capturar estas urls y redirigirlas a un html simple.


Para este truco necesitaremos un html en /var/www/html, en el ejemplo lo llamaremos "get-gemini.html" y dentro, tendrá éste html super sencillo:


<html>
  <body>
    <h1>&iquest;Te gusta lo que ves?</h1>
    <p>Si quieres explorar m&aacute;s del espacio Gemini, desc&aacute;rgate uno de los siguientes clientes y disfruta:</p>
    <ul>
      <li><a href="https://github.com/skyjake/lagrange">Lagrange</a></li>
      <li><a href="https://github.com/MasterQ32/kristall">Kristall</a></li>
      <li><a href="https://www.marmaladefoo.com/pages/geminaut">Geminaut</a></li>
    </ul>
  </body>
</html>

Ahora, si hemos seguido el tutorial de lu1sdev que os he enlazado anteriormente, tendremos una sección server en nuestro fichero de configuración de Nginx, donde apuntamos al proxy inverso hacia nuestro Kineto. Justo antes de la línea "location /" pegaremos este texto:


# Block access to external gemini capsules
location ~ ^/x/(.*)$ {
    root /var/www/html/;
        try_files '' /get-gemini.html =404;
    }

Reiniciamos Nginx, y probamos; cuando cliquemos en un enlace que vaya a otra cápsula Gemini, Nginx nos mostrará el html anterior siempre, y así evitamos que nuestro proxy sea utilizado para finales malignos contra otras cápsulas que no sean las nuestras, o que cierta empresa de GAFAM indexe cápsulas que no sean las tuyas.


Atrás 🔙

-- Response ended

-- Page fetched on Thu Apr 25 06:41:43 2024