Configuración de router pfSense con Internet de fibra Orange

Voy a describir cómo configurar un router neutro con la conexión a Internet FTTH de Orange en España. El router en cuestión tiene el sistema pfSense basado en FreeBSD.

Continue reading Configuración de router pfSense con Internet de fibra Orange

Advertisements

IPsec and PMTU problems

This post has a very good explanation of the problems I’ve been suffering with my IPsec tunnels recently:

MTU woes in IPsec tunnels and how you can fix it

Two things have fixed my stalled transmissions over IPsec tunnels:

  1. Clamping the MSS of the IPsec connections to 1280
  2. Setting the sysctl net.ipv4.tcp_mtu_probing=1

As seen in this post, the values of net.ipv4.tcp_mtu_probing are:

 0 - Disabled
 1 - Disabled by default, enabled when an ICMP black hole detected
 2 - Always enabled, use initial MSS of tcp_base_mss.

Obtener un prefijo IPv6 con gogoc en Fedora

En mi post anterior, expliqué cómo conectar de forma anónima una sola máquina con el broker IPv6 Freenet6.net. Ahora os voy a contar cómo obterner un prefijo /64 y repartir direcciones a nuestra red local.

Voy a asumir que tenemos el paquete gogoc instalado y hemos configurado la opción “-y” en /etc/sysconfig/gogoc. Además necesitamos crear una cuenta en Freenet6.

Con estos prerequisitos cumplidos, editamos el fichero /etc/gogoc/gogoc.conf y modificamos las siguientes líneas:

# Nuestra cuenta en Freenet6.net
userid=mi_usuario
passwd=mi_password

# Especificar un servidor en concreto nos permite tener siempre el mismo prefijo.
# Podemos usar también authenticated.freenet6.net
server=amsterdam.freenet6.net
auth_method=any

# Solicitamos un prefijo /64
host_type=router
prefixlen=64
# Aquí hay que poner el interfaz de red donde queremos anunciar el prefijo
if_prefix=p6p1

De esta forma cuando arranquemos el servicio, obtendrá un prefijo /64 y ejecutará el demonio radvd que lo anunciará en la red, permitiendo que todos los dispositivos que soporten la autoconfiguración IPv6 obtengan una dirección IPv6 pública.

# systemctl start gogoc.service
# systemctl status gogoc.service
gogoc.service - Freenet6.net tunnel client to IPv6
Loaded: loaded (/lib/systemd/system/gogoc.service; disabled)
Active: active (running) since Tue, 24 Apr 2012 13:10:24 +0200; 7min ago
Main PID: 8223 (gogoc)
CGroup: name=systemd:/system/gogoc.service
├ 8223 /usr/bin/gogoc -f /etc/gogoc/gogoc.conf -y
├ 8260 /usr/sbin/radvd -u radvd -p /var/run/radvd/radvd.pid -C /var/run/gogoc/gogoc-rtadvd.conf
└ 8261 /usr/sbin/radvd -u radvd -p /var/run/radvd/radvd.pid -C /var/run/gogoc/gogoc-rtadvd.conf

Obtener una dirección IPv6 con Freenet6 en Fedora

Después de un tiempo aprendiendo a hacer paquetes RPM, me he decidido a unirme al grupo de empaquetadores de Fedora y hace poco he subido mi primer programa: el cliente gogoc para el broker de IPv6 freenet6.net.

Este programa negocia un túnel por UDP contra los servidores de freenet6, y te asigna una IPv6 dinámica. También es posible solicitar un prefijo estático, con lo que podrás dar direcciones IPv6 a toda tu red, pero para esto hace falta registrarse en http://gogonet.gogo6.com/page/freenet6-registration

El proceso para conectarse de forma anónima es muy sencillo:

Instalamos el paquete gogoc.

# yum install gogoc

Configuramos que acepte las claves públicas de los servidores.

# vim /etc/sysconfig/gogoc

# Add command line options to the gogoc daemon
#
# Add "-y" to accept automatically the server keys,
# otherwise you will have to add them to /var/lib/gogoc/gogockeys.pub
GOGOC_OPTS=-y

Arrancamos el servicio:

# systemctl start gogoc.service

Y ya está, en cuanto conecte nos tiene que añadir un nuevo interfaz tun, donde podemos ver que tiene configurada una IPv6 con ámbito global:

tun       Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet6 addr: 2001:5c0:1400:a::f8b/128 Scope:Global
UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1280  Metric:1
RX packets:6 errors:0 dropped:0 overruns:0 frame:0
TX packets:3 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:500
RX bytes:416 (416.0 b)  TX bytes:469 (469.0 b)

Podemos comprobar nuestra conectividad en http://test-ipv6.com/ o haciendo un ping:

# ping6 -n ipv6.google.com
PING ipv6.google.com(2a00:1450:4003:802::1012) 56 data bytes
64 bytes from 2a00:1450:4003:802::1012: icmp_seq=1 ttl=53 time=210 ms
64 bytes from 2a00:1450:4003:802::1012: icmp_seq=2 ttl=53 time=141 ms
64 bytes from 2a00:1450:4003:802::1012: icmp_seq=3 ttl=53 time=119 ms
64 bytes from 2a00:1450:4003:802::1012: icmp_seq=4 ttl=53 time=134 ms
64 bytes from 2a00:1450:4003:802::1012: icmp_seq=5 ttl=53 time=125 ms
64 bytes from 2a00:1450:4003:802::1012: icmp_seq=6 ttl=53 time=157 ms
^C
--- ipv6.google.com ping statistics ---
6 packets transmitted, 6 received, 0% packet loss, time 5005ms
rtt min/avg/max/mdev = 119.163/148.030/210.544/30.535 ms

En caso de que no conecte, lo más probable es que el broker esté caído. Para diagnosticar los problemas, podemos habilitar el debug en /etc/gogoc/gogoc.conf poniendo la línea log_file=3 , de esta forma tendremos habilitado el log verboso en /var/log/gogoc/gogoc.log

Si queremos que nos conecte automáticamente en cada reinicio, debemos habilitar el servicio:

# systemctl enable gogoc.service

Recordad repasar vuestro firewall, ya que con esta IP vuestro equipo está directamente accesible desde Internet, sin el habitual NAT que dan los routers de conexión a Internet.

En otro post, explicaré cómo obtenet un prefijo /64 y repartir direcciones IPv6 a toda nuestra red mediante el demonio radvd.

También os recuerdo que los principales proveedores de contenido en Internet planean ofertar sus servicios de forma definitiva en IPv6 a partir del 6 de Junio de 2012, en el World IPv6 Lauch. Por el bien de Internet, colaboremos entre todos para que el despliegue de IPv6 sea un éxito.

Configurar túnel IPv6 en Fedora

Aún falta un poco hasta que los proveedores de acceso a Internet nos asignen un rango IPv6 en cada router, sobre todo en España, donde nos venden a precio de oro una conexión del siglo pasado.

Estos últimos días he estado configurándome un túnel IPv6-en-IPv4 de Hurricane Electrics, y la verdad es que funciona muy bien. Os cuento como he hecho la configuración en Fedora 16:

Lo primero de todo es darse de alta y solicitar un túnel, se nos asignará un IP y un rango /64 para nuestra red local. En la página de información detallada de nuestro túnel vienen todos los datos que vamos a necesitar.

Es muy importante que nuestro router de acceso a internet nos reenvíe los paquetes IP protocolo 41 a nuestra IP interna. Por ejemplo mi router no soporta la opción explícitamente, ya que en los reenvíos del NAT sólo permite los protocolos TCP y UDP. Para que funcione he tenido que añadir mi ordenador en la “DMZ” que permiten configurar estos routers. Para añadir la regla al iptables del equipo:

# iptables -A INPUT -p 41 -j ACCEPT

Creo el fichero /etc/sysconfig/network-scripts/ifcfg-he-ipv6:

NAME="Hurricane Electric IPv6 tunnel"
DEVICE="he-ipv6"
TYPE=sit
BOOTPROTO=none
ONBOOT=yes
NM_CONTROLLED=no
IPV6INIT=yes
IPV6TUNNELIPV4=216.66.84.46 # Server IPv4 address
IPV6ADDR=2001:470:1e28:37a1::2/127 # Client IPv6 address
DNS1=2001:470:20::2

En el fichero /etc/sysconfig/network añado las siguientes líneas:

IPV6_DEFAULTDEV=he-ipv6
IPV6FORWARDING=yes

En /etc/sysctl.conf habilito el forwarding para el protocolo IPv6:

# IPv6 packet forwarding
net.ipv6.conf.all.forwarding = 1

Instalo el demonio radvd pra que anuncie el prefijo en la red local:

# yum install radvd

Edito el fichero /etc/radvd.conf y añado el prefijo /64 que nos indica la página de tunnelbroker.

interface p6p1 {
   AdvSendAdvert on;
   MinRtrAdvInterval 30;
   MaxRtrAdvInterval 100;
   prefix 2001:470:1e29:37a1::/64 {
      AdvOnLink on;
      AdvAutonomous on;
      AdvRouterAddr off;
   };
   RDNSS 2001:470:20::2 { };
};

Para que el túnel se levante al arrancar el equipo es necesario tener el servicio network activado. También habilito el servicio radvd.

