Xarx.es

Dèries. La meua llibreta d'anotacions.

Tunel Entre RouterOs-Mikrotik Y AirOs-Ubiquiti

Una de las útilidades claras de guifi.net es enlazar ubicaciones con túneles sin hacerlo a través de Internet.

En el caso que me ocupa se trata de dos nodos en los que los trastos corresponden a un Routerboard RB750 y a un MaxLink, integrado por un Wispstation5 de Ubiquiti.

Entre las referencias contaba con:

Entre esto y la ayuda de David Rubert he conseguido establecer un tunel gre y que funcione.¡Aleluya!

Primero lo intenté con pptp. Configuré el servidor en el mikrotik y, aunque no pude usar la wispstation5 como cliente si que pude hacerlo con otros clientes (móvil con Android, portatil con GNU-Linux y Network-manager).

Finalmente la configuración quedó básicamente como la que me sugería David… Suponemos que las direcciones de los extremos guifi-públicas son 10.x1.y1.z1 y 10.x2.y2.z2 mientras que las direcciones que asignamos en el túnel son 172.16.1.1/30 y 172.16.1.2/30. También usaremos 10.x2.y2.z3, el gw del extremo del airOs hacia guifi.net

En el routeros creamos la interface del tunel (de tipo GRE). Los datos importantes para ello son las ip de los extremos (públicas o guifi-públicas), la nueva mtu y el nombre del túnel. Después asignamos la ip al extremo del túnel en el lado local (el del rb750)

  /interface gre add local-address=10.x1.y1.z1 mtu=1524 name=tunel0 remote-address=10.x2.y2.z2
  /ip address add address=172.16.1.1/30 interface=tunel0 network=172.16.1.0

Si queremos salir a internet a través del túnel deberemos añadir una regla de firewall que enmascare la ip de origen (haciendo NAT) y una ruta por defecto al gw de Internet. Después haremos algo parecido en el otro extremo. En el AirOs lo que debemos hacer es crear o modificar el rc.poststart. Para ello entramos vía ssh al airOs y entonces hacemos:

  vi /etc/persistent/rc.poststart

en este archivo incluimos lo siguiente:

  # gw a guifi.net por z3
  ip route add 10.0.0.0/8 via 10.x2.y2.z3 
  # creamos tunel y levantamos
  ip tunnel add tunel0 mode gre local 10.x2.y2.z2 remote 10.x1.y1.z1
  ip link set tunel0 up
  # asignamos ip del tunel
  ip addr add 172.16.1.2/30 dev tunel0
  # default gw por tunel0 (extremo remoto)
  ip route del default
  ip route add default via 172.16.1.1 dev tunel0
  # hacemos NAT en el tunel
  iptables -t nat -A POSTROUTING -o tunel0 -j MASQUERADE

Grabamos :wq :-), hacemos que sea ejecutable y que esta configuración sea permanente. Finalmente reiniciamos el trasto.

  chmod +x /etc/persistent/rc.poststart
  cfgmtd -w -p /etc/ 
  reboot

Como comentario añadido podemos hablar del MTU. Haciendo que llegue a 1524 no habrá que trocear tramas. Otra opción sería modificar, usando una regla de mangle, el parámetro MSS en el establecimiento de las conexiones tcp, tal como sugiere Emilio. En el caso del routeros se puede hacer como se comenta en minihowto.com o en el wiki de mikrotik

Alias IP Con Network Manager

Origen: http://askubuntu.com/questions/217357/multiple-ips-for-a-single-wireless-nic

Aunque en el artículo original se hable solo de wireless lo que se incluye es válido para cualquier conexión usable a través de NetworkManager

Para lo que sigue se asume que se utiliza NetworkManager,que las conexiones (cableadas o inhalámbricas) ya se han configurado usando DHCP y que se trata de IPv4.

Aunque no se pueden configurar, esperemos que solo de momento, las direcciones estáticas en en el GUI de NetworkManager hay un truco para hacerlo.

  • Averiguar los dispositivos disponibles

    $ nmcli dev
    
  • Encontrar el UUID de la conexión que nos interesa configurar

    $ nmcli con
    
  • Añadir un script en /etc/NetworkManager/dispatcher.d/, ej 98AliasIP.sh, conteniendo lo siguiente:

/etc/NetworkManager/dispatcher.d/98AliasIP.sh
1
2
3
4
5
6
7
8
9
10
11
   #!/bin/bash
    # interfaz wlan0, conexión correspondiente a ese UUID
    #  solo añade el/los alias cuando esa conexión está activa
    WLAN_DEV=wlan0
    MYCON_UUID=31c48409-e77a-46e0-8cdc-f4c04b978901
    if [ "$CONNECTION_UUID" == "$MYCON_UUID" ]; then
        # add alias for Network 1: 192.168.0.123/24
        ifconfig $WLAN_DEV:0 192.168.0.123 netmask 255.255.255.0 up
        # add alias for Network 2: 192.168.1.123/24
        ifconfig $WLAN_DEV:1 192.168.1.123 netmask 255.255.255.0 up
    fi
  • Asegurarse de que el script tiene los permisos adecuados (chmod +x /path/to/script.sh) y rearrancar NetworkManager:

    $ sudo service network-manager restart
    

