Pieza 18 de 64
AccesoPieza nº 0018 de 64

Usted es 172.26.▒▒▒.▒▒▒

Entra en la sede electrónica del Ayuntamiento de Vitoria-Gasteiz y la página apunta, en su código, con qué navegador llegas, y acierta. También apunta desde qué dirección llegas, el número con el que cada aparato se identifica en internet, y ahí escribe siempre la misma: una dirección de red privada, de las que no viajan por internet. Nos la ha escrito cada vez que hemos mirado, en cuatro fechas.

Dominio
sedeelectronica.vitoria-gasteiz.org
Guardado
08 SEP 2026
Comprobado en vivo
14 SEP 2026
Citas
7 en 1 fichero guardado
Lectura
unos 4 min

Cada página de un portal Liferay lleva, entre sus primeras líneas de JavaScript, el lenguaje de los programas que corren en el navegador, una ficha que el servidor, el ordenador que sirve la página, escribe sobre la visita: Liferay.ThemeDisplay, 48 funciones en la portada de la sede, de la línea 356 a la 520. Dicen la dirección pública del portal, el número de la página, el idioma, el huso horario (Europe/Paris, que es el de aquí con otro nombre), si el visitante se ha identificado (no) y con qué número se le conoce mientras tanto. Los programas de la propia página consultan esa ficha: el idioma lo leen de ahí.

