Come creare una magnifica OLD_STYLE CHAT nel vostro PC, sicura, privata e veramente REAL-TIME

Dopo una lunga assenza vi propongo in occasione del giorno di San Valentino l’installazione di una chat che pur grezza e funzionante da linea di comando vi darà una particolare esperienza utente. Questa chat infatti rispetto a tutte le comuni chat piu’ diffuse, vi consente di trasmettere carattere per carattere al vostro interlocutore e non solo le righe una volta completate. Provare per credere 😉

Ecco come procedere:

Dal vostro router instradate la porta 2822 verso l’indirizzo IP del vostro PC Windows (ovviamente il tutto funziona anche direttamente in un pc con s.o. Linux )

Installate Debian (o altra distribuzione… io preferisco Debian) in una macchina virtuale WSL2:

da powershell (come amministratore):

wsl --install -d Debian

Dopo aver avviato la macchina viruale da utente root della macchina Debian :

leggete l’ip della vostra macchina linux:
ip addr | grep eth0

Assumiamo che Linux abbia IP: 192.168.35.17

Aggiorniamo i pacchetti della macchina virtuale:

sudo apt update && sudo apt upgrade -y
sudo apt-get install ytalk openssh-server

Modifichiamo ora le impostazioni ssh:

sudo vi /etc/ssh/sshd_config

Aggiungete queste righe:

Port 2222
ListenAddress 0.0.0.0

Creao un nuovo utente

sudo useradd talkd
sudo usermod -a -G tty talkd

sudo vi /etc/inetd.conf

modificate queste linee:
talk dgram udp wait nobody.tty /usr/sbin/in.talkd in.talkd
ntalk dgram udp wait nobody.tty /usr/sbin/in.ntalkd in.ntalkd

in modo che diventino cosi’
talk dgram udp4 wait talkd.tty /usr/sbin/in.talkd in.talkd
ntalk dgram udp4 wait talkd.tty /usr/sbin/in.ntalkd in.ntalkd

Riavviamo il servizio inetd:

sudo service openbsd-inetd restart

Aggiungo alla macchina virtuale gli utenti che potranno utilizzare la chat:

sudo adduser romeo
sudo adduser giulietta

Dalla macchina windows (powershell come amministratore)

netsh interface portproxy add v4tov4 listenport=2822 listenaddress=0.0.0.0 connectport=2222 connectaddress=192.168.35.17


New-NetFirewallRule -DisplayName "SSH Server WSL" -Direction Inbound -LocalPort 2822 -Protocol TCP -Action Allow

Eventualmente per gestire le regole di forward:

Digitando il comando netsh interface portproxy show all si possono controllare tutte le porte che si sono inoltrate verso le macchine virtuali.

Utilizzando il comando netsh interface portproxy delete v4tov4 listenaddress=0.0.0.0 listenport=PORTA si possono eliminare singole regole di inoltro.

Abbiamo finito. Ora raggiungete sia voi (romeo) che il vostro interlocutore (giulietta) la macchina linux tramite ssh

Romeo: ssh romeo@192.168.35.17 -p 2222

Giulietta: ssh giulietta@ip_casa_di_romeo -p 2822 (ip_casa_di_romeo è l’ip pubblico del router di romeo)

una volta entrati basta dare il comando:

romeo: ytalk giulietta

e giulietta: ytalk romeo

Buon divertimento 😉

Installare GitLab in Debian 8 con certificato Let’s Encrypt

Da utente root:

su -

apt-get update && apt-get install curl

Installo certbot

echo "deb http://ftp.debian.org/debian jessie-backports main" >> /etc/apt/sources.list

apt-get update && apt-get install certbot -t jessie-backports

Creo il file di configurazione di letsencrypt per gitlab.(cambiare gitlab.yourdomain.com con il nome del vostro sito e your@email.com con il vostro indirizzo email)

Il dominio mattermost.yourdomain.com serve per abilitare anche la chat inclusa in gitlab (cambiare yourdomain.com col vostro dominio)

mkdir -p /root/letsencrypt-config 
cat <<EOT >> /root/letsencrypt-config/gitlab.ini
# this is the let's Encrypt config for our gitlab instance

# use the webroot authenticator. 
 authenticator = webroot
# the following path needs to be served by our webserver
# to validate our domains
 webroot-path = /var/www/letsencrypt

# generate certificates for the specified domains.
domains = gitlab.yourdomain.com, mattermost.yourdomain.com

# register certs with the following email address
email = your@email.com

# use a 4096 bit RSA key instead of 2048
rsa-key-size = 4096
EOT

Creo una cartella per la verifica del sito

mkdir -p /var/www/letsencrypt

Installo Gitlab

curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | bash
apt-get install gitlab-ce

Modifico il file di configurazione di Gitlab impostando il nome del sito (cambiare gitlab.yourdomain.com con il nome del vostro sito)

vi /etc/gitlab/gitlab.rb
external_url "http://gitlab.yourdomain.com"

Per abilitare la chat mattermost modificare anche la seguente riga:

mattermost_external_url 'http://mattermost.yourdomain.com'

Aggiungo al file di configurazione delle linee per utilizzare le chiavi e per attivare l’invio della posta. Modificare opportunamente le variabili evidenziate

cat <<EOT >> /etc/gitlab/gitlab.rb
### Customize NGINX
nginx['redirect_http_to_https'] = true
nginx['ssl_certificate']= "/etc/letsencrypt/live/gitlab.yourdomain.com/fullchain.pem"
nginx['ssl_certificate_key'] = "/etc/letsencrypt/live/gitlab.yourdomain.com/privkey.pem"

nginx['custom_gitlab_server_config']="location ^~ /.well-known {\n alias /var/www/letsencrypt/.well-known;\n}\n"

