Archivos de etiquetas: linux

Problemas en la previsualización de documentos PDF en Alfresco

Primer problema:

En ocasiones los ficheros PDF no pueden ser visualizados por el Share de Alfresco. Esto puede ser debido a que si el PDF tiene activas las restricciones de impresión y/o copia, la librería SWFTools y en concreto la utilidad pdf2swf no es capaz de transformar el fichero.

Para estar seguros de que es este el problema, podemos llamar directamente a la utilidad con el fichero PDF y comprobar el resultado:

pdf2swf prueba.pdf -o prueba.swf

Si el mensaje que devuelve es «FATAL   PDF disallows copying» entonces estamos ante este problema.

La forma de solucionarlo es recompilar SWFTools y de esta forma evitamos el aviso y podremos ver los documentos.

Las siguientes instrucciones son para la compilación bajo Linux:

Bajamos el paquete de código fuente de las SWFTools (p.e. la versión 0.9.2 está probada en la versión 3.4.8 de Alfresco funcionando perfectamente), lo descomprimimos y entramos en el directorio creado.

En lib/pdf/pdf.cc comentamos las dos líneas siguientes:

if(!pi->config_print && pi->nocopy) {msg(» PDF disallows copying»);exit(0);}
if(pi->config_print && pi->noprint) {msg(» PDF disallows printing»);exit(0);}}

Configuramos de forma estática para que podamos llevarlo a otras distribuciones de Linux (yo la he probado en Ubuntu 11.10):

CC=/usr/bin/gcc-4.6 CXX=/usr/bin/g++-4.6 LDFLAGS=»-static» ./configure

Seguramente tengamos que instalar los paquetes para desarrollo como es el g++ y el gcc.

Luego:

make

Y por último:

make install 

O bien, simplemente sustituimos la utilidad pdf2swf que es la que se utiliza. Ya podremos ver los PDF bloqueados normalmente.

Segundo problema:

Otro problema que encontramos es que en la versión 3.4.x y 4.x los PDF se ven borrosos en la previsualización, esto es debido a los modificadores establecidos para realizar la conversión a SWF que pone Alfresco.

Para solucionarla tendremos que modificar el fichero webapps/alfresco/WEB-INF/classes/alfresco/subsystems/thirdparty/default/swf-transform.properties que generalmente tiene la siguiente línea:

swf.encoder.params=-s zoom=72 -s ppmsubpixels=1 -s poly2bitmap=1 -s bitmapfonts=1

Por esta otra (por ejemplo):

swf.encoder.params=-s zoom=100 -s ppmsubpixels=1 -s poly2bitmap=1 -s bitmapfonts=1

De esta forma se verán correctamente, eso si, el tiempo de conversión será mayor.

ACTUALIZACIÓN (12/07/2012): Aunque para compilar SWFTools se puede usar la información de los enlaces que doy al final, para Ubuntu 11 (y probado en la 12) tanto para amd64 como i386 se pueden seguir la siguiente secuencia de comandos de forma rápida:

sudo apt-get install build-essential checkinstall
sudo chown $USER /usr/local/src
sudo chmod u+rwx /usr/local/src
sudo apt-get install libgif-dev xpdf libfreetype6 libfreetype6-dev libjpeg62 libjpeg8 libjpeg8-dev
sudo wget http://www.swftools.org/swftools-0.9.1.tar.gz
cd lib/pdf
sudo wget http://gd.tuwien.ac.at/publishing/xpdf/xpdf-3.02.tar.gz
./configure
make


sudo checkinstall

Fuentes:
http://monkiki.wordpress.com/2010/04/19/compilar-pdf2swf-con-soporte-para-pdf-protegidos/
http://loftux.com/2012/01/08/replace-alfresco-standard-flash-viewer-with-pdf-js/
http://www.vservu.com/_blog/MegaZine3_-_tips,_tricks_and_hints/post/pdf2swf-switches/
http://www.swftools.org/
https://designbye.wordpress.com/2010/02/23/installing-swftools-and-pdf2swf-on-ubuntu-linux/
http://ubuntuforums.org/showthread.php?t=1821521

Calculando métricas en Alfresco mediante scripts

