En el principio las computadoras eran aparatos enormes, mainframes, hosts o como quieran
llamarlos.
El concepto de red que hoy conocemos no estaba tan difundido, justamente porque esas
computadoras eran carisimas, y solo las tenian los militares, las universidades, las grandes
empresas, etc.
Entonces, como hacian muchas personas para trabajar en conjunto sin tener que estar en la misma
computadora, con 20 teclados a la vez? :) - Se utilizaban terminales 'bobas', justamente por no
tener una gran capacidad de procesamiento. De hecho tenian muy poca. Se las vinculaba mediante
puerto serie (por ejemplo) al HOST central, y alli obtenian un shell Unix, VMS, etc. Por supuesto,
esto era todo muy bueno cuando trabajabamos en modo texto, en la consola simple, tan amada por
los odiadores del mouse (me incluyo).
Luego se dise un sistema grafico, y las terminales bobas necesitaban tener al menos la capacidad
de ejecutar un controlador de modo de video, que no necesitaba tanto procesamiento. Ya eran
menos bobas, pero no tanto. Ustedes se preguntaran: "de que sirve solo tener un controlador
grafico y no tener poder para ejecutar aplicaciones?" - Bueno, este controlador grafico es en verdad
el Servidor X. Un servidor X es un conjunto de controladores de placas de video, y tambien un
conjunto de funciones basicas, como por ejemplo: "dibujar en las coordenadas x1,y1,x2,y2 un
cuadrado".
Claro, tener funciones de dibujo no sirve de nada si no tenemos programas que las utilicen. Estos
programas se llaman "clientes X", ya que acceden a las funciones de un "servidor X". Y si,
adivinaron: los clientes X se ejecutaban en los HOSTS centrales, pero se conectaban al servidor X
de nuestra terminal ya-no-tan-boba. Este es el concepto de XWindow bajo la arquitectura
Cliente/Servidor: Los 'programas' son clientes que se conectan a un servidor, y el servidor hace lo
que le piden. Obviamente el servidor X tambien se encarga de controlar el mouse, teclado, y otros
dispositivos de entrada, asi como tambien varios monitores simultaneamente, etc.
Luego de tener claro este concepto podemos llegar a suponer de forma muy acertada que esta
funcionalidad se mantiene en el actual XWindow, asi que vayamos a la practica:
Imaginen de que no tienen espacio para instalar, por ejemplo, OpenOffice, o que les faltan las
librerias necesarias para hacer anda tal programa para XWindow. Si estan en una red, o via banda
ancha, o incluso modem (aunque tendremos que armarnos de PACIENCIA!), pueden averiguar si
en otra computadora con GNU/Linux se encuentra el programa en cuestion instalado. Entonces,
con solamente conectarnos via SSH, o telnet, o como fuere mientras podamos ejecutar un
programa instalado en dicho sistema, podremos ver y usar en nuestro servidor X el cliente X en
cuestion, o sea el programa que estemos ejecutando.
Ustedes diran: "Claro... y como sabe el cliente X a que servidor X se tiene que conectar?". Simple:
lo sabe a traves de una variable de entorno llamada DISPLAY, o a traves de un parametro en la
linea de comandos del programa.
En principio, la variable DISPLAY debe contener nuestra direccion IP y tambien el numero de
pantalla X que se esta usando. Generalmente por cada PC funciona un solo servidor X por vez, y un
solo monitor, por lo que sera el "Display 0". Intentaron alguna vez ejecutar un programa de
XWindow directamente desde la consola? Habran visto el mensaje de error "Can't open display"
(no se puede abrir la pantalla, digamos). Justamente, los programas X (clientes X) necesitan que
haya un display (servidor X) activo para poder funcionar.
Entonces, necesitamos saber la direccion IP de la maquina donde se encuentran los clientes X que
queremos ejecutar, o sea, donde nosotros ahora estamos via ssh o telnet. Recuerdan como hicimos
para obtener la IP de nuestro sistema? Si, con el ifconfig. Hagamos lo mismo en el sistema remoto:
"/sbin/ifconfig". Debemos indicar el path completo ya que lo mas probable es que no seamos
'root' en ese sistema, y el /sbin no se incluye en el PATH para usuarios comunes. Una vez obtenida
la IP... solo hagamos "xhost +esa_ip" y listo. Volvamos a ejecutar el xterm, y esta vez SI lo
veremos aparecer en nuestro display, de a no ser que tengamos iptables o ipchains filtrando los
puertos del 6000 al 6063, que son los que XWindow utiliza para recibir conecciones de clientes.
Esto lo podemos obtener haciendo "grep x11 /etc/services".
Ahora ustedes piensen: cuando ponen XWindow, no solo aparece el servidor X (el cual pueden
cargar con el comando 'X', en vez de 'startx'), sino que aparecen una serie de programas:
Administrador de ventanas o de escritorio, alguna que otra xterm o similar, etc. En este caso, el
servidor X y los clientes X se conectan mediante la interfaz 'loopback', la famosa direccion IP
'127.0.0.1', la que siempre que hagamos 'ifconfig' va a estar, de a no ser que la desactivemos (algo
para nada aconsejable).
Claro, en este caso no usamos xhost, ni nada. Somos nosotros mismos ejecutando tanto el server
como los clientes, en el mismo teclado, misma PC, mismo usuario, etc.
Entonces, en resumen, todo el tiempo X esta funcionando como servidor y recibe permanentes
conecciones de clientes X, y generalmente estos son 'locales', y no 'remotos'.
Veamos entonces, para que un cliente X remoto se ejecute en nuestro display, el resumen de los
comandos o pasos necesarios es el siguiente:
1. Iniciar XWindow por el metodo elegido (X o startx).
2. Obtener nuestra direccion IP utilizando ifconfig. Este sera el valor que
usaremos para la variable DISPLAY en el sistema remoto.
3. desde un shell (sea de otra consola, o desde una xterm en el XWindow
recien cargado) conectarnos por ssh, telnet o el metodo que sea a otro
sistema GNU/Linux o U*nix, tambien, ya que el protocolo X es comun a
todos.
4. Obtener la IP del sistema remoto (otra vez ifconfig).
5. Localmente, habilitar dicha IP con xhost +IP.
6. Remotamente, ejecutar "export DISPLAY=ip_nuestra:0". ip_nuestra es
el valor obtenido en el paso (2).
7. Ultimo paso, ejecutar el cliente X en cuestion, claro esta desde el
sistema remoto.
Y si todo anda bien, o sea, no hay firewalls molestando en ningun lado, veremos el cliente X en
nuestra pantalla.
Ahora, utilizar la variable de entorno DISPLAY es la mejor opcion, creo yo, ya que aunque
podemos indicar mediante parametros al cliente X a que servidor X conectarse, no siempre este
parametro es exactamente igual en todo cliente. En cambio el uso de la variable de entorno
DISPLAY esta 'estandarizado'. Aparte nos ahorra el hecho de tener que indicarle mas parametros a
los programas!
De todas formas, el parametro que los clientes X aceptan es generalmente "-display" o "--display" y
en algunos casos no tiene nada que ver. Tendremos que ver la documentacion o modo de uso (-help si se encuentra disponible, o -h) del cliente en cuestion. Entonces, para ejecutar la xterm
mediante parametros o no mediante la variable de entorno, hariamos lo siguiente:
xterm -display 200.20.2.22:0
$ xinit
Obtendremos una sesin X en la primera tty libre (si no tenemos otra sesin grfica abierta
ser la terminal tty7) con un xterm abierto. En ese xterm ejecutaremos el comando:
$ xhost +nombre_de_host
Atencin
Nunca usaremos el comando xhost +, ya que permite a cualquier cliente conectarse y
tomar el control de las X. Siempre especificaremos un host.
A continuacin, abriremos una sesin SSH en el servidor desde cualquier terminal del host
cliente, ejecutando en el host cliente el comando:
$ ssh <IP_servidor>
Por ejemplo:
$ ssh 192.168.1.3
Por ejemplo:
$ export DISPLAY=192.168.1.2:0
Por ltimo, ejecutaremos en la terminal SSH el comando que lanza el window manager
(por ejemplo, icewm-session):
$ icewm-session
|-xterm---bash
|-ssh
Y en el servidor tendremos activo el proceso window manager (por ejemplo, icewmsession), que cuelga del demonio sshd:
$ pstree
init-+|-sshd---sshd---bash---icewm-session
Si ya tenamos en el host cliente una sesin X local abierta, para iniciar una sesin X
remota tendremos que especificar el DISPLAY tanto al lanzar xinit:
$ xinit -- :1
$ xhost +
Obtendremos una sesin X en la primera tty libre (por ejemplo la terminal tty8).
De la misma manera, si queremos abrir otra sesin X remota en el host cliente tendremos
que especificar el DISPLAY tanto al lanzar xinit:
$ xinit -- :2 &
$ xhost +
Obtendremos una sesin X en la primera tty libre (por ejemplo la terminal tty9).
En el host cliente tendremos activos los procesos:
$ pstree
init-+|-login---bash-+-xinit-+-Xorg
|
|-ssh
|-xterm---bash
|-login---bash-+-xinit-+-Xorg
|
|-xterm---bash
|-ssh
Introduccin.
Cuando se tienen distintas mquinas en una LAN y se desea aprovechar el poder y recursos de una de estas y
ahorrar trabaj, una sesin grfica remota ser de gran utilidad. Lograr esto es muy fcil. Se puede hacer de
dos formas, una accediendo va SSH, RHS o Telnet, y la otra utilizando alguna de las pantallas de acceso
grfico, como GDM.
Procedimiento.
1. Abrase una sesin X de la mquina cliente, pero sin utilizar startx, y utilcese en cambio el comando
xinit para que se abra slo una consola grfica.
2. En la consola grfica de la mquina cliente, debe ejecutarse el siguiente comando:
xhost +
3. Tmese nota de la direccin IP de la mquina cliente y hgase ssh, telnet, rsh, o lo que se prefiera,
al servidor.
4. En terminal del telnet, modifquese la direccin del DISPLAY. Suponiendo que la direccin IP de la
mquina cliente es 192.168.0.3, entonces debe ejecutarse:
export DISPLAY=192.168.0.3:0
5. En la terminal de ssh, rsh o telnet, debe ejecutarse el comando que lanza entorno grfico de su
preferencia, como sera gnome-session o startkde. No debe utilizarse startx porque no funcionar.
6. Disfrute de su sesin X remota.
poco poder en el microprocesador, o resulta mucho trabajo instalarles todo un sistema optimizado y
personalizado.
El objetivo ser entonces querrs que los usuarios puedan utilizar el servidor con mayor poder y recursos
para que se ejecuten ah las sesiones grficas y as tener un mayor control en toda la red.
Las pruebas realizadas para la redaccin de este manual se hicieron en los siguientes equipos:
Servidores:
o Mandrake 7.2 + actualizaciones disponibles a la fecha + XFree86-4.0.3 + Ximian GNOME1.4 + kernel-2.4.5, en un equipo Pentium III 550 MHz, 256 MB RAM. Bogomips: 1101.
o LinuxPPP 6.4 + actualizaciones disponibles a la fecha + XFree86-4.0.3 + Ximian GNOME1.4 + kernel-2.2.19, en un equipo Pentium III 700 MHz, 512 MB RAM. Bogomips: 1399.19
Clientes: utilizaron un rudimentario Mandrake 7 o LinuxPPP 6.4 con XFree86-3.3.6 instalado.
Concentrador: Encore ENH705-TX base 100 TX.
Procedimiento.
1. Actualice gdm al menos a la versin 2.2.x o, de ser posible, ms reciente.
2. En el servidor, debe abrirse una terminal como superusuario y debe ejecutarse el comando
gdmconfig, vaya a la seccin de Expert y de all a la pestaa XDMCP, deben habilitarse las casillas
de "Activar XDMCP" y "Honrar peticiones indirectas" y despus re-iniciar gdm.
4. En los clientes, debe respaldarse y editarse el archivo /etc/X11/prefdm y debe hacerse que contenga
nicamente lo siguiente, considerando que se debe poner la ruta completa de X:
#!/bin/sh
/usr/X11R6/bin/X -query direccin_IP_del_Servidor
Ejemplo:
#!/bin/sh
/usr/X11R6/bin/X -query 192.168.1.254
5. En todas las mquinas, ya sea que si se utiliza linuxconf o alguna otra herramienta, hgase que el
modo de ejecucin sea grfico y con red, es decir que arranque en modo de ejecucin 5 (o nivel de
corrida 5).
6. Deben re-iniciarse los servidores X de las mquinas clientes.
7. Las mquinas clientes vern a GDM ejecutndose como si se estuviese en el mismo servidor, y
permitir iniciar GNOME o KDE o cualquier otro entorno grfico utilizado. Si cuenta con buenos
adaptadores de red, ni siquiera se notar si se est en un cliente o en el servidor.
3. Que en el computador donde se desea ver la informacin est instalado un servidor de X-Window.
En el caso de sistemas tipo Unix basta con tener X-Window instalado (si ve el modo grfico es porque ya
est instalado). Para otros sistemas operativos puede ser posible encontrar un servidor de X-Window, por
ejemplo para Windows, puede emplear Cygwin-X (http://x.cygwin.com) o Xming
(http://www.straightrunning.com/XmingNotes/).
Una vez est ejecutndo el servidor de X-Window en su computador entre al servidor usando ssh con opcin
para hacer reenvo de X11. De esta manera toda la informacin grfica enviada por el servidor viajar por el
canal seguro que ssh establece cuando se conecta al servidor. En el caso de OpenSSH esto se indica con la
opcin -X, i.e se debe conectar con:
ssh -X juan@pasosdeJesus.org
En el caso de putty en el dialogo de configuracin que aparece antes de iniciar la conexin, en el men
Connection->SSH->X11 marque 'Enable X11 forwarding'.
Una vez haga esto, las aplicaciones grficas que inicie en la sesin ssh que inici, se vern en su
computador. Pruebe por ejemplo con:
xeyes
donde base es el nombre del servidor al interior de la organizacin y 443 es el nmero de puerto de HTTPS
(protocolo HTTP sobre SSL, es decir conexiones web encriptadas).
Si emplea putty debe especificar esta informacin en el dilogo de configuracin Connection->SSH>Tunnels como se presenta a continuacin presionando el botn Add para adicionar el tnel a la regin
`Forwarded ports'.
Una vez inicie la conexin debe digitar la clave del usuario en el cortafuegos. Con lo cual quedar
establecido un tnel entre el puerto 10443 del computador local y el puerto 443 del servidor base. Este tnel
puede usarse ingresando en un navegador la direccin:
https://127.0.0.1:10443
Conexiones X y Tunneling
El uso de las X bajo encapsulado dentro de la conexin ssh es un ejemplo de tunneling. Tunneling o
redireccionamiento de puertos (port forwarding) es una tcnica que permite redireccionar trfico TCP inseguro a
travs de SSH.
En el sistema de ventanas X un display consiste en un teclado, un ratn y una pantalla. Cuando se invoca un
cliente X este necesita saber que DISPLAY utilizar. Un display queda determinado por una cadena de la
forma HOST:n.v, donde:
El hecho de que $DISPLAY valga localhost:10.0 se traduce en la instruccin: 'conctate con TCP al
puerto 10+6000 = 6010'. La aplicacin ejecutndose en orion, por ejemplo xclock se conectar al puerto
6010 de localhost (orion). El daemon de ssh en orion esta ya escuchando en ese puerto y redirige la salida
grfica en ese puerto atravs del puerto 22 de orion hacia el cliente. El mensaje est cifrado. El mensaje
cifrado es recibido por el cliente el cul lo descifra y lo enva descifrado al servidor X local. Obsrvese que
el puerto 6010 de orion slo es accedido desde orion. No hay por tanto necesidad de dejar los puertos del
servicio X 6000 en adelante abiertos al exterior.
Ahora arrancamos una segunda sesin SSH, pero no solicitamos redireccin de las X. Establecemos la
variable DISPLAY al valor que tenemos en la otra sesin y reutilizamos el servicio de redireccin:
lusasoft@LusaSoft:~$ ssh pp2@europa.deioc.ull.es
pp2@europa:~$ export DISPLAY=localhost:21.0
pp2@europa:~$ xclock & # Aparece un reloj en nuestro escritorio
[1] 5904
pp2@europa:~$
pp2@europa:~$ konsole & # Aparece una consola KDE en el escritorio
[2] 5906
pp2@europa:~$ kbuildsycoca running...
Reusing existing ksycoca
kdecore (KProcess): WARNING: _attachPty() 10
Es posible especificar tambin el redireccionamiento de las X con la opcin ForwardX11 yes en el fichero
de configuracin.
Si no funciona el tunneling de las X puede ser debido a la configuracin de ssh. Habra que comprobar los
ficheros de configuracin del cliente ssh_config y del servicio sshd_config. Habitualmente la
configuracin por defecto desabilita el redireccionamiento de las X. Para permitirlo hay que poner:
X11Forwarding yes
Por ejemplo:
$ grep X11 /etc/ssh/ssh*fig
/etc/ssh/ssh_config:#
ForwardX11 no
/etc/ssh/ssh_config:#
ForwardX11Trusted yes
/etc/ssh/sshd_config:X11Forwarding yes
/etc/ssh/sshd_config:X11DisplayOffset 10
Supongamos que tenemos KDE en la mquina local. Nos conectamos a la mquina remota con redireccin
de las X:
pp2@nereida:~/pp2bin$ ssh -X -v beowulf
Ahora podemos establecer un escritorio Gnome sin mas que invocarlo en la mquina remota:
casiano@beowulf:~$ gnome-session &
Ejercicio 2.1.18 Abrimos un navegador (mozilla o equivalente). Abra otra aplicacin grfica (un juego). Cierre el
desktop remoto. Se cierra el navegador?. Se cierra el juego?
Observe que procesos suyos se estn ejecutando en la mquina remota despus de cerrado el desktop
grfico:
casiano@beowulf:~$ ps
casiano
302
1
casiano
900
1
casiano
953 32648
casiano
954 32648
xscreensaver -nosplash
/usr/lib/iceape/iceape-bin -browser
ps -fA
grep casiano
Que ocurre?
Desktop Remoto desde una de las Consolas Alternativas
1. Entre en una de las terminales alternativas pulsando CTRL-ALT-F2 (o cualquier otra TTY alternativa). Ahora
podemos conmutar entre las terminales desde ALT-F1 hasta ALT-F6. Para volver a la sesin grfica actual
pulsamos ALT-F7.
2. Entre en la primera terminal con ALT-F1. Introduzca un login y una password. No tiene por que ser el
mismo usuario que tiene en la otra sesin.
3. Ahora desde la nueva terminal en la que hemos entrado tecleamos
4. $ xinit -- :1 vt12
El programa xinit inicia las X. Tambin puede usarse startx, que es un front-end para xinit.
Por defecto xinit y startx arrancan las X en el display :0 y a continuacin una xterm. Cuando la
xterm termina se elimina el servicio X. Tambin suele ser posible terminar las X presionando la
combinacin Control-Alt-Backspace. En general, xinit arranca un servidor X y ejecuta un cierto
script. Lo normal es que este script corra un cierto nmero de programas y finalmente un gestor de
ventanas.
La sintxis de xinit es:
xinit [ [ client ] options ] [ -- [ server ] [ display ] options ]
o
La opcin :1 hace que usemos un display alternativo al que se est usando (probablemente el :0). Si
se quieren ejecutar mltiples servicios X en la misma mquina, cada uno debe tener un nmero de
display distinto.
o El argumento vt12 es opcional, y asocia la sesin grfica con la tecla ALT-F12 en vez de asociarla
con la primera que est disponible. Si no especificamos esta opcin continuara en F8, etc. Si
queremos iniciar mas sesiones deberemos especificar DISPLAYs alternativos :2, :3, etc.
5. Ahora nos conectamos via SSH a la mquina remota y comenzamos startkde u otro entorno grfico.
6. Podemos conmutar entre las dos sesiones pulsando CTRL-ALT-F7 y CTRL-ALT-F12
CygWin
Con una instalacin de Cygwin en su mquina Windows (Vase http://www.cygwin.com) arranque una
xterm. Haga una conexin con X forwarding a la mquina UNIX:
$ ssh -X user@beowulf
Ahora puede arrancar un desktop (o cualquier otro programa grfico) contra la mquina windows sin mas que hacer
$startkde