Una vez se active la conexión se añadiran los 2 alias configurados. Puede comprobarse usando /sbin/ifconfig o ip addr show.

Arrancar Gparted O Clonezilla Live Desde El Disco Duro Con Grub O Grub2

En un equipo como el mini-servidor del que vengo hablando donde no tenemos lector de cd/dvd, floppy, usb ni otros periféricos, aparte de interfaz de red.

Una forma de utilizar Gparted o Clonezilla es bajar la Live y arrancarlos desde el bootloader previo (grub o grub2)

Grub2 puede iniciar archivos iso almacenados en alguna partición que pueda leer (fat, ext2, ext3,…).

La primera parte es común… Iniciar el SO previo, bajar el zip y descomprimirlo…

wget "http://downloads.sourceforge.net/project/gparted/gparted-live-stable/0.14.1-6/gparted-live-0.14.1-6-i686-pae.zip?r=&ts=1361810860&use_mirror=switch" -O gparted-live-0.14.1-6-i686-pae.zip
o 
wget "http://downloads.sourceforge.net/project/clonezilla/clonezilla_live_stable/2.0.1-15/clonezilla-live-2.0.1-15-i686-pae.zip?r=&ts=1361816054&use_mirror=ignum" -O clonezilla-live-2.0.1-15-i686-pae.zip

Supongamos que disponemos de grub como gestor de arranque y una partición fat en hda4 donde pondremos GParted Live/Clonezilla Live. Comenzaremos descomprimiendo los archivos en esa partición.

mount /dev/hda4 ./tmpmnt
unzip *-live-*.zip -d tmpmnt
mv tmpmnt/live tmpmnt/live-hd

Si no se cambia el nombre del directorio de “live” a “live-hd”, por ejemplo, pueden encontrarse problemas si se tiene una versión en el disco duro y se quiere arrancar otra live, en CD o USB.

GParted Live

A continuación podemos añadir una entrada en menu.lst de grub o, si queremos hacerlo desde la linea de comando de grub teclearemos algo muy similar cuando arranquemos.

Para GRUB 1.x (Legacy) editaremos el /boot/grub/menu.lst añadiendo lo siguiente:

title     GParted live
root      (hd0,3)
kernel    /live-hd/vmlinuz boot=live config union=aufs noswap noprompt vga=788 ip=frommedia live-media-path=/live-hd bootfrom=/dev/hda4 toram=filesystem.squashfs
initrd    /live-hd/initrd.img
boot

Recuérdese que en la sintaxis de la versión 1 de grub, /dev/hda4 es (hd0,3).

Para GRUB 2.x (y 1.9x) para añadir una entrada de menú deberemos editar /etc/grub.d/40_custom y despues hacer ejecutar update-grub2

menuentry "GParted live" {
  set root=(hd0,4)
  linux /live-hd/vmlinuz boot=live config union=aufs noswap noprompt vga=788 ip=frommedia live-media-path=/live-hd bootfrom=/dev/hda4 toram=filesystem.squashfs
  initrd /live-hd/initrd.img
}

En este caso aunque la partición sea la misma (hda4) la sintaxis de grub2 comienza a contar en 1 y no en 0 por lo que debemos escribir (hd0,4) en vez de (hd0,3). Como ya se ha comentado tras esto debemos ejecutar update-grub2.

Alternativamente se puede ejecutar arrancar desde el archivo iso con grub2. Por ejemplo, con gparted-live-0.5.2-9.iso en /home/isos podríamos modificar /etc/grub.d/40_custom de grub2

menuentry "Gparted live" {
    set isofile="/home/isos/gparted-live-0.5.2-9.iso"
    loopback loop $isofile
    linux (loop)/live/vmlinuz boot=live config union=aufs noswap noprompt vga=788 ip=frommedia toram=filesystem.squashfs findiso=$isofile
    initrd (loop)/live/initrd.img
}

Y, de nuevo ejecutar update-grub2 para actualizar la configuración de grub2

NOTA1: En los ejemplos anteriores se ha añadido el parámetro “toram=filesystem.squashfs” para que la partición donde están los archivos, /dev/hda4 en el ejemplo, no se bloquee tras arrancar el Live correspondiente desde el disco duro.

NOTA2: Recuérdese comprobar los parámetros en syslinux/syslinux.cfg descomprimido desde el archivo zip. Deberemos incluirlos en los ejemplos anteriores. Y lo mismo respecto a los paths a los archivos.