Para el cálculo de métricas en las búsquedas, subidas de ficheros, etc. podemos usar alguno de los programas que existen para estas tareas como es JMeter.

JMeter es un programa en Java, del proyecto Apache, que permite testear aplicaciones web. Es una aplicación de escritorio y muy usada en los entornos en los que se utilizan servidores de aplicaciones, sobre todo Tomcat.

Para más información podemos ir a la URL del proyecto: http://jakarta.apache.org/jmeter/

Si no tenemos tiempo de crear una batería de pruebas siempre podemos recurrir al intérprete BASH de Linux, Unix, MacOS, etc. que puede facilitarnos esta tarea.

Haciendo uso de algún WebScript ya implementado en Alfresco o modificando alguno de estos podemos usar las funciones y comandos de BASH para tomar tiempos.

Búsqueda aleatoria:

Una de las pruebas más importantes es el de las búsquedas en Alfresco. En este caso vamos a usar un WebScript de la parte OpenSearch que tiene Alfresco. El problema de este sistema es que solo devuelve los resultados en 3 formatos, HTML, RSS y ATOM, y en nuestro caso necesitamos que los devuelva en formato texto (TEXT) para poder tratarlo. Para esto, solo tenemos que modificar el descriptor para incluir en el contexto la llamada a una plantilla FreeMarker que devuelva texto plano e incluir esta plantilla. Para no «ensuciar» el despliegue lo haremos creando el directorio en alfresco/extension de forma que además podamos conservarlo entre distintas actualizaciones del producto. El sitio para introducir los dos ficheros será: /alfresco/extension/templates/webscripts/org/alfresco/repository/

Los dos ficheros serán los siguientes:

Fichero: keywordsearch.get.desc.xml


  Alfresco Keyword Search (OpenSearch Enabled)
  Execute Keyword Search against Alfresco Repository (Company Home and below)
  /api/search/keyword.html?q={searchTerms}&p={startPage?}&c={count?}&l={language?}
  /search/keyword.html?q={searchTerms}&p={startPage?}&c={count?}&l={language?}
  /api/search/keyword.texp?q={searchTerms}&p={startPage?}&c={count?}&l={language?}
  /search/keyword.text?q={searchTerms}&p={startPage?}&c={count?}&l={language?}
  /api/search/keyword.atom?q={searchTerms}&p={startPage?}&c={count?}&l={language?}
  /search/keyword.atom?q={searchTerms}&p={startPage?}&c={count?}&l={language?}
  /api/search/keyword.rss?q={searchTerms}&p={startPage?}&c={count?}&l={language?}
  /search/keyword.rss?q={searchTerms}&p={startPage?}&c={count?}&l={language?}
  /api/search/keyword.portlet?q={searchTerms}&p={startPage?}&c={count?}&l={language?}
  guest
  required

Fichero: keywordsearch.get.text.ftl 

${row.name}

Una vez introducidos los ficheros en el sitio correspondiente solo queda ir a la URL http://servidoralfresco:8080/alfresco/service/index y pulsar el botón de refresco de los WebScripts.

Ahora podemos ejecutar el script creado para las búsquedas. Este script lo que hace es una búsqueda por una palabra o KEYWORD, guardar los resultados en un fichero y después realizar el número de búsquedas solicitadas de forma automática guardando los tiempo y redirigiéndolos a un fichero para poder editar  posteriormente los resultados.

La sintaxis del script es:

./random_search usuario password keyword núm_iteracciones url_alfresco

Fichero: random_search

#!/bin/bash

# Pruebas de busquedas en Alfresco usando el webscript «search»
# www.fegor.com

