:: UCSPI-TCP


Nome del pacchetto:   ucspi-tcp
Sito di riferimento:   http://cr.yp.to/ucspi-tcp.html
Autore:   D. J. Bernstein
Versione presentata:   v. 0.88
Categoria port:   SYSUTILS

:: Descrizione del pacchetto

Una caratteristica dei sistemi Unix è la possibilità di eseguire programmi in grado di rimanere in "ascolto" e gestire connessioni tcp provenienti da client.
Per risparmiare risorse è possibile utilizzare un programma che avvia una sola "istanza" di se stesso necessaria per esaminare tutte le connessioni in arrivo nel sistema. Quando una connessione ad una determinata porta/servizio è identificata e valida, questo programma è in grado di avviare l'applicazione corretta.

Uno dei tcpd più famosi in ambiente Unix si chiama INETD. Questo programma è molto versatile ma soffre di alcuni problemi tra cui la difficoltà di gestire grandi numeri di connessioni e la necessità di memoria per lavorare quando si verificano grossi carichi di lavoro.
Per l'implementazione del servizio abbiamo deciso di sostituire INETD con ucspi-tcp, realizzato da D. J. Bernstein, lo sviluppatore di QMAIL.

L'utilizzo di ucpsi-tcp consente di contenere "overloading" durante connessioni simultanee.

:: Installazione

UCSPI-TCP è disponibile tra i ports di FreeBSD. E' pertanto possibile installarlo attraverso i consueti comandi:

# cd /usr/ports/sysutils/ucspi-tcp
# make
# make install
# make clean

L'installazione è completata. Per verificare l'installazione dei file compresi nel pacchetto vi ricordiamo l'utilizzo di:

# pkg_info (elenco dei pacchetti tra cui ucspi-tcp)
# pkg_info -L [nome del pacchetto]

Controlliamo se il nostro sistema ha in esecuzione INETD e, se presente, "killiamo" il processo e disabilitiamo il suo avvio automatico al boot nel seguente modo:

vi /etc/rc.conf
[CONTENUTO DEL FILE]
....
[AGGIUNGERE IN CODA AL FILE]
inetd_enable="NO"

A questo punto creiamo una directory in cui metteremo i file di regole che ucspi-tcp utilizzerà.

# cd /etc
# mkdir ucspi-rules

L'installazione è completata.

:: Configurazione

La sintassi per avviare tcpserver è la seguente:

# tcpserver options host port application

dove options valide sono:

Opzione abbreviata Descrizione
-B bannerInvia il banner al computer remoto una volta stabilita una connessione.
-c nConsente al massimo n connessioni simultanee.
-dRimane in attesa per un periodo prolungato in caso di di risposte lente dal parte del computer remoto.
-DNon rimane mai in attesa per un periodo prolungato.
-g gidCambia il gid di tcpserver prima di ricevere una connessione.
-hRicerca il nome qualificato dell'indirizzo IP del computer client effettuando chiamate ai servers dns.
-HNon ricerca il nome qualificato dell'indirizzo IP del computer client.
-l localnameUsa localname quale nome del computer sul quale tcpserver stà funzionando anzichè ricercarlo mediante query ai server dns.
-oNon cambia mai le opzioni dei pacchetti IP.
-OCancella qualunque opzione di routing dei pacchetti IP (default).
-pRicerca l'indirizzo IP del computer client effettuando un ricerca inversa ai server dns.
-PNon ricerca l'indirizzo IP del computer client effettuando una ricerca inversa.
-u uidCambia il uid di tcpserver prima di ricevere una connessione.
-x dbUsa le regole contenute nel file db per accettare o rifiutare una connessione.
-XSe il file db specificato con l'opzione -x non esiste permette qualuqnue connessione.


dove host è l'indirizzo IP del computer locale da dove accettare le connessioni; il valore 0 indica tutti gli indirizzi IP del computer;
dove port è in numero od il nome della porta dalla quale attendere le connessioni;
dove application è la riga di comando da digitare per avviare l'applicazione interessata.

Un ruolo molto importante è poi svolto dal file db dove sono contenute le regole di convalida delle connessioni. Il formato di tale file è il seguente:

ip/domain:allow/deny,variabili

Esso è costituito essenzialmente da tre parti, la prima composta dall'indirizzo IP o dal nome della rete o del computer da cui si accettano le connessioni; la seconda dalla parola allow o deny; la terza dalle variabili di sistema che si vogliono impostare durante la connessione.

Iniziamo dunque la configurazione di ucspi con la creazione dei file di regole necessarie per il controllo delle connessioni alle porte tcp SMTP (25) e POP (110). Nel nostro caso:

# cd /etc/ucspi-rules
# vi rules-25.tcp
[CONTENUTO DEL FILE]
1.2.3.:allow,RELAYCLIENT=""
:allow

# vi rules-110.tcp
[CONTENUTO DEL FILE]
:allow

Analizziamo il contenuto di rules-25.tcp.
In questo file abbiamo indicato a ucpsi-tcp che vogliamo consentire a tutti quelli della rete 1.2.3 di usare il server 1.2.3.4 come relay per l'inoltro di messaggi (prima riga).
Consentiamo a tutti di raggiungere la porta 25 del nostro server per inoltrare messaggi al mio sistema (seconda riga).
In questo file, la variabile RELAYCLIENT svolge un ruolo basilare perchè se non fosse stata definita in quel modo, qmail avrebbe accettato solo ed esclusivamente email indirizzate agli hosts elencati nel file /var/qmail/control/rcpthosts. Dato che non possiamo conoscere a priori i destinatari delle email scritte dagli utenti della nostra rete, impostando la variabile RELAYCLIENT="", forziamo qmail ad ignorare il file /var/qmail/control/rcpthosts e quindi ad accettare email verso qualunque host. Tale comportamento deve essere tenuto però solo nei confronti degli utenti della nostra rete per evitare di creare un relay di posta disponibile a tutti.

Ora dobbiamo procedere alla "compilazione" dei file di regole appena prodotti in modo da poterli usare con il demone ucspi-tcp.
Per automatizzare questa operazione abbiamo preparato un breve script che dovrebbe consentirci di velocizzare l'operazione ogni volta che apportiamo modifiche a questi file di regole.

# cd /etc/ucspi-rules
# vi make-db.sh
[CONTENUTO DEL FILE]
cat rules-25.tcp | tcprules rules-25.cdb temp
cat rules-110.tcp | tcprules rules-110.cdb temp
# chmod 700 make-db.sh
# ./make-db.sh

Attiviamo infine il file di boot per l'avvio automatico del tcpserver e delle relative regole.

# cd /usr/local/etc/rc.d
# vi ucspi.sh
[CONTENUTO DEL FILE]
#!/bin/sh

case "$1" in
start)
        /usr/local/bin/tcpserver -p -x \
                 /etc/ucspi-rules/rules-25.cdb -u qmaild -g \
                 qnofiles 0 smtp /var/qmail/bin/qmail-smtpd &

        /usr/local/bin/tcpserver -v -R 0 pop3 /var/qmail/bin/qmail-popup server.rete.dom \\
                 /usr/local/bin/checkpassword /var/qmail/bin/qmail-pop3d Maildir \\
                 2>&1 | /var/qmail/bin/splogger &

        echo " ucspi-tcpd"
;;
stop)
        killall tcpserver
        echo " ucspi-tcpd"
;;
*)
         echo "Usage: `basename $0` {start|stop}" >&2
;;
esac

exit 0

(salvataggio e ritorno al prompt)

# chmod 555 ucspi.sh
# /usr/local/etc/rc.d/ucspi.sh start

[ Pagina principale ]