-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathUtilities.sh
1358 lines (1189 loc) · 52.7 KB
/
Utilities.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
#!/bin/bash
#Utilites per LAS - Lorenzo Amorosa
############################-VARIABILI-########################################
$$ #PID dello script bash corrente
$# #Numero di argomenti da riga di comando
$? #Exit value dell’ultimo comando eseguito command.
$ #PID della shell
$! #PID dell’ultimo comando eseguito in background
$0 #Nome script search.
$n #N-esimo argomento posizionale. Il massimo numero è 9
$*, $@ #Tutti gli argomenti passati.
"$*" #Tutti gli argomenti in un unica stringa "$1 $2 ...". I valori sono separati da $IFS.
"$@" #Tutti gli argomenti, separati individualmente ("$1" "$2"...).
############################-SSH-########################################
#di default ciò che il programma remoto produce su stdout e stderr viene stampato sulla shell che invoca ssh
#eseguire con ssh un comando remoto
ssh 10.1.1.1 "ip r | egrep '^10\.9\.9\.0\/24 ' | awk '{ print \$3 }'"
#eseguire con ssh due comandi remoti
ssh 10.1.1.1 "/bin/bash /tmp/regole$$.sh ; rm -f /tmp/regole$$.sh"
#eseguire ssh con ridirezione input e output su client (ssh)
ssh 10.1.1.1 "ls -l" > ~/out 2> ~/err
#generare una coppia di chiavi rsa
ssh-keygen -t rsa -b 2048 -P ""
#Non legge da stdin (ridiretto su /dev/null)
ssh -n 10.1.1.1 <command>
#creo utenti remoti tramite ssh
for i in {1..59} ; do
ssh -n 10.9.9.$i "adduser --disabled-password --gecos '' --home /home/$u $u ; mkdir /home/$u/.ssh ; echo $k >> /home/$u/.ssh/authorized_keys ; chown -R $u:$u /home/$u/.ssh ; chmod 700 /home/$u/.ssh ; echo '$i * * * * /home/$u/script.sh' | crontab"
done
#Impostare il sistema affinche' i router possano eseguire ssh verso i client
##### generare sui router coppie di chiavi ssh
##### mettere le chiavi pubbliche dei router su ogni client
##### nel file /root/.ssh/authorized_keys
############################-COMMANDS-########################################
#copia file da locale a remoto, inserire nomefile e valore X (1 Client, 2 Router, 3 Server) (-r per dir ricorsive)
scp nomefile [email protected]:nomedestinazione
#copia file da remoto a locale, inserire nomefile e valore X (1 Client, 2 Router, 3 Server) (-r per dir ricorsive)
scp [email protected]:nomefile nomedestinazione
#numeri da first a last
seq first | first last | first increment last
#leggere ininterrottamente da file
tail --pid=$$ -f /var/log/reqs | while read var1 var2 ; do echo $var1; done
#elimina la prima riga da output
tail -n +2
#grep quiet, no output, exit code 0 se trova match
grep -q <pattern> <file>
#grep case insensitive
grep -i <pattern> <file>
#grep inverse match
grep -v <pattern> <file>
#grep only exact word
grep -w <pattern> <file>
#grep print only matching string
grep -o <pattern> <file>
#grep print number of matching lines
grep -c <pattern> <file>
#restituisce i nomi dei file nei quali la riga cercata e' comparsa
grep -l <pattern> file.a file.b file.c
grep -l <pattern> file.*
#restituisce anche il numero di linea matchata
grep -n <pattern> <file>
#Stampa anche le N righe precedenti al match
grep -B <N> <pattern> <file>
#Stampa anche le N righe precedenti al match
grep -A <N> <pattern> <file>
#Stampa senza bufferizzare
grep --line-buffered <pattern> <file>
# Elenca tutti i file che contengono "ciao" analizzando
# ricorsivamente il direttorio corrente .
grep -r "ciao" .
# Per restituire solo i nomi dei file senza le righe
# che fanno match , usare l ’ opzione -l
grep -r -l "ciao" .
# Controllo se la variabile A contiene " ciao "
A=ciaone
if echo $A | grep -q " ciao"; then
echo A contiene ciao
else
echo A non contiene ciao
fi
# Restituisci il decimo carattere di ogni riga del file
cut -c10 file.txt
# Restituisci i caratteri dal quinto al decimo
cut -c5-10 file.txt
# Restiuisci i caratteri dall'inizio fino al 20 esimo
cut -c-20 file.txt
# Resituisci i caratteri dal quinto in poi
cut -c5- file.txt
# Estraggo il primo campo , separati da una virgola
cut -d, -f1
# Estraggo il primo ed il terzo campo , separati da uno spazio
cut -d' ' -f1,3
#stampare un solo campo (es. user) di un solo processo
ps -C connect.sh -o user
#selezionare con ps processo con pid specifico (piu' d'uno separati da virgola)
ps -p 583
#stampare solo l'utente ed il programma in esecuzione
#per altro output: man ps, sezione STANDARD FORMAT SPECIFIERS
ps -hao uname,cmd
# Visualizza i processi di las e root, o solo las
ps U "las root"
ps U las
#Visualizza tutti i processi , anche non propri
ps ax
#Mostra gli utenti proprietari del processo
ps u
#Visualizza la riga di comando completa che ha originato il processo
ps w
#Visualizza i rapporti di discendenza tra i processi
ps f
#ordina alfabeticamente
sort <f>
#ordina numericamente
sort -n <f>
#elimina duplicati
sort -u <f>
#inverte ordine
sort -r <f>
#ordina elenco ip address
sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n
# Elimina i duplicati CONTIGUI
uniq
# Indica il numero di occorrenze per ogni duplicato
uniq -c
# Mostra SOLO i duplicati
uniq -d
#-SED
#sed 's/vecchio_pattern/nuovo_valore/' <file>
#inserisce Linea: all'inizio di ogni riga
cat /etc/passwd | sed 's/^/Linea:/'
#Sostuisce a dottore Dott. (case insensitive)
cat personale | sed 's/dottore/Dott./i'
#replace tutte le virgole con punto (ogni occorrenza per linea)
sed 's/,/./g' <file>
#cancella le occorrenze
sed '/regex/d' <file>
#elimina ultima riga da output
sed \$d <file>
#awk, separatore di default e' il blank (spazio)
cat log | awk -F ": " '{ print $2 }'
#awk senza buffering
cat log | awk -W interactive '{ print $1 }'
#xargs
cat /etc/passwd | cut -f1 -d: | xargs mail -s 'l output di cat e cut va in input a mail'
#ss tcp processi e utenti
ss -tpn
#ss udp proc e utenti
ss -upn
#data in timestamp
date +%s
#byte di un file
stat prova.txt -c %s
#aggiungere sulla macchina un ip con maschera e su interfaccia specificata
ip addr add 10.1.1.1/24 dev eth2
#rimuovere sulla macchina un ip con maschera e su interfaccia specificata
ip addr delete 10.1.1.1/24 dev eth2
#aggiungere sulla macchina indicazioni riguardo l'instradamento
ip route add 10.9.9.0/24 via 10.1.1.254
#rimuovere dalla macchina indicazioni riguardo l'instradamento
ip route delete 10.9.9.0/24 via 10.1.1.254
#cambiare sulla macchina ip che svolge l'instradamento
ip route replace default via 10.1.1.254
#aggiungere sulla macchina indicazioni riguardo l'instradamento
ip route add 10.9.9.0/24 dev eth1
#abilitare sulla macchina l'instradamento
sysctl -w net.ipv4.ip_forward=1
# Visualizza i PID dei processi che usano un file
fuser /path/to/file
# Visualizza i processi che usano un intero filesystem
fuser -m /var
# Invia un segnale di SIGUSR1 a tutti i processi che usano il file
fuser -k -USR1 /path/to/file
# Visualizza tutti i file aperti dal sistema
lsof
# Visualizza i file aperti da uno specifico user
lsof -u <username>
# Visualizza i file aperti da uno specifico processo
lsof -p <PID>
# Limitare l'output di lsof ad una sola directory
lsof +D /path/to/dir
# Listare tutti i file in base al tipo di connessione ( tcp o udp )
lsof -i tcp
# IMPORTANTE : Visualizza le porte numeriche e non simboliche
lsof -i tcp -P
#dd from if, se manca da stdin, to of, se manca stdout.
dd if=IN of=OUT
############################-TRAP-########################################
FILE=/var/log/file.log
function logging(){
case "$1" in
start) receive_messages > "$FILE" & PID=$! ;;
stop) test -n "$PID" && kill "$PID" ;;
restart)logging stop && logging start ;;
esac
}
trap 'logging restart' USR1
trap 'logging stop' EXIT
logging start
while :
do echo qui si fa qualcosa mentre si aspettano i segnali
done
############################-AT-########################################
#due comandi tra mezz'ora
echo "/root/ldapmod.sh $UTENTE status closed ; /root/ldapmod.sh $UTENTE used 0" | at now + 30 minutes
#9:00 AM , now + 2 days
#atq comandi in coda ad utente. Eseguito da root: comandi in coda a tutti
# Rimuovo il job con Id 7 (con atq vedo id del job)
atrm 7
#rimuovo processo e comandi da lui lanciati, da grep ^job mette id nel file
trap "kill -9 -$$" EXIT
echo "/bin/kill $$" | at now + 50 minutes 2>&1 | grep ^job | awk '{ print $2 }' > /tmp/watchdog.$$
cd ~/jobs
for S in * ; do
echo fai cose
done
atrm $(cat /tmp/watchdog.$$)
############################-ROOT-#######################################
comandi di root: iptables, ss (?), tcpdump, adduser, addgroup, passwd, chown
#script da chiamare supposti in /root/
############################-CHECK-######################################
#Controllo parametri
if [[ $# -ne "3" ]]; then
echo "Uso: $! ip_client num ip_generico"
exit 1
else
#Controllo ch $1 abbia ultimo byte ip tra 1-100
if ! echo "$1" | egrep -q "^10\.1\.1\.([1-9][0-9]?|100)$" ; then
echo "$1 non e' un IP valido di client"
exit 2
fi
#Controllo che $2 sia un numero intero, anche ^\d$
if ! [[ "$2" =~ ^[0-9]+$ ]]; then
echo "$2 is not a number"
exit 3
fi
#notare che non sono ammessi indirizzi broadcast (non ammesso valore 255) e gli indirizzi del tipo *.*.*.0
if ! [[ "$3" =~ ^(25[0-4]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.(25[0-4]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.(25[0-4]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.(25[0-4]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]?)$ ]] ; then
echo "$3 non e' un IP valido"
exit 4
fi
# $1 sia close o open
if [[ "$1" != close && "$1" != open ]] ; then
echo "$1 deve essere close/open"
exit 5
fi
fi
##########################-LDAP-########################################
#avvio demone ldap
sudo systemctl restart slapd
#aggiungere uno schema ldif
sudo ldapadd -Y EXTERNAL -H ldapi:/// -f nomefile.ldif
#Visualizzare l'entry e tutti i figli a partire da "dc=labammsis" su ldap locale
ldapsearch -x -h 127.0.0.1 -b "dc=labammsis"
#Visualizzare solo i figli di primo livello di "fn=home,dc=labammsis" su ldap locale
ldapsearch -x -h 127.0.0.1 -b "fn=home,dc=labammsis" -s one
#Visualizzare solo l'entry "fn=home,dc=labammsis" su ldap locale
ldapsearch -x -h 127.0.0.1 -b "fn=home,dc=labammsis" -s base
#Aggiungere una entry allo schema ldif su ldap locale
ldapadd -x -h 127.0.0.1 -D "cn=admin,dc=labammsis" -w admin -f entry.ldif
#Eliminare una entry dallo schema ldif su ldap locale
ldapdelete -x -h 127.0.0.1 -D "cn=admin,dc=labammsis" -w admin "user=pippo,dc=labammsis"
#Modificare una entry sullo schema ldif su ldap locale (oppure vedi funzione modldapattr)
ldapmodify -x -h 127.0.0.1 -D "cn=admin,dc=labammsis" -w admin -f differenze.ldif
#Visualizzare solo le entry con un certo valore di un attributo (output NON pulito), da usare in combo con grep (-c)
ldapsearch -x -h 127.0.0.1 -b "dc=labammsis" -s one "status=open"
#Visualizzare solo un attributo di una entry (output NON pulito)
ldapsearch -x -h 127.0.0.1 -b "user=pippo,dc=labammsis" -s one status
#Applicare filtri in AND (per OR sostituire &->|)
ldapsearch -h 127.0.0.1 -x -s one -b "uname=$USER,dc=labammsis" "(&(objectClass=request)(action=*))"
ldapsearch -h 127.0.0.1 -x -b "dc=labammsis" -s sub "(&(objectclass=request)(|(action=get)(action=put)))"
#Verificare che esista una entry
if ldapsearch -h localhost -x -b "server=$ips,utente=$username,dc=labammsis" -s base >/dev/null 2>&1 ; then
echo entry presente
else
echo "lettura username fallita"
fi
##########################-LDAP-########################################
#esempio di aggiunta di una entry in uno schema ldap
echo -e "dn: user=gatto,dc=labammsis\nobjectClass: data\nuser: topo\nupdate: $(date +%s)\nused: 0\nstatus: closed\nlimit: 200" > /tmp/entry.ldif
ldapadd -x -h 127.0.0.1 -D "cn=admin,dc=labammsis" -w admin -f /tmp/entry.ldif
rm /tmp/entry.ldif
#Aggiunta di entry, con certezza riguardo alla sua univocita'
# $1 = nuovo gateway, $2 = server LDAP da aggiornare, $3 DN, $4 ipclient
function registra_ldap(){
ldapdelete -c -h $2 -x -D "cn=admin,dc=labammsis" -w admin "$3" 2> /dev/null
TS=$(/bin/date +%s)
echo "dn: $3
objectClass: gw
ipclient: $4
iprouter: $1
timestamp: $TS" | ldapadd -x -D "cn=admin,dc=labammsis" -w admin -h $2
}
#rimpiazzo interamente la mia directory ldap e la importo da un altro server
function sostituisci_ldap(){
#cancello le entry che ci sono...
ldapsearch -h 127.0.0.1 -x -s sub -b "dc=labammsis" "objectClass=gw" | grep "^dn: " | awk '{ print $2 }' | ldapdelete -D "cn=admin,dc=labammsis" -w "admin" -x
#le rimpiazzo con le entry dell'altro router
ldapsearch -x -c -s sub -h 10.1.1.253 -b "dc=labammsis" "objectClass=gw" | ldapadd -x -D "cn=admin,dc=labammsis" -w admin
}
##########################-LDAP-########################################
# Legge uno specifico attributo di una entry ldap
# ARGOMENTI : $1 Distinguished Name , $2 Nome attributo, $3 ip server ldap
# RETURN : 0 se l'attributo e' stato trovato, 1 altrimenti
function readldapattr() {
RES=$(ldapsearch -x -h "$3" -b "$1" -s base | egrep "^$2: " | awk -F ": " '{ print $2 }')
if test -z "$RES" ; then
return 1
else
echo "$RES"
return 0
fi
}
# Esempio d'uso :
ATTRVAL=$(readldapattr "user=pippo,dc=labammsis" "status" "127.0.0.1")
echo "RETURN VALUE: $?"
echo "ATTR VALUE: $ATTRVAL"
#leggere piu' attributi con 1 unico ldapsearch (ORDINE ALFABETICO ATTRIBUTI)
ldapsearch -x -h localhost -b "user=pippo,dc=labammsis" -s base | sort | egrep "^used: |^limit: " | awk '{ print $2 }' > /tmp/ldap$$
LIM=$(head -1 /tmp/ldap$$)
USE=$(tail -1 /tmp/ldap$$)
##########################-LDIF-########################################
#Schema ldif, importante non prendere gli spazi
dn: cn=data,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: data
olcAttributeTypes: ( 1000.1.1.1 NAME 'user'
DESC 'nome dello user'
EQUALITY caseExactMatch
SUBSTR caseExactSubstringsMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
olcAttributeTypes: ( 1000.1.1.2 NAME 'limit'
DESC 'MB trasferibili max'
EQUALITY integerMatch
ORDERING integerOrderingMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )
olcAttributeTypes: ( 1000.1.1.3 NAME 'used'
DESC 'MB trasferiti'
EQUALITY integerMatch
ORDERING integerOrderingMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )
olcAttributeTypes: ( 1000.1.1.4 NAME 'status'
DESC 'valore dello status'
EQUALITY caseExactMatch
SUBSTR caseExactSubstringsMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
olcAttributeTypes: ( 1000.1.1.5 NAME 'update'
DESC 'ultimo update'
EQUALITY integerMatch
ORDERING integerOrderingMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )
olcObjectClasses: ( 1000.2.1.1 NAME 'data'
DESC 'data'
MUST ( user $ limit $ used $ status $ update )
STRUCTURAL )
#Schema LDIF piu' articolato, importante non includere spazi
dn: cn=file,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: file
olcAttributeTypes: ( 5000.1.1.1 NAME ( 'uname' )
DESC 'uname'
EQUALITY caseExactMatch
SUBSTR caseExactSubstringsMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
olcAttributeTypes: ( 5000.1.1.2 NAME ( 'file' )
DESC 'file'
EQUALITY caseExactMatch
SUBSTR caseExactSubstringsMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
olcAttributeTypes: ( 5000.1.1.3 NAME ( 'action' )
DESC 'nome dello scipt'
EQUALITY caseExactMatch
SUBSTR caseExactSubstringsMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
olcAttributeTypes: ( 5000.1.1.4 NAME ( 'ts' )
DESC 'ts'
EQUALITY integerMatch
ORDERING integerOrderingMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )
olcAttributeTypes: ( 5000.1.1.5 NAME ( 'limit' )
DESC 'limit'
EQUALITY integerMatch
ORDERING integerOrderingMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )
olcAttributeTypes: ( 5000.1.1.6 NAME ( 'byte' )
DESC 'byte'
EQUALITY integerMatch
ORDERING integerOrderingMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )
olcAttributeTypes: ( 5000.1.1.7 NAME ( 'client' )
DESC 'client'
EQUALITY caseExactMatch
SUBSTR caseExactSubstringsMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
olcObjectClasses: ( 5000.2.1.1 NAME 'user'
DESC 'un utente'
MUST ( uname $ limit )
STRUCTURAL )
olcObjectClasses: ( 5000.2.1.2 NAME 'request'
DESC 'richiesta di esecuzione'
MUST ( ts $ file $ client )
MAY (action $ byte )
STRUCTURAL )
##########################-LDIF-########################################
# Definizione di una entry per lo schema data (file entry.ldif)
dn: user=pippo,dc=labammsis
objectClass: data
user: pippo
update: 1234567890
used: 0
status: closed
limit: 200
##########################-LDIF-########################################
# File differenze.ldif che modifica l’attributo used dell’entry
# definita in precedenza con dn: user=pippo,dc=labammsis
dn: user=pippo,dc=labammsis
changetype: modify
replace: used
used: 50
# Eliminazione di un attributo
dn: ts=555555,uname=$USER,dc=labammsis
changetype: modify
delete: action
# Aggiunta di un attributo
dn: ts=555555,uname=$USER,dc=labammsis
changetype: modify
add: byte
byte: 30
##########################-LDAP-########################################
# Modifica di uno specifico attributo di una entry ldap
# ARGOMENTI: $1 Distinguished Name, $2 Nome attributo, $3 Nuovo valore, $4 host server ldap
# RETURN: 0 se l'attributo e'stato modificato, 1 altrimenti
function modldapattr() {
echo -e "dn: $1\nchangetype: modify\nreplace: $2\n$2: $3" | ldapmodify -x -h "$4" -D "cn=admin,dc=labammsis" -w admin
return $?
}
# Esempio d’uso :
modldapattr "ind=10.9.9.1,ind=10.1.1.1,dc=labammsis" "cnt" "2" "127.0.0.1"
echo "RETURN VALUE: $?"
# Eliminazione di uno specifico attributo di una entry ldap
# ARGOMENTI: $1 Distinguished Name, $2 Nome attributo, $3 host server ldap
# RETURN: 0 se l'attributo e'stato rimosso, 1 altrimenti
function delldapattr() {
echo -e "dn: $1\nchangetype: modify\delete: $2" | ldapmodify -x -h "$3" -D "cn=admin,dc=labammsis" -w admin
return $?
}
# Esempio d’uso :
modldapattr "ts=555555,uname=$USER,dc=labammsis" "action" "127.0.0.1"
echo "RETURN VALUE: $?"
# Aggiunta di uno specifico attributo di una entry ldap
# ARGOMENTI: $1 Distinguished Name, $2 Nome attributo, $3 Valore, $4 host server ldap
# RETURN: 0 se l'attributo e'stato aggiunto, 1 altrimenti
function addldapattr() {
echo -e "dn: $1\nchangetype: modify\nadd: $2\n$2: $3" | ldapmodify -x -h "$4" -D "cn=admin,dc=labammsis" -w admin
return $?
}
# Esempio d’uso :
modldapattr "ts=555555,uname=$USER,dc=labammsis" "byte" "30" "127.0.0.1"
echo "RETURN VALUE: $?"
##########################-LOG-#########################################
#Scrivere un messaggio al logger
logger -p local4.info ___$(hostname -I | egrep -o "10\.1\.1\.([1-9][0-9]?|100)")___$(whoami)___
#formato:
#Jun 7 14:29:40 Router las: ___prova1___ciao___
#facility: auth, ftp, news, authpriv, kern, syslog, cron, lpr, user, daemon, mail, uucp, local0 .. local7
#priority: emerg, alert, crit, err, warning, notice, info, debug
#leggere da /var/log/reqs righe con formato
#Jun 7 14:29:40 Router las: ___prova1___ciao___
tail --pid=$$ -f /var/log/reqs | while read mm gg hh host user msg ; do
IP=$(echo $msg | awk -F '___' '{ print $2 }')
UTENTE=$(echo $msg | awk -F '___' '{ print $3 }')
echo $IP
echo $UTENTE
done
#(per filtrare su input)
#tail --pid=$$ -f /var/log/reqs | grep --line-buffered EXEC___ | while read line; do
#Usare una funzione per scrivere messaggi di errore sul log
function err() {
EX=$1
shift
echo "$@"
logger -p local1.info "$@"
exit $EX
}
#Esempio d'uso
if [ "$1" != "put" -a "$1" != "get" ] ; then
err 1 "Bad first argument, need put|get"
fi
if ! echo "$2" | grep -q '^/' ; then
err 2 "Bad second argument, need a filename"
fi
##########################-LOG-#########################################
#Come configurare rsyslog
#/etc/rsyslog.d/esame.conf
# -- su C: local1.=info @10.1.1.253
# local1.=info @10.1.1.254
# -- su R: local1.=info /var/log/reqs
#Decommentare le seguenti linee in /etc/rsyslog.conf
# $ModLoad imudp
# $UDPServerRun 514
#Eseguire il comando
#sudo systemtctl restart rsyslog
##########################-SNMP-#########################################
#snmpget esame
snmpget -v 1 -c public 10.1.1.1 'NET-SNMP-EXTEND-MIB::nsExtendOutputFull."esame"' | awk -F ' = STRING: ' '{ print $2 }'
#Configurare il demone snmp su client commentando nel file /etc/snmp/snmp.conf la riga "mibs:" per avere i nomi simbolici
#Inoltre nel file /etc/snmp/snmpd.conf svolgere le seguenti operazioni:
#attivare ricezione udp con la riga "agentAddress udp:161"
#Definire una vista che includa tutto il MIB con "view all included .1"
#Abilitare le community ad operare su quella vista con "rocommunity public default -V all" e "rwcommunity supercom default -V all"
#Inserire inoltre la riga "extend-sh esame ps -C connect.sh -o user | grep -v USER"
#Infine eseguire il comando "sudo systemtctl restart snmpd"
#Per prova inserisci "view systemonly included .1"
#Visualizza tutti gli oggetti del server 10.9.9.1
snmpwalk -v 1 -c public 10.9.9.1 .1 | less
#Visualizza tutti gli oggetti del server 10.9.9.1 mostrando OID
snmpwalk -On -v 1 -c public 10.9.9.1 .1 | less
# Visualizza il valore di una specifica entry del server 10.9.9.1 'SNMPv2-MIB::sysName.0'
snmpget -v 1 -c public 10.9.9.1 'SNMPv2-MIB::sysName.0'
#Per fare in modo che SNMP possa essere esteso per eseguire un comando di root sono necessari alcuni passaggi:
#Per far eseguire a SNMP comandi di root serve editare il file di configurazione /etc/snmp/snmpd.conf per includere la nuova regola:
# Restituisce le connessioni correntemente attive
#extend activeconn /usr/bin/sudo /bin/ss -ntp
# editare il file /etc/sudoers con: sudo visudo
# Permette all'utente snmp di eseguire il comando ss senza digitare la password
#snmp ALL=NOPASSWD:/bin/ss
# Aggiungere al file: /etc/snmp/snmpd.conf (segue esempio)
proc <nome_processo> <max_numero> <min_numero>
#proc rsyslogd 10 1
#proc rsyslogd
#Elenco dei processi monitorati da snmp su localhost
snmpwalk -v 1 -c public localhost "UCD-SNMP-MIB::prNames"
# Visualizza tutti i valori di UDC - SNMP - MIB
snmpwalk -v 1 -c public localhost .1 | grep "UCD-SNMP-MIB"
# Ottengo l'id del processo "rsyslogd" su localhost e lo salvo in ID
ID=$(snmpwalk -v 1 -c public localhost "UCD-SNMP-MIB::prNames" | grep rsyslogd | awk -F "prNames." '{ print $2 }' | awk -F " = " '{ print $1 }')
# Utilizzo l'id per ottenere il conteggio, verifico cosi' se il processo e' in esecuzione su localhost
snmpget -v 1 -c public localhost "UCD-SNMP-MIB::prCount.$ID" | awk -F "INTEGER: " '{ print $2 }'
##########################-SNMP-#########################################
# Ottiene il numero di istanze di un processo registrato tramite SNMP
# ARGOMENTI : $1 nome processo , $2 indirizzo macchina
function getProcessCount{
ID=$(snmpwalk -v 1 -c public "$2" "UCD-SNMP-MIB::prNames" | grep "$1" | awk -F "prNames." '{ print $2 }' | awk -F " = " '{ print $1 }')
NUM=$(snmpget -v 1 -c public "$2" "UCD-SNMP-MIB::prCount.$ID" | awk -F "INTEGER: " '{ print $2 }')
echo $NUM
}
# Esempio d'utilizzo:
NUMERO=$(getProcessCount "rsyslogd" "10.9.9.1" )
echo $NUMERO
##########################-IPTABLES-#########################################
#Le regole iptables vengono resettate allo spegnimento della macchina, se si vogliono rendere persistenti
#è quindi importante aggiungerle al file .bashrc
# Visualizza le configurazioni di iptables (tabella filter), -x per valori numerici esatti
iptables -vnxL
# Visualizza una singola chain
iptables -L <chain>
#Policy:
#DROP: Scarta il pacchetto
#REJECT: Scarta il pacchetto ed invia un pacchetto ICMP per segnalare l’errore al mittente.
#ACCEPT: Accetta il pacchetto.
#chain: INPUT, OUTPUT, FORWARD
# Aggiungo una regola in coda ( APPEND ) alla chain FORWARD
iptables -A FORWARD <options> -j <policy>
# Aggiungo una regola all'inizio della coda ( INSERT ) alla chain FORWARD
iptables -I FORWARD <options> -j <policy>
# Rimuovo una regola ( DELETE ) dalla chain FORWARD
iptables -D FORWARD <options> -j <policy>
# Elimina la regola numero 2 della chain INPUT
iptables -D INPUT 2
#Eliminare tutte le regole (di ogni chain o di quella specificata)
iptables -F <chain>
iptables -F
#Azzera pacchetti passati nelle catena, mostrando valori attuali
iptables -Z -vnL
#options:
-i eth3 # Solo pacchetti in ingresso dall'interfaccia eth3
-o eth3 # Solo pacchetti in uscita dall'interfaccia eth3
-s <ip>[/<netmask>] # Pacchetti che provengono dall'ip specificato
-d <ip>[/<netmask>] # Pacchetti destinati all'ip specificato
-p tcp # Solo pacchetti TCP
-p udp # Solo pacchetti UDP [anche icmp]
#Si puo' specificare il negato di un'opzione
! -s <address>[/<netmask>]
# Specificando il protocollo tcp o udp , si possono selezionare le porte:
--dport <prt> # Pacchetti con porta di destinazione == <prt>
--sport <prt> # Pacchetti con porta di partenza == <prt>
# Nel caso del protocollo TCP , anche lo stato della connessione:
-m state --state NEW,ESTABLISHED
-m state --state ESTABLISHED
#ARGOMENTI: $1 A oppure D per aggiungere o togliere la regola, $2 indirizzo sorgente, ma da settare a seconda dei casi
function gestisciRegola() {
iptables -"$1" INPUT -s "$2" -j ACCEPT
#iptables -"$1" FORWARD -i eth2 -o eth1 -s "$2" ! -d 10.1.1.0/24 -j ACCEPT
#iptables -"$1" FORWARD -i eth1 -o eth2 ! -s 10.1.1.0/24 -d "$2" -j ACCEPT -m state --state ESTABLISHED
#iptables -t nat -"$1" POSTROUTING -i eth2 -o eth1 -s "$2" ! -d 10.1.1.0/24 -j SNAT --to-source 10.9.9.250
}
# Esempio d'uso
# Aggiungo la regola
gestisciRegola A 10.1.1.1
# Elimino la regola
gestisciRegola D 10.1.1.1
#check rule in forward chain already exists
#Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
# pkts bytes target prot opt in out source destination
# 0 0 ACCEPT tcp -- eth1 eth2 10.9.9.1 10.1.1.1 tcp spt:22 state ESTABLISHED
# 0 0 ACCEPT tcp -- eth2 eth1 10.1.1.1 10.9.9.1 tcp dpt:22
client=10.1.1.1
server=10.9.9.1
if ! iptables -vnL FORWARD | egrep -q "ACCEPT +tcp +-- +eth2 +eth1 +$client +$server +tcp dpt:22$" ; then
iptables -I FORWARD -o eth1 -i eth2 -p tcp -s 10.1.1.1 -d 10.9.9.1 --dport 22 -j ACCEPT
iptables -I FORWARD -o eth2 -i eth1 -p tcp -d 10.1.1.1 -s 10.9.9.1 --sport 22 -m state --state ESTABLISHED -j ACCEPT
else
echo regola gia inserita
fi
##########################-IPTABLES LOG-#####################################
#Inserisce una regola che logga i pacchetti in transito nella chain specificata con prefisso e livello di log specificati
#I log hanno facility=kernel, --log-level=debug => i log salvati con livello kernel.debug
iptables -I <chain> <options> -j LOG --log-prefix="___prefisso___" --log-level=<livello_log>
# Logga l'inizio di ogni connessione inoltrata da 10.1.1.1 a 10.9.9.1 con livello debug e prefisso ___NEWCON___
iptables -I FORWARD -i eth2 -s 10.1.1.1 -d 10.9.9.1 -p tcp --tcp-flags SYN SYN -j LOG --log-prefix "___NEWCON___" --log-level=debug
# Logga la fine di ogni connessione inoltrata da 10.1.1.1 a 10.9.9.1 con livello debug e prefisso ___ENDCON___
iptables -I FORWARD -i eth2 -s 10.1.1.1 -d 10.9.9.1 -p tcp --tcp-flags FIN FIN -j LOG --log-prefix "___ENDCON___" --log-level=debug
function imposta_regole(){
# ... deve essere attivata (evitando duplicazioni)
# su entrambi i router una regola di iptables
# che permetta di loggare ogni pacchetto da e per tale client (passato come $1)
#volendo mandare in background imposta_regole: ssh [email protected] "ip route" | grep -q "default via 10.0.2.2", se $? diverso da 0 si lanciano script seguenti
echo "if ! iptables -vnL FORWARD | grep -q 'check_$1' ; then
iptables -I FORWARD -s $1 -j LOG --log-level debug --log-prefix ' check_$1 '
iptables -I FORWARD -d $1 -j LOG --log-level debug --log-prefix ' check_$1 '
iptables -I INPUT -s $1 -j LOG --log-level debug --log-prefix ' check_$1 '
iptables -I OUTPUT -d $1 -j LOG --log-level debug --log-prefix ' check_$1 '
fi" > /tmp/regole$1.sh
/bin/bash /tmp/regole$1.sh
#qui inserimento regole su altro router
scp /tmp/regole$1.sh 10.1.1.253:/tmp
ssh 10.1.1.253 "/bin/bash /tmp/regole$1.sh ; rm -f /tmp/regole$1.sh"
#rimuovo file contenente regole
rm -f /tmp/regole$1.sh
}
#FORMATO DEI LOG CIRCA PER UDP, ICMP, TCP
#Jun 16 15:59:03 Router kernel: [12506.141621] ___UDP___ IN=eth2 OUT= MAC=08:00:27:0b:37:1f:08:00:27:72:c7:c1:08:00 SRC=10.1.1.1 DST=10.1.1.254 LEN=82 TOS=0x00 PREC=0x00 TTL=64 ID=2939 DF PROTO=UDP SPT=51519 DPT=161 LEN=62
#Jun 16 15:31:40 Router kernel: [10862.759703] ___ICMP___ IN=eth2 OUT= MAC=08:00:27:0b:37:1f:08:00:27:72:c7:c1:08:00 SRC=10.1.1.1 DST=10.1.1.254 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=33869 DF PROTO=ICMP TYPE=8 CODE=0 ID=1301 SEQ=1
# Apr 27 12:02:56 router kernel: [10139.999098] INIZIO IN=eth2 OUT=eth1 MAC=08:00:27:27:a6:e6:08:00:27:24:9b:d5:08:00 SRC=10.1.1.1 DST=10.9.9.1 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=23272 DF PROTO=TCP SPT=37668 DPT=22 WINDOW=29200 RES=0x00 SYN URGP=0
# opzioni dei comandi
# tail --pid $$ garantisce che tail termini quando termina il processo principale
# grep --line-buffered e awk -W interactive evitano il buffering, ogni linea
# prodotta va direttamente in output
#
# notare che awk taglia sulla "]" evitando il problema dovuto al timestamp precedente,
# che potrebbe riempire o non riempire le [] modificando la numerazione dei campi seguenti
tail --pid=$$ -f /var/log/newconn | egrep --line-buffered 'INIZIO|FINE' | awk -W interactive -F ']' '{ print $2 }' | while read EVENTO IN OUT MAC SRC DST LEN TOS PREC TTL ID DF PROTO SPT DPT RESTO ; do
SOURCEIP=$(echo $SRC | cut -f2 -d=)
SOURCELASTBYTE=$(echo $SOURCEIP | cut -f4 -d.)
DESTIP=$(echo $DST | cut -f2 -d=)
DESTLASTBYTE=$(echo $DESTIP | cut -f4 -d.)
SOURCEPORT=$(echo $SPT | cut -f2 -d=)
DESTPORT=$(echo $DPT | cut -f2 -d=)
CHAIN="CONTA-$SOURCELASTBYTE-$DESTLASTBYTE-$SOURCEPORT-$DESTPORT"
# uso una custom chain semplicemente per metterci dentro una sola regola
# salto poi nella custom chain dalla catena FORWARD, sia per i pacchetti
# in andata che in ritorno: la regola della custom chain quindi somma
# automaticamente i traffici, semplificando il successivo rilevamento
#
# notare che si usa solo l'ultimo byte degli indirizzi, che in questo
# specifico caso è suffciente a individuare le macchine, perche' le
# catene hanno nomi limitati a 32 caratteri
case $EVENTO in
INIZIO)
iptables -N $CHAIN
iptables -I $CHAIN -j RETURN
forwardjump I $SOURCEIP $DESTIP $SOURCEPORT $DESTPORT $CHAIN
;;
FINE)
forwardjump D $SOURCEIP $DESTIP $SOURCEPORT $DESTPORT $CHAIN
iptables -F $CHAIN
iptables -X $CHAIN
;;
*)
echo "evento sconosciuto $EVENTO"
;;
esac
done
function forwardjump() {
iptables -$1 FORWARD -p tcp -s $2 -d $3 --sport $4 --dport $5 -j $6
iptables -$1 FORWARD -p tcp -d $2 -s $3 --dport $4 --sport $5 -j $6
}
##########################-IPTABLES DEFAULT-#####################################
#data una coppia di indirizzi, un'interfaccia e una porta si abilitano le comunicazioni
#in entrambe le direzioni, entrambi i componenti sono sia server che client
function confTotallyBidir(){
# confTotallyBidir interface ip1 ip2 port proto
# ip2 come server di ip1
iptables -I INPUT -i $1 -s $2 -d $3 -p $5 --dport $4 -j ACCEPT
iptables -I OUTPUT -o $1 -d $2 -s $3 -p $5 --sport $4 -m state --state ESTABLISHED -j ACCEPT
# ip2 come client di ip1
iptables -I INPUT -i $1 -s $2 -d $3 -p $5 --sport $4 -m state --state ESTABLISHED -j ACCEPT
iptables -I OUTPUT -o $1 -d $2 -s $3 -p $5 --dport $4 -j ACCEPT
# ip1 come server di ip2
iptables -I INPUT -i $1 -s $3 -d $2 -p $5 --dport $4 -j ACCEPT
iptables -I OUTPUT -o $1 -d $3 -s $2 -p $5 --sport $4 -m state --state ESTABLISHED -j ACCEPT
# ip1 come client di ip2
iptables -I INPUT -i $1 -s $3 -d $2 -p $5 --sport $4 -m state --state ESTABLISHED -j ACCEPT
iptables -I OUTPUT -o $1 -d $3 -s $2 -p $5 --dport $4 -j ACCEPT
}
#data una coppia di indirizzi, un'interfaccia e una porta si abilitano le comunicazioni
#rendendo ip1 client di ip2, ip2 server di ip1
function confTotallyMono(){
# confConnMono interface ip1 ip2 port
# ip2 come server di ip1
iptables -I INPUT -i $1 -s $2 -d $3 -p tcp --dport $4 -j ACCEPT
iptables -I OUTPUT -o $1 -d $2 -s $3 -p tcp --sport $4 -m state --state ESTABLISHED -j ACCEPT
# ip1 come client di ip2
iptables -I INPUT -i $1 -s $3 -d $2 -p tcp --sport $4 -m state --state ESTABLISHED -j ACCEPT
iptables -I OUTPUT -o $1 -d $3 -s $2 -p tcp --dport $4 -j ACCEPT
}
#data una coppia di indirizzi, un'interfaccia, una porta e un protocollo si abilitano le comunicazioni
#rendendo ip2 server di ip1
function confServer(){
# confServer interface ip1 ip2 port proto
iptables -I INPUT -i $1 -s $2 -d $3 -p $5 --dport $4 -j ACCEPT
iptables -I OUTPUT -o $1 -d $2 -s $3 -p $5 --sport $4 -m state --state ESTABLISHED -j ACCEPT
}
#data una coppia di indirizzi, un'interfaccia, una porta e un protocollo si abilitano le comunicazioni
#rendendo ip2 client di ip1
function confClient(){
# confClient interface ip1 ip2 port proto
iptables -I OUTPUT -i $1 -s $2 -d $3 -p $5 --dport $4 -j ACCEPT
iptables -I INPUT -o $1 -d $2 -s $3 -p $5 --sport $4 -m state --state ESTABLISHED -j ACCEPT
}
#scarto qualsiasi configurazione precedente
iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD
#confTotallyBidir
confTotallyBidir eth1 10.9.9.254 10.9.9.253 22 tcp
confTotallyBidir eth2 10.1.1.254 10.1.1.253 22 tcp
confTotallyBidir eth3 192.168.56.254 192.168.56.253 22 tcp
confTotallyBidir eth3 192.168.56.254 192.168.56.253 389 tcp
# LDAP client-router (router server ldap)
confServer eth2 10.1.1.0/24 10.1.1.250 389 tcp
iptables -I INPUT -i eth2 -p tcp -s 10.1.1.0/24 -d 10.1.1.250 --dport 389 -j ACCEPT
iptables -I OUTPUT -o eth2 -p tcp -d 10.1.1.0/24 -s 10.1.1.250 --sport 389 -m state --state ESTABLISHED -j ACCEPT
# rsyslog client-router (log registrati su router)
confServer eth2 10.1.1.0/24 10.1.1.254 514 udp
iptables -I INPUT -i eth2 -p udp -s 10.1.1.0/24 -d 10.1.1.254 --dport 514 -j ACCEPT
iptables -I OUTPUT -o eth2 -p udp -d 10.1.1.0/24 -s 10.1.1.254 --sport 514 -m state --state ESTABLISHED -j ACCEPT
# SNMP router-client (demone snmp su client)
confClient eth2 10.1.1.254 10.1.1.0/24 161 udp
iptables -I OUTPUT -o eth2 -p udp -d 10.1.1.0/24 -s 10.1.1.254 --dport 161 -j ACCEPT
iptables -I INPUT -i eth2 -p udp -s 10.1.1.0/24 -d 10.1.1.254 --sport 161 -m state --state ESTABLISHED -j ACCEPT
# Accetta tutti i pacchetti dell'interfaccia di loopback
iptables -I INPUT -i lo -s 127.0.0.0/8 -j ACCEPT
iptables -I OUTPUT -o lo -d 127.0.0.0/8 -j ACCEPT
# Imposto policy di default
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
# Consenti le connessioni SSH ( in questo caso verso router ) PER DEBUG
iptables -I INPUT -i eth3 -s 192.168.56.1 -d 192.168.56.202 -p tcp --dport 22 -j ACCEPT
iptables -I OUTPUT -o eth3 -d 192.168.56.1 -s 192.168.56.202 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
##########################-IPTABLES2 DEFAULT-#####################################
#utile se ho ICMP oppure RANGE-IP
function setipparams() {
# setta le variabili a seconda che ci sia un ip o un range
# MOD per caricare eventualmente il modulo iprange
# IPS e IPD sono sorgente e destinazione con l'opzione giusta
if echo $1 | grep -q -- '-' ; then
# se c'è un - è un range
MOD="-m iprange"
IPD="--dst-range $1"
IPS="--src-range $1"
else
# se no è un ip singolo
MOD=""
IPD="-d $1"
IPS="-s $1"
fi
}
function setprotoparams() {
# setta le variabili a seconda del protocollo (icmp, tcp o udp)
# PROTO è sempre il protocollo
# DP e SP sono sorgente e destinazione solo se non è icmp
# sarebbe opportuno error checking, anche se invocata solo
# internamente da questo stesso script
PROTO="-p $1"
if test "$PROTO" = "-p icmp" ; then
DP=""
SP=""
else
DP="--dport $2"
SP="--sport $2"
fi
}
function client() {
# imposta regole iptables quando io sono client
# parametri: server proto porta
setipparams $3
setprotoparams $4 $5
iptables -I OUTPUT -o $1 $MOD $PROTO -s $2 $DP $IPD -j ACCEPT
iptables -I INPUT -i $1 $MOD $PROTO -d $2 $SP $IPS --state ESTABLISHED -j ACCEPT
}
function server() {
# imposta regole iptables quando io sono server
# parametri: client proto porta
setipparams $3
setprotoparams $4 $5
iptables -I INPUT -i $1 $MOD $PROTO -d $2 $DP $IPS -j ACCEPT
iptables -I OUTPUT -o $1 $MOD $PROTO -s $2 $SP $IPD --state ESTABLISHED -j ACCEPT
}
#Esempi d'uso
# sono server LDAP per i client (gw.sh)
server eth2 10.1.1.254 "10.1.1.1-10.1.1.200" tcp 389
# rispondo ai ping dei client (gw.sh)
server eth2 10.1.1.254 "10.1.1.1-10.1.1.200" icmp
# sono client SSH verso i client (check.sh e reset.sh)
client eth2 10.1.1.254 "10.1.1.1-10.1.1.200" tcp 22
# sono client e server SSH per l'altro router (check.sh e reset.sh)
client eth2 10.1.1.254 10.1.1.253 tcp 22
server eth2 10.1.1.254 10.1.1.253 tcp 22
# sono client e server SYSLOG per l'altro router (check.sh)
client eth2 10.1.1.254 10.1.1.253 udp 514
server eth2 10.1.1.254 10.1.1.253 udp 514
# sono client e server LDAP per l'altro router (init.sh)
client eth2 10.1.1.254 10.1.1.253 tcp 389
server eth2 10.1.1.254 10.1.1.253 tcp 389
# sono client i server SNMP per l'altro router (init.sh)
client eth2 10.1.1.254 10.1.1.253 udp 161
server eth2 10.1.1.254 10.1.1.253 udp 161
##########################-IPTABLES NAT-#########################################
# Visualizza le configurazioni di iptables (tabella nat)
iptables -t nat -vnL
# Visualizza una singola chain
iptables -t nat -L <chain>
#chain: POSTROUTING, PREROUTING, OUTPUT
#Policy:
#MASQUERADE: conversione implicita nell’indirizzo IP assegnato all’interfaccia di uscita.
#ACCEPT: No conversione.
#SNAT --to-source <addr> (chain POSTROUTING)
#DNAT --to-destination <addr> (chain PREROUTING)
#con <addr>=<address>|<address>:<port>
#<options> uguali a tabella filter
# Aggiungo una regola in coda ( APPEND )
iptables -t nat -A <chain> <options> -j <policy>
# Aggiungo una regola all'inizio della coda ( INSERT )
iptables -t nat -I <chain> <options> -j <policy>
# Rimuovo una regola ( DELETE )
iptables -t nat -D <chain> <options> -j <policy>
#Esempi:
# Intercetta le connessioni SSH da Client a Router e le ridirige a Server
iptables -t nat -A PREROUTING -i eth2 -s 10.1.1.1 -d 10.1.1.254 -p tcp --dport 22 -j DNAT --to-dest 10.9.9.1
# Espone le connessioni dal Client al Server come se venissero dal Router stesso
iptables -t nat -A POSTROUTING -o eth1 -s 10.1.1.1 -d 10.9.9.1 -j SNAT --to-source 10.9.9.254
##########################-IPTABLES CHAIN/STORE-#####################################
# Crea la chain PIPPO
iptables -N PIPPO
# Inserisco una regola all'interno di PIPPO che faccia direttamente il RETURN (ovvero ritorni alla chain che l'ha invocata)
iptables -I PIPPO -j RETURN
# Elimino tutte le regole all'interno di PIPPO ( FLUSH )
iptables -F PIPPO
# Elimino la chain PIPPO
iptables -X PIPPO
# Salva la configurazione corrente sul file
iptables-save > /tmp/output
# Ripristina la configurazione salvata
iptables-restore < /tmp/output
############################-CRON-###################################################
#PERCORSI ASSOLUTI!
#Esegue il comando ogni 5 minuti
# */5 * * * * /root/traffic.sh
#Esegue il comando da lun a ven alle 22
# 00 22 * * 1-5 /root/traffic.sh
#Esegue il comando alle 5 e alle 17 delle domeniche e dei venerdi di gennaio, maggio e agosto
# 00 5,17 * jan,may,aug sun,fri /root/traffic.sh
#Esegui un job la prima domenica di ogni mese
#0 2 * * sun [ $(date +% d) -le 07 ] && /root/traffic.sh
#Esegui ogni 30 secondi
#* * * * * /root/traffic.sh
#* * * * * sleep 30; /root/traffic.sh
#Esegui piu' di un job
#* * * * * /root/traffic.sh ; /root/script.sh
#Esegui ogni smt=yearly,monthly,weekly,daily,hourly,reboot
#@smt /root/traffic.sh
# configuro cron per l'esecuzione, apro l'editor predefinito con crontab -e ed inserisco la linea "*/5 * * * * /root/traffic.sh"
# configuro cron per l'esecuzione tramite script, eseguendo i seguenti comandi
/usr/bin/crontab -l > /tmp/traffic.cron.$$
echo "*/5 * * * * /root/traffic.sh" >> /tmp/traffic.cron.$$
/usr/bin/crontab /tmp/traffic.cron.$$
/bin/rm -f /tmp/traffic.cron.$$
#edito cron altro utente
crontab -u username -e
#verifico chi ha invocato cron
if /usr/bin/tty > /dev/null ; then
# invocato da terminale, controllo parametri
else
# Invocato da cron