NOTA3: Hay un límite de longitud en para los parametros de arranque en grub1 (256 caracteres, por ejemplo)

Clonezilla Live

El principio es el mismo,… bajar el zip, esta vez Clonezilla Live. Vamos directamente a las entradas de grub y grub2..

Para GRUB 1.x (Legacy) editaremos el /boot/grub/menu.lst añadiendo lo siguiente:

title Clonezilla live on harddrive
root (hd0,3)
kernel /live-hd/vmlinuz boot=live live-config noswap nolocales edd=on nomodeset ocs_live_run="ocs-live-general" ocs_live_extra_param="" ocs_live_keymap="" ocs_live_batch="no" ocs_lang="" vga=788 ip=frommedia nosplash live-media-path=/live-hd bootfrom=/dev/sda4 toram=filesystem.squashfs
initrd /live-hd/initrd.img
boot

Para GRUB 2.x (y 1.9x) para añadir una entrada de menú deberemos editar /etc/grub.d/40_custom y despues hacer ejecutar update-grub2

menuentry "Clonezilla" {
  set root=(hd0,4)
  linux /live-hd/vmlinuz boot=live live-config noswap nolocales edd=on nomodeset ocs_live_run=\"ocs-live-general\" ocs_live_extra_param=\"\" ocs_live_keymap=\"\" ocs_live_batch=\"no\" ocs_lang=\"\" vga=788 ip=frommedia nosplash live-media-path=/live-hd bootfrom=/dev/sda4 toram=filesystem.squashfs
  initrd /live-hd/initrd.img
}

Después será necesario ejecutar update-grub2 para actualizar la configuración de grub2.

NOTA4: Recuérdese poner \ (barra invertida) antes de ” (comillas) para “escapar” ese carácter en los parámetros de grub2. De otra forma no se mostrarían en /proc/cmdline y algunas acciones de Clonezilla no funcionarían.

Como ya hemos visto también es posible arrancar directamente del archivo iso con grub2. Supongamos que tenemos el iso en /home/isos/clonezilla-live-1.2.6-24.iso. De nuevo editaremos /etc/grub.d/40-.custom. Por ejemplo:

menuentry "Clonezilla live" {
  set isofile="/home/isos/clonezilla-live-1.2.6-24.iso"
  loopback loop $isofile
  linux (loop)/live/vmlinuz boot=live live-config noswap nolocales edd=on nomodeset ocs_live_run=\"ocs-live-general\" ocs_live_extra_param=\"\" ocs_live_keymap=\"\" ocs_live_batch=\"no\" ocs_lang=\"\" vga=788 ip=frommedia nosplash toram=filesystem.squashfs findiso=$isofile
  initrd (loop)/live/initrd.img
}

Y tras ello ejecutamos update-grub2 para actualizar la configuración de grub2.

NOTA5: Asignamos “live-media-path=/live-hd” ya que los archivos no están en el path por defecto (live). Forzamos “bootfrom=/dev/hda4” (files are on /dev/hda4) para que si hubiese otro Clonezilla-Live, por ejemplo en el lector de CD arranque de todas formas el correcto. De nuevo el parámetro “toram=filesystem.squashfs” se añade para que se pueda usar la partición que tiene los archivos tras arrancar (y se pueda montar, por ejemplo). Si se quiere que live-initramfs copie todos los archivos (de /dev/hda4) se puede usar tan solo el parámetro “toram” (no “toram=filesystem.squashfs”). Esto es útil cuando se tiene en /dev/hda4 algunos archivos personalizados que sean necesarios.

La NOTA2 es de nuevo aplicable en este caso.

Debian NetInstall

El procedimiento es similar al que se muestra en el post de 2007 de instalación de Ubuntu..

Primero hay que bajar el kernel y el initrd a una partición que sea legible por el bootloader (grub, grub2,…) que tengamos disponible y arrancar aprovechándolo

http://ftp.debian.org/debian/dists/wheezy/main/installer-i386/current/images/netboot/debian-installer/i386/

No tiene mucho más… es como la instalación desde red o hdmedia de ubuntu pero con debian… Por ejemplo, con grub-legacy podríamos hacer (suponiendo que lo hemos dejado en la partición sda5):

1
2
3
4
> root (hd0,4)
> kernel /linux ramdisk_size=16386 root=/dev/ram0 rw --
> initrd /initrd.gz
> boot

El hecho de cambiar de ubuntu a debian tiene que ver con el hecho de que ubuntu, desde 12.04, ya no soporta kernels i386 non-PAE. Esto significa que ya no es usable con el mini-servidor que ya tiene su edad y usa un via C3 como corazón.

Netgear Cg3100d + ONO: Sin Rutas Estáticas Añadidas

Otra vez ONO tocando las bolas…

