domingo, 17 de abril de 2016

Torrenter


En alguna conversación relacionada a FLISOL CABA 2016, se mencionó disponer de alguna copia de la wikipedia para que los asistentes puedan llevársela.

La wikipedia pesa 12 GB completa, 3 GB sin índices ni imágenes según esa conversación.

Si este servicio estuviera disponible en la misma red del Flisolator, generaría un cierto impacto en el ancho de banda, por que una cosa es una instalación que intermitentemente baja 3 a 6 GB a 12 de un saque.

La idea es entonces tener una red separada donde las máquinas bajen sin interferir sobre las instalaciones y con bittorrent que sea más veloz, así no se quedan a vivir.

En cada lugar donde digo eth?, 192.168.?.?, /dev/sd??, /dev/ttyS? y similares, son valores míos, si has de transitar esta experiencia tus valores probablemente sean otros.

Plan A

Aprovechar hardware obsoleto.

Recordando que tenía un mother viejo muy decente con Athlon 2800+, con cinco puertos PCI gracias a @fcingolani y un switch 10/100 de 24 bocas, ofrecí sin compromiso armar una red aparte para este servicio.


En el primer intento venía bien, con 1.75GB de ram, una buena placa de video para usar su memoria como swap (128 MB + 120 MB se podrían usar), un disco sata de 160GB. El BIOS veía las cuatro placas 3com, video ok, memoria ok. Cuando intenté arrancar con pendrive, cuando estaba probando uno de los que tenía, dijo "missing operating system", ok, nada del otro mundo. Pero la apagué y fué definitivo. Nunca más arrancó. Dejé el mother pelado, sin pila, reset de la memoria del BIOS, lo envolví en papel aluminio, cambié de fuente, puse velitas, nada.


Plan B


Lo mismo con un Pentium 3 de 700.

Bueno, no lo mismo, sólo 640MB de RAM y dos discos ATA de 40 80 GB. Es que cuando llegué a las primeras mediciones, uno de los de 40 falló y me obligó a buscar en el cajón y aparecieron dos de 80.

En parte por perversión, en parte por que hay un slot ISA 16, quise usar una (más) vieja ethernet 3c509 como interfaz de control, pero no prosperó. Le puse una Realtek. Retrospectivamente, el fallo se debía a problemas de enrutamiento, así que quizás tambien la agregue.


Las tareas


Instalar algún linux.

RAID: para aumentar el ancho de banda sobre los miserables discos.

Ethernet de control: para facilitar la vida.


Trunking: para aumentar el ancho de banda entre el Torrenter y la red, se configuran varios puertos del switch y las placas para que haga la comunicación en paralelo. En teoría pasamos de una red de 100Mbits a 400Mbits entre el servidor y el switch. A un sólo cliente no le hace diferencia, pero a cuatro o más si.

DHCPD: para que otorgue las direcciones IP a las máquinas que se conecten.

DNS: quizás en otra oportunidad

Memoria video como swap: para aumentar la performance del servidor.

Tracker: para que funcione bittorrent

Torrente: de eso se trata todo esto, no?

Mediciones: tiene sentido gastar plata en un taxi para llevar esto si no hay una diferencia importante en el tiempo de download? veremos...

Arranque desatendido: la idea es llevar una caja que se prenda y ande.

 

La ejecución


Distro

Asumo que quien lee esto sabe más o menos instalar cualquier distro y manejarse con linux.

Debian 8.0.4 32 bits, nada especial, sin entorno gráfico, con algunas cositas útiles.

apt-get install vim ethtool tcpdump

Particionamiento

Disk /dev/sda: 76.7 GiB, 82348277760 bytes, 160836480 sectors

Device     Boot    Start       End   Sectors  Size Id Type
/dev/sda1  *        2048  15624191  15622144  7.5G 83 Linux
/dev/sda2       15624192  16623615    999424  488M 82 Linux swap / Solaris
/dev/sda3       16623616 160835583 144211968 68.8G fd Linux raid autodetect


Disk /dev/sdb: 76.7 GiB, 82348277760 bytes, 160836480 sectors

Device     Boot    Start       End   Sectors  Size Id Type
/dev/sdb1           2048  15624191  15622144  7.5G 83 Linux
/dev/sdb2       15624192  16623615    999424  488M 82 Linux swap / Solaris
/dev/sdb3       16623616 160835583 144211968 68.8G fd Linux raid autodetect