### SMTP
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.gmail.com"
gitlab_rails['smtp_port'] = 587
gitlab_rails['smtp_user_name'] = "my.email@gmail.com"
gitlab_rails['smtp_password'] = "my-gmail-password"
gitlab_rails['smtp_domain'] = "smtp.gmail.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = false
gitlab_rails['smtp_openssl_verify_mode'] = 'peer'
EOT

Per configurare anche la chat Mattermost aggiungere le seguenti righe:

cat <<EOT >> /etc/gitlab/gitlab.rb
mattermost_nginx['custom_gitlab_mattermost_server_config'] = "location ^~ /.well-known {\n alias /var/www/letsencrypt/.well-known;\n}\n"
mattermost['enable'] = true
mattermost['gitlab_auth_endpoint'] = "https://gitlab.yourdomain.com/oauth/authorize"
mattermost['gitlab_token_endpoint'] = "https://gitlab.yourdomain.com/oauth/token"
mattermost['gitlab_user_api_endpoint'] = "https://gitlab.yourdomain.com/api/v3/user"
mattermost_nginx['redirect_http_to_https'] = true
mattermost_nginx['ssl_certificate'] = "/etc/letsencrypt/live/gitlab.yourdomain.com/fullchain.pem"
mattermost_nginx['ssl_certificate_key'] = "/etc/letsencrypt/live/gitlab.yourdomain.com/privkey.pem"
mattermost['email_enable_sign_up_with_email'] = true
mattermost['email_enable_sign_in_with_email'] = true
mattermost['email_enable_sign_in_with_username'] = true
mattermost['email_send_email_notifications'] = true
mattermost['email_require_email_verification'] = false
mattermost['email_smtp_username'] = "my.email@gmail.com"
mattermost['email_smtp_password'] = "my-gmail-password"
mattermost['email_smtp_server'] = "smtp.gmail.com"
mattermost['email_smtp_port'] = 587
mattermost['email_connection_security'] = "STARTTLS"
EOT

Per altre configurazioni smtp vedi: https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/doc/settings/smtp.md

Riconfiguro GITLAB

gitlab-ctl reconfigure

Creo il certificato

certbot certonly -c /root/letsencrypt-config/gitlab.ini

Modifico la configurazione impostando https

vi /etc/gitlab/gitlab.rb
external_url "https://gitlab.yourdomain.com/"

anche per Mattermost

mattermost_external_url 'https://mattermost.yourdomain.com'

Creo uno script per l’aggiornamento del certificato

cat <<EOT >> /etc/cron.monthly/renew-ssl-certificates

#!/bin/bash

/usr/bin/certbot certonly -c /root/letsencrypt-config/gitlab.ini --renew-by-default
# or /usr/bin/certbot renew --quiet

gitlab-ctl restart
EOT

Rendo eseguibile lo script

chmod +x /etc/cron.monthly/renew-ssl-certificates

Accedo a gitlab con l’utente root (la password viene richiesta alla prima schermata)

Dall’area admin – Settings – Applications, modifico l’url dell’applicazione Mattermost da http a https

https://mattermost.yourdomain.com/signup/gitlab/complete

https://mattermost.yourdomain.com/login/gitlab/complete

VestaCP e Iptables su container Proxmox

Utilizzando il Pannello VestaCP su una macchina virtuale (container) sotto Proxmox ho riscontrato che non potevo inviare mail tramite smtp.

Indagando sono riuscito a capire che iptables non funziona correttamente nei container di Proxmox.
In particolare queste regole ad esempio non si attivano:
– append INPUT – match state – state ESTABLISHED, RELATED – jump ACCEPT
– append OUTPUT – match state – state ESTABLISHED, RELATED – jump ACCEPT
Allora, visto che modprobe non è attivo nei container ho trovato che nella macchina padre Proxmox bisogna modificare il file

/etc/vz/vz.conf
e nella sezione IPv4 modificare la riga IPTABLES in:

IPTABLES="iptable_filter iptable_mangle ipt_limit ipt_multiport ipt_tos ipt_TOS ipt_REJECT ipt_TCPMSS ipt_tcpmss ipt_ttl ipt_LOG ipt_length ip_conntrack ip_conntrack_ftp ip_conntrack_irc ipt_conntrack ipt_state ipt_helper iptable_nat ip_nat_ftp ip_nat_irc ipt_REDIRECT xt_mac ipt_owner"

A questo punto riavviare la macchina e dai container le regole viste sopra funzionano..
Ma ho visto anche che lo script di attivazione di iptables di vestaCP fa un test per verificare se e’ presente il modulo “state” che non funziona ancora..

Allora ho modificato il file
/usr/local/vesta/bin/v-update-firewall

alla riga 41 e seguenti in questo modo:

# Checking conntrack module avaiabilty
#$modprobe nf_conntrack >/dev/null 2>&1
#$modprobe nf_conntrack_ftp >/dev/null 2>&1
cat /proc/net/ip_tables_matches | grep state > /dev/null 2>&1
if [ $? -ne 0 ]; then
stateful='no'
fi

riavviando dal pannello VestaCP il servizio di firewall, ora tutto funziona a dovere !!

Aumentare la dimensione di un disco virtuale in Centos 6

Questa mini guida spiega come aumentare la dimensione di un disco di una macchina virtuale Linux Centos 6 su sistema VMware.

Ci sono diverse guide a proposito ma poche coprono tutti i seguenti aspetti:

  • Macchina virtuale su VMWare
  • Sistema Linux Centos 6
  • Dischi gestiti con LVM
  • Evitare di dover definire una partizione aggiuntiva

Ecco i passaggi che ho fatto.

Installazione base di Centos 6.4 su VMPlayer o VMware Fusion su Mac

Il disco di base era dimensionato a 6 GB

Ora voglio portarlo a 12 GB

Controllo lo spazio a disposizione inizialmente:

[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Montato su
/dev/mapper/VolGroup-lv_root
 3,5G 620M 2,8G 19% /
tmpfs 497M 0 497M 0% /dev/shm
/dev/sda1 485M 32M 429M 7% /boot

Controllo la dimensione delle partizioni in settori:

[root@localhost ~]# fdisk -ul /dev/sda
 
Disco /dev/sda: 6442 MB, 6442450944 byte
255 testine, 63 settori/tracce, 783 cilindri, totale 12582912 settori
Unità = settori di 1 * 512 = 512 byte
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Identificativo disco: 0x0009fd66
 
Dispositivo Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048     1026047      512000   83  Linux
La partizione 1 non termina al limite del cilindro.
/dev/sda2         1026048    12582911     5778432   8e  Linux LVM
La partizione 2 non termina al limite del cilindro.

Prendo nota del settore  1026048 iniziale della partizione /dev/sda2

Spengo la macchina virtuale con

[root@localhost ~]# halt

e aumento la dimensione del disco fisso a 12 GB. Avvio nuovamente la macchina e uso fdisk per ridimensionare la partizione /dev/sda2

[root@localhost ~]# fdisk /dev/sda
 
WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').
 
Comando (m per richiamare la guida): p
 
Disco /dev/sda: 12.9 GB, 12884901888 byte
 
255 testine, 63 settori/tracce, 1566 cilindri
Unità = cilindri di 16065 * 512 = 8225280 byte
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Identificativo disco: 0x0009fd66
 
Dispositivo Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          64      512000   83  Linux
La partizione 1 non termina al limite del cilindro.
/dev/sda2              64         784     5778432   8e  Linux LVM
La partizione 2 non termina al limite del cilindro.
 
Comando (m per richiamare la guida): d
Numero della partizione (1-4): 2
 
Comando (m per richiamare la guida): n
Azione comando
    e   estesa
   p   partizione primaria (1-4)
p
Numero della partizione (1-4): 2
Primo cilindro (64-1566, predefinito 64):
Utilizzo del valore predefinito 64
Last cilindro, +cilindri or +size{K,M,G} (64-1566, predefinito 1566):
Utilizzo del valore predefinito 1566
 
Comando (m per richiamare la guida): t
Numero della partizione (1-4): 2
Codice esadecimale (digitare L per elencare i codici): 8e
Modificato il tipo di sistema della partizione 2 in 8e (Linux LVM)
 
Comando (m per richiamare la guida): u
Modifica delle unità di visualizzazione/immissione su settori
 
Comando (m per richiamare la guida): p
 
Disco /dev/sda: 12.9 GB, 12884901888 byte
 
255 testine, 63 settori/tracce, 1566 cilindri, totale 25165824 settori
Unità = settori di 1 * 512 = 512 byte
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Identificativo disco: 0x0009fd66
 
Dispositivo Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048     1026047      512000   83  Linux
La partizione 1 non termina al limite del cilindro.
/dev/sda2         1026048    25157789    12065871   8e  Linux LVM

Se il primo settore della partizione /dev/sda2 non e’ uguale a prima del ridimensionamento possiamo utilizzare la modalitò avanzata di fdisk

Comando (m per richiamare la guida): x
 
Comando per esperti (m per richiamare la guida): b
Numero della partizione (1-4): 2
Nuovo inizio dati (1026048-25157789, predefinito 1026048): 1026048
 
Comando per esperti (m per richiamare la guida): w
La tabella delle partizioni è stata alterata!
 
Chiamata di ioctl() per rileggere la tabella delle partizioni.
 
WARNING: Re-reading the partition table failed with error 16: Dispositivo o risorsa occupata.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Sincronizzazione dei dischi in corso.

Riavvio per applicare le modifiche

[root@localhost ~]# reboot

Controllo la dimensione dei Gruppi di volume LVM

[root@localhost ~]# vgdisplay
  --- Volume group ---
  VG Name               VolGroup
  System ID
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  3
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               2
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               5,51 GiB
  PE Size               4,00 MiB
  Total PE              1410
  Alloc PE / Size       1410 / 5,51 GiB
  Free  PE / Size       0 / 0
  VG UUID               cGePzQ-4rCO-T6XB-dmAu-S8Vl-OvrU-09IU5I

Ridimensione il gruppo in base alla partizione

[root@localhost ~]# pvresize /dev/sda2
  Physical volume "/dev/sda2" changed
  1 physical volume(s) resized / 0 physical volume(s) not resized

Controllo ora il risultato

[root@localhost ~]# vgdisplay
  --- Volume group ---
  VG Name               VolGroup
  System ID
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  4
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               2
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               11,50 GiB
  PE Size               4,00 MiB
  Total PE              2945
  Alloc PE / Size       1410 / 5,51 GiB
  Free  PE / Size       1535 / 6,00 GiB
  VG UUID               cGePzQ-4rCO-T6XB-dmAu-S8Vl-OvrU-09IU5I

Estendo ora il volume logico lv_root

[root@localhost ~]# lvextend -l +100%FREE /dev/VolGroup/lv_root
  Extending logical volume lv_root to 9,54 GiB
  Logical volume lv_root successfully resized
[root@localhost ~]# lvdisplay /dev/VolGroup/lv_root --- Logical volume --- LV Path /dev/VolGroup/lv_root LV Name lv_root VG Name VolGroup LV UUID HlpgVs-YQ2L-ve3n-p3S8-N2gC-USV2-3nROu4 LV Write Access read/write LV Creation host, time localhost.localdomain, 2013-06-27 00:10:38 +0200 LV Status available # open 1 LV Size 9,54 GiB Current LE 2441 Segments 2 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 253:0

Alla fine espando il filesystem

[root@localhost ~]# resize2fs /dev/VolGroup/lv_root
resize2fs 1.41.12 (17-May-2010)
Filesystem at /dev/VolGroup/lv_root is mounted on /; on-line resizing required
old desc_blocks = 1, new_desc_blocks = 1
Performing an on-line resize of /dev/VolGroup/lv_root to 2499584 (4k) blocks.
The filesystem on /dev/VolGroup/lv_root is now 2499584 blocks long.

E verifico finalmente il risultato

[root@localhost ~]# df -h
Filesystem            Size  Used Avail Use% Montato su
/dev/mapper/VolGroup-lv_root
                      9,4G  621M  8,4G   7% /
tmpfs                 497M     0  497M   0% /dev/shm
/dev/sda1             485M   32M  429M   7% /boot

pdb.set_trace()

Per il debug degli script Python usiamo da tempo il sistema

import pdb;pdb.set_trace()

ma se abbiamo bisogno di debuggare uno script python dalla ZMI di Plone, questo sistema non funziona.

Ecco che ci viene aiuto un prodottino minimale per zope. Non e’ una novita’ ma l’ho incontrato solo di recente

basta scaricare dal repository e posizionarlo nella nostra cartella src:

svn co svn://svn.zope.org/repos/main/Products.enablesettrace/trunk enablesettrace

abilitarlo dal buildout.cfg, rilanciare ./bin/buildout

ed ecco che il comando

pdb.set_trace()

permette di stoppare l’esecuzione dello script nel punto in cui vogliamo.

Questo prodotto servira’ solo in fase di sviluppo ovviamente.

Per ulteriori informazioni du pdb vedi: http://docs.python.org/library/pdb.html

Installazione di Plone 4.1 su Debian 6.0.2

Ecco i passi da fare per installare Plone 4 su una distribuzione Debian 6.0.2 oppure Ubuntu 10.04LTS.

L’installazione prevede anche l’installazione di python in una directory utente e senza necessita’ di diritti di root

Gli unici comandi da eseguire come utente root sono i seguenti

aptitude update

aptitude upgrade

aptitude install zlib1g-dev libjpeg-dev build-essential libssl-dev

# la seguente linea e' opzionale
aptitude install ssh sudo screen subversion

# l'installazione dei 2 pacchetti seguenti puo' tornar utile per l'installazione di alcuni prodotti Plone:
aptitude install libxml2-dev libxslt-dev

adduser plone

su - plone

Ecco dunque tutti i passaggi da fare con l’utente appena creato plone

mkdir plone4; cd plone4

Scarico Python, Setuptools e Pip

wget http://www.python.org/ftp/python/2.7.1/Python-2.7.1.tgz
wget http://pypi.python.org/packages/source/s/setuptools/setuptools-0.6c11.tar.gz#md5=7df2a529a074f613b509fb44feefe74e
wget http://pypi.python.org/packages/source/p/pip/pip-1.0.2.tar.gz#md5=47ec6ff3f6d962696fe08d4c8264ad49
ATTENZIONE: Plone 4.1 non supporta completamente Python 2.7.x. Per quel che ho provato io funziona tutto, ma ufficialmente non e’ supportato Python 2.7.x
La scelta piu’ cautelare Per Plone 4.1 e’ Python 2.6: http://www.python.org/ftp/python/2.6.7/Python-2.6.7.tgz

Scompatto tutti i pacchetti

for i in `ls -1 *gz `; do tar xvzf $i; done

Creo il percorso dove andrò ad installare Python

mkdir -p python/2.7.1
cd Python-2.7.1

Configuro i sorgenti di Python per essere installati nel percorso definito sopra

./configure --prefix="/home/plone/plone4/python/2.7.1"
make
make install

Verifico che python sia installato con il supporto ssl:

$ ../python/2.7.1/bin/python
Python 2.7.1 (r...........)
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import socket
>>> socket.ssl
<function ssl at 0xb768ac34>
>>>

Se ottengo un risultato simile a quello sopra posso proseguire tranquillo, esco dalla console python con CTRL+d

Installo Setuptools e Pip

cd ../setuptools-0.6c11/
../python/2.7.1/bin/python2.7 setup.py install
cd ../pip-1.0.2/
../python/2.7.1/bin/python2.7 setup.py install
cd ..

Utilizzo Pip per installare ZopeSkel

./python/2.7.1/bin/pip install zopeskel==2.21.2
./python/2.7.1/bin/paster create --list-templates

Creo il buildout di Plone

./python/2.7.1/bin/paster create -t plone4_buildout
Selected and implied templates:
ZopeSkel#plone4_buildout  A buildout for Plone 4 developer installation
Enter project name: instance
Variables:
 egg:      instance
 package:  instance
 project:  instance
**************************************************************************
**   *** NOTE: You probably don't want to use this template!
**  Since Plone 3.1, the preferred way to get a buildout-based setup
**  for Plone is to use the standard installer for your operating
**  system (the Windows installer, the Mac installer, or the Unified
**  Installer for Linux/Unix/BSD). These give you a best-practice,
**  widely-used setup with an isolated Python and a well-documented
**  buildout. This template is here for older versions of Plone and
**  for experts who explicitly want a raw, non-installer-based
**  installation.
**  (This message is particularly aimed at people following out-of-
**  date books/documentation that suggest this is the right way to get
**  a Plone-based buildout. This is no longer the case.)
**************************************************************************
Expert Mode? (What question mode would you like? (easy/expert/all)?) ['easy']:
Plone Version (Plone version # to install) ['4.0.5']: 4.1
Creating template plone4_buildout
Creating directory ./instance
 Copying README.txt to ./instance/README.txt
 Copying bootstrap.py to ./instance/bootstrap.py
 Copying buildout.cfg_tmpl to ./instance/buildout.cfg
 Recursing into src
 Creating ./instance/src/
 Copying README.txt to ./instance/src/README.txt
 Recursing into var
 Creating ./instance/var/
 Copying README.txt to ./instance/var/README.txt
**************************************************************************
**   Generation finished.
**  You probably want to run python bootstrap.py and then edit
**  buildout.cfg before running bin/buildout -v".
**  See README.txt for details.
**************************************************************************
cd instance
../python/2.7.1/bin/python bootstrap.py
./bin/buildout

Avvio l’istanza in modalità foreground

./bin/instance fg

Per avviarla in background utilizzerò poi

./bin/instance start

OpenWRT su Mikrotik RouterBoard 133c3

Scheda Mikrotik 133c3

Ecco i passaggi da fare per installare OpenWRT su una scheda Mikrotik RouterBORAD 133C3

Il processore della scheda 133C3 e’ un Infineon ADM5120 percio’ abbiamo bisogno di questi files:

http://www.wifiextreme.com.au/files/openwrt/openwrt-adm5120-2.6-vmlinux.elf
http://www.wifiextreme.com.au/files/openwrt/openwrt-adm5120-2.6-rootfs.tgz
http://www.wifiextreme.com.au/files/openwrt/kernel (nome completo openwrt-adm5120-2.6-rb1xx-vmlinux)

Per caricare questi files abbiamo bisogno di un server di appoggio con i servizi dhcpd, tcpd e httpd

Illustrero’ le prodedure adottate utilizzando un server di appoggio linux (debian) e quelle adottate utilizzando un comune pc con windows XP.

Debian

Ho scaricato l’immagine minimale di debian: http://cdimage.debian.org/debian-cd/6.0.1a/i386/iso-cd/debian-6.0.1a-i386-businesscard.iso ed installata (nel mio caso in un pc virtuale)

Ho assegnato alla macchina debian l’ip statico 192.168.1.100 (supponendo che il router di rete abbia ip 192.168.1.2):

in /etc/network/interfaces:

auto lo
iface lo inet loopback

iface eth0 inet static
address 192.168.1.100
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.1.255
gateway 192.168.1.2
auto eth0

Installo i pacchetti che mi servono:

aptitude install apache2 tftpd dhcp3-server screen

ho creato la dir /srv/tftp

mkdir /srv/tftp; cd /srv/tftp

e scaricato qui dentro il file http://www.wifiextreme.com.au/files/openwrt/openwrt-adm5120-2.6-vmlinux.elf che rinominero’ in linuxrc

wget -O /srv/tftp/linuxrc http://www.wifiextreme.com.au/files/openwrt/openwrt-adm5120-2.6-vmlinux.elf

perche’ tftp funzioni assegno i permessi 777 alla cartella e al suo contenuto:

chmod -R 777 /srv/tftp

configuro il server dhcp in questo modo (/etc/dhcp/dhcpd.conf):

option domain-name "example.com";
option domain-name-servers 4.2.2.3, 8.8.8.8, ns1.example.com;
option subnet-mask 255.255.255.0;
default-lease-time 600;
max-lease-time 7200;
server-name "servername";

subnet 192.168.1.0 netmask 255.255.255.0 {
  range 192.168.1.200 192.168.1.250;
  option routers 192.168.1.2;
}

host clientname {
  filename "/srv/tftp/linuxrc";
  server-name "servername";
  next-server 192.168.1.100;
  hardware ethernet 01:23:45:67:89:AB;
  fixed-address 192.168.1.90;
}

01:23:45:67:89:AB va sostituito con il mac address della scheda Mikrotik. Vedi dopo come ricavarlo da console seriale.

nella cartella /var/www scarico gli altri file che serviranno in seguito:

cd /var/www; wget http://www.wifiextreme.com.au/files/openwrt/openwrt-adm5120-2.6-rootfs.tgz; wget -O /var/www/openwrt-adm5120-2.6-rb1xx-vmlinux http://www.wifiextreme.com.au/files/openwrt/kernel

ho rinominato il file kernel con il suo nome completo perche’ poi lo script di OpenWRT richiedera’ quel nome.

riavvio i servizi per applicare le modifiche:

/etc/init.d/isc-dhcp-server restart; /etc/init.d/openbsd-inetd restart

Passiamo ora alla scheda Mikrotik:
Colleghiamo un cavo null-modem tra la scheda e il pc (un adattatore usb-seriale puo’ tornar comodo).
Dalla mio pc la nuova seriale rilevata (tramite l’adattatore USB) si chiama /dev/ttyUSB0
Collego anche un cavo di rete direttamente tra la scheda ed il pc (la rete della mia macchina virtuale e’ impostata in bridge)

Dal mio pc apro una console seriale tramite screen

screen /dev/ttyUSB0 115200

(nel vostro pc potete scegliere la vostra console seriale preferita)

Diamo alimentazione alla scheda Mikrotik
Sulla console seriale comparira’ la scritta:
Press any key within 2 seconds to enter setup

Entro 2 secondi dovremo premere un tasto per accedere al bios della scheda Mikrotik

per avere informazioni sulla nostra scheda scegliamo “i” (i – board info):

Board Info:

        Board type: 133C3
     Serial number: 12270CCBBAAD
  Firmware version: 2.11
     CPU frequency: 175 MHz
       Memory size: 16 MB
  eth1 MAC address: 01:23:45:67:89:AB

formattiamo la memoria NAND (salutate prima per l’ultima volta il firmware originale..)

scegliamo “e” (e – format nand) e confermiamo con “yes”

scegliamo “o” (o – boot device) e poi “1” (1 – boot Ethernet once, then NAND)

ora scegliamo “p” (p – boot protocol) e poi “2” (2 – dhcp protocol)

ora possiamo uscire con “x” (x – exit setup)

e vedere se la scheda tramite dhcp riesce a ricevere il file linuxrc dalla macchina debian

Premendo invio alla fine del primo caricamento di openwrt ci ritroveremo una shell linux

ora per installare OpenWRT diamo il comando:

wget2nand http://192.168.1.100

Lo script wget2nand automaticamente effettua questi passaggi

mount /dev/mtdblock2 /mnt; cd /mnt; wget -O /mnt/kernel http://192.168.1.100/openwrt-adm5120-2.6-rb1xx-vmlinux;
cd /; umount /mnt; mount /dev/mtdblock3 /mnt; cd /mnt;
wget http://192.168.1.100/openwrt-adm5120-2.6-rootfs.tgz
gzip -d openwrt-adm5120-2.6-rootfs.tgz; tar xvf openwrt-adm5120-2.6-rootfs.tar
rm openwrt-adm5120-2.6-rootfs.tar
cd /; umount /mnt; sync

ora possiamo riavviare tramite il comando “reboot” e verificare nel bios che il boot device (opzione “o”) sia impostato su “n” (n – boot from NAND, if fail then Ethernet).

Ora l’installazione e’ finita.
OpenWRT rispondera’ via telnet all’indirizzo 192.168.1.1 e dopo aver cambiato la password di root potremo accedere tramite ssh.

Windows

Utilizzo Windows come pc di supporto per i servizi:
creo la cartella c:\wrt
scarico all’interno di questa cartella questo files:
http://tftpd32.jounin.net/download/tftpd32.400.zip
http://smallsrv.com/shttp3.exe
http://www.wifiextreme.com.au/files/openwrt/kernel
http://www.wifiextreme.com.au/files/openwrt/openwrt-adm5120-2.6-rootfs.tgz

creo la cartella c:\wrt\tftp
scarico all’interno di questa cartella questo file:
http://www.wifiextreme.com.au/files/openwrt/openwrt-adm5120-2.6-vmlinux.elf
e lo rinomino in linuxrc

installo il programma shttp3.exe nella cartella c:\wrt ed ottengo:
– la cartella del server http c:\wrt\shttps
– la cartella dove mettere i files che saranno accessibili da wget:
c:\wrt\shttps\www
sposto dentro la cartella c:\wrt\shttps\www i due files “kernel” e
“openwrt-adm5120-2.6-rootfs.tgz”

scompatto il programma tftpd32.400.zip
ottengo la cartella tftpd32.400
entro dentro e lancio il programma tftpd32 e lo configuro come segue:

Server interface: 192.168.1.100
Settings ->
       Global ->
               Start services: TFTP Server, DHCP Server
       TFTP ->
               Base dir: c:\wrt\tftp
               Security: standard
               tftp configuration: Timeout: 3, Max retrasmit: 6, TFTP port: 69
               Advanced TFTP Opions: PXE Compatibility, Allow '\' ad virtual root,
translate unix file names
       DHCP ->
               IP pool start. add.: 192.168.1.50
               Size of pool: 10
               Boot file: linuxrc
               Default router: 192.168.1.100
               Mask: 255.255.255.0
               DHCP Options: (no, no, no)

Chiudere e riaprire il programma tftpd32

collego il cavo seriale (cross) alla scheda mikrotik c133c
configuro il mio pc con l’ip di rete statico 192.168.1.100 netmask 255.255.255.0
collego il cavo di rete direttamente alla scheda mikrotik c133c

avvio un terminale con queste impostazioni: 115200 N,8,1
attacco l’alimentazione alla scheda mikrotik c133c

appena compare il messaggio “Press any key within 2 seconds to enter
setup” premere un tasto
dal menu principale entro in “boot device” (o) e scelgo l’opzione “1 –
boot Ethernet once, then NAND” (1)
entro ora nella sezione “boot protocol” (p) e scelgo “2 – dhcp protocol” (2)
alla fine esco dal menu del bios (x)

La sceda dovrebbe acquisire un indirizzo dinamico dal pc windows e
scaricare automaticamente il file linurc
Alla fine ci troveremo in console seriale il prompt dei comandi di openwrt

Posso vede le partizioni presenti con

cat /proc/mtd

ed ottengo una cosa del tipo:

dev:    size   erasesize  name
mtd0: 00010000 00001000 "booter"
mtd1: 00010000 00001000 "firmware"
mtd2: 00400000 00004000 "RouterBoard NAND Boot"
mtd3: 03c00000 00004000 "rootfs"
mtd4: 04000000 00004000 "NAND 64MiB 3,3V 8-bit"

Ora procedo all’installazione vera e propria:

Nel pc windows avvio il server web lanciando dalla cartella
c:\wrt\shttp il programma “http”

Dalla console seriale do i comandi:

mount /dev/mtdblock2 /mnt; cd /mnt; wget http://192.168.1.100/kernel

cd /; umount /mnt; mount /dev/mtdblock3 /mnt; cd /mnt;
wget http://192.168.1.100/openwrt-adm5120-2.6-rootfs.tgz

gzip -d openwrt-adm5120-2.6-rootfs.tgz; tar xvf openwrt-adm5120-2.6-rootfs.tar
rm openwrt-adm5120-2.6-rootfs.tar
cd /; umount /mnt; sync; reboot

L’installazione di OpenWRT e’ terminata.

Possiamo cancellare dal pc windows tutta la cartella c:\wrt

Da console seriale impostiamo la password di root per disabilitare
telnet e abilitare automaticamente ssh
l’ip di default e’ 192.168.1.1 e l’utente e’ “root”

Installare pure-ftpd con utenti virtuali

Scrivo questo post giusto per ricorarmi i passaggi nel caso dovessi ripetere l’operazone nel futuro, personalmente preferisco utilizzare sftp e scp per trasferire files da e per i server Linux, ma in qualche occasione viene richiesto ftp e quindi ecco come fare.

Sto utilizzando la distribuzione Debian, versione 6.0.2

Installo i pacchetti necessari:

aptitude install pure-ftpd pure-ftpd-common openssl

Controllo che sia impostata la modalita’ “standalone” nel file di configurazione /etc/default/pure-ftpd-common:

grep "STANDALONE_OR_INETD" /etc/default/pure-ftpd-common

Dovrei ottenere questo risultato:

STANDALONE_OR_INETD=standalone

..eventualmente vado a modificare il file.

Vado a modificare la configurazione di default:

cd /etc/pure-ftpd/conf

Abilito la modalita’ passiva. 121.134.156.178 e’ l’IP pubblico del server ed e’ necessario che il firewall consenta l’accesso alle porte da 4500 a 4600

echo ,21 > Bind
echo 121.134.156.178 > ForcePassiveIP
echo 4500 4600 > PassivePortRange

Applico alcuni accorgimenti di sicurezza:

echo yes > ChrootEveryone
echo yes > NoChmod
echo yes > BrokenClientsCompatibility
echo 4 > MaxClientsPerIP
echo 10 > MaxClientsNumber
echo 1 > TLS

Disabilito tutti i tipi di autenticazione e abilito l’autenticazione tramite database (testuale) di utenti virtuali

echo no > PAMAuthentication
echo no > UnixAuthentication
echo /etc/pure-ftpd/pureftpd.pdb > PureDB
ln -s /etc/pure-ftpd/conf/PureDB ../auth/50pure

Creo un gruppo ed un utente di sistema (reale) apposito a cui associare gli utenti virtuali. Questo utente non avra’ ne’ shell ne’ home directory

groupadd -g 2001 ftpgroup
useradd -u 2001 -s /bin/false -d /bin/null -c "pureftpd user" -g ftpgroup ftpuser

Ora posso iniziare a creare gli utenti virtuali tramite il comando pure-pw adduser

pure-pw useradd myfirstuser -u ftpuser -d /var/ftp/public/myfirstuser
pure-pw mkdb

Dopo ogni modifica al database testuale degli utenti virtuali (/etc/pure-ftpd/pureftpd.passwd) e’ necessario rigenerare il database binario utilizzato da pure-ftpd (/etc/pure-ftpd/pureftpd.pdb). Il comando pure-pw mkdb fa proprio questo.
Se pero’ aggiungiamo al primo comando il parametro -m, si dira’ a pure-pw di aggiornare automaticamente anche il database binario. In questo modo non servira’ il secondo comando pure-pw mkdb.

Creo ora la directory principale dell’utente virtuale (questa operazione puo’ essere ommessa se il server pure-ftpd viene lanciato con l’opzione -j che permettera’ la generazione automatica della directory al primo login dell’utente, personalmente preferisco generare manualmente le directory)

mkdir -p /var/ftp/public/myfirstuser
chown ftpuser:ftpgroup /var/ftp/public/myfirstuser

Genero ora un certificato ssl per il support TLS/SSL (vedi sopra il comando “echo 1 > TLS”)

openssl req -x509 -nodes -newkey rsa:1024 -keyout /etc/ssl/private/pure-ftpd.pem -out /etc/ssl/private/pure-ftpd.pem
chmod 600 /etc/ssl/private/pure-ftpd.pem

Riavvio il server e posso provare l’accesso ftp

/etc/init.d/pure-ftpd restart

Alcuni utili comandi:
Lista degli utenti virtuali

pure-pw list

Modifica della password di un utente

pure-pw passwd myfirstuser

Visualizzo i dettagli di un utente

pure-pw show myfirstuser

Modifico dei dettagli di un utente

pure-pw usermod myfirstuser -n 1000 -N 100
pure-pw mkdb

Elimino un utente virtuale e aggiorno subito il database binario (-m)

pure-pw userdel myfirstuser -m

Per monitorare gli utenti virtuali fpt collegati, posso utilizzare il comando

pure-ftpwho

La lista delle direttive di configurazione per Pure-FTPd su Debian/Ubuntu:

Flag Filename Value
-W AllowAnonymousFXP
-z AllowDotFiles
-w AllowUserFXP
-O %s AltLog string
-t %s AnonymousBandwidth range
-M AnonymousCanCreateDirs
-i AnonymousCantUpload
-e AnonymousOnly
-q %d:%d AnonymousRatio range
-s AntiWarez
-r AutoRename
-S %s Bind string
-b BrokenClientsCompatibility
-o CallUploadScript
-A ChrootEveryone
-j CreateHomeDir
-Z CustomerProof
-B Daemonize
-D DisplayDotFiles
-H DontResolve
-P %s ForcePassiveIP IP-number
-F %s FortunesFile string
-4 IPV4Only
-6 IPV6Only
-K KeepAllFiles
-L %d:%d LimitRecursion range
-1 LogPID
-c %d MaxClientsNumber
-C %d MaxClientsPerIP integer
-k %d MaxDiskUsage integer
-I %d MaxIdleTime integer
-m %d MaxLoad integer
-u %d MinUID integer
-N NATmode
-E NoAnonymous
-R NoChmod
-G NoRename
-0 NoTruncate
-p %d:%d PassivePortRange range
-y %d:%d PerUserLimits range
-X ProhibitDotFilesRead
-x ProhibitDotFilesWrite
-n %d:%d Quota range
-f %s SyslogFacility string
-Y %d TLS integer
-a %d TrustedGID integer
-V %s TrustedIP IP-number
-U %s:%s Umask file:dir
-T %s UserBandwidth range
-Q %d:%d UserRatio range
-d VerboseLog

Proxmox firewall e router con un solo ip pubblico

Ecco come ho impostato il server proxmox per avere un firewall e il routing tramite un unico ip pubblico.

Dal pannello di controllo web abilitare eth0 con l’ip pubblico senza bridge e vmbr0 con un ip locale:

...
auto eth0
iface eth0 inet static
         address 91.11.22.33
         netmask 255.255.255.0
         broadcast 91.11.22.255
         gateway 91.11.22.254

auto vmbr0
iface vmbr0 inet static
        address 10.254.254.254
        netmask 255.0.0.0
        broadcast 10.255.255.255
        bridge_ports none
        bridge_stp off
        bridge_fd 0

...
...

Ora install shorewall

sudo aptitude install shorewall

Creo il file /etc/shorewall/zones e ci scrivo:

#ZONE   TYPE            OPTIONS         IN                      OUT
#                                       OPTIONS                 OPTIONS
fw      firewall
net     ipv4
dmz     ipv4

Creo il file /etc/shorewall/interfaces e ci scrivo:

#ZONE   INTERFACE       BROADCAST       OPTIONS
net     eth0            detect          blacklist,nosmurfs
dmz     venet0          detect          routeback
dmz     vmbr0           detect          routeback,bridge

Creo il file /etc/shorewall/policy e ci scrivo:

#SOURCE DEST    POLICY          LOG     LIMIT:          CONNLIMIT:
#                               LEVEL   BURST           MASK

# From Firewall Policy
fw      fw      ACCEPT
fw      net     ACCEPT
fw      dmz     ACCEPT

# From DMZ Policy

dmz     dmz     ACCEPT
dmz     net     ACCEPT
dmz     fw      DROP            info

# From Net Policy
net     fw      DROP            info
net     dmz     DROP            info

# THE FOLLOWING POLICY MUST BE LAST
#
all     all     REJECT          info

Creo il file /etc/shorewall/rules e ci scrivo:

#ACTION          SOURCE     DEST       PROTO   DEST        SOURCE     ORIGINAL    RATE

# Permit access to SSH
SSH/ACCEPT       net        fw         -       -            -          -        
  6/min:5

# Permit access to Proxmox Manager and Console
ACCEPT           net        fw         tcp     443,5900:5999

# PING Rules
Ping/ACCEPT      all        all

# LAST LINE -- DO NOT REMOVE

Alla fine la cartella /etc/shorewall dovrebbe contenere i seguenti file:

drwxr-xr-x  2 root root 4096 Apr 14 15:15 .
drwxr-xr-x 77 root root 4096 Apr 14 13:15 ..
-rw-r--r--  1 root root  453 Nov  8  2007 Makefile
-rw-r--r--  1 root root  214 Apr 14 15:03 interfaces
-rw-r--r--  1 root root  494 Apr 14 15:10 policy
-rw-r--r--  1 root root  517 Apr 14 15:15 rules
-rw-r--r--  1 root root 4004 Apr 14 13:18 shorewall.conf
-rw-r--r--  1 root root  183 Apr 14 13:19 zones

Controllo ora il funzionamento di shorewall:

shorewall try /etc/shorewall 60

in questo minuto di prova posso provare se risponde il pannello di controllo web di proxmox e se riesco a loggarmi in ssh al server.

Se tutto funziona posso abilitare proxmox all’avvio automatico: modifico il file /etc/default/shorewall e cambio:

startup=0

in

startup=1

Posso ora avviare shorewall manualmente col comando

shorewall start

oppure riavviarlo al bisogno con

shorewall restart

Per permettere alle macchine virtuali di uscire in internet creo il file /etc/shorewall/masq e sccrivo:

#INTERFACE      SOURCE          ADDRESS         PROTO   PORT(S) IPSEC   MARK
eth0            10.0.0.0/8

# LAST LINE -- DO NOT REMOVE

per dirottare il traffico web (porta 80) su una macchina virtuale inserisco nel file /etc/shorewall/rules questa regola:

DNAT                    net     dmz:10.0.1.101          tcp     80

Posso anche cambiare porta di destinazione nella macchina virtuale con la regola:

DNAT                    net     dmz:10.0.1.103:8180     tcp     80

Le macchine virtuali potranno avere degli indirizzi privati del tipo 10.xxx.yyy.zzz (es 10.0.1.101) ed essere gestiti semplicemente con un’interfaccia venet.

Shorewall ha alcune opzioni comode e interessanti:

safe-restart

salva la configurazione attuale, quindi applica quella nuova e chiede conferma per mantenere le nuove regole; se la conferma non è data entro 60 secondi sono riapplicate le regole precedenti;

try configuration-directory [timeout]

riavvia shorewall utilizzando la configurazione presente nella directory specificata e se sono rilevati errori o se il timeout è raggiunto, le regole precedenti sono riapplicate;

show check

esegue la validazione sintattica della configurazione;

logwatch

simile a tail -f $LOGFILE;

ipcalc [<address> <mask> | <address/vlsm>]

dato un indirizzo di rete, mostra i corrispondenti indirizzi di network, broadcast e netmask.

(per questo post ho preso pesantemente spunto dal seguente: http://www.myatus.co.uk/2009/08/31/guide-firewall-and-router-with-proxmox/)

Installazione xvd in Plone 4

XVD e’ un “nuovo” metodo di personalizzare i template di Plone, per maggiori info vedi http://plone.org/products/collective.xdv/documentation/reference-manual/theming.

Per l’nstallazione su Plone 4 su server debian 6.0.2 ho eseguito i seguenti passaggi:

Installo i pacchetti debian: build-essential e libxslt1-dev, in precedenza avevo gia installato python 2.7.1 da sorgenti (vedi il post http://www.carinato.net/linux/installazione-di-plone-4-su-debian-6-0-2)

sudo aptitude install build-essential libxslt1-dev

Modifico il file buildout.cfg in questo modo:

Nella sezione [buildout] cerco la variabile extends ed aggiungo

http://good-py.appspot.com/release/collective.xdv/1.0?plone=4.0.4

ottengo in questo modo (la seconda e terza riga devo essere identate):

extends =
  versions.cfg
  http://good-py.appspot.com/release/collective.xdv/1.0?plone=4.0.4

Inoltre come per i comuni prodotti aggiuntivi aggiungo il prodotto nella variabile eggs

eggs =
    Plone
    ...
    ...
    collective.xdv

A questo punto rilancio il buildout

./bin/buildout

Creo nella cartella principlae di Plone (dove si trova il file buildout.cfg) una cartella themes e ci metto dentro il tema statico di riferimento ed il file xml con le regole. Un test minimale puo’ essere fatto come spiegato qui

Avvio l’istanza Plone per testare il risultato

./bin/instance fg

e attivo xdv dall’apposito pannello di controllo, vedi sempre qui

Buon “theming” !!