Como no se puede meter mano al cacharro con los firmwares actuales no es posible más que un servidor de dhcp simple, así que hay que olvidarse de distribuír otras rutas.

Tampoco es posible añadirle otras rutas estáticas para que haga de enrutador principal.

Cada día comprendo más a quien lo usa solo de modem, aunque sigo pensando que por qué usar 2 cacharros para algo que uno solo bastaría.

Propagar Rutas Estáticas Con Dhcp (Isc-dhcp-server Y Mikrotik routerOs)

isc-dhcp-server

Para empezar podemos utilizar las opciones option routers y option static-routes. La primera nos definirá la ruta por defecto (default gw) y la segunda nos permite añadir rutas estáticas a pares (red - gw). Por ejemplo:

option routers 192.168.100.1;
option static-routes 192.168.1.0 192.168.100.2, 10.0.0.0 192.168.100.3;

pero SOLO SIRVE PARA RUTAS “CON CLASE” A(/8), B(/16), C(/24)

o sea que hay que buscar otro camino para las rutas sin clase más habituales

Se declara la opciones siguientes en la sección global de la configuración del servidor (en /etc/dhcp/dhcpd.conf)

option rfc3442-classless-static-routes code 121 = array of integer 8;
option ms-classless-static-routes code 249 = array of integer 8;

La segunda linea es para los clientes que corren Microsoft Windows, ya que Microsoft decidió que usaría la opción 249 en vez de la que sugiere el estándar (121).

El siguiente paso es usar estas opciones dentro de la definición de la subred. Por ejemplo:

subnet 192.168.1.0 netmask 255.255.255.0 {
   ... otras optiones ....
   option rfc3442-classless-static-routes 24, 192, 168, 123, 10, 10, 10, 1, 0, 192, 168, 1, 2;
   option ms-classless-static-routes 24, 192, 168, 123, 10, 10, 10, 1, 0, 192, 168, 1, 2;
}

El formato de estas opciones es:

<netmask-network1>, <network1-byte1>, <network1-byte2>, <network1-byte3>, <router1-byte1>, <router1-byte2>, <router1-byte3>, <router1-byte4>[, <netmask-network2>, <network2-byte1>,...]

Donde los bytes con valor 0 se omiten. Se repiten los bloques [máscara,red-destino,router] que sean necesarios.

Debe incluirse de nuevo la ruta por defecto (default-gw) en estas opciones porque el estándar permite que el cliente-dhcp ignore la option routers x.x.x.x.

Así que cada una de las lineas anteriores (rfc3442-… y ms-clas..) contiene la siguiente información de enrutado, separada en cada conjunto [máscara, red-destino, router]:

24, 192, 168, 123, 10, 10, 10, 1  : 192.168.123.0/24 via 10.10.10.1
 0,               192,168,  1, 2  : 0.0.0.0 via 192.168.1.2 (default route)

Visto en http://www.j-schmitz.netblog//pushing-static-routes-with-isc-dhcp-server

mikrotik routerOs

Para RouterOs la situación es similar, pero en vez de tener números decimales separados por comas tenemos números hexadecimales (sin separación)

Así por ejemplo podríamos encontrar la configuración:

/ip dhcp-server option
add code=121 name=classless value=0x18A000000A016501000A016501
/ip dhcp-server network
set 0 dhcp-option=classless

Donde primero se define la opción y después se usa.

De nuevo el valor también incluye la ruta por defecto. Y deberíamos añadir otra opción con código 259 para clientes Microsoft.

[admin@MikroTik] /ip route> print
Flags: X - disabled, A - active, D - dynamic, C - connect, S - static, r - rip, b - bgp, o - ospf,
m - mme, B - blackhole, U - unreachable, P - prohibit
#      DST-ADDRESS        PREF-SRC        GATEWAY            DISTANCE
0 ADS  0.0.0.0/0                          10.1.101.1         0
1 ADS  160.0.0.0/24                       10.1.101.1         0

0x18A000000A016501000A016501 es, en decimal y separado por comas: 24,160,0,0,10,1,101,1,0,10,1,101,1

Visto en http://wiki.mikrotik.com/wiki/Manual:IP/DHCP_Server#Example

Clonando Disco O Partición/es Al Vuelo Con Clonezilla

El “ocs-onthefly” se usa para copiar/clonar de disco a disco o de partición a particiónis al vuelo (sin imagen intermedia).

Este comando es diferente de drbl-ocs (o clonezilla). Clonezilla se usa para hacer un clonado masivo, o sea que guarda la máquina “de referencia” como imagen en el servidor clonezilla. Por otro lado, ocs-onthefly se usa para una copia 1 a 1, o sea que no se genera ni almacena una imagen en el servidor. Tan solo clona disco o partición directamente.

Hay 2 formas de ejecutar ocs-onthefly:

1- Clonado local: Arranca la máquina como cliente DRBL. A continuación se clona un disco a otro. Es una manera simple de clonar un disco cuando solo se dispone de una máquina.

