Thinking on hiring me?

Please read

Fernando Guillén

a Freelance Web Developer

cabecera decorativa

software development as an artistic expression

Archive for the ‘tutorial’ Category

Jueves, Septiembre 18th, 2008

Port Forwarding: accediendo a las máquinas de una intranet desde una sóla máquina pública.

Las redes de los clientes son celosas y normalmente sólo se puede acceder a las máquinas de su red desde dentro de la red misma. Lo que viene a llamarse una intranet.

Pero muchas de mis tareas de mantenimiento requieren acceso a varias máquinas de una intranet y desplazarme al cliente no lo veo una opción factible ni acorde con nuestros tiempos.

Una de las soluciones que más me ha gustado es pedirle al cliente un sólo acceso, una sola máquina con IP pública.

Para dar seguridad se puede configurar para que sólo se pueda acceder desde la IP estática de tu oficina, y, para ofrecer flexibilidad, que también se pueda acceder desde la IP estática de tu servidor en un datacenter. Pero bueno todo este párrafo te lo puedes saltar si no hay mucho inconveniente con la seguridad.

La máquina con la IP pública mola que sea linux, más que nada porque si no lo es ya no hace falta que sigas leyendo pues el resto del artículo sobreentiende esta premisa.

Lo que vamos a hacer es lo que se ve en la ilustración.

port forwarding

Aquí me ves a mí con más pelo y sin barba deseando acceder a todos los servicios de las máquinas de la intranet 10.10.10.* y sin embargo sólo pudiendo acceder a la máquina con la IP pública 205.205.205.205.

Lo que necesito tiene un nombre y este es Port Forwarding, y la implementación de esto más sencilla que he visto se hace mediante IP Tables.

Va a ser más rápido escribir los comandos que hay que ejecutar para que esto funcione que toda la charla previa que te he contado.

Mi máquina con acceso público tiene la distribución de linux Gentoo así que los ejemplos son para esta distro pero no deberían variar mucho para otras distros.

Instalamos iptables (si no está ya)

# emerge iptables

Le decimos al kernel que permita ip-forwarding

# echo 1 > /proc/sys/net/ipv4/ip_forward

Flasheamos toda la configuración de iptables que haya por defecto

# iptables -F
# iptables -t nat -F

Permitimos el forward desde iptables (eth0 es la interface pública)

# iptables -A FORWARD -i eth0 -j ACCEPT
# iptables -A FORWARD -o eth0 -j ACCEPT

Esto hace que las ips se enmascaren para no liar a los routes y saltarse posibles filtros de seguridad por IP

# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Y aquí por fín las reglas del Port Forwarding

# iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 213306 -j DNAT --to-destination 10.10.10.21:3306
# iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 2180 -j DNAT --to-destination 10.10.10.21:80
# iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 2280 -j DNAT --to-destination 10.10.10.22:80
# iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 2221 -j DNAT --to-destination 10.10.10.22:21
# iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 2322 -j DNAT --to-destination 10.10.10.23:22

Guardamos la configuración de iptables actual para que no haya que reescribirla al reiniciar

# /etc/init.d/iptables save

Ponemos el servicio de iptables para que arranque al inicio

# rc-update add iptables default

Creo que esto también hay que hacerlo

# vim /etc/sysctl.conf

Añadir/descomentar las siguientes líneas:

net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 1

Y ya debería funcionar. Si me voy a mi máquina en mi oficina y accedo a:

$ mysql -h205.205.205.205 -P 213306

Me encontraré con la mysql de la máquina 10.10.10.21.

Si accedo con un navegador a:

http://205.205.205.205:2280

Me encuentro con el Apache de la máquina 10.10.10.22.

Si no te funciona revisa la linkografía:

Miércoles, Agosto 27th, 2008

Ruby, uso de caracteres no ASCII en la consola IRB del Mac OS X

Mis versiones:

  • Mac OS X 10.5.4
  • Ruby 1.8.6 patchlevel 114
  • Rails 2.1.0

Tengo problemas para introducir caracteres no ASCII ( caracteres especiales, acentos y ñs ) en la consola IRB de Ruby así como también en la consola script/console de Rails.

Gracias a las lista ror-es lo he podido solucionar.

Resumo aquí a mi manera el post con la solución:

Instalamos la versión universal de la librería readline mediante MacPorts:

$ sudo port install readline +universal

Si te dá error de:

-bash: port: command not found

Asegúrate que tienes instalados los MacPorts y que tienes esto en tu .bash_profile:

export PATH=$PATH:/opt/local/bin
export MANPATH=$MANPATH:/opt/local/share/man
export INFOPATH=$INFOPATH:/opt/local/share/info

Instalamos la extesión Ruby para readline. Vigila la versión que te bajas, debe coincidir con tu versión de Ruby exactamente:

$ ruby --version
ruby 1.8.6 (2008-03-03 patchlevel 114) [universal-darwin9.0]

v1_8_6_114

$ cd /tmp
$ svn co http://svn.ruby-lang.org/repos/ruby/tags/v1_8_6_114/ext/readline/ readline

Aplicamos un parchecito:

$ curl http://pastie.textmate.org/pastes/168767/download | patch readline/extconf.rb

Y compilamos, necesitarás tener instaladas las OS X developer tools:

$ cd readline
$ ruby extconf.rb
$ make
$ sudo make install

Si el script/console te sigue dando problemas asegúrate de tener bien la $KCODE:

$ script/console
Loading development environment (Rails 2.1.0)
>> puts $KCODE
UTF8
=> nil

Gracias de nuevo a Daniel Rodriguez Troitiño por la solución.

Jueves, Febrero 14th, 2008

Alberto Knapp Bjeren, The Cocktail, El Iniciador y charla magistral

Ayer asistí a una charla magistral desde el cerebro del equipo de The Cocktail impulsada por El Iniciador.

Vaya lío de párrafo que me ha quedado.

Eran las cuatro y media de la tarde cuando me enteré que en El Iniciador de este miércoles iba a venir el director de orquesta de The Cocktail. La gente de The Cocktail son ahora mismo para mí la más interesante en España en lo que ha desarrollo web se refiere.

La impresión que me trasmiten es que son nuestros 37Signals nacionales.

Dejé todo lo que estaba haciendo, cogí mi cuaderno y me lancé al metro para escuchar lo que Alberto quería decirnos.

La charla se titulaba nomeacuerdocomo pero eso daba igual, lo que importaba era mantenerlo hablando y estar atentos para recoger cualquier perla de sabiduría que se le escapara.

Perlas que dejó caer voluntariamente o no:

* La plataforma Apple es uno de los productos más sobre valorados.

* La usabilidad es el equilibrio entre lo que pides al usuario y lo que le das como recompensa. No importa pedirle si le vas enseñando qué es lo que ha conseguido poco a poco.

* Los productos que funcionan son los que no sorprenden al usuario. Se refiere en este punto a que el usuario se siente mejor si se puede hacer unas expectativas del producto nada más verlo. Los productos innovadores producen desconcierto en el usuario, incomodidad y rechazo. Aquí podemos añadir que siempre hay innovación que triunfa, hay una verdad en cada frase.

* Los diagramas de gantt y los projects sólo sirven para saber a quién cortar la cabeza si algo falla.

* Los proyectos de la web de hoy se hacen entre poca gente, con mucha libertad, sin projects sino con demostraciones de avances periódicos.

* Defendió la beta pública sobre la beta privada, discrepé un poco con él al respecto.

* Trucos para crear revuelo mediático: no te anuncies cuando sales sino cuando llevas un año: aguantar es la verdadera noticia, entrega una funcionalidad nueva cada mes, dales caramelos a las familias de freekies: saca algo especial para los de Mac o los de Linux, esto hará que se pongan de tu parte y son expertos evangelizadores.

* Confiar ciegamente en que un modelo web que funcione en los USA vaya a funcionar en el mercado español es un gran error, la cultura de la opinión no está arraigada en España. Remató diciendo que los españoles estamos acostumbrados al sufrimiento y la resignación no a quejarnos y opinar. Esto está profundamente arraigado en nuestra memoria católica.

* Una característica que aprecia en un programador es la responsabilidad por encima de la experiencia. Una persona no responsable requiere ser supervisada por mucha experiencia que tenga no encajará bien en los modelos ágiles de desarrollo de software.

* Se le escapó alguna alusión cómico-reprochista a las grandes consultoras, se le notaba como se auto censuraba al poco.

* .. Y mucho más que se me olvida.