if [ ! $# -eq 5 ]
then
        echo Sintaxis: random_search user passwd keyword num_randoms alfresco_url
        exit 1
fi

echo Realizando consulta completa…
IFSPREV=$IFS
IFS=$’x0A’$’x0D’
curl –user «$1:$2» «$5/service/api/search/keyword.text?q=$3&p=Company%20Home&c=10000&l=es» > random_search_result.txt

echo Comenzando las busquedas…
LINEAS=`cat random_search_result.txt | wc -l`
echo -e «Results of random_search.sh» > random_search_times.csv SG_FOR_I=`date +%s`
for n in $(seq 1 $4);
do
        RNM=$RANDOM
        let «RNM %= $LINEAS»
        let «RNM += 1»
        KEYWORD=`head -n $RNM random_search_result.txt | tail -1 | tr -d ‘r’`
        NS_CURL_I=`date +%s%N`
        curl –user «$1:$2» «$5/service/api/search/keyword.text?q=${KEYWORD}&p=Company%20Home&c=1&l=es»
        NS_CURL_F=`date +%s%N`
        let TOTAL_NS_CURL=$NS_CURL_F-$NS_CURL_I
        let TOTAL_MS_CURL=TOTAL_NS_CURL/1000000
        echo -e «`date`t$KEYWORDt$TOTAL_NS_CURLt$TOTAL_MS_CURL» >> random_search_times.csv 

done
SG_FOR_F=`date +%s`
let TOTAL_SG_FOR=$SG_FOR_F-$SG_FOR_I
echo -e «rrTotal time» >> random_search_times.csv
echo -e «`date`t$TOTAL_SG_FOR» >> random_search_times.csv
IFS=$IFSPREV

Un ejemplo de ejecución del comando sería:

[root@alfpru1 scripts]# ./random_search admin admin «*ftl» 5 http://192.168.56.1:8080/alfresco
Realizando consulta completa…
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   671    0   671    0     0   7910      0 –:–:– –:–:– –:–:–     0
Comenzando las busquedas…
categorysearch.get.atom.404.ftl
show_audit.ftl
categorysearch.get.atom.ftl
my_docs.ftl
general_example.ftl

Y posteriormente en la hoja de cálculo:

Subidas masivas:

Otra de las pruebas es la de realizar subidas masivas y en profundidad de un número de ficheros y comprobar los tiempos de estas subidas. El script es bastante parecido al anterior y hace uso de un WebScript que también está incluido en Alfresco. En este caso hay que crear un «site» llamado «tests» para poder subir los ficheros a dicho espacio.

Fichero: directory_upload
#!/bin/bash

# Pruebas de subidas en Alfresco usando el webscript «upload»
# www.fegor.com

if [ ! $# -eq 5 ]
then
        echo Sintaxis: directory_upload user passwd path ext alfresco_url
        exit 1
fi

echo «Subiendo…»
IFSPREV=$IFS
IFS=$’x0A’$’x0D’

echo -e «Results of directory_upload.sh» > directory_upload_times.csv
SG_FOR_I=`date +%s`
for f in $(find $3 ( -name *.$4 ));
do
        NS_CURL_I=`date +%s%N`
        curl -k -X POST –user «$1″:»$2″ -F filedata=@$f -F siteid=»tests» -F containerid=»documentLibrary» -F uploaddirectory=»testsDir» -F filename=»`basename $f`» -F contenttype=»`file –brief –mime $f`» «$5/service/api/upload» | grep ‘description’ | cut -d ‘:’ -f 2 | tr -d ‘»‘
        NS_CURL_F=`date +%s%N`
        let TOTAL_NS_CURL=$NS_CURL_F-$NS_CURL_I
        let TOTAL_MS_CURL=TOTAL_NS_CURL/1000000
        echo -e «`date`t$ft$TOTAL_NS_CURLt$TOTAL_MS_CURL» >> directory_upload_times.csv
done
SG_FOR_F=`date +%s`
let TOTAL_SG_FOR=$SG_FOR_F-$SG_FOR_I
echo -e «rrTotal time» >> directory_upload_times.csv
echo -e «`date`t$TOTAL_SG_FOR» >> directory_upload_times.csv
IFS=$IFSPREV

Este script también devuelve un fichero (directory_upload_times.csv) para su edición y estudio mediante cualquier sistema de hoja de cálculo como MS-Excel o OpenOffice.org

Un ejemplo de ejecución podría ser el siguiente:

[root@alfpru1 scripts]# ./directory_upload admin admin AMCM2011/ pdf http://192.168.56.1:8080/alfresco
Subiendo…
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 3252k  100   278  100 3252k    253  2968k  0:00:01  0:00:01 –:–:– 3014k
 File uploaded successfully
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  772k  100   253  100  772k    424  1295k –:–:– –:–:– –:–:– 1435k
 File uploaded successfully
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  311k  100   257  100  311k    414   502k –:–:– –:–:– –:–:–  510k
 File uploaded successfully
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 2485k  100   251  100 2485k    385  3814k –:–:– –:–:– –:–:– 3976k
 File uploaded successfully
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  415k  100   251  100  415k    245   406k  0:00:01  0:00:01 –:–:–  429k
 File uploaded successfully
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  481k  100   255  100  481k    443   836k –:–:– –:–:– –:–:–  859k
 File uploaded successfully
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 2471k  100   249  100 2471k    242  2402k  0:00:01  0:00:01 –:–:– 2444k
 File uploaded successfully

… procesando los datos:

Resetear contraseñas

Entrar como root en Linux:

En lilo:
1. Teclear: linux single
2. Cambiar la contraseña con: passwd
En grub:
1. Pulsar E en Grub.
2. Añadir a la línea «kernel…» lo siguiente: init=/bin/sh Single
3. Pulsar B para arrancar.
4. Remontar en lectura/escritura: mount / -o rw,remount

Cambiar password del root de MySQL:
1. Parar MySQL
2. Ejecutar MySQL como: mysqld --skip-grant-tables --user=root &

3. Entrar en la bd mysql: mysql mysql

4. UPDATE user SET Password=PASSWORD('clavenueva') WHERE user='root';
  flush privileges;
  exit; 
5. Arrancar MySQL

Autenticación NTLM en Alfresco con Active Directory

En muchas ocasiones, aunque el servidor de autenticación sea un Windows 2000 Server, Windows 2003 Server o posterior y sus usuarios estén en el Active Directory no es necesario tener que configurar Alfresco para que autentique como tal vía LDAP/Active Directory.

Windows 2000 y superiores utilizan la autenticación mixta vía LDAP (Active Directory) y TLM v2 y por tanto podemos configurar Alfresco tocando solamente 3 ficheros, que serán:

web.xml
ntlm-authentication-context.xml
file-servers-custom.xml

En Alfresco, este tipo de autenticación donde no solo se usa el protocolo «desafío/respuesta» NTLM sino que además se usa contra una base de datos de usuarios de Windows, para la identificación de cada persona, se le denomina «NTLM passthru».

Se usa ${tomcat} como identificador del punto de comienzo del servidor de aplicaciones que en este caso es Apache-Tomcat.

Primero hay que activar los filtros necesarios para la autenticación vía web en ${tomcat}/webapps/alfresco/WEB-INF/web.xmldescomentando las líneas siguientes:

org.alfresco.web.app.servlet.NTLMAuthenticationFilter

org.alfresco.repo.webdav.auth.NTLMAuthenticationFilter


Authentication
Filter
/navigate/*


Authentication
Filter
/command/*


Authentication
Filter
/download/*


Authentication
Filter
/template/*


Authentication
Filter
/n/*


Authentication
Filter
/c/*


Authentication
Filter
/t/*


Authentication
Filter
/d/*


Authentication
Filter
/ajax/*


Authentication
Filter
/wcs/*


Authentication
Filter
/wcservice/*

Lo mejor es buscar la cadena «NTLM» y a partir de ahí descomentar estas líneas.

El siguiente fichero a configurar es ${tomcat}/share/classes/alfresco/extension/ntlm-authentication-context.xml donde solo hay que establecer el servidor o servidores Windows que contienen el Active Directory.

En este caso, por ejemplo:


MIDOMINIOserv001, serv001


Y por último el fichero ${tomcat}/share/classes/alfresco/extension/file-servers-custom.xml que es el que nos permitirá acceder a los recursos CIFS (SMB) desde Windows o desde Linux. Aquí se configura para usar «passthru» así como los servidores necesarios.

Por ejemplo:



MIDOMINIOserv001, serv001



Con esto ya estaría configurado nuestro sistema para autenticación NTLM y acceso a los recursos vía CIFS/SMB. Bastará con poner en la dirección del navegador de ficheros la dirección del host o servidor Alfresco:

En Windows como \serv001

En Linux, generalmente como smb://srv001

Observaciones: Hay que tener en cuenta que si es un entorno Linux los puertos usados
para los recursos CIFS/SMB (puertos 137, 138, 139 y 445) solo pueden abrirse por el usuario root y no por un usuario sin privilegios de administración. En este último caso habría que utilizar puertos por encima del 1024 reasignándose dentro de la configuración (en el
propio fichero file-servers-custom.xml) y utilizando un sistema de «forwading» o «NAT» con un router.

Firewall en Linux (Ipfwadm, Ipchains… Iptables)

En muchas distribuciones (p.e. en Ubuntu) no vienen ningún firewall configurado y activado por defecto si no lo establecemos expresamente. Hasta Windows XP ya traía uno y aconsultaba al usuario y aconsejaba activarlo…

En linux tenémos un firewall (cortafuegos) que es una verdadera maravilla, podemos hacer de todo hoy día y no tiene nada que envidiar al más robusto sistema de protección y bloqueo de tráfico que haya en el mercado. Pero empecemos por el principio…

En un primer inicio, bajo el kernel 2.0 se utilizó un sistema rudimentario pero muy potente que era Ipfwadm. Este tenía 3 directivas básicas (INPUT, OUTPUT y FORWARD) para controlar el tráfico de entrada, salida y el «reenvío». Potente, sencillo aunque con una sintáxis algo complicada para realiar tareas más avanzadas.

La segunda generación la tenemos en el núcleo 2.2 con Ipchains. Este trae un nuevo concepto, el de las «cadenas de reglas», o lo que es igual, permite las pilas de reglas creadas por el usuario, o sea, podemos hacer una «cadena» de reglas que se llame WEB y que controle todo el tráfico que sea de este tipo.

Además de esto trajo consigo la numeración de reglas por lo que era posible insertar nuevas reglas a las ya existentes, no solo añadirlas.

Junto con la capacidad de filtrar cualquier protocolo (no solo TCP, UDP e ICMP) y la capacidad de usar la «negación» en las reglas le aventajaba en mucho a su antecesor.

Pero vino por fín con la versión 2.4 del kernel de linux (comenzó en realidad en la rama 2.3) Iptables. Una nueva implementación para dotar a los sistemas con kernel linux de un verdadero y potente sistema de firewall con posibilidad de bloquear y denegar tráfico, devolver tráfico de una conexión existente, realizar traslaciones de direcciones, enrutar, y dos aspectos muy importantes, implementar un sistema SPI o Stateful Packet Inspection (Inspección de Paquetes de Estado) y de QoS (Quality of Service) o Calidad del Servicio.

En el caso del SPI ahora es posible asociar el tráfico devuelto generado a partir de una regla input anterior, en Ipchains hacían falta 6 reglas para enrutar entre dos interfaces.

Además al llevar una «inteligencia» en la gestión de los paquetes mediante este SPI tiene una ventaja adicional, es que mantiene el control de sesiones de tráfico, de forma que aunque un atacante pueda fabricar paquetes que simulen paquetes de un protocolo determinado como devueltos, (Ipchains podía permitir dicho tráfico) como no existe una sesión para dichos paquetes se rechazarán.

Como únicamente la cadena FORWARD controla cualquier paquete para ser reenviado, INPUT y OUTPUT solo se aplican para entrar o salir del host, se reduce mucho el número de reglas a incluir en nuestro sistema.

La instalación de Iptables requiere la compilación del kernel si no están configuradas, pero hoy día están dentro de todos los kernels por defecto de las distribuciones así que no hay que preocuparse. Además cada distribución realiza una gestión de las reglas a su manera, pe. es de considerar la de CentOS (evidentemente también Fedora y RedHat) que se implementan de forma sencilla pero efectiva.

Como Ubuntu no trae esta bonita configuración (la de CentOS) hay que ponerse manos a la obra, lo mejor es ponerla en el rc.local si no somos muy paranóicos o crearnos un sistema de arranque/parado dentro de /etc/init.d dentro de los niveles de arranque que necesitemos y (si no usamos referencias a hosts sino solo a IPs) hacer que arranque antes de que lo hagan las interfaces de red. El primer sistema está bien para portátiles y ordenadores de escritorio pero para servidores es más que recomendable la segunda opción.

Se pueden realizar multitud de configuraciones y espero ir poniendo aquí algunas complejas que controlen no solo tráfico o enrutamiento, sino también «Throughput», «Reliability», etc. dentro de un sistema basado en QoS.

Por lo pronto yo uso dos en mi portátil, una para utilizarla como sistema básico de cortafuegos, hay que tener en cuenta que uso dos interfaces (bueno tres como veréis más abajo) que son la ethernet cableada y la wifi. Como soy quisquilloso con eso, activo una u otra y dejo pasar tráfico a mi sistema de una u otro como yo quiera. Además de esto utilizo los flags largos y no los cortos porque así (consejo de un amigo) se aprende uno mejor la sintáxis de los comandos. Este es por tanto mi fichero firewall_on.sh

#!/bin/sh
#
# Firewall sencillo
# fegor
#
# eth0 -> Ethernet cableada
# eth1 -> Ethernet inalámbrica
#
# Evitar ecos de ICMP, ataques SYN floods y otras medidas
# de protección
#
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter
echo 1 > /proc/sys/net/ipv4/conf/all/log_martians
#
# Limpieza
#
iptables –delete-chain
iptables –flush
iptables –table nat –flush
#
# Permitir tráfico loopback
#
iptables –append INPUT –in-interface lo –jump ACCEPT
iptables –append OUTPUT –out-interface lo –jump ACCEPT
#
# Políticas por defecto
#
iptables –policy INPUT DROP
iptables –policy OUTPUT DROP
iptables –policy FORWARD DROP
#
# Permitir tráfico establecido de entrada e
# ilimitado de salida
#
iptables –append INPUT –match state –state ESTABLISHED,RELATED –jump ACCEPT
iptables –append OUTPUT –match state –state NEW,ESTABLISHED,RELATED –jump ACCEPT
#
# Permitir entradas selectivas (ssh, http, etc.)
#
iptables –append INPUT –in-interface eth0 –protocol tcp –syn –match state –state NEW –source 0/0 –destination 0/0 –destination-port 22 –jump ACCEPT
iptables –append INPUT –in-interface eth1 –protocol tcp –syn –match state –state NEW –source 0/0 –destination 0/0 –destination-port 22 –jump ACCEPT
# Permitir entradas EMule/AMule
iptables –append INPUT –in-interface eth0 –protocol tcp –syn –match state –state NEW –source 0/0 –destination 0/0 –destination-port 4662 –jump ACCEPT
iptables –append INPUT –in-interface eth0 –protocol udp –source 0/0 –destination 0/0 –destination-port 4672 –jump ACCEPT
#
# Rechazar finalmente el tráfico restante
#
iptables –append INPUT –jump DROP

Otro script qu utilizo es para enrutar mi USB Modem 3G y hacer que cualquier otro ordenador salga a través de mi portátil. Para ello hay que activar el enrutamiento y hacer el FORWARD pertinente. Este es mi router_on.sh

#!/bin/sh
#
# Enrutar tráfico de los demás a internet
# fegor
#
# eth0 -> Ethernet cableada
# eth1 -> Ethernet inalámbrica
# ppp0 -> Modem USB 3G
#
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables –flush
iptables –table nat –flush
iptables –table nat –append POSTROUTING –out-interface ppp0 -j MASQUERADE
iptables –append FORWARD –in-interface eth0 -j ACCEPT
iptables –append FORWARD –in-interface eth1 -j ACCEPT

Y eso es todo, no pretende ser un manual de Iptables, ni guia, ni tutorial, ni nada más que lo que habéis leído. Para saber más:

Enlaces:

http://www.netfilter.org/
http://es.wikipedia.org/wiki/Iptables
http://www.linuca.org/body.phtml?nIdNoticia=99
http://www.bulma.net/body.phtml?nIdNoticia=1522

Bibliografía:

Firewalls (Manual de referencia)
Keith E. Strasberg, Richard J. Gondek y Gary Rollie
Edit. Mc Graw Hill

Información dentro de la propia distribución linux que tengáis:

man iptables
iptables –help