Captura de https://sedeelectronica.vitoria-gasteiz.org/
foto 1La portada de sedeelectronica.vitoria-gasteiz.org, la sede electrónica del Ayuntamiento de Vitoria-Gasteiz, el 23 de septiembre de 2026. Recuadrado, el botón «Conectar», que lleva a la pantalla para identificarse. La dirección que la página atribuye al visitante no se ve: va escrita en su código.Captura del 23 de septiembre de 2026, 14:20 (hora peninsular) · el recuadro es nuestro
1de 7sedeelectronica.vitoria-gasteiz.org/portal/es/línea 356 de 6.066
Copia
archivo
Guardado
8 sep 2026
Peso
235,6 kB
sha256
42db5c76290a…
353    UPLOAD_SERVLET_REQUEST_IMPL_MAX_SIZE: 750857600
354};
355
356Liferay.ThemeDisplay = {
1Donde empieza la ficha de la visita, línea 356 de la portada: 48 funciones hasta la 520.
2de 7sedeelectronica.vitoria-gasteiz.org/portal/es/línea 499 de 6.066sigue en el mismo fichero · 143 líneas más abajo
496isImpersonated: function () {
497    return false;
498},
499isSignedIn: function () {
500    return false;
501},
2El portal sabe que no nos hemos identificado.

Dos de esas 48 funciones se llaman getRemoteAddr y getRemoteHost: la dirección y el nombre del extremo remoto, es decir, del visitante, tal como los ve el servidor. En la portada guardada el 8 de septiembre de 2026 las dos devuelven lo mismo, 172.26.▒▒▒.▒▒▒ (los dos últimos números los tapamos nosotros). Nuestro capturador, el programa con el que guardamos las páginas, llegó desde una dirección pública, que no es esa.

3–5de 7sedeelectronica.vitoria-gasteiz.org/portal/es/líneas 448–457 de 6.066
Copia
archivo
Guardado
8 sep 2026
Peso
235,6 kB
sha256
42db5c76290a…
Tapado
4 tramos ▒
445getPlid: function () {
446    return '79';
447},
448getPortalURL3: function () {
449    return 'https://sedeelectronica.vitoria-gasteiz.org';
450},
451getRealUserId: function () {
452    return '20099';
453},
454getRemoteAddr4: function () {
455    return '172.26.▒▒▒.▒▒▒';
456},
457getRemoteHost5: function () {
458    return '172.26.▒▒▒.▒▒▒';
459},
460getScopeGroupId: function () {
3La dirección pública del portal, bien escrita: el servidor sabe cómo se llama de puertas afuera.
4La dirección del visitante según el servidor. Los dos últimos números los tapamos nosotros; los dos primeros bastan para saber que es privada.
5El nombre del visitante, que debería resolver la dirección: la misma cifra otra vez.
▒Los tramos ▒ de esta cita no están así en el fichero: los tapa el museo. Se sustituye cada letra y cada cifra por un bloque, sin cambiar la longitud, para no publicar un identificador de sesión ni una dirección de una red interna. Todo lo demás de la cita es literal.

No podía serlo. En febrero de 1996 el RFC 1918, una de las normas técnicas de internet, reservó tres bloques de direcciones para redes privadas: 10.0.0.0/8, 172.16.0.0/12 y 192.168.0.0/16. Son las direcciones de la oficina, del router de casa, del pasillo entre servidores: ningún router de internet las encamina, y por eso las puede usar todo el mundo a la vez sin estorbarse. 172.26 cae dentro del segundo bloque. Nadie que llegue desde fuera puede tener esa dirección, así que nadie que llegue desde fuera puede ser el visitante al que el portal se la atribuye.

Tampoco es cosa de un día. El archivo guarda 1.004 ficheros del dominio con esa función (929 páginas y 75 bloques de JavaScript), 53 capturados el 31 de agosto de 2026 y 951 el 8 de septiembre, y el valor es el mismo en los 1.004. El 14 de septiembre volvimos a pedir la portada: 129 de sus 6.066 líneas eran distintas, entre ellas las marcas de versión de sus programas y la ficha del navegador, pero las líneas 454 a 458 seguían iguales, con la misma dirección. El 23 de septiembre, otra vez la misma. Cuatro fechas, un visitante.

Tampoco es un caso raro. En el archivo hay 62 portadas de dominios de la Administración que declaran esa misma función. En 17 devuelve la dirección desde la que capturamos: ahí funciona. En 34 devuelve una dirección privada, como aquí. En 4 devuelve 127.0.0.1, la dirección de la propia máquina, con lo que el servidor sostiene que el visitante es él. En 5, otra dirección pública que no es la nuestra. En 2, nada. Damos la cuenta y no los nombres: el museo ordena piezas, no organismos, y la pieza es la misma en 34 sitios.

Lo que se puede explicar sin adivinar: getRemoteAddr devuelve la dirección del otro extremo de la conexión que llegó al servidor. Aquí, delante del portal, hay un intermediario, una máquina que recibe las visitas y se las pasa: las respuestas del 8, del 14 y del 23 de septiembre vienen firmadas por nginx y traen la marca de una caché intermedia, un almacén de copias de las páginas. Así, el otro extremo de la conexión es el intermediario, no el visitante. El servidor cuenta lo único que ve.

Para que sepa la dirección real, el intermediario tiene que pasársela en una cabecera, una línea de datos que acompaña a cada petición (X-Forwarded-For es la habitual), y al servidor hay que decirle que se la crea. Una de las dos cosas no pasa; cuál, la página no lo dice. En dos portales más del archivo el valor no es uno sino dos direcciones vecinas, repartidas entre sus páginas. Dos máquinas intermedias lo explicarían, pero eso ya no se ve desde fuera.

El portal sí escucha al navegador. Antes de la ficha del visitante, en la misma página, va Liferay.Browser, otra ficha, esta sobre el programa con el que se llega, y está bien hecha: la copia del 8 de septiembre dice getMajorVersion 125.0 e isLinux true, que es lo que declara nuestro capturador, un Chrome 125 sobre Linux. La copia del 14, pedida declarando un Chrome 128 de Windows, dice 128.0 e isWindows true. El portal lee la cabecera en la que el navegador cuenta quién es y la transcribe con precisión. La dirección de la que viene, en cambio, no la oye.

6de 7sedeelectronica.vitoria-gasteiz.org/portal/es/línea 206 de 6.066
Copia
archivo
Guardado
8 sep 2026
Peso
235,6 kB
sha256
42db5c76290a…
206getMajorVersion: function () {
207    return 125.0;
208},
6La ficha del navegador: 125.0, la versión de Chrome que declara nuestro capturador. Esta cabecera sí la lee.
7de 7sedeelectronica.vitoria-gasteiz.org/portal/es/línea 240 de 6.066sigue en el mismo fichero · 34 líneas más abajo
237isIphone: function () {
238    return false;
239},
240isLinux: function () {
241    return true;
242},
243isMac: function () {
7Y el sistema: Linux, que también es el nuestro. En la copia del 14 de septiembre, pedida desde un Chrome de Windows, esta línea dice false.

Consecuencias, las que se ven. En los 2.754 ficheros capturados del dominio nadie llama a getRemoteAddr(): los programas de la sede no usan ese valor, así que ninguna función de la página se equivoca por él. Lo que el portal hace con esa dirección puertas adentro, registros o auditoría, no se ve desde fuera. Se ven dos cosas. Cada página publica, a quien lea su código, una dirección de una red interna. Y a nosotros, cada vez que hemos entrado, nos ha escrito en nuestra propia página que éramos otro.

Sabe con qué navegador llegamos y que no nos identificamos. Y nos presentó igual las cuatro veces: usted es 172.26.▒▒▒.▒▒▒.

Lo que decimos
  • La portada de sedeelectronica.vitoria-gasteiz.org declara Liferay.ThemeDisplay.getRemoteAddr y getRemoteHost devolviendo la misma dirección privada del bloque 172.16.0.0/12.
  • Ese valor es idéntico en los 1.004 ficheros del dominio que lo llevan, capturados el 31 de agosto y el 8 de septiembre de 2026, y en la portada pedida de nuevo el 14 y el 23 de septiembre, siempre por nosotros.
  • La ficha del navegador de la misma página sí refleja el User-Agent, la línea en la que el navegador dice quién es, con el que se pide.
  • En el archivo hay 62 portadas de la Administración con esa función y en 34 devuelve una dirección privada.
  • Ningún script capturado del dominio llama a getRemoteAddr().
Lo que no decimos
  • Que otros visitantes reciban esa misma dirección: solo hemos visto nuestras visitas. Una dirección privada, en todo caso, no puede ser la de nadie que llegue desde internet.
  • Por qué el intermediario no pasa la dirección real ni si el portal está configurado para leerla: la página no lo dice y no lo hemos probado.
  • Qué hace el servidor con ese valor en sus registros: no se ve desde fuera.
  • Que esa dirección sirva para llegar a nada desde internet: es privada y no se encamina.
  • Qué máquina concreta es: solo que está dentro.
  • Cuáles son los otros 61 portales: la cuenta se da sin nombres a propósito.
Procedencia

De dónde sale cada cita

Cada trozo de código de esta ficha está en un fichero guardado tal como lo entregó el servidor, con su huella (sha256) y su hora. Las citas entre «» se comprueban por programa contra ese fichero antes de publicar.

Desgobierno Digital · https://desgobiernodigital.com/piezas/vitoria-remoteaddr/ · copia impresa de la edición generada el 19 de octubre de 2026 · Un proyecto de BQuant · correcciones: @Gsnchez