8.2_ Configurazione del server.
codice:
# Some options that are often worth tuning have been included as
# commented-out examples in this file.
# - When such options are commented with ";", the proposed setting
# differs from the default Samba behaviour
# - When commented with "#", the proposed setting is the default
# behaviour of Samba but the option is considered important
# enough to be mentioned here
Ok.
codice:
# NOTE: Whenever you modify this file you should run the command
# "testparm" to check that you have not made any basic syntactic
# errors.
# A well-established practice is to name the original file
# "smb.conf.master" and create the "real" config file with
# testparm -s smb.conf.master >smb.conf
# This minimizes the size of the really used smb.conf file
# which, according to the Samba Team, impacts performance
# However, use this with caution if your smb.conf file contains nested
# "include" statements. See Debian bug #483187 for a case
# where using a master file is not a good idea.
Rinomino quindi il file smb.conf in smb.conf.master e farò le modifiche su questo, generando poi il file smb.conf con il comando proposto. Nella directory non c'è già un file smb.conf.master quindi debian di default usa il smb.conf completo ma non è un problema.
codice:
sudo mv /etc/samba/smb.conf /etc/samba/smb.conf.master
codice:
#======================= Global Settings =======================
[global]
## Browsing/Identification ###
# Change this to the workgroup/NT-domain name your Samba server will part of
workgroup = fracassetti.lan
# server string is the equivalent of the NT Description field
server string = %h server
# Windows Internet Name Serving Support Section:
# WINS Support - Tells the NMBD component of Samba to enable its WINS Server
# wins support = no
# WINS Server - Tells the NMBD components of Samba to be a WINS Client
# Note: Samba can be either a WINS Server, or a WINS Client, but NOT both
; wins server = w.x.y.z
# This will prevent nmbd to search for NetBIOS names through DNS.
dns proxy = no
# What naming service and in what order should we use to resolve host names
# to IP addresses
; name resolve order = lmhosts host wins bcast
La configurazione di base fatta dal setup. E' già impostato il gruppo di lavoro in fracassetti.lan
codice:
#### Networking ####
# The specific set of interfaces / networks to bind to
# This can be either the interface name or an IP address/netmask;
# interface names are normally preferred
; interfaces = 127.0.0.0/8 eth0
interfaces = eth1
# Only bind to the named interfaces and/or networks; you must use the
# 'interfaces' option above to use this.
# It is recommended that you enable this feature if your Samba machine is
# not protected by a firewall or is a firewall itself. However, this
# option cannot handle dynamic or non-broadcast interfaces correctly.
; bind interfaces only = yes
bind interfaces only = yes
Sarò fissato ma il protocollo SMB non è considerato molto sicuro, sicuramente non per l'uso al di fuori di una rete locale e gli stessi commenti suggeriscono di procedere in questo modo. Per quanto mi riguarda, mi serve solo che sia in ascolto sulla rete locale e l'interfaccia eth1. Visto che ho solo una rete associata all'interfaccia eth1 posso anche specificare solo quella, come indicato nei commenti.
codice:
#### Debugging/Accounting ####
# This tells Samba to use a separate log file for each machine
# that connects
log file = /var/log/samba/log.%m
# Cap the size of the individual log files (in KiB).
max log size = 1000
# If you want Samba to only log through syslog then set the following
# parameter to 'yes'.
# syslog only = no
syslog only = yes
# We want Samba to log a minimum amount of information to syslog. Everything
# should go to /var/log/samba/log.{smbd,nmbd} instead. If you want to log
# through syslog you should set the following parameter to something higher.
# syslog = 0
syslog = 1
# Do something sensible when Samba crashes: mail the admin a backtrace
panic action = /usr/share/samba/panic-action %d
Imposto il logging di samba direttamente nel syslog, non mi serve diversamente.
codice:
####### Authentication #######
# "security = user" is always a good idea. This will require a Unix account
# in this server for every user accessing the server. See
# /usr/share/doc/samba-doc/htmldocs/Samba3-HOWTO/ServerType.html
# in the samba-doc package for details.
# security = user
security = share
# You may wish to use password encryption. See the section on
# 'encrypt passwords' in the smb.conf(5) manpage before enabling.
encrypt passwords = true
# If you are using encrypted passwords, Samba will need to know what
# password database type you are using.
passdb backend = tdbsam
obey pam restrictions = yes
guest account = guest
invalid users = root
# This boolean parameter controls whether Samba attempts to sync the Unix
# password with the SMB password when the encrypted SMB password in the
# passdb is changed.
unix password sync = yes
# For Unix password sync to work on a Debian GNU/Linux system, the following
# parameters must be set (thanks to Ian Kahan < for
# sending the correct chat script for the passwd program in Debian Sarge).
passwd program = /usr/bin/passwd %u
passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .
# This boolean controls whether PAM will be used for password changes
# when requested by an SMB client instead of the program listed in
# 'passwd program'. The default is 'no'.
pam password change = yes
Aggiungo le configurazioni per indentificare l'utente che ho creato come il "guest", cioè un identificativo per un utente non autenticato che può accedere alle risorse condivise.
codice:
########## Domains ###########
# Is this machine able to authenticate users. Both PDC and BDC
# must have this setting enabled. If you are the BDC you must
# change the 'domain master' setting to no
#
; domain logons = yes
#
# The following setting only takes effect if 'domain logons' is set
# It specifies the location of the user's profile directory
# from the client point of view)
# The following required a [profiles] share to be setup on the
# samba server (see below)
; logon path = \\%N\profiles\%U
# Another common choice is storing the profile in the user's home directory
# (this is Samba's default)
# logon path = \\%N\%U\profile
# The following setting only takes effect if 'domain logons' is set
# It specifies the location of a user's home directory (from the client
# point of view)
; logon drive = H:
# logon home = \\%N\%U
# The following setting only takes effect if 'domain logons' is set
# It specifies the script to run during logon. The script must be stored
# in the [netlogon] share
# NOTE: Must be store in 'DOS' file format convention
; logon script = logon.cmd
# This allows Unix users to be created on the domain controller via the SAMR
# RPC pipe. The example command creates a user account with a disabled Unix
# password; please adapt to your needs
; add user script = /usr/sbin/adduser --quiet --disabled-password --gecos "" %u
# This allows machine accounts to be created on the domain controller via the
# SAMR RPC pipe.
# The following assumes a "machines" group exists on the system
; add machine script = /usr/sbin/useradd -g machines -c "%u machine account" -d /var/lib/samba -s /bin/false %u
# This allows Unix groups to be created on the domain controller via the SAMR
# RPC pipe.
; add group script = /usr/sbin/addgroup --force-badname %g
Questa sezione serve per creare un controller di dominio. Non è il mio caso e non mi serve quindi lascio tutto commentato.
codice:
########## Printing ##########
# If you want to automatically load your printer list rather
# than setting them up individually then you'll need this
# load printers = yes
# lpr(ng) printing. You may wish to override the location of the
# printcap file
; printing = bsd
; printcap name = /etc/printcap
# CUPS printing. See also the cupsaddsmb(8) manpage in the
# cupsys-client package.
; printing = cups
; printcap name = cups
Non ho neppure stampanti connesse al server quindi anche qui lascio tutto commentato.
codice:
############ Misc ############
# Using the following line enables you to customise your configuration
# on a per machine basis. The %m gets replaced with the netbios name
# of the machine that is connecting
; include = /home/samba/etc/smb.conf.%m
# Most people will find that this option gives better performance.
# See smb.conf(5) and /usr/share/doc/samba-doc/htmldocs/Samba3-HOWTO/speed.html
# for details
# You may want to add the following on a Linux system:
# SO_RCVBUF=8192 SO_SNDBUF=8192
# socket options = TCP_NODELAY
# The following parameter is useful only if you have the linpopup package
# installed. The samba maintainer and the linpopup maintainer are
# working to ease installation and configuration of linpopup and samba.
; message command = /bin/sh -c '/usr/bin/linpopup "%f" "%m" %s; rm %s' &
# Domain Master specifies Samba to be the Domain Master Browser. If this
# machine will be configured as a BDC (a secondary logon server), you
# must set this to 'no'; otherwise, the default behavior is recommended.
# domain master = auto
# Some defaults for winbind (make sure you're not using the ranges
# for something else.)
; idmap uid = 10000-20000
; idmap gid = 10000-20000
; template shell = /bin/bash
# The following was the default behaviour in sarge,
# but samba upstream reverted the default because it might induce
# performance issues in large organizations.
# See Debian bug #368251 for some of the consequences of *not*
# having this setting and smb.conf(5) for details.
; winbind enum groups = yes
; winbind enum users = yes
# Setup usershare options to enable non-root users to share folders
# with the net usershare command.
# Maximum number of usershare. 0 (default) means that usershare is disabled.
; usershare max shares = 100
Riguarda sempre le funzionalità di domain controller, non mi interessano.
codice:
#======================= Share Definitions =======================
#[homes]
# comment = Home Directories
# browseable = no
# By default, the home directories are exported read-only. Change the
# next parameter to 'no' if you want to be able to write to them.
# read only = yes
Per adesso mi interessa avere a disposizione solo la share /download, poi magari vedremo se ho bisogno di rendere disponibili le home directory di altri utenti... Per ora, commento tutto.
codice:
# File creation mask is set to 0700 for security reasons. If you want to
# create files with group=rw permissions, set next parameter to 0775.
create mask = 0700
# Directory creation mask is set to 0700 for security reasons. If you want to
# create dirs. with group=rw permissions, set next parameter to 0775.
directory mask = 0700
# By default, \\server\username shares can be connected to by anyone
# with access to the samba server.
# The following parameter makes sure that only "username" can connect
# to \\server\username
# This might need tweaking when using external authentication schemes
# valid users = %S
Tutti gli utenti devono potersi connettere alla share. Quindi commento.
Un discorso a parte meritano i permessi da indicare su files e directory contenuti nella share: Stò realizzando un serverino che starà in casa mia, non in un ufficio o un'azienda e non ci saranno più utenti a condividere la share. Mi serve che tutti coloro che accedono alle condivisioni possano spostare o eliminare i files contenuti all'interno della condivisione.
Il discorso da fare sulla forma ottale del permessi Unix non è complicato ma neppure così immediato.
Una "mask" è il set di permessi che sono attribuiti ad un files o ad una directory. e' indicata solitamente in gruppi da 3 o 4 cifre, di cui ora mi interessano solo le ultime 3. Nell'esempio evidenziato in rosso, il file indica come "File creation mask" il valore "0700" che, considerando solo le ultime 3 cifre, non si legge "settecento" ma "sette-zero-zero".
Questi cifre indicano i permessi assegnati (in questo caso) ai nuovi file creati nella share. Nell'ordine in cui si leggono di solito, "il proprietario" (user) di questi nuovi files ha "7" come livello di permessi, il "gruppo utente" (group) cui appartiene il proprietario ha "0" e "tutti gli altri" (other) hanno "0".
Questi livelli si ottengono con delle semplici somme ma, riassumendo velocemente e rimandando a una delle tante spiegazioni reperibili online per gli approfondimenti:
"0": Nessun permesso
"1": Esecuzione. Il file può essere eseguito ma non letto o scritto
"2": Scrittura. Il file può essere scritto ma non aperto per lettura o lanciato
"3": Il file può essere scritto ed eseguito ma non aperto per lettura
"4": Il file può essere aperto in lettura ma non scritto ne eseguito
"5": Il file può essere letto ed eseguito ma non scritto.
"6": Il file può essere letto e scritto ma non eseguito
"7": Tutti i permessi. Il file può essere letto, scritto ed eseguito.
Creare una share con "File creation mask" 0700 significa che l'utente proprietario del file godrà di tutti i permessi su di esso ma nessun'altro utente (a parte root) sarà in grado di lavorare su quel file. Se voglio che l'utente e tutti gli appartenenti al suo gruppo godano di tutti i permessi sul file dovrò usare la mask 770, se invece voglio che tutti possano fare tutto su quel file userò la mask 777.
Inutile dilungarsi, l'unico modo per capirci qualcosa è leggere le guide e provare...
codice:
# Un-comment the following and create the netlogon directory for Domain Logons
# (you need to configure Samba to act as a domain controller too.)
;[netlogon]
; comment = Network Logon Service
; path = /home/samba/netlogon
; guest ok = yes
; read only = yes
# Un-comment the following and create the profiles directory to store
# users profiles (see the "logon path" option above)
# (you need to configure Samba to act as a domain controller too.)
# The path below should be writable by all users so that their
# profile directory may be created the first time they log on
;[profiles]
; comment = Users profiles
; path = /home/samba/profiles
; guest ok = no
; browseable = no
; create mask = 0600
; directory mask = 0700
Sempre per domain controller, non mi interessa.
codice:
#[printers]
# comment = All Printers
# browseable = no
# path = /var/spool/samba
# printable = yes
# guest ok = no
# read only = yes
# create mask = 0700
# Windows clients look for this share name as a source of downloadable
# printer drivers
#[print$]
# comment = Printer Drivers
# path = /var/lib/samba/printers
# browseable = yes
# read only = yes
# guest ok = no
# Uncomment to allow remote administration of Windows print drivers.
# You may need to replace 'lpadmin' with the name of the group your
# admin users are members of.
# Please note that you also need to set appropriate Unix permissions
# to the drivers directory for these users to have write rights in it
; write list = root, @lpadmin
Niente stampanti quindi commento tutto.
codice:
# A sample share for sharing your CD-ROM with others.
;[cdrom]
; comment = Samba server's CD-ROM
; read only = yes
; locking = no
; path = /cdrom
; guest ok = yes
# The next two parameters show how to auto-mount a CD-ROM when the
# cdrom share is accesed. For this to work /etc/fstab must contain
# an entry like this:
#
# /dev/scd0 /cdrom iso9660 defaults,noauto,ro,user 0 0
#
# The CD-ROM gets unmounted automatically after the connection to the
#
# If you don't want to use auto-mounting/unmounting make sure the CD
# is mounted on /cdrom
#
; preexec = /bin/mount /cdrom
; postexec = /bin/umount /cdrom
Anche qui nessun cdrom da condividere
Provo quindi a generare il file di configurazione e riavviare samba, con i comandi
codice:
sudo testparm -s smb.conf.master >smb.conf
sudo /etc/init.d/samba restart
Questo è ora il contenuto del file smb.conf, con solo le istruzioni applicate e ripulito dai commenti:
codice:
[global]
workgroup = FRACASSETTI.LAN
server string = %h server
interfaces = eth1
bind interfaces only = Yes
security = SHARE
obey pam restrictions = Yes
guest account = guest
pam password change = Yes
passwd program = /usr/bin/passwd %u
passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .
unix password sync = Yes
syslog only = Yes
log file = /var/log/samba/log.%m
max log size = 1000
dns proxy = No
panic action = /usr/share/samba/panic-action %d
invalid users = root
8.3_ Impostazione di una share pubblica.
Dalla guida citata in precedenza prendo la sezione da aggiungere in fondo al file per creare la mia share di rete:
codice:
[Download]
comment = Risorsa pubblica condivisa
path = /download
read only = no
guest ok = yes
guest only = yes
create mask = 0666
directory mask = 0777
Il serverino rimane in casa mia, accessibile solo dalla LAN per impostazione data a Samba, non ho altri utenti e mi serve la libertà di muovere, modificare e cancellare liberamente files all'interno della share, esigenza di comodità che ne prevarica la riservatezza.
Con la configurazione data in precedenza, è l'utente "guest" con cui lavora samba che si presenta al sistema per scrivere i files nella share. A livello di filesystem, quindi, l'utente "owner" dei files e delle directory sarà guest. Anche operando via rete gli spostamenti di files tra una directory e l'altra all'interno della share saranno eseguiti sul server dall'utente guest quindi potrei utilizzare una mask più restrittiva per "create" e "directory".
Prendiamo però ora il caso in cui io abbia necessità di collegarmi al mio server via ssh con il mio utente "matteo" e avessi bisogno di maneggiare i files presenti nella share configurata usando la mask 0700 per le directory e 0600 per i files, come indicato nella guida.
Per il sistema, l'owner con diritti "7" o "6" sarà "guest" mentre "matteo" che appartiene agli "others" il permesso attribuito è "0" e quindi non potrò toccare files e directory senza modificarne prima gli attributi o senza usare "sudo" o diventare root.
Se volessi usare una mask più ristretta ma idonea alle mie esigenze potrei forse usare le mask 0606 e 0707che permetterebbero a "guest" ed a tutti gli altri utenti l'accesso in lettura e scrittura sui files e tutti i permessi sulle directory create nelle share. E' una situazione un pò atipica, in quanto esclude dall'accesso si dati solo gli utenti del server diversi da "guest" ma appartenenti al suo gruppo...
Una soluzione più standard sarebbe sicuramente rendere "matteo" membro del gruppo "guest" e usare una più standard mask "0660" e "0770".
Di solito, salvo esigenze particolari, per una soluzione casereccia come la mia si usano con sufficiente tranquillità le mask "0666" e "0777"...
Provo quindi a rigenerare il file di configurazione e riavviare samba, con i comandi
codice:
sudo testparm -s smb.conf.master >smb.conf
sudo /etc/init.d/samba restart
Questo è ora il contenuto del file smb.conf:
codice:
[global]
workgroup = FRACASSETTI.LAN
server string = %h server
interfaces = eth1
bind interfaces only = Yes
security = SHARE
obey pam restrictions = Yes
guest account = guest
pam password change = Yes
passwd program = /usr/bin/passwd %u
passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .
unix password sync = Yes
syslog only = Yes
log file = /var/log/samba/log.%m
max log size = 1000
dns proxy = No
panic action = /usr/share/samba/panic-action %d
invalid users = root
[Download]
comment = Risorsa pubblica condivisa
path = /download
read only = No
create mask = 0666
directory mask = 0777
guest only = Yes
guest ok = Yes
La directory, attualmente, è di proprietà di root e presenta i seguenti permessi:
codice:
drwxr-xr-x 2 root root 6 Aug 18 17:26 download
Io ho bisogno che sia anche scrivibile da tutti, altrimenti non sarà possibile creare o modificare file all'interno della directory da parte di utenti non root. Con il comando
codice:
sudo chmod -R o=rwx /download
si assegnano i permessi di lettura, scrittura ed esecuzione a tutti gli utenti non "root" e non appartenenti al gruppo "root" ("u" stà per user, "g" stà per "group" ed "o" stà per "others")
Ora i permessi sulla directory sono:
codice:
drwxr-xrwx 3 root root 17 Aug 18 17:37 download
Impostare "browseable = no" mi darebbe comunque la possibilità raggiungere la share scrivendone il percorso completo ma non potrei vederla nell'elenco delle risorse disponibili del server: Avrei, insomma, una share "nascosta". Per ora però non mi interessa.
http://www.nexthardware.com/forum/ga..._su_server.png http://www.nexthardware.com/forum/ga...ssetti.lan.png http://www.nexthardware.com/forum/ga...are_Player.jpg
Fatto, share configurata e scrivibile da Windows e Linux! ;)
[EDIT: 24 Febbraio 2012]
Oggi mi sono accorto di diversi errori nel log del server, dovuti ad un problema con il daemon "winbind". Questo daemon è utilizzato per la comunicazione con domini Windows e, dato che la mia rete locale non ha un dominio ma solo un workgroup, di per se il servizio è inutile. E' stato probabilmente installato come dipendenza di samba, dato che generalmente lavorano insieme.
Eseguire come root o tramite sudo i comandi:
codice:
/etc/init.d/winbind stop
update-rc.d winbind remove
arresta il servizio e lo rimuove dall'avvio automatico al boot. La funzionalità si samba, in assenza di un dominio windows, non ne viene influenzata.
[EDIT2: 24 Febbraio 2012]
Già che ci sono, ho notato che samba tenta continuamente di connettersi al daemon cupsd, per la gestione delle stampanti. Ovviamente, dato non ho stampanti sul server ed il servizio non è installato, anche per questo viene registrato un errore. Qui ho trovato qualche indicazione che per il momento sembra funzionare.
Ho aggiunto queste istruzioni alla sezione [global] del mio file di configurazione anche se il parse con testparm ha rimosso l'opzione "printing = none" che è quindi probabilmente evitabile:
codice:
load printers = No
printing = none
printcap name = /dev/null
e, ovviamente riavviato il daemon.
9.1_ Transmission daemon.
Per il protocollo bittorrent su Linux ho sempre utilizzato Transmission. Non per un motivo particolare, era il client predefinito installato in gnome... Poi ne ho scoperto alcune feature interessanti tra cui il fatto che questo client ho la possibilità di funzionare anche in modalità daemon, con il controllo tramite interfaccia web. Ancora meglio, di recente ho scoperto che c'è la possibilità di installare direttamente un'interfaccia grafica remota per la connessione e la gestione della modalità daemon in esecuzione su un'altra macchina. In più, questa interfaccia remota è disponibile per Windows, Linux, Mac ed in java, quindi in teoria anche per palmari e smartphone... Si candida pertanto a diventare il client bittorrent perfetto per la mia installazione.
Il contro è che l'ultima versione disponibile nei repository ufficiali di Debian è però la 2.03-2 mentre l'ultima rilasciata come stabile è una 2.33, che tra l'altro sembra implementare qualche bugfix interessante... Inoltre questa versione Transmission richiede una versione della libreria libevent > 2.0.10 e attualmente in debian c'è la 1.4... La 2.0.5 per Debian è in Alpha, si trova nel repository "Experimental". Non molto confortante: Avrei preferito non compilare da sorgenti e forse sarebbe meglio installare una versione più vecchia di transmission ma a questo punto provo...
La procedura che devo seguire è quella indicata per l'installazione in una headless machine.
[EDIT del 23 Giugno 2012:]
Se dovessero servire i .deb già compilati qui ci sono sia il deb di transmission-daemon che delle libreria libevent. Sono quelli che girano sul mio sistema e li aggiungo mano a mano che aggiorno il daemon: è l'unica garanzia che posso dare.
Questi sono i requisiti per compilare e generare il pacchetto .deb da installare per transmission-daemon:
codice:
sudo apt-get install build-essential automake autoconf libtool pkg-config libcurl4-openssl-dev intltool libxml2-dev libgtk2.0-dev libnotify-dev libglib2.0-dev libevent-dev checkinstall
La procedura installa circa 250mb di librerie e tools...
Ho trovato questa guida per ubuntu, che fà esattamente quello che mi serve: Con due comandi installa e compila la versione sperimentale della libreria e crea il pacchetto .deb per la versione 2.32 usando il tool checkinstall.
I comandi, spezzati per maggiore leggibilità ed adattati alla versione 2.33 sono i seguenti:
codice:
mkdir -v $HOME/transmission_build
cd $HME/transmission_build
wget http://monkey.org/~provos/libevent-2.0.11-stable.tar.gz
tar xvf libevent-2.0.11-stable.tar.gz
cd libevent-2.0.11-stable
./configure --prefix=$HOME/transmission_build/libevent
make
sudo make install
La procedura crea la directory transmission_build nella home directory dell'utente corrente, ci scarica dentro la versione 2.0.11-stable dei sorgenti della libreria libevent prelevati dal sito monkey.org:/, scompatta l'archivio e configura, compila ed installa la libreria. Di questa sequenza, l'unico comando che richiede i permessi di superuser è l'installazione, tutto il resto è raccomandabile farlo con i permessi di un utente standard.
Ora non resta che compilare ed installare la versione aggiornata di transmission-daemon.
Per la verità, la procedura sopra indicata sulla vm di test è andata liscia e senza intoppi mentre sul server fisico mi ha dato diversi problemi, probabilmente a causa della presenza della versione precedente della libreria. Sul server fisico ho dovuto rimuovere la versione 1.4 con il comando
codice:
apt-get purge libevent-1.*
prima della procedura precedente e creare un link simbolico alla nuova versione dopo l'installazione, con il comando:
codice:
ln -s /usr/local/lib/libevent-2.0.so.5 /usr/lib/libevent-2.0.so.5
Per installare la versione aggiornata di transmission-daemon è sufficiente eseguire il secondo comando della guida linkata in precedenza, di seguito spezzato per leggibilità ed aggiornato per la versione 2.33:
codice:
cd $HOME/transmission_build
wget http://download.transmissionbt.com/files/transmission-2.33.tar.bz2
tar xjvf transmission-2.33.tar.bz2
cd transmission-2.33
export PKG_CONFIG_PATH="$HOME/transmission_build/libevent/lib/pkgconfig"
./configure
make
sudo checkinstall --pakdir "$HOME/transmission_build" --backup=no --deldoc=yes --fstrans=no --deldesc=yes --delspec=yes --default --pkgversion "2.33"
make clean
In realtà, dovendo installare il programma sulla macchina stessa e non dovendo esportare il pacchetto .deb, gli ultimi due comandi possono essere tranquillamente sostituiti con:
codice:
sudo make install
ma non ci avevo pensato subito...
Installo ora il pacchetto .deb e lancio il comando "transmission-daemon --help" per verificare che la versione sia quella corretta:
codice:
sudo dpkg -i transmission_2.33-1_amd64.deb
(Reading database ... 65418 files and directories currently installed.)
Preparing to replace transmission 2.33-1 (using transmission_2.33-1_amd64.deb) ...
Unpacking replacement transmission ...
Setting up transmission (2.33-1) ...
Processing triggers for man-db ...
matteo@server:~/transmission_build$ transmission-daemon --help
Transmission 2.33 (12565) http://www.transmissionbt.com/
A fast and easy BitTorrent client
;)
Ora che il programma è installato, si tratta di creare un utente limitato "transmission" che esegua il processo transmission-daemon all'avvio ma che sia sprovvisto di password (in modo che non possa fare login sulla macchina) e creare uno script che avvii il daemon con le giuste credenziali al boot del server.
codice:
sudo adduser --disabled-password transmission
Ora eseguo un "cambio d'identità" necessario per avviare il processo transmission-daemon e generare una configurazione iniziale che posso poi personalizzare:
codice:
sudo su transmission
transmission-daemon -f
Se non ci sono messaggi di errore, basta avviare il processo per pochi secondi e poi arrestarlo con il comando "Ctrl +C". Con "exit" riprendo poi la mia identità.
http://www.nexthardware.com/forum/ga...n-daemon-f.jpg
Devo ora creare quello che si chiama "init script" e cioè lo script caricato al boot del server che avvia il processo transmission-daemon e ne permette la classica gestione start | stop | restart. Sono fortunato e la guida riportata qui indica proprio lo script da utilizzare per le distribuzioni debian-like. Non avendo cambiato la configurazione di transmission ed avendo accettato il nome utente "transmission" non devo modificare nulla quindi copio-incollo lo script aprendo con nano come root il file "/etc/init.d/transmission-daemon" e poi lo rendo eseguibile con i comandi:
codice:
sudo chmod +x /etc/init.d/transmission-daemon
sudo chown root:root /etc/init.d/transmission-daemon
Provo:
codice:
# /etc/init.d/transmission-daemon start
Starting bittorrent client transmission-daemon...
Starting bittorrent client transmission-daemon succeeded
root@server:/home/matteo/transmission_build# /etc/init.d/transmission-daemon stop
Stopping bittorrent client transmission-daemon...
start-stop-daemon: warning: this system is not able to track process names
longer than 15 characters, please use --exec instead of --name.
Ed il processo rimane appeso... Ahi! Lo script proposto dalla guida non funziona ma questa mia modifica un pò a sentimento alla linea 103 sembra risolvere il problema:
codice:
start-stop-daemon --chuid $USERNAME --stop --quiet --retry=TERM/10/KILL/5 --pidfile $PIDFILE --exec $DAEMON
I comandi
codice:
/etc/init.d/transmission-daemon start
/etc/init.d/transmission-daemon stop
/etc/init.d/transmission-daemon restart
funzionano ora come previsto. Il mio init-script corretto, testato e funzionate diventa quindi:
codice:
#! /bin/sh
### BEGIN INIT INFO
# Provides: transmission-daemon
# Required-Start: networking
# Required-Stop: networking
# Default-Start: 2 3 5
# Default-Stop: 0 1 6
# Short-Description: Start the transmission BitTorrent daemon client.
### END INIT INFO
# Original Author: Lennart A. JÃŒtte, based on Rob Howell's script
# Modified by Maarten Van Coile & others (on IRC)
# Do NOT "set -e"
#
# ----- CONFIGURATION -----
#
# For the default location Transmission uses, visit:
# http://trac.transmissionbt.com/wiki/ConfigFiles
# For a guide on how set the preferences, visit:
# http://trac.transmissionbt.com/wiki/EditConfigFiles
# For the available environement variables, visit:
# http://trac.transmissionbt.com/wiki/EnvironmentVariables
#
# The name of the user that should run Transmission.
# It's RECOMENDED to run Transmission in it's own user,
# by default, this is set to 'transmission'.
# For the sake of security you shouldn't set a password
# on this user
USERNAME=transmission
# ----- *ADVANCED* CONFIGURATION -----
# Only change these options if you know what you are doing!
#
# The folder where Transmission stores the config & web files.
# ONLY change this you have it at a non-default location
#TRANSMISSION_HOME="/var/config/transmission-daemon"
#TRANSMISSION_WEB_HOME="/usr/share/transmission/web"
#
# The arguments passed on to transmission-daemon.
# ONLY change this you need to, otherwise use the
# settings file as per above.
#TRANSMISSION_ARGS=""
# ----- END OF CONFIGURATION -----
#
# PATH should only include /usr/* if it runs after the mountnfs.sh script.
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
DESC="bittorrent client"
NAME=transmission-daemon
DAEMON=$(which $NAME)
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0
# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME
# Load the VERBOSE setting and other rcS variables
[ -f /etc/default/rcS ] && . /etc/default/rcS
#
# Function that starts the daemon/service
#
do_start()
{
# Export the configuration/web directory, if set
if [ -n "$TRANSMISSION_HOME" ]; then
export TRANSMISSION_HOME
fi
if [ -n "$TRANSMISSION_WEB_HOME" ]; then
export TRANSMISSION_WEB_HOME
fi
# Return
# 0 if daemon has been started
# 1 if daemon was already running
# 2 if daemon could not be started
start-stop-daemon --chuid $USERNAME --start --pidfile $PIDFILE --make-pidfile \
--exec $DAEMON --background --test -- -f $TRANSMISSION_ARGS > /dev/null \
|| return 1
start-stop-daemon --chuid $USERNAME --start --pidfile $PIDFILE --make-pidfile \
--exec $DAEMON --background -- -f $TRANSMISSION_ARGS \
|| return 2
}
#
# Function that stops the daemon/service
#
do_stop()
{
# Return
# 0 if daemon has been stopped
# 1 if daemon was already stopped
# 2 if daemon could not be stopped
# other if a failure occurred
start-stop-daemon --chuid $USERNAME --stop --quiet --retry=TERM/10/KILL/5 --pidfile $PIDFILE --exec $DAEMON
# start-stop-daemon --stop --quiet --retry=TERM/10/KILL/5 --pidfile $PIDFILE --name $NAME
RETVAL="$?"
[ "$RETVAL" = 2 ] && return 2
# Wait for children to finish too if this is a daemon that forks
# and if the daemon is only ever run from this initscript.
# If the above conditions are not satisfied then add some other code
# that waits for the process to drop all resources that could be
# needed by services started subsequently. A last resort is to
# sleep for some time.
start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
[ "$?" = 2 ] && return 2
# Many daemons don't delete their pidfiles when they exit.
rm -f $PIDFILE
return "$RETVAL"
}
case "$1" in
start)
echo "Starting $DESC" "$NAME..."
do_start
case "$?" in
0|1) echo " Starting $DESC $NAME succeeded" ;;
*) echo " Starting $DESC $NAME failed" ;;
esac
;;
stop)
echo "Stopping $DESC $NAME..."
do_stop
case "$?" in
0|1) echo " Stopping $DESC $NAME succeeded" ;;
*) echo " Stopping $DESC $NAME failed" ;;
esac
;;
restart|force-reload)
#
# If the "reload" option is implemented then remove the
# 'force-reload' alias
#
echo "Restarting $DESC $NAME..."
do_stop
case "$?" in
0|1)
do_start
case "$?" in
0|1) echo " Restarting $DESC $NAME succeeded" ;;
*) echo " Restarting $DESC $NAME failed: couldn't start $NAME" ;;
esac
;;
*)
echo " Restarting $DESC $NAME failed: couldn't stop $NAME" ;;
esac
;;
*)
echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2
exit 3
;;
esac
Ora che il software è installato ed il sistema configurato per avviarlo al boot, è necessario configurare anche transmission. Il daemon viene eseguito dall'utente "transmission" quindi la configurazione da modificare si trova nella home directory di questo utente e precisamente nel percorso:
codice:
/home/transmission/.config/transmission-daemon
E' necessario ricordarsi di fermare il daemon con il comando
codice:
/etc/init.d/transmission-daemon stop
prima di modificare la configurazione altrimenti il programma, chiudendosi, sovrascrive il file di configurazione con le impostazioni correnti, eliminando eventuali modifiche fatte dopo l'ultimo avvio.
Questo è il file di configurazione di default.
codice:
{
"alt-speed-down": 50,
"alt-speed-enabled": false,
"alt-speed-time-begin": 540,
"alt-speed-time-day": 127,
"alt-speed-time-enabled": false,
"alt-speed-time-end": 1020,
"alt-speed-up": 50,
"bind-address-ipv4": "0.0.0.0",
"bind-address-ipv6": "::",
"blocklist-enabled": false,
"blocklist-url": "http://www.example.com/blocklist",
"cache-size-mb": 4,
"dht-enabled": true,
"download-dir": "/home/transmission/Downloads",
"encryption": 1,
"idle-seeding-limit": 30,
"idle-seeding-limit-enabled": false,
"incomplete-dir": "/home/transmission/Downloads",
"incomplete-dir-enabled": false,
"lpd-enabled": false,
"message-level": 2,
"peer-congestion-algorithm": "",
"peer-limit-global": 240,
"peer-limit-per-torrent": 60,
"peer-port": 51413,
"peer-port-random-high": 65535,
"peer-port-random-low": 49152,
"peer-port-random-on-start": false,
"peer-socket-tos": "default",
"pex-enabled": true,
"port-forwarding-enabled": true,
"preallocation": 1,
"prefetch-enabled": 1,
"ratio-limit": 2,
"ratio-limit-enabled": false,
"rename-partial-files": true,
"rpc-authentication-required": false,
"rpc-bind-address": "0.0.0.0",
"rpc-enabled": true,
"rpc-password": "{112c502b40dc4eb6ef8c5771f18666f2c30cb19e5abEdhD.",
"rpc-port": 9091,
"rpc-url": "/transmission/",
"rpc-username": "",
"rpc-whitelist": "127.0.0.1",
"rpc-whitelist-enabled": true,
"script-torrent-done-enabled": false,
"script-torrent-done-filename": "",
"speed-limit-down": 100,
"speed-limit-down-enabled": false,
"speed-limit-up": 100,
"speed-limit-up-enabled": false,
"start-added-torrents": true,
"trash-original-torrent-files": false,
"umask": 18,
"upload-slots-per-torrent": 14,
"utp-enabled": true
}
La spiegazione delle varie voci si trova in questa pagina della documentazione online. La parte per me più interessante, è la configurazione dell'interfaccia web (che mi servirà anche per configurare l'interfaccia remota).
codice:
"rpc-authentication-required": false,
"rpc-bind-address": "0.0.0.0",
"rpc-enabled": true,
"rpc-password": "{112c502b40dc4eb6ef8c5771f18666f2c30cb19e5abEdhD.",
"rpc-port": 9091,
"rpc-url": "/transmission/",
"rpc-username": "",
"rpc-whitelist": "127.0.0.1",
"rpc-whitelist-enabled": true,
E' possibile attivare l'accesso autenticato con username e password all'interfaccia web, decidere su quale porta dovrà andare in ascolto l'interfaccia web, eventuali whitelist o range di IP autorizzati, sempre per evitare o consentire accessi non autorizzati dall'esterno. Sempre da questo file di configurazione, è possibile decidere quale porta utilizzare per bittorrent, che dovrà poi essere aperta sul firewall.
Io ho usato il client installato sul mio desktop per creare una configurazione che potesse andare bene anche per il daemon sul server e ho copiato il file di configurazione dal mio desktop al server. Nella documentazione non c'è scritto che algoritmo è utilizzato per cifrare la password, quindi il fatto di averla inserita in chiaro dall'interfaccia grafica è sicuramente un comodità... Credo comunque che sia un md5.
Infine, l'impostazione del parametro "umask" a "0" fà in modo che il trasmission salvi i file scaricati assegnando come permessi di default "666" e quindi concedendo a tutti gli utenti i permessi di lettura e scrittura sui files scaricati. L'interpretazione di questi valori non è molto intuitiva: Il file di configurazione utilizza il "json markup language" e questo formato prevede ed accetta solo numeri in base decimale: "18" è la conversione in base decimale del valore "022" ottale che corrisponde ai permessi di "-rw-r--r--". "0" è la conversione decimale del valore ottale "000" che applicato come mascheramento restituisce, appunto, "666" Per stabilire quindi il valore del parametro bisogna determinale in forma ottale i permessi che si vuole che i file possiedano, determinare il valore ottale della umask da applicare (usando 0666 come valore di partenza, similmente a quanto descritto qui per vsftpd) e convertire questo valore in un numero in base decimale, usando magari una calcolatrice scientifica...
Questo è il file di configurazione che utilizzo sul mio server:
codice:
{
"alt-speed-down": 50,
"alt-speed-enabled": false,
"alt-speed-time-begin": 540,
"alt-speed-time-day": 127,
"alt-speed-time-enabled": false,
"alt-speed-time-end": 1020,
"alt-speed-up": 50,
"bind-address-ipv4": "0.0.0.0",
"bind-address-ipv6": "::",
"blocklist-enabled": false,
"blocklist-updates-enabled": true,
"blocklist-url": "http://www.example.com/blocklist",
"cache-size-mb": 2,
"compact-view": false,
"dht-enabled": true,
"download-dir": "/download/transmission",
"encryption": 1,
"idle-seeding-limit": 30,
"idle-seeding-limit-enabled": false,
"incomplete-dir": "/download/transmission/incompleti",
"incomplete-dir-enabled": true,
"inhibit-desktop-hibernation": false,
"lazy-bitfield-enabled": true,
"lpd-enabled": false,
"main-window-height": 534,
"main-window-is-maximized": 0,
"main-window-width": 674,
"main-window-x": 1157,
"main-window-y": 425,
"message-level": 2,
"open-dialog-dir": "/download/transmission",
"open-file-limit": 32,
"peer-congestion-algorithm": "",
"peer-limit-global": 240,
"peer-limit-per-torrent": 60,
"peer-port": 51413,
"peer-port-random-high": 65535,
"peer-port-random-low": 49152,
"peer-port-random-on-start": false,
"peer-socket-tos": "default",
"pex-enabled": true,
"play-download-complete-sound": false,
"port-forwarding-enabled": true,
"preallocation": 1,
"prefetch-enabled": 1,
"prompt-before-exit": true,
"proxy": "",
"proxy-auth-enabled": false,
"proxy-auth-password": "",
"proxy-auth-username": "",
"proxy-enabled": false,
"proxy-port": 80,
"proxy-type": 0,
"ratio-limit": 2,
"ratio-limit-enabled": false,
"rename-partial-files": true,
"rpc-authentication-required": true,
"rpc-bind-address": "0.0.0.0",
"rpc-enabled": true,
"rpc-password": "hash-della-password",
"rpc-port": 9091,
"rpc-url": "/transmission/",
"rpc-username": "matteo",
"rpc-whitelist": "127.0.0.1,192.168.150.*",
"rpc-whitelist-enabled": true,
"script-torrent-done-enabled": false,
"script-torrent-done-filename": "/home/matteo",
"show-backup-trackers": false,
"show-desktop-notification": false,
"show-extra-peer-details": false,
"show-filterbar": true,
"show-notification-area-icon": false,
"show-options-window": false,
"show-statusbar": true,
"show-toolbar": true,
"show-tracker-scrapes": true,
"sort-mode": "sort-by-name",
"sort-reversed": false,
"speed-limit-down": 100,
"speed-limit-down-enabled": false,
"speed-limit-up": 10,
"speed-limit-up-enabled": true,
"start-added-torrents": true,
"statusbar-stats": "total-ratio",
"trash-original-torrent-files": false,
"umask": 0,
"upload-slots-per-torrent": 14,
"user-has-given-informed-consent": true,
"utp-enabled": true,
"watch-dir": "/download/transmission/pickup",
"watch-dir-enabled": true
}
Infine, devo poi ricordarmi di aprire nella catena INPUT di netfilter la porta configurata in transmission-daemon aggiungendo, allo script che configura il firewall al boot, la regola:
codice:
# Regola che apre la porta in uso da transmission-daemon
$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 51413 -j ACCEPT
Per impostare il sistema per avviare automaticamente transmission-daemon al boot, devo usare il comando:
codice:
update-rc.d transmission-daemon defaults
codice:
root@server:/home/matteo# update-rc.d transmission-daemon defaults
update-rc.d: using dependency based boot sequencing
update-rc.d: warning: transmission-daemon start runlevel arguments (2 3 4 5) do not match LSB Default-Start values (2 3 5)
L'output ci avvisa che il nostro script prevede di avviare il daemon anche al runlevel 4 invece che ai soli runlevel 2, 3 e 5 previsti dalla Linux Standard Base... Poco male, lo lascio così ma se volessi fare il pignolo potrei specificare a mano i runlevel da utilizzare per avvio ed arresto del daemon con il comando:
codice:
update-rc.d transmission-daemon start 20 2 3 5 . stop 80 0 1 6 .
in cui "20" e "80" sono valori che indicano semplicemente una la priorità standard e i valori "2, 3, 5" i runlevel di avvio e 0, 1 e 6 i runlevel di arresto.
Ora posso avviare il mio daemon riavviando il server, per essere sicuro che si riavvii al boot oppure usando il comando:
codice:
sudo /etc/init.d/transmission-daemon start
Nota:
Nel mio caso, uso la directory "\download" e alcune sue sottodirectory nella configurazione di transmission-daemon. Perchè il tutto funzioni è necessario, ovviamente, che l'utente "transmission" abbia i permessi di lettura e scrittura su quelle directory. Il daemon non crea ne modifica le directory in automatico quindi è necessario che tali directory esistano e siano configurate con i permessi corretti.
Nel mio caso, essendo la directory /download di proprietà di root, ho usato il comando
codice:
sudo chmod -R o=rwx /download
per far si la directory /download e tutte le sue sottodirectory fossero scrivibili da tutti gli utenti non appartenenti al gruppo di root, quindi anche dall'utente transmission. E' lo stesso comando usato per rendere la share accessibile tramite samba, quindi nel caso non è necessario ripeterlo.
9.2_ Transmission Remote gui.
Ora che il daemon è installato e si avvia al boot, è necessario poterlo gestire da remoto.
Per farlo posso, come detto, utilizzare l'interfaccia web integrata oppure una GUI remota disponibile per windows, linux o mac.
L'interfaccia web, con le opzioni standard, è raggiungibile all'url http://ip-o-nome-host-del-server:9091.
E' piuttosto semplice ma funzionale. Se volessi raggiungerla anche da internet dovrei ovviamente ricordarmi di aprire anche la porta 9091 nella catena di input del firewall...
http://www.nexthardware.com/forum/ga...are_Player.png
E', per ovvi motivi, un pò limitata ma ovviamente è pensata principalmente per aggiungere e gestire i download da remoto (cosa che fà egregiamente) ma per sostituire in toto un client installato localmente ci vuole altro.
Quella che mi serve è una GUI remota:
Su Windows è disponibile dal sito dell'autore un comodo installer per tutte le piattaforme. E' sufficiente scaricarlo, avviare il setup e inserire nella configurazione i parametri di connessione (Ip, porta e credenziali) per ritrovarci il nostro client perfettamente funzionate.
http://www.nexthardware.com/forum/ga...trg-Win-01.jpg http://www.nexthardware.com/forum/ga...trg-Win-02.jpg http://www.nexthardware.com/forum/ga...trg-Win-03.jpg http://www.nexthardware.com/forum/ga...trg-Win-04.jpg
Per linux, è possibile installare il pacchetto specifico per la propria distribuzione oppure scaricare i pacchetti .zip precompilati per architettura a 32 o 64 bit forniti dall'autore e lanciare l'eseguibile contenuto, come da istruzione nel file readme. Il file binario si integra con il sistema di notifica di Gnome, quindi quando il server termina un download se c'è la remote-gui aperta mi arriva anche la notifica sul desktop.
http://www.nexthardware.com/forum/ga...i-download.jpg http://www.nexthardware.com/forum/ga...Remote_GUI.jpg http://www.nexthardware.com/forum/ga...onnessione.png http://www.nexthardware.com/forum/ga...nessione-1.png
Per vedere i files scaricati cliccando sul file col mouse e selezionando "Apri cartella di destinazione" devo però configurare i client con opzioni specifiche per il sistema in uso. Di seguito, la configurazione che ho utilizzato per Windows e Linux.
http://www.nexthardware.com/forum/ga...ux-setting.jpg http://www.nexthardware.com/forum/ga...n7-setting.jpg
Entrambi gli installer permettono la configurazione dei parametri del daemon che però è necessario ricordarsi di riavviare prima di fare modifiche da linea di comando, per evitare di perdere parte delle impostazioni.
Allo stato attuale, non sono ancora riuscito a far funzionare la "pickup directory" ma, almeno per ora, non mi serve, magari ci guarderò più avanti.
;)
That's all folks!!!
10_ Server FTP con vsftpd.
In realtà è un thread a parte... Ma sempre basato su questa configurazione.
Diciamo che mi faccio un pò di cross-posting!! ;)
9.1b_ Aggiornamento di Transmission daemon.
Dato che ho scelto di installare una versione del daemon che non sarà inclusa nel repository stabile per molto tempo ancora, rimane mia responsabilità provvedere agli eventuali aggiornamenti.
E' possibile rimuovere la versione precedente, lanciando il comando con i permessi di root o come sudo:
codice:
sudo dpkg -r transmission
La procedura è identica a quella di installazione, ci sono solo da adattare i percorsi per la versione che si vuole installare:
codice:
cd $HOME/transmission_build
wget http://download-origin.transmissionbt.com/files/transmission-2.42.tar.bz2
tar xjvf transmission-2.42.tar.bz2
cd transmission-2.42
export PKG_CONFIG_PATH="$HOME/transmission_build/libevent/lib/pkgconfig"
./configure
make
A questo punto, se la compilazione non riporta errori o librerie mancanti, posso scegliere se creare un pacchetto .deb esportabile oppure se installare direttamente la nuova versione del daemon.
Per installarla direttamente basta eseguire come root o tramite sudo, il comando:
codice:
make install
make clean
che, in assenza di errori, installa la versione aggiornata del daemon. Il comando "make clean" rimuove i file temporanei usati per la compilazione.
codice:
root@server:/root/transmission_build$ transmission-daemon --help
Transmission 2.42 (13013) http://www.transmissionbt.com/
A fast and easy BitTorrent client
[...]
In alternativa, dopo il completamento della compilazione, lanciare il seguente comando crea il pacchetto "transmission_2.42-1_amd64.deb" e lo installa direttamente:
codice:
sudo checkinstall --pakdir "$HOME/transmission_build" --backup=no --deldoc=yes --fstrans=no --deldesc=yes --delspec=yes --default --pkgversion "2.42"
make clean
Anche qui "make clean" rimuove i file temporanei derivati dalla compilazione. Onestamente preferisco questo metodo, altrimenti non è possibile utilizzare "dpkg" per disinstallare il daemon.
;)
[EDIT del 29 Gennaio 2012]
Ora sembra funzionare anche la pick-up directory...
[EDIT del 06 Ottobre 2012]
La procedura funziona senza problemi fino alla versione 2.71 (ultima versione che ho testato).
[EDIT del 10 Novembre 2012]
Anche la versione 2.73 funziona, però la procedura con la generazione del pacchetto riporta parecchi warning, che francamente, non mi pare ci fossero con le versioni precedenti.
[EDIT del 26 Gennaio 2013]
Stò aggiornando dalla 2.73 alla versione 2.76. Il pacchetto dei sorgenti sul sito è stato pubblicato nel formato ".tar.xz" che, diversamente dai precedenti, è compresso con l'agoritmo LZMA2 (sostanzialmente quello di 7-Zip). Il comando per decomprimere l'archivio è quindi diverso.
Nel caso la libreria corretta non sia già installata è necessario installarla con il comando:
codice:
sudo apt-get install liblzma2
Poi si può decomprimere il pacchetto con il comando:
codice:
tar Jxf transmission-2.76.tar.xz
3.5.5_ Gestione di reti multiple.
Nello script che ho usato finora ogni volta che ho dovuto abilitare un servizio ho usato il valore "-s 0/0" che significa che l'azione relativa a quella particolare regola/istruzione deve essere applicata a tutto il traffico di rete di provenienza, senza discriminare. Questa scelta non è molto elegante: Sbattersi a configurare tutti i servizi per ascoltare solo sulla rete locale e poi autorizzare dogs&pigs nel firewall anche se dal punto di vista pratico non porta a particolari problemi è quantomeno poco coerente.
Per migliorare questa situazione, ci sono diverse possibilità.
Una consiste, ad esempio, nel restringere le connessioni in ingresso autorizzate alla sola interfaccia di rete locale, usando l'opzione "-i $LOCAL_IFACE" in luogo di "-s 0/0" per quei servizi che devono essere accessibili solo dall'interfaccia "inside". Dato che ho due interfacce di rete posso usarle per discriminare le connessioni in ingresso:
codice:
$IPT -A tcp_inbound -p TCP -i $LOCAL_IFACE --destination-port 22 -j ACCEPT
Nel caso però, di un sistema che non operi come gateway o che sia comunque dotato di una sola scheda di rete, questa discriminazione non è più possibile. E' possibile però sostituire il parametro "-s 0/0" indicando le specifiche reti o indirizzi IP da cui si vuole autorizzare (o impedire, perchè no...) il traffico in ingresso o comunque in transito.
Una pecca o limitazione o comunque particolarità di iptables è l'impossibilità di impostare per il parametro "-s" più destinazioni con un solo comando. Se avessi quindi voluto applicare regole specifiche ad esempio, per autorizzare solo una determinata rete o singoli indirizzi IP, avrei dovuto ripetere l'istruzione per ogni eccezione da gestire.
Esempio:
Mettiamo che io mi trovi a dover gestire con questo firewall/router una piccola rete locale che fornisce anche un accesso wireless "ospiti" a cui devo impedire di accedere all'interfaccia di webmin oppure di volere restringere l'accesso al server via webmin ad un solo specifico indirizzo IP.
Attualmente la regola che ho impostato nello script è questa:
codice:
$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 15000 -j ACCEPT
che autorizza tutte le sorgenti ad accedere alla porta 15000 su cui ho messo in ascolto webmin. Dalla configurazione del tool l'ho configurato per rimanere in ascolto solo sulla rete locale ma con questa istruzione la porta nel firewall è assolutamente aperta anche lato "outside" e chiunque abbia accesso alla rete "inside" può accedere al pannello di webmin.
Se volessi restringere l'accesso a webmin (ma, più in generale, ad un qualunque servizio di rete) a specifici indirizzi IP o a specifiche reti (ad esempio, per permettere l'amministrazione di webmin da uno specifico IP statico lato internet), dovrei ripetere l'istruzione per ogni eccezione:
codice:
$IPT -A tcp_inbound -p TCP -s 192.168.100.0/0 --destination-port 15000 -j ACCEPT
$IPT -A tcp_inbound -p TCP -s 192.168.10.1 --destination-port 15000 -j ACCEPT
$IPT -A tcp_inbound -p TCP -s 2.228.5.3 --destination-port 15000 -j ACCEPT
Finché le reti sono poche o non sono molte le eccezioni poco male ma quando la situazione si inizia a complicare può diventare scomodo.
Ho quindi apportato una modifica allo script del firewall. Nella sezione "Local settings" all'inizio dello script ho aggiunto una sezione che contiene delle variabili corrispondenti alle reti che devo gestire o alle eccezioni che voglio definire (così agendo solo nella parte iniziale posso aggiornare le impostazioni di tutto lo script, senza dovermi andare a cercare ogni eccezione registrata).
Ho anche definito la variabile "TRUSTED_SRC" che ho usato per comprendere tutte le reti "trusted"
codice:
# Local Settings
[...]
# Trusted Networks and source IP
CASALECCHIO="192.168.10.0/24"
PODERINA="192.168.7.0/24"
TRUSTED_SRC="$LOCAL_NET $CASALECCHIO $PODERINA 10.10.10.0/24 77.89.33.26"
Se voglio quindi autorizzare l'accesso a webmin solo dalla rete 192.168.10.0/24 che ho registrato nella variabile "CASALECCHIO" posso usare il comando
codice:
# User specified allowed TCP protocol
#$IPT -A tcp_inbound -p TCP -s $CASALECCHIO --destination-port 15000 -j ACCEPT
se invece volgio definire più eccezioni ma non tutte devo necessariamente ripetere le righe:
codice:
# User specified allowed TCP protocol
#$IPT -A tcp_inbound -p TCP -s $CASALECCHIO --destination-port 15000 -j ACCEPT
#$IPT -A tcp_inbound -p TCP -s 77.89.33.26 --destination-port 15000 -j ACCEPT
Per ripetere con un solo comando tutte le reti che ho inserito nella variabile "TRUSTED_SRC", non potendo indicare più sorgenti per ogni comando devo modificare l'istruzione in questo modo:
codice:
# User specified allowed TCP protocol
for X in $TRUSTED_SRC
do
$IPT -A tcp_inbound -p TCP -s $X --destination-port 15000 -j ACCEPT
done
E questo è il risultato, una volta rilanciato lo script:
codice:
[...]
ACCEPT tcp -- 192.168.100.0/0 anywhere tcp dpt:15000
ACCEPT tcp -- 192.168.10.0/24 anywhere tcp dpt:15000
ACCEPT tcp -- 192.168.7.0/24 anywhere tcp dpt:15000
ACCEPT tcp -- 10.10.10.0/24 anywhere tcp dpt:15000
ACCEPT tcp -- 77.89.33.26 anywhere tcp dpt:15000
[...]