2- Clonado por red: Arranca las máquinas origen y destino como clientes DRBL. A continuación se clona de la una a la otra. Esto es especialmente útil si se dispone de 2 máquinas y no se quiere desmontar los discos.

USO:

ocs-onthefly [OPCION]
Opciones:
  -e, --resize-partition _Cambia el tamaño del disco de destino en la máquina de destino (soluciona el hecho de restaurar una partición/imagen pequeña en otra mayor)_
  -f, --source DEV _Especifica el dispositivo de origen como DEV (hda, hda1...)_
  -g, --grub-install GRUB_PARTITION _Instala grub en hda con el directorio raíz de grub en la partición GRUB_PARTITION cuando la restauración acaba. GRUB_PARTITION puede ser "/dev/hda1", "/dev/hda2"... o "auto" (con "auto" clonezilla detectará la partición raíz de grub automáticamente)_
  -i --filter PROGRAM _Usar PROGRAM (gzip/lzop/bzip2/cat) antes de enviar los datos de la partición a netcat (solo en modo de clonado de red). El filtro por defecto es gzip. Úsese "cat" si no se quiere comprimir (Bueno para redes rápidas, donde la compresión nos ralentizará las transferencias)_
  -n, --no-sfdisk _Saltar la creación de la tabla de particiones_
  -m, --no-mbr-clone _NO clonar el MBR_
  -o, --load-geometry _Forzar el uso de los CHS almacenados (cylinders, heads, sectors) al usar sfdisk durante la restauración_
  -p, --port PORT _Especifica el puerto de netcat (Solo para el modo de clonado de red)_
  -r, --server _Especifica que la máquina donde se ejecuta es el servidor de clonación en la red_
  -s, --source-IP IP _Especifica la IP de la máquina origen (se usa en la máquina de destino)_
  -t, --target DEV _Especifica el dispositivo de destino como DEV (hda, hda1...)_
  -v, --verbose _Imprime información (más) durante la ejecución_

Ejemplo:

  1. Clonado local: Clonado el 1er disco duro (hda) al 2o (hdb). Se arranca la máquina como cliente DRBL y se ejecute:

    ocs-onthefly -f hda -t hdb

  2. Clonado vía red: Clonado del 1er disco duro (hda) de la máquina A al 1er disco duro (hda) de la máquina B. El procedimiento, sin desmontar las máquinas sería:

2.1- Arrancamos la máquina A como cliente DRBL. Supongamos que su IP es, por ejemplo, 192.168.100.1 Ejecutamos:

ocs-onthefly -r -f hda

2.2- En un momento de la ejecución se muestra el comando que se debe ejecutar en la máquina B. Será algo como:

/opt/drbl/sbin/ocs-thefly --source-IP 192.168.100.1 -t [TARGET_DEV] (TARGET_DEV es hda, hdb, hda1, hdb1...)

Siendo el “TARGET_DEV” el disco (o partición) de destino en la máquina B (hda, hdb, hda1). En el ejemplo es hda

2.3 Se arranca la máquina B como cliente DRBL y se ejecuta ese comando completado adecuadamente.

ocs-onthefly --source-IP 192.168.100.1 -t hda

El proceso de clonado comenzará a continuación… y si hay suerte concluirá sin problemas.

Script Ddnsupd De Nslu2 Para Solucionar Incompetencia De ONO

Mi experiencia con los routers de ONO lleva años siendo mala (sí, ya se… cambia de proveedor!).

He sufrido con un Scientific Atlanta epr2320 y, recientemente, con un Netgear cg3100d. Y la conclusión es que entiendo los comentarios en internet recomendando usarlos únicamente como modems.

Ya me explayaré sobre el tema. Pero la cuestión es que en los firmwares más recientes han capado las habilidades del router. Por ejemplo ya no son accesibles a través de ssh ni saben manejar dyndns. Y también hay problemas al redireccionar puertos. Vamos una joya de cacharro (o de firmware, que igual el cacharro puede y algunos no lo dejan).

La situación es que necesitaba poner en marcha una actualización de ip dinámica en dyndns. Aunque hay soluciones como dyndns o tinydyndns en los repositorios (ubuntu-debian) he decidido utilizar una opción que ya conocía… así que rescaté un script que usaba en un nslu2 y que aquí incluyo:

Script de Actualización de IP para dyndns (ddnsupd.sh) download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
#!/bin/sh
# DynDNS Update Client for the Linux NSLU2
#
# Script version - (used for user-agent)
VER=NSLU2-Linux-DNSUPD-0.9.4beta