De todos modos no sólo eran los puntos que tocaba sino todo el contexto y ejemplos en los que nos metía, se notaba que estaba cómodo que no tenía que impresionar a nadie, que la verdad está en lo humano y lo cercano y que la verdad es lo auténtico.

De verdad que salí encantado.

A lo largo de toda la charla no pude evitar sentir que Alberto me recordaba a alguien:

Alberto Knapp y Pablo Carbonell

Respeto enormemente la labor profesional de mis dos escogidos. Si alguien se siente ofendido no tiene más que decirlo.

En cualquier caso esto lo hago por el humor… viva el humor¡ :)

Viernes, Agosto 17th, 2007

Compartir el escaner en red

Cada vez me quedo más maravillado con esto del Ubuntu (6.10).

Ahora estoy con una impresora multifunción HP F380 instalándola en el servidor de la oficina para que pueda ser accesible desde cualquier terminal instalada en la intranet.

No voy a entrar en pormenores con la instalación de la modalidad impresora por que ha sido un “Instalar nueva impresora > siguiente > siguiente > siguiente”, tampoco voy a explicar como se instala el escaner en modo local por que ni siquiera se instala, simplemente abres el Gimp y “Archivo > Adquirir > Xsane > Device Dialog” y él solito te encuentra el escaner instalado en local y te abre la interface de escaneado.

Lo que sí tiene un pelín de ‘consola’ es configurar el escaner en modo servidor y atender peticiones de los clientes de la red.

Instalar servidor

Instalamos los paquetes necesarios

  • sane
  • sane-utils
  • xinetd

Ya sea mediante el gestor de paquetes gráfico o en consola:
$ sudo aptitude install xinetd sane sane-utils

Retocamos los ficheros de configuración

Añadimos la red de nuestra intranet en el /etc/sane.d/saned.conf:
$ sudo echo "192.168.1.0/24" >> /etc/sane.d/saned.conf

Configuramos el servicio saned para que lo arranque xinetd, para ello creamos un fichero llamado /etc/xintetd.d/saned y escribimos esto:
service sane
{
disable = no
socket_type = stream
wait = no
user = saned
group = saned
server = /usr/sbin/saned
protocol = tcp
}

Comprobamos que el puerto que usará nuestro servicio saned está bien configurado:
$ grep "sane" /etc/services
sane-port 6566/tcp sane saned # SANE network scanner daemon

Reiniciamos xinetd por si acaso:
$ sudo /etc/init.d/xinetd restart

Instalación de los clientes

Instalamos los paquetes necesarios

  • sane
  • sane-utils

Ya sea mediante el gestor de paquetes gráfico o en consola:
$ sudo aptitude install sane sane-utils

Le decimos a saned del cliente dónde está nuestro servidor

$ sudo echo "ip_servidor_escaner" >> /etc/sane.d/net.conf

Ya está

Vamos al Menú > Aplicaciones > Gráficos > Xsane

Resolución de problemas

Comprueba que el puerto 6566 está a la escucha

En el servidor:
$ telnet localhost 6566

En el cliente:
$ telnet ip_servidor_con_escaner 6566

Mira el log de xinetd en SYSLOG

En el servidor:
$ tail -f /var/log/syslog

Sin soltar esta consola abre otra y reinicia xinetd para ver que dice:
$ sudo /etc/init.d/xinetd restart

Comprueba que el servidor detecta el escaner


$ scanimage -L
device `hpaio:/usb/Deskjet_F300_series?serial=CN74PGY0Q304KH' is a hp HP Deskjet F300 series multi-function peripheral

Comprueba que el cliente detecta el escaner


$ scanimage -L
device `net:willie.constela:hpaio:/usb/Deskjet_F300_series?serial=CN74PGY0Q304KH' is a hp HP Deskjet F300 series multi-function peripheral

Comprueba el log del saned

Para xinetd:
$ sudo /etc/init.d/xinetd stop

Inicia saned en consola con debug:
$ saned -d20

Desde cliente haz peticiones:
$ scanimage -L

Sitios de referencia

Castellano

English

a Freelance Web Developer is proudly powered by WordPress
Entries (RSS) and Comments (RSS).

Creative Commons License
Fernando Guillen's blog by Fernando Guillen is licensed under a Creative Commons Attribution-NoDerivs 3.0 Unported License.