No quiero incursionar en arrancar de raid, así que dejé las sd?1 para / y /home


RAID



apt-get install mdadm

Creación del raid con stripe, los discos en controladoras distintas debería mejorar el ancho de banda.

mdadm --create --verbose /dev/md0 --level=stripe \
  --raid-devices=2 /dev/sda3 /dev/sdb3




Para que monte al inicio



mdadm --detail --scan >> /etc/mdadm/mdadm.conf
 

mkfs.ext4 /dev/md0



blkid | grep md0 >> /etc/fstab

quedando

[/etc/fstab]

#UUID=044d6468-a015-404f-ae97-fb0814ca5aaf
/dev/md0        /RAID           ext4       defaults       0         3


Seguro que pude haber usado UUID en lugar de /dev/md0, pero me desvía de mi camino, que es bastante largo aún.


Trunking

 

Primero, hay que comunicarse con el switch.

apt-get install minicom

Usar un null-modem cable y configurar correctamente la comunicación en minicom:

/dev/ttyS0
19200 8n1 sw flow control
modem dcd line off


Ok, tengo login, pero, ¿cuáles eran las credenciales? las sabía hace 15 años.

Por suerte "3comcso" and password "RIP000" hace reset.

Luego, hay que cerrar las ventanas

system->security->modify-> las claves de cada usuario


configurar IP por si queremos guardar otros 15 años el cable en un cajón:

ip->interface->plin plin plin




recuperar las 100 Mbits full duplex:

ethernet->portMode->all->100full

y finalmente armar el trunk de un lado...

feature->trunk->addPort->1->1
feature->trunk->addPort->1->2
feature->trunk->addPort->1->3
feature->trunk->addPort->1->4  

...y del otro


apt-get install ifenslave


[trunkIt.sh]    ifconfig eth0 down
    ifconfig eth1 down
    ifconfig eth2 down
    ifconfig eth3 down
  
    modprobe bonding mode=0 miimon=100
    ifconfig bond0 hw ether 00:11:22:33:44:55
    ifconfig bond0 192.168.1.3 netmask 255.255.255.0 up

    ifenslave bond0 eth0
    ifenslave bond0 eth1
    ifenslave bond0 eth2

    ifenslave bond0 eth3

Si tenés la interfaz de control en la misma red (mala idea, ahora la tengo así sólo por las pruebas) hay que ajustar las rutas con distintas combinaciones de


[goNoTrunk.sh]
    route del -net 192.168.1.0/24 bond0
    route add -net 192.168.1.0/24 eth4

[goTrunk.sh]
    route del -net 192.168.1.0/24 eth4
    route add -net 192.168.1.0/24 bond0

un ping 192.168.1.3 desde otra máquina seguido de un arp -a confirma que está funcionando:



192.168.1.3              ether   00:11:22:33:44:55   C                     eth6

si hay que continuar instalando cosas, puede hacer falta un

route add default gw 192.168.1.1

Primeras mediciones


Deseo determinar si el RAID es más rápido que el IDE pelado. Para ello transferí vía ssh linuxmint-17.3-cinnamon-32bit.iso de 1G4. No lo hice en condiciones de laboratorio, hay otro tráfico en la red, otras actividades en las máquinas involucradas y no repetiré las mediciones a menos que algo me llame la atención.

El resultado que esperaba era:
   La lectura sobre RAID es mejor que sobre IDE.
   La lectura vía trunk es mejor que vía enlace normal.

Veamos la cruda realidad

  • Escritura interfaz de control a IDE     5.0MB/s   04:37 (*)
  • Escritura interfaz de control a RAID    4.9MB/s   04:46
  • Lectura interfaz de control desde IDE   4.5MB/s   05:08



(*) es el mismo tiempo que me dió con los discos de 40 antes de fallar. Eso es bueno, el ruido de la red no interfiere mucho.

Epa, ¿qué pasó??? ¿Está tardando más en leer que en escribir teniendo de este lado una máquina brutalmente más poderosa?

32 bits vs 64 bits (doble)
640 MB vs 16 GB (25!!)
700 Mhz x 1 vs 3.2 GHz x 4 (cuádruple por cuatro)
IDE vs SATA (no sé)