# systemctl enable network.service radvd.service
# systemctl start network.service radvd.service

Por último he creado un script para actualizar mi IP pública en tunnelbroker. Lo he ubicado en /root/bin/he-ipv6.sh:

#!/bin/sh
USERNAME="username"
PASSWORD="mi_password"
TUNNEL_ID="123456"
/usr/bin/curl --silent --user ${USERNAME}:${PASSWORD} "https://ipv4.tunnelbroker.net/nic/update?hostname=${TUNNEL_ID}" > /dev/null 2>&1

Con crontab -e lo programo para ejecución en cada arranque:

@reboot        /root/bin/he-ipv6.sh

Acordaros también de repasar las reglas de iptables e ip6tables, ya que ahora tenéis todos los puertos por IPv4 redirigidos a vuestro ordenador y direcciones IPv6 públicas, por lo que podéis ser contactados directamente desde internet.

Para probar que todo funciona correctamente podéis hacer un ping por IPv6:

$ ping6 ipv6.google.com
PING ipv6.google.com(mad01s09-in-x12.1e100.net) 56 data bytes
64 bytes from mad01s09-in-x12.1e100.net: icmp_seq=1 ttl=55 time=120 ms
64 bytes from mad01s09-in-x12.1e100.net: icmp_seq=2 ttl=55 time=135 ms
64 bytes from mad01s09-in-x12.1e100.net: icmp_seq=3 ttl=55 time=186 ms
64 bytes from mad01s09-in-x12.1e100.net: icmp_seq=4 ttl=55 time=128 ms
64 bytes from mad01s09-in-x12.1e100.net: icmp_seq=5 ttl=55 time=127 ms
^C
--- ipv6.google.com ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4006ms
rtt min/avg/max/mdev = 120.754/139.764/186.314/23.748 ms

También es muy útil la página test-ipv6.com para comprobar varios aspectos de la conexión. Debería daros una nota de 10/10.

Instalación de servidor OpenVPN

Después de leer las últimas noticias sobre CarrierIQ me he decidido a rootear mi teléfono Android e instalar CyanogenMod 7.1 para quitarme la ROM del operador y poder tunelizar las conexiones por VPN. No me voy a explayar en el proceso de rooteado del teléfono (un HTC Desire) ya que hay muchas guías que lo explican y con unrevoked es muy sencillo.

Voy a explicar cómo configurar un servidor VPN para poder usarlo desde el teléfono.

Continue reading Instalación de servidor OpenVPN

Control de ancho de banda en Linux

En casa tengo la típica línea ADSL, y ya llevaba tiempo dándole vueltas a varios problemas de latencia y velocidad que estaba sufriendo cuando conectaba aMule, Transmission o similares. Cuando estaba usando estos programas P2P, la navegación se ralentizaba hasta extremos desesperantes, muchas veces lo que más le costaba era la resolución DNS de las páginas, algo que tendría que ser lo más rápido posible.

Para mejorar la situación he creado un script basándome en el fantástico Wonder Shaper, un script que usa el algoritmo HTB para asegurar un ancho de banda a las clases que definamos. La principal diferencia es que wonder shaper está pensando para un equipo que tenga conexión directa a Internet con una IP pública asignada, y mi script está diseñado para un equipo con una IP privada dentro de la LAN, que es la configuración habitual de los routers ADSL. Por supuesto, esta aproximación solo funciona bien si nuestro equipo es el único en la red local, ya que si otros hosts están generando tráfico, llenaremos el buffer del router y no conseguiremos nada.

Podéis descargar la última versión aquí: https://raw.github.com/jorti/wondershaper/master/90-wshaper
O clonar el repositorio con:  git clone git://github.com/jorti/wondershaper.git

Para instalarlo hay que copiar el script en /etc/NetworkManager/dispatcher.d  y hacerlo ejecutable. También hay que editarlo y configurar las variables adecuadas, como el interfaz, el rango IP de nuestra red interna y los anchos de banda de la LAN y de Internet, este último es especialmente importante que esté ajustado a un valor algo menor que el real, para no usar el buffer del router si no el de nuestra máquina y de este modo poder controlar la latencia.

Si se ejecuta con el parámetro status, nos muestra toda la información de los qdiscs, classes, filters y reglas iptables. De esta forma podemos ver las estádisticas de uso y asegurarnos que está funcionando bien. Me gustaría también configurar algún tipo de monitorización, pero esto será para más adelante.

Con este script he conseguido reducir la latencia considerablemente y puedo navegar de forma fluida mientras hago uso de programas P2P. Si queréis profundizar más en el tema, es imprescindible el howto de Linux advanced routing and traffic control. Espero que os sirva.