# User configurable Section
#
# USER=<dnsuser>
# PASSWD=<dnspasswd>
# DOMAIN=<domain.name.org,domain2.name.org,domain3.name.org>
# SYSTEM=[dyndns|statdns|custom]
# WILDCARD=[ON|OFF|NOCHG]
# MX=[mailexchanger.name.org|NOCHG]
# BACKMX=[YES|NO|NOCHG]
# OFFLINE=[YES|NO] or leave blank

USER=usuario_en_dyndns.org
PASSWD=clave_del_usuario
DOMAIN=el_dominio.que_toque.cx
SYSTEM=dyndns
WILDCARD=ON
MX=NOCHG
BACKMX=NOCHG
OFFLINE=

# Var folder, Set VAR to either '/var' or '/opt/var', '/opt/var' recommended for Unslung users
VAR=/var

# Update using either 'http' or 'https' (openssl and wget-ssl are needed for https)
HTTP=https
# For https set SSL=--no-check-certificate
SSL=--no-check-certificate

# Paths to program files
WGET=/usr/bin/wget
FIND=/usr/bin/find
CHMOD=/bin/chmod
MKDIR=/bin/mkdir
GREP=/bin/grep
ECHO=/bin/echo
DATE=/bin/date
CAT=/bin/cat
SED=/bin/sed
CP=/bin/cp
RM=/bin/rm
# A beep command equivalent to 'printf "\a"'
#BEEP='Set_Led beep1'  #unslung
# sgtes para slugos o debian
#BEEP='/sbin/leds beep'
BEEP='/usr/bin/beep'

# Dyndns script update section
# 
# Check and create folders
if [ ! -d ${VAR}/log ]; then
  ${MKDIR} -p ${VAR}/log
  ${CHMOD} 755 ${VAR}/log
fi
if [ ! -d ${VAR}/tmp ]; then
  ${MKDIR} -p ${VAR}/tmp
  ${CHMOD} 755 ${VAR}/tmp
fi

# Check and create err.ip
if [ ! -f ${VAR}/tmp/err.ip ]
then
  ${ECHO} "off" > ${VAR}/tmp/err.ip
fi

# Check for Fatal error file,  disable script and error beep if file exists
if [ -f ${VAR}/log/dyndns.fatal.error ]
then
  ${BEEP}
  ${BEEP}
  exit 0
fi

# Fetch current IP Address.
###########################
# 
# --- original:
# ${WGET} -q -t 1 -T 30 -U ${VER} -O ${VAR}/tmp/now.ip http://checkip.dyndns.com:8245/
# --- increased parameter t (tries) to avoid error "not updated: read error on ip fetch") 
#     into ip_hist.log
${WGET} -q -t 12 -T 30 -U ${VER} -O ${VAR}/tmp/now.ip http://checkip.dyndns.com:8245/
# --- This could be changed to get the ip address from router >  > ${VAR}/tmp/now.ip 

# Verify the data is good.
PAT='Current IP Address: *[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*'
if ${GREP} "$PAT" ${VAR}/tmp/now.ip >/dev/null;
then
  MYIP="`${SED} -e 's|.*Address: ||; s|</body>.*||' ${VAR}/tmp/now.ip`"
  # On good IP data.
  # Check for IP history.
  if [ -f ${VAR}/tmp/old.ip ]
  then
    # On history found.
    if [ "`${CAT} ${VAR}/tmp/err.ip`" = "on" ]
    then
      ${ECHO} "`${DATE} +%Y%m%d.%H%M%S` - not updated: Network connection restored." >> ${VAR}/log/ip_hist.log;
      # Turn err.ip Off
      ${ECHO} "off" > ${VAR}/tmp/err.ip
    fi
    # Check for settings change
    if [ ! "`${CAT} ${VAR}/tmp/update.para`" = "${USER}:${PASSWD}:${DOMAIN}:${SYSTEM}:${WILDCARD}:${MX}:${BACKMX}:${OFFLINE}:" ]
    then
      ${WGET} -q -t 1 -T 30 -U ${VER} -O ${VAR}/tmp/upd.ip ${SSL} "${HTTP}://${USER}:${PASSWD}@members.dyndns.org/nic/update?system=${SYSTEM}&hostname=${DOMAIN}&myip=${MYIP}&wildcard=${WILDCARD}&mx=${MX}&backmx=${BACKMX}&offline=${OFFLINE}";
      # Log the settings change and notify user.
      ${ECHO} "`${DATE} +%Y%m%d.%H%M%S` - Settings - `${CAT} ${VAR}/tmp/upd.ip`" >> ${VAR}/log/ip_hist.log;
      ${ECHO} "`${DATE} +%x`" > ${VAR}/tmp/day.ip;
      ${RM} -f ${VAR}/tmp/old.ip;
      ${CP} ${VAR}/tmp/now.ip ${VAR}/tmp/old.ip;
      ${ECHO} "${USER}:${PASSWD}:${DOMAIN}:${SYSTEM}:${WILDCARD}:${MX}:${BACKMX}:${OFFLINE}:" > ${VAR}/tmp/update.para;
      ${BEEP}
    fi
    # Check for IP Change
    if [ "`${CAT} ${VAR}/tmp/now.ip`" = "`${CAT} ${VAR}/tmp/old.ip`" ]
    then
      # On no IP change
      # Check if 28 day refresh is needed.
      # you must enter the appropriate paths for the find command
      # but do not use variables in the string or it may not work correctly 
      /usr/bin/find /var/tmp/ -name old.ip -mtime +27 -exec rm {} \;
      if  [ -f ${VAR}/tmp/old.ip ]
      then
        # On no refresh needed.
        # Check for Next day. 
        if [ ! "`${CAT} ${VAR}/tmp/day.ip`" = "`${DATE} +%x`" ]
        then
          # On day change
          # Log entry
          ${ECHO} "`${DATE} +%Y%m%d.%H%M%S` - No update - `${CAT} ${VAR}/tmp/upd.ip`" >> ${VAR}/log/ip_hist.log;
          ${ECHO} "`${DATE} +%x`" > ${VAR}/tmp/day.ip;
        fi
      else
        # On refresh needed.
        # Do a 28 Day refresh and Notify user with a distinguishable beep.
        ${WGET} -q -t 1 -T 30 -U ${VER} -O ${VAR}/tmp/upd.ip ${SSL} "${HTTP}://${USER}:${PASSWD}@members.dyndns.org/nic/update?system=${SYSTEM}&hostname=${DOMAIN}&myip=${MYIP}&wildcard=${WILDCARD}&mx=${MX}&backmx=${BACKMX}&offline=${OFFLINE}";
        echo "`${DATE} +%Y%m%d.%H%M%S` - Refresh - `${CAT} ${VAR}/tmp/upd.ip`" >> ${VAR}/log/ip_hist.log;
        echo "`${DATE} +%x`" > ${VAR}/tmp/day.ip;
        ${CP} ${VAR}/tmp/now.ip ${VAR}/tmp/old.ip;
        ${BEEP}
      fi
    else
      # On IP change
      # Update DynDNS with new IP Address. 
      ${WGET} -q -t 1 -T 30 -U ${VER} -O ${VAR}/tmp/upd.ip ${SSL} "${HTTP}://${USER}:${PASSWD}@members.dyndns.org/nic/update?system=${SYSTEM}&hostname=${DOMAIN}&myip=${MYIP}&wildcard=${WILDCARD}&mx=${MX}&backmx=${BACKMX}&offline=${OFFLINE}";
      # Log the IP change and notify user.
      ${ECHO} "`${DATE} +%Y%m%d.%H%M%S` - Update - `${CAT} ${VAR}/tmp/upd.ip`" >> ${VAR}/log/ip_hist.log;
      ${ECHO} "`${DATE} +%x`" > ${VAR}/tmp/day.ip;
      ${RM} -f ${VAR}/tmp/old.ip;
      ${CP} ${VAR}/tmp/now.ip ${VAR}/tmp/old.ip;
      ${BEEP}
    fi
  else
    # On No History
    # Initialize client and Update DynDNS.
    # Check err.ip status
    if [ "`${CAT} ${VAR}/tmp/err.ip`" = "on" ]
    then
      # Log Service Restoral.
      ${ECHO} "`${DATE} +%Y%m%d.%H%M%S` - not updated: Network connection restored." >> ${VAR}/log/ip_hist.log;
    fi
    # Set err.ip off
    ${ECHO} "off" > ${VAR}/tmp/err.ip
    ${WGET} -q -t 1 -T 30 -U ${VER} -O ${VAR}/tmp/upd.ip ${SSL} "${HTTP}://${USER}:${PASSWD}@members.dyndns.org/nic/update?system=${SYSTEM}&hostname=${DOMAIN}&myip=${MYIP}&wildcard=${WILDCARD}&mx=${MX}&backmx=${BACKMX}&offline=${OFFLINE}";
    ${ECHO} "`${DATE} +%Y%m%d.%H%M%S` - Initialise - `${CAT} ${VAR}/tmp/upd.ip`" >> ${VAR}/log/ip_hist.log;
    ${ECHO} "`${DATE} +%x`" > ${VAR}/tmp/day.ip;
    ${CP} ${VAR}/tmp/now.ip ${VAR}/tmp/old.ip;
    ${ECHO} "${USER}:${PASSWD}:${DOMAIN}:${SYSTEM}:${WILDCARD}:${MX}:${BACKMX}:${OFFLINE}:" > ${VAR}/tmp/update.para
    ${BEEP}
  fi
  # Analyse and report any Fatal error return strings
  if ${GREP} "\!yours\|notfqdn\|abuse\|nohost\|badagent\|badauth\|badsys\|dnserr\|numhost\|911\|\!donator" ${VAR}/tmp/upd.ip >/dev/null
  then
    ${ECHO} "`${DATE} +%x` - Fatal Error Returned from Dyndns - `${CAT} ${VAR}/tmp/upd.ip` - Correct the error then delete this file to re-enable" > ${VAR}/log/dyndns.fatal.error;
    ${BEEP}
    ${BEEP}
    #
    # Place holder - for example - to send fatal error report by email
    # #############
    #
  fi