Probablemente ssh está metiendo ruido, voy a tener que instalar un servidor web y usar wget en el cliente. De paso sirve para luego brindar descarga directa.

apt-get install nginx-light


Sólo hay que tirar un par de symlinks a los archivos previamente subidos. La escritura no me importa mucho, en realidad lo interesante es la lectura. Va de nuevo.

  • Lectura interfaz de control desde IDE   11,2MB/s   in 2m 8s
  • Lectura interfaz de control desde RAID  10,9MB/s   in 2m 9s
No hay diferencia apreciable, está en la velocidad máxima, vamos bien.


Ahora, a probar la lectura utilizando el trunk, que es el escenario productivo, de lecturas simultáneas. No pongo la velocidad pues wget marca la última, no la promedio.

  • 3 interfaz de control / IDE     6m 11s
  •                                 5m 45s
  •                                 6m 8s

 Parece coherente, se triplica el tiempo.

  • 3 trunk / RAID                  2m 47s
  •                                 3m 31s
  •                                 2m 47s

repitiendo...


  • 3 trunk / RAID                  4m 55s
  •                                 4m 19s
  •                                 3m 45s
     
Todo mal, los resultados que esperaba eran tipo  2m , veamos que dice ps:



top - 21:54:24 up 12 min,  2 users,  load average: 1.77, 0.98, 0.58
Tasks:  76 total,   1 running,  75 sleeping,   0 stopped,   0 zombie
%Cpu(s):  1.2 us, 11.1 sy,  0.0 ni, 42.8 id,  5.9 wa,  0.0 hi, 39.0 si,  0.0 st
KiB Mem:    641708 total,   593456 used,    48252 free,     9332 buffers
KiB Swap:   999416 total,        0 used,   999416 free.   548752 cached Mem
 

530 www-data  20   0    6520   2164   1688 D 39.5  0.3   0:41.50 nginx

No sé bien como diagnosticar, probablemente hay una saturación general.

Una medida más, igual pienso que lo mejor va a ser ver como se comporta con bittorrent.
  • 4 trunk / RAID                  5m 34s
  •                                 5m 35s
  •                                 4m 3s
  •                                 5m 37s


  • 4 interfaz de control / RAID    8m 20s
  •                                 8m 24s
  •                                 8m 31s
  •                                 8m 27s

pero load average: 0.60

Momento de parar y pensar


¿o será que le cuesta hacer funcionar a las cuatro ethernets? ¿Y si en lugar de usar el trunking, ponemos un cable cruzado en cada ethernet y tenemos cinco conexiónes simultáneas?


Recapitulemos, estos son los planes:

Usar bittorrent, para lo cual hace falta que estén todos en la misma red, para lo cual hace falta trunking.

¿Hace falta trunking? Si hay suficientes máquinas la carga sobre el servidor se alivia considerablemente.


Usar descarga directa, cada uno en su red, pero hay que medir si no es eso lo que hace que se caiga la performance. Además no tengo que sacar del rack el switch y llevarlo, menos trabajo y riesgo.

A ojo, los 12 GB son 45 minutos. Sin duda está mejor que los 70 de sin trunk, pero lejos de los 20 de una conexión no compartida, con o sin trunk. De todos modos, si viene una sola persona a la vez, el tiempo es 20 minutos. A medida que se sumen se degrada por un lado pero se compensa por bittorrent.

Apuesto entonces por trunking + bittorrent, sin importar los números. Igual si me queda tiempo probaré la conexión directa x 5.


Tracker

Ver Torrente

Torrente


Elegí este porque es el único que según apt-cache search hace tracking.

man bittorrent-downloader es tu amigo

Las próximas instrucciones son muy empíricas, puede ser que haya alguna importante falencia conceptual. Es lo que me funcionó.

*) Construir el archivo de torrent, el que uno le pasa al cliente.

btmakemetafile http://192.168.1.3:6969/announce linuxmint-17.3-cinnamon-32bit.iso

No olvidar el /announce, perdí horas por ello.

*) Copiar el .torrent a una carpeta e iniciar el tracker

bttrack --port 6969 --dfile dstate --logfile - --allowed_dir /RAID/TORRENT --allow_get 1



*) Abrir un browser en http://192.168.1.3:6969, tomar el link para el siguiente paso.

