Ya he conseguido que funcione el envio de archivos con gaim y protocolo jabber. Con la ayuda del sniffer Ethereal he observado como funciona el protocolo jabber para el envio de archivos y he visto que el que intenta enviar un archivo realiza una petición similar a:
<query xmlns='http://jabber.org/protocol/bytestreams' sid='XXXXXXX'> <streamhost jid='Marble@bulmalug.net/Gaim' host='192.168.0.5' port='5500'/> </query>
Como se puede observar esta diciendo que se conecte al puerto 5500, ip 192.168.0.5!!! Es decir, da la ip interna de la red local a los usuarios que estan en internet que por supuesto no se van a poder conectar, deberia dar la ip pública. Para solucionarlo en el gaim vamos a Herramientas -> Preferencias -> Red, se desactiva autodetectar y donde se especifica la IP Pública he puesto un dominio dinámico que se actualiza cada vez que me conecto a internet. En el rango de puertos he puesto entre 5500 y 5502, por supuesto he hecho que el firewall (iptables) del gateway de mi red redirija esos puertos a mi màquina y que el firewall de mi màquina acepte el trafico.
A continuación se puede ver que la petición jabber envia el host que apunta a mi IP:
<query xmlns='http://jabber.org/protocol/bytestreams' sid='XXXXXXX'> <streamhost jid='Marble@bulmalug.net/Gaim' host='hostvirtual.homeip.net' port='5500'/> </query>
Quien tenga ip dinámica como yo y quiera un dominio que apunte siempre a su ip (se ha de actualizar cada vez que se realiza una nueva conexion a internet) puede conseguirlo en dyndns y usar ddclient para actualizar la ip de forma automàtica.
Os pongo las reglas del firewall iptables por si a alguien le interesa:
En el gateway que tiene acceso a internet:
$IPTABLES -t filter -A INPUT -i $INTERNET_INTERFACE -p tcp --dport 5500:5502 -j ACCEPT $IPTABLES -t nat -I PREROUTING 1 -i $INTERNET_INTERFACE -p tcp --dport 5500:5502 -j DNAT --to-dest 192.168.0.5 $IPTABLES -I FORWARD 1 -p tcp -i $INTERNET_INTERFACE --dport 5500:5502 -d 192.168.0.5 -j ACCEPT
En el ordenador donde se ejecutara gaim configurado para que escuche en los puertos 5500-5502:
$IPTABLES -t filter -A INPUT -i $LAN_INTERFACE -p tcp --dport 5500:5502 -j ACCEPT