else
  # On IP read error
  # Check err.ip status
  if [ ! "`${CAT} ${VAR}/tmp/err.ip`" = "on" ]
  then
    # On err.ip = off - Log read error. 
    ${ECHO} "`${DATE} +%Y%m%d.%H%M%S` - not updated: read error on ip fetch" >> ${VAR}/log/ip_hist.log;
  fi
  # Set err.ip = On to allow only one error log on next run.
  ${ECHO} "on" > ${VAR}/tmp/err.ip
  # Notify user.
  ${BEEP}
  ${BEEP}
fi
# end

# ADD MANUALLY A CRON JOB CALLING THIS SCRIPT
# EXAMPLE FOR NSLU2:
# Set the interval of the next IP check using a crontab entry.
# Once every 15 minutes is good for a home server.
# */15 * * * * root /opt/bin/dnsupd &>/dev/null
#

El script se ejecuta temporizado desde cron y utiliza archivos temporales localizados en /var/tmp y también escribe un par de archivos de log situados en /var/log

La ventaja que le veo sobre la solución dyndns de los repositorios es que no utiliza un demonio más sino que lo lanza cron. Debe, por tanto, ser un script ejecutable con los permisos adecuados. Quizá como inconveniente tiene que los datos de configuración están en el mismo script (y accesibles).

Actualización: Con el nuevo firmware del router de Netgear (1.04.02) han añadido la función de DNS Dinámico. Eso si, tan solo usando DynDNS, ahora que en esta compañía fuerzan a entrar cada mes para no perder la entrada de DNS (o pasarse a sus servicios de pago).

Error Arranque: XP No Encuentra Uno De Los Archivos Del Registro (System)

Mi portatil ya está en su tercera edad, es del 2002, y además ya ha sufrido bastantes achaques… varios transplantes de disco duro…

Hace unas temporadas además se fue de escalada y tubo un traspiés con una caída de 3m que motivó otro trasplante, esta vez de pantalla, y también causó otros rasguños superficiales.

En este accidente creo que también se dañó algo el disco duro porque desde entonces suele fallar algo…

En concreto el error del que voy a hablar hoy ya es la segunda vez que aparece… se trata de que el arranque de Ms Windows XP (Home) no encuentra alguno de los archivos que contienen el registro. Esta última vez no encontraba el archivo system dentro de c:\windows\system32\config

Realmente el archivo estaba allí pero debía haberse quedado en un estado extraño…

Microsoft ofrece un artículo al respecto: Cómo recuperar un Registro dañado que impide que Windows XP se inicie

En el se propone el uso de la consola de recuperación para hacer el proceso en varios pasos…

  • Arrancar desde la consola de recuperación y recuperar el registro del día que se instaló el equipo.

  • Arrancar con el registro de instalación y copiar los archivos de registro de algún punto de restauración a una localización accesible desde la consola.

  • Arrancar desde la consola de recuperación y copiar los archivos del punto de restauración copiados en el paso anterior a otra localización.

  • Suerte.

Bien… yo dedicí utilizar el Hiren’s Boot CD (HBCD) (versión 14.1) y sus utilidades… Hay una sección dedicada a las utilidades relacionadas con el registro. Entre ellas hay una, de la que no recuerdo el nombre, dedicada a recuperar el registro a un punto de restauración previo… La ejecuté y ¡BIEEEN! ¡¡FUNCIONÓ!! TODOS LOS PASOS DE UN GOLPE.

También tiene otra utilidad de copia de seguridad del registro. En la versión siguiente (15.1) parece que hay una utilidad llamada Registry Restore Wizard que hace esto y seguramente más.

En resumen… una buena herramienta nos hace la vida más fácil.

Crear Un Pendrive Multiboot a Mano

Aunque hay un montón de automatizaciones o semi-automatizaciones para crear pendrives con diferentes livecd’s decidí hacerlo a mano para aprender un poco más de syslinux/isolinux como gestor de arranque y porque, creo recordar, ninguno incluía Hiren’s Boot CD.

Los livecds/utilidades que incluí son:

  • Hiren’s Boot CD 14.1
  • HDD Regenerator 2011
  • Hardware Detection Tool 0.5.0
  • KNOPPIX 6.7.1
  • WIFIWAY 2.0.3
  • CLONEZILLA 1.2.10
  • GPARTED 0.9.1
  • SYSTEM RESCUE CD
  • GHOST RECOVERY CD