*) Posicionarse en la carpeta donde esta el archivo a compartir

btdownloadheadless --check_hashes 0 \
http://192.168.1.3:6969/file?info_hash=l%FCyH%7F%E2%9C%7B%25%92%7D%40%0F%26%C3%05%19%AB%A3%DD



El check_hashes en 1 la primera vez, la siguientes en 0.

Tras mucho, mucho, mucho fallar, he llegado a la conclusión de que sólo convendría usar bittorrent si hay mucha gente bajando.

Hacer un link de /var/www a /RAID/TORRENT (o donde lo hayas puesto) y ahí:

[index.html>
  <html>
    <head>
      <title>
        Flisol CABA 2016 Tracker
      </title>
    </head>
    <body>
      Torrent:

         <a href="linuxmint-17.3-cinnamon-32bit.iso.torrent">
           linuxmint-17.3-cinnamon-32bit.iso
         </a>
      <br/>
      Descarga directa: 

        <a href="linuxmint-17.3-cinnamon-32bit.iso">
           linuxmint-17.3-cinnamon-32bit.iso
        </a>
     <br/>
    </body>
  </html>

Memoria video como swap

Ya estoy un poco cansado y se me acaba el tiempo, así que le doy para adelante. Si puedo en otro momento edito y mejoro.

Hay que hallarla con


lspci -vvv -s 01:00.0

01:00.0 VGA compatible controller: Advanced Micro Devices, ...
  Subsystem: ASUSTeK Computer Inc. Radeon 9200 SE / TD / 128M
  Control: ...
  Status: ...
  Latency: ...
  Interrupt: ...
  Region 0: Memory at e0000000 (32-bit, prefetchable) [size=128M]

  ...

I'm feeling lucky, tiene dos adaptadores...


lspci -vvv -s 01:00.1

01:00.1 Display controller: Advanced Micro Devices, ...  (Secondary)...       Subsystem: ASUSTeK Computer Inc. Device c007
    Control: ...
    Status: ...
    Latency: ...
    Region 0: Memory at e8000000 (32-bit, prefetchable) [size=128M]




Ok, podremos rapiñar 120 MB + 128 MB.

Primer adaptador



Region 0: e0000000 + 800000 (los 8M que dejamos para video) = E0800000

Longitud total: 8000000 (128 MB)
Menos los 8 MB =  7800000 (120 MB)

El comando es entonces:

modprobe slram map=VRAM,0xE0800000,+0x7800000
 
dmesg dice:
 
[  695.642037] slram: devname=VRAM, devstart=0xe0800000, devlength=0x7800000
[  695.659638] slram: Registered device VRAM from 3678208KiB to 3801088KiB
[  695.659664] slram: Mapped from 0xe9780000 to 0xf0f80000



Y el otro? Probemos


e8000000 es la dirección y son los 128 MB completos (80000000)



modprobe phram phram=VRAM,0xe8000000,+0x8000000


cat /proc/mtd

dev:    size   erasesize  name
mtd0: 07800000 00004000 "VRAM"
mtd1: 08000000 00001000 "VRAM"


modprobe mtdblock


ls /dev/mtd*

/dev/mtd0
/dev/mtd0ro
/dev/mtd1
/dev/mtd1ro
/dev/mtdblock0
/dev/mtdblock1

mkswap /dev/mtdblock0
 

Setting up swapspace version 1, size = 122876 KiB
no label, UUID=767e1e0d-cf7b-464d-8895-b2b04685046
9
 

mkswap /dev/mtdblock1
 

Setting up swapspace version 1, size = 131068 KiB
no label, UUID=80ce243a-4c85-43a5-af96-1031cba2470c


Hay que darle prioridad a esta memoria antes que al disco con -p.

swapon /dev/mtdblock0 -p 10
swapon /dev/mtdblock1 -p 10
 
Veamos que pasó. 
 
swapon --summary 


Filename    Type  Size Used Priority
/dev/sdb2                               partition 499708 0 -1
/dev/sda2                               partition 499708 0 -2
/dev/mtdblock0                          partition 122876 0 10
/dev/mtdblock1                          partition 131068 0 10



El script actual es:

[swapOnVideo.sh]

modprobe slram map=VRAM,0xE0800000,+0x7800000
modprobe phram phram=VRAM,0xe8000000,+0x8000000
swapon /dev/mtdblock0 -p 10
swapon /dev/mtdblock1 -p 10

DHCPD

Por último, falta proveer direcciones IP a quienes se conecten.

apt-get install isc-dhcp-server

-------- Lo completaré otro día. --------

Arranque desatendido

Por más último, hay que lograr que se pueda prender la máquina y funcione sin tener que interactuar.

Ya está para
  • raid
  • nginx

Falta para

  • trunking
  • routing
  • bttracker
  • btdownloadheadless
  • swap en video

-------- Lo completaré otro día. --------

Conclusiones


Como ya todos sabemos, si las horas que dediqué las hubiera invertido en freelancear, pude haber comprado una máquina usada funcionando bastante más potente y aprovechar el trunking como es debido. Pero no puedo negar que me divierte bastante hacer esto, al menos no estoy gastando plata.



Links

https://flisol.usla.org.ar/event/caba/

https://raid.wiki.kernel.org/index.php/RAID_setup

http://computerdd.blogspot.com.ar/2006/10/linux-connect-to-serial-console-of.html

https://www.pantz.org/hardware/switches/3com3300passreset.html

http://www.linuxhorizon.ro/bonding.html

http://nginx.org/en/docs/beginners_guide.html

http://www.bittornado.com/


http://ft23.pmenier.net/docext/mtd/TIP_Use_memory_on_video_card_as_swap.html

https://wiki.archlinux.org/index.php/swap_on_video_ram

martes, 29 de diciembre de 2015

Gravity Falls

Por motivos que no aclararé, me hallo descifrando los mensajes secretos de Gravity Falls.

If you do not understand spanish, you can ask me to translate this text to english and I will put the job in the backlog

Me basé en unos programitas en python que había desarrollado para Crypto I de Coursera, que comenzé y abandoné dos veces pues al final se pone demasiado matemático para mis capacidades. Aún así, aprendí muchísimo y no dudo en recomendarlo.

La idea es que, según me han contado, hay varios cifrados. Un Caesar(3), una substitución y según pude ver de casualidad en un mensaje, un Atbash, que viene a ser 'a' -> 'z', 'b'->'y'...


$ python GravityFalls.py
?: m
    PU. FDHVDULDQ ZLOO EH RXW QHAW ZHHN. PU. DWEDVK ZLOO VXEVWLWXWH.
    ??. ????????? ???? ?? ??? ???? ????. ??. ?????? ???? ??????????.
?: try Caesar
  1 OT. ECGUCTKCP YKNN DG QWV PGZV YGGM. OT. CVDCUJ YKNN UWDUVKVWVG.
  2 NS. DBFTBSJBO XJMM CF PVU OFYU XFFL. NS. BUCBTI XJMM TVCTUJUVUF.
  3 MR. CAESARIAN WILL BE OUT NEXT WEEK. MR. ATBASH WILL SUBSTITUTE.
  4 LQ. BZDRZQHZM VHKK AD NTS MDWS VDDJ. LQ. ZSAZRG VHKK RTARSHSTSD.

   ...

Tengo entendido que buscando en Internet se halla la tabla de la substitución pero, ¿cuál es la gracia?

Como los mensajes están en inglés, el código y la interfaz tambien.

El programa soporta sólo maýusculas e ignora la puntuación, tal como son todos los mensajes obtenidos.

Emite estadísticas de frecuencia de caracteres, bigramas y trigramas, junto con tablas de frecuencias de las mismas en inglés. Esto sirve para descubrir las tablas de substitución.


¿Unit Testing? Eeeh, si, ad hoc, al comienzo orientado a refactorización y luego derivando a TDD.

¿Performance? Bueno, hay operaciones cuestionables desde ese punto de vista, como recalcular las frecuencias al pedir su visualización sin que nada haya cambiado.

¿Arquitectura? Es como la arquitectura de un banco de plaza, es poco. Es lo más sencilla posible para que sea comprensible y expandible. Lo mencionable es el Chain of Responsability para la ejecución de los comandos y el tímido MVC. Los componentes son Model y teñido por Controller en accept() y View está completamente separado.

Sintetizando, este proyecto te puede servir para aprender o practicar:
  • criptoanálisis básico
  • inglés (mensajes, interfaz, código)
  • programación (python, patrones)
En https://github.com/cpantel/gravityFalls está el código. Sólo he comiteado lo mínimo indispensable pues en el proceso de desarrollo y refactorización he cometido pecados inconfesables y no hace falta se hagan públicos.


Detalles


El protocolo de Chain of Responsability es accept(command, [message], [...]) y la respuesta es (Bool:handled, Bool:error, String:result). Al final, Printer formatea y muestra según la respuesta.

Si se quisiera agregar un módulo, por ejemplo un algoritmo para SubtitutionCipher, habría que agregarlo colgando de él, quizás pasarle el Statistical y que devuelva un dictionary

Usé Chain of Responsability en lugar de Mediator pues tenía ganas de usar Chain of Responsability. Si hiciera falta pasar a Mediator, lo haría. Ganas pero no capricho.

Estas son las tablas de frecuencias en inglés sacadas de [practicalcryptography]

Frecuencia letras (asociada a f1)



E 12.1
T 8.94
A 8.55
O 7.47
I 7.33
N 7.17
S 6.73
R 6.33
H 4.96
L 4.21
D 3.87
C 3.16
U 2.68
M 2.53
F 2.18
G 2.09
P 2.07
W 1.83
Y 1.72
B 1.6
V 1.06
K 0.81
J 0.22
X 0.19
Z 0.11
Q 0.1

Frecuencia palabras (asociada a futura fw)


THE 6.42
OF 2.76
AND 2.75
TO 2.67
A 2.43
IN 2.31
IS 1.12
FOR 1.01
THAT 0.92
WAS 0.88
ON 0.78
WITH 0.75
HE 0.75
IT 0.74
AS 0.71
AT 0.58
HIS 0.55
BY 0.51
BE 0.48
ARE 0.47
FROM 0.47
THIS 0.42
I 0.41
BUT 0.4
HAVE 0.39
AN 0.37
HAS 0.35
NOT 0.34
THEY 0.33
OR 0.3

Frecuencia bigramas (asociada a f2)


TH 2.71
HE 2.33
IN 2.03
ER 1.78
AN 1.61
RE 1.41
ES 1.32
ON 1.32
ST 1.25
NT 1.17
EN 1.13
AT 1.12
ED 1.08
ND 1.07
TO 1.07
OR 1.06
EA 1
TI 0.99
AR 0.98
TE 0.98
NG 0.89
AL 0.88
IT 0.88
AS 0.87
IS 0.86
HA 0.83
ET 0.76
SE 0.73
OU 0.72
OF 0.71

Frecuencia trigamas (asociado a f3)


THE 1.81
AND 0.73
ING 0.72
ENT 0.42
ION 0.42
HER 0.36
FOR 0.34
THA 0.33
NTH 0.33
INT 0.32
ERE 0.31
TIO 0.31
TER 0.3
EST 0.28
ERS 0.28
ATI 0.26
HAT 0.26
ATE 0.25
ALL 0.25
HES 0.24
VER 0.24
HIS 0.24
ETH 0.24
OFT 0.22
ITH 0.21
FTH 0.21
STH 0.21
OTH 0.21
RES 0.21
ONT 0.2

Frecuencia primera letra de palabra (asociado a ffw)

t 16.671
a 11.602
s 7.755
h 7.232
w 6.753
i 6.286
o 6.264
b 4.702
m 4.383
f 3.779
c 3.511
l 2.705
d 2.67
p 2.545
n 2.365
e 2.007
g 1.95
r 1.653
y 1.62
u 1.487
v 0.649
j 0.597
k 0.59
q 0.173
z 0.034
x 0.017

Frecuencia de letras repetidas (asociada a futura fd)


LL
SS
EE
OO
TT
FF
RR
NN
PP
CC
MM
GG
DD
AA
BB

Próximos pasos

Que calcule las frecuencias de letras duplicadas.
Que calcule las frecuencias de palabras
Que calcule las frecuencias de la primera letra de cada palabra
Que calcule el patrón (véase próxima entrada en uno de estos días)

Referencias


[practicalcryptography] http://practicalcryptography.com/cryptanalysis/letter-frequencies-various-languages/english-letter-frequencies/

https://en.wikipedia.org/wiki/Letter_frequency

Frecuencia de letras repetidas y buena parte de mi instrucción tomadas de Secret History:  The Story of Cryptology - Craig P. Bauer