Linux - Creare un Gateway Server


Sono necessarie due schede di rete, 
- Una su cui sarà attivo il servizio DHCP per la lan. (eth1)
- Una che andrà verso il router ADSL (eth0)

yum install unzip file-roller zip -y 

Scaricare lo script di megalab e scompattarlo:



#!/bin/sh
#File di routing realizzato da MegaLab.it
#Per info, vedi http://www.megalab.it/7050/
#Ultimo aggiornamento: 26 Aprile 2011

# Notifico l'avvio dello script
echo "MLI: Script di routing in caricamento.."

# Questo è il percorso in cui si trova l'eseguibile di iptables
# (su CentOS, dovrebbe essere sempre nel percorso proposto di default)
IPT="/sbin/iptables"

# Devi specificare qui le interfacce di rete da utilizzare
# La variabile "WAN" contiene il nome di quella rivolta verso Internet
# La variabile "LAN1" contiene il nome di quella rivolta verso la rete LAN
WAN="eth0"
LAN1="eth1"


# ============ QUESTE IMPOSTAZIONI DOVEREBBERO RIMANERE SEMPRE UGUALI ============
# First we need to clear up any existing firewall rules
# and chain which might have been created
$IPT -F
$IPT -F INPUT
$IPT -F OUTPUT
$IPT -F FORWARD
$IPT -F -t mangle
$IPT -F -t nat
$IPT -X

# Default policies: Drop any incoming packets
# accept the rest.
$IPT -P INPUT DROP
$IPT -P OUTPUT ACCEPT
$IPT -P FORWARD ACCEPT

# To be able to forward traffic from your LAN
# to the Internet, we need to tell the kernel
# to allow ip forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward

# Masquerading will make machines from the LAN
# look like if they were the router
$IPT -t nat -A POSTROUTING -o $WAN -j MASQUERADE
# ============ fine QUESTE IMPOSTAZIONI DOVEREBBERO RIMANERE SEMPRE UGUALI ============


# ============ QUESTO BLOCCO DI ISTRUZIONI È DEDICATO AL PORT FORWARDING ============
# Per rilanciare una specifica porta verso un client, devi inserire due linee basate su questo modello:
# (personalizza i valori fra parentesi quadre)

# $IPT -t nat -A PREROUTING -i $WAN -p [scrivi tcp oppure udp] --dport [scrivi il numero della porta] -j DNAT --to [scrivi l'indirizzo IP del computer di destinazione]
# $IPT -A FORWARD -i $WAN -p [scrivi tcp oppure udp] --dport [scrivi il numero della porta] -m state --state NEW -j ACCEPT

# ============ fine QUESTO BLOCCO DI ISTRUZIONI È DEDICATO AL PORT FORWARDING ============


# ============ QUESTE IMPOSTAZIONI DOVEREBBERO RIMANERE SEMPRE UGUALI ============
# Do not allow new or invalid connections to reach your internal network
$IPT -A FORWARD -i $WAN -m state --state NEW,INVALID -j DROP

# Accept any connections from the local machine
$IPT -A INPUT -i lo -j ACCEPT
# plus from your local network
$IPT -A INPUT -i $LAN1 -j ACCEPT

# Here we define a new chain which is going to handle
# packets we don't want to respond to
# limit the amount of logs to 10/min
$IPT -N Firewall
$IPT -A Firewall -m limit --limit 10/minute -j LOG --log-prefix "Firewall: "
$IPT -A Firewall -j DROP

# log those packets and inform the sender that the packet was rejected
$IPT -N Rejectwall
#$IPT -A Rejectwall -m limit --limit 10/minute -j LOG --log-prefix "Rejectwall: "
$IPT -A Rejectwall -j REJECT
# use the following instead if you want to simulate that the host is not reachable
# for fun though
#$IPT -A Rejectwall -j REJECT  --reject-with icmp-host-unreachable

# here we create a chain to deal with unlegitimate packets
# and limit the number of alerts to 10/min
# packets will be drop without informing the sender
$IPT -N Badflags
$IPT -A Badflags -m limit --limit 10/minute -j LOG --log-prefix "Badflags: "
$IPT -A Badflags -j DROP

# A list of well known combination of Bad TCP flags
# we redirect those to the Badflags chain
# which is going to handle them (log and drop)
$IPT -A INPUT -p tcp --tcp-flags ACK,FIN FIN -j Badflags
$IPT -A INPUT -p tcp --tcp-flags ACK,PSH PSH -j Badflags
$IPT -A INPUT -p tcp --tcp-flags ACK,URG URG -j Badflags
$IPT -A INPUT -p tcp --tcp-flags FIN,RST FIN,RST -j Badflags
$IPT -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j Badflags
$IPT -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j Badflags
$IPT -A INPUT -p tcp --tcp-flags ALL ALL -j Badflags
$IPT -A INPUT -p tcp --tcp-flags ALL NONE -j Badflags
$IPT -A INPUT -p tcp --tcp-flags ALL FIN,PSH,URG -j Badflags
$IPT -A INPUT -p tcp --tcp-flags ALL SYN,FIN,PSH,URG -j Badflags
$IPT -A INPUT -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j Badflags

# Accept certain icmp message, drop the others
# and log them through the Firewall chain
# 0 => echo reply
$IPT -A INPUT -p icmp --icmp-type 0 -j ACCEPT
# 3 => Destination Unreachable
$IPT -A INPUT -p icmp --icmp-type 3 -j ACCEPT
# 11 => Time Exceeded
$IPT -A INPUT -p icmp --icmp-type 11 -j ACCEPT
# 8 => Echo
# avoid ping flood
$IPT -A INPUT -p icmp --icmp-type 8 -m limit --limit 1/second -j ACCEPT
$IPT -A INPUT -p icmp -j Firewall
# ============ fine QUESTE IMPOSTAZIONI DOVEREBBERO RIMANERE SEMPRE UGUALI ============


# ============ BLOCCO DI ISTRUZIONI CHE ABILITANO IL CONTROLLO DEL SERVER DA REMOTO ============
# Eliminando i cancelletti dalla prossime due righe, il server accetterà connessioni SSH e VNC in entrata anche via Internet
# PRUDENZA! Questo vi consente di gestire il server da tutto il mondo, ma espone anche ad accessi non autorizzati
# $IPT -A INPUT -i $WAN -p tcp --dport 22 -j ACCEPT
# $IPT -A INPUT -i $WAN -p tcp --dport 5900 -j ACCEPT
# ============ fine BLOCCO DI ISTRUZIONI CHE ABILITANO IL CONTROLLO DEL SERVER DA REMOTO ============


# ============ BLOCCO DI ISTRUZIONI CHE ABILITANO L'USO DI SQUID ============
# Per maggiori info su questo blocco di comandi, vedi http://www.megalab.it/7083/
#$IPT -t nat -A PREROUTING -i $LAN1 -p tcp --dport 80 -j REDIRECT --to-port 3128
#$IPT -A INPUT -j ACCEPT -m state --state NEW,ESTABLISHED,RELATED -i $LAN1 -p tcp --dport 3128
#$IPT -A OUTPUT -j ACCEPT -m state --state NEW,ESTABLISHED,RELATED -o $WAN -p tcp --dport 80
#$IPT -A INPUT -j ACCEPT -m state --state ESTABLISHED,RELATED -i $WAN -p tcp --sport 80
#$IPT -A OUTPUT -j ACCEPT -m state --state ESTABLISHED,RELATED -o $LAN1 -p tcp --sport 80

#$IPT -t nat -A PREROUTING -i $LAN1 -p tcp --dport 8080 -j REDIRECT --to-port 3128
#$IPT -A INPUT -j ACCEPT -m state --state NEW,ESTABLISHED,RELATED -i $LAN1 -p tcp --dport 3128
#$IPT -A OUTPUT -j ACCEPT -m state --state NEW,ESTABLISHED,RELATED -o $WAN -p tcp --dport 8080
#$IPT -A INPUT -j ACCEPT -m state --state ESTABLISHED,RELATED -i $WAN -p tcp --sport 8080
#$IPT -A OUTPUT -j ACCEPT -m state --state ESTABLISHED,RELATED -o $LAN1 -p tcp --sport 8080

#$IPT -t nat -A PREROUTING -i $LAN1 -p tcp --dport 443 -j REDIRECT --to-port 3129
#$IPT -A INPUT -j ACCEPT -m state --state NEW,ESTABLISHED,RELATED -i $LAN1 -p tcp --dport 3129
#$IPT -A OUTPUT -j ACCEPT -m state --state NEW,ESTABLISHED,RELATED -o $WAN -p tcp --dport 443
#$IPT -A INPUT -j ACCEPT -m state --state ESTABLISHED,RELATED -i $WAN -p tcp --sport 443
#$IPT -A OUTPUT -j ACCEPT -m state --state ESTABLISHED,RELATED -o $LAN1 -p tcp --sport 443
# ============ fine BLOCCO DI ISTRUZIONI CHE ABILITANO L'USO DI SQUID ============

# ============ BLOCCO DI ISTRUZIONI CHE ABILITANO LE CONNESSIONI VPN IN ENTRATA ============
# Per maggiori info su questo blocco di comandi, vedi http://www.megalab.it/7254/
$IPT -A INPUT -i ppp0 -j ACCEPT
$IPT -A INPUT -i $WAN -p tcp --dport 1723 -j ACCEPT

#Attivando i prossimi comandi, le richieste web in ingresso dalla VPN saranno gestite da Squid
#$IPT -t nat -A PREROUTING -i ppp0 -p tcp --dport 80 -j REDIRECT --to-port 3128
#$IPT -A INPUT -j ACCEPT -m state --state NEW,ESTABLISHED,RELATED -i ppp0 -p tcp --dport 3128
#$IPT -A OUTPUT -j ACCEPT -m state --state NEW,ESTABLISHED,RELATED -o $WAN -p tcp --dport 80
#$IPT -A INPUT -j ACCEPT -m state --state ESTABLISHED,RELATED -i $WAN -p tcp --sport 80
#$IPT -A OUTPUT -j ACCEPT -m state --state ESTABLISHED,RELATED -o ppp0 -p tcp --sport 80

#$IPT -t nat -A PREROUTING -i ppp0 -p tcp --dport 8080 -j REDIRECT --to-port 3128
#$IPT -A INPUT -j ACCEPT -m state --state NEW,ESTABLISHED,RELATED -i ppp0 -p tcp --dport 3128
#$IPT -A OUTPUT -j ACCEPT -m state --state NEW,ESTABLISHED,RELATED -o $WAN -p tcp --dport 8080
#$IPT -A INPUT -j ACCEPT -m state --state ESTABLISHED,RELATED -i $WAN -p tcp --sport 8080
#$IPT -A OUTPUT -j ACCEPT -m state --state ESTABLISHED,RELATED -o ppp0 -p tcp --sport 8080

#$IPT -t nat -A PREROUTING -i ppp0 -p tcp --dport 443 -j REDIRECT --to-port 3129
#$IPT -A INPUT -j ACCEPT -m state --state NEW,ESTABLISHED,RELATED -i ppp0 -p tcp --dport 3129
#$IPT -A OUTPUT -j ACCEPT -m state --state NEW,ESTABLISHED,RELATED -o $WAN -p tcp --dport 443
#$IPT -A INPUT -j ACCEPT -m state --state ESTABLISHED,RELATED -i $WAN -p tcp --sport 443
#$IPT -A OUTPUT -j ACCEPT -m state --state ESTABLISHED,RELATED -o ppp0 -p tcp --sport 443
# ============ fine BLOCCO DI ISTRUZIONI CHE ABILITANO LE CONNESSIONI VPN IN ENTRATA ============

# ============ BLOCCO DI ISTRUZIONI CHE ABILITANO LE CONNESSIONI FTP ============
# Per maggiori info su questo blocco di comandi, vedi http://www.megalab.it/7226/
$IPT -A INPUT -i $WAN -p tcp --dport 20 -j ACCEPT
$IPT -A INPUT -i $WAN -p tcp --dport 21 -j ACCEPT
$IPT -A INPUT -i $WAN -p tcp --dport 2121 -j ACCEPT
$IPT -A INPUT -i $WAN -p tcp --dport 2122 -j ACCEPT
# ============ fine BLOCCO DI ISTRUZIONI CHE ABILITANO LE CONNESSIONI FTP ============


# ============ QUESTE IMPOSTAZIONI DOVEREBBERO RIMANERE SEMPRE UGUALI ============
# Accept related and established connections
$IPT -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# Drop netbios from the outside, no log, just drop
$IPT -A INPUT -p udp --sport 137 --dport 137 -j DROP

# Finally, anything which was not allowed yet
# is going to go through our Rejectwall rule
$IPT -A INPUT -j Rejectwall

echo "MLI: server pronto al routing!"
# ============ QUESTE IMPOSTAZIONI DOVEREBBERO RIMANERE SEMPRE UGUALI ============



Con questo script apre le porte giuste oppure mette regole del firewall per consentire al server di oprerare come Gateway, Firewall, SQUID, SSH, VNC, ftp e permette di gestire la VPN 

chmod ugo+x /root/routing.sh

sh /root/routing.sh

Andare su un client e dare il comando:
tracert www.google.it

sincerarsi che La prima riga dovrebbe sempre riportare l'indirizzo del vostro server, chiaro segnale che il traffico sta passando attraverso lo stesso e tutto sta funzionando come previsto

Per essere sicuri che lo script venga eseguito ad ogni avvio è sufficiente dare il seguente comando:

gedit /etc/rc.local

ed accodare il comando sh /root/routing.sh

Nella sezione del file precedente PORT FORWARDING si può usare il seguente stratagemma per dedicare un pc della lan a fungere da Web server:
Se, ad esempio, volessimo inoltrare la porta 80 TCP (server web) verso il PC che ha l'indirizzo 192.168.0.87, scriveremo:
  • $IPT -t nat -A PREROUTING -i $WAN -p tcp --dport 80 -j DNAT --to 192.168.0.87
  • $IPT -A FORWARD -i $WAN -p tcp --dport 80 -m state --state NEW -j ACCEPT
yum install openssl -y

openssl req -x509 -nodes -days 3650 -newkey rsa:1024 -keyout "root/miocertificato.pem" -out "root/miocertificato.pem"

Verrà richiesto:

  • Country Name (2 letter code) [AU]: Digitare IT per la nazione
  • State or Province Name (full name) [Some-State]: il nome esteso del Paese. Nel nostro caso, Italia;
  • Locality Name (eg, city) []: il nome della località. 
  • Organization Name (eg, company) [Internet Widgits Pty Ltd]: il nome della vostra organizzazione.
  • Organizational Unit Name (eg, section) []: l'unità operativa della quale fate parte all'interno dell'azienda. 
  • Common Name (eg, YOUR name) []: questo campo non può essere lasciato vuoto. Se state generando un certificato digitale da utilizzarsi per creare connessioni HTTPS indicare l'hostname oppure il nome e cognome
  • Email Address []: 

Il certificato pronto per l'uso si troverà in /root

Adesso vediamo come installare una VPN PPTP:

1. rpm --import http://poptop.sourceforge.net/yum/RPM-GPG-KEY-PPTP

rpm -Uvh http://poptop.sourceforge.net/yum/stable/rhel5/pptp-release-current.noarch.rpm 

yum clean all 

yum install pptpd ppp -y 

2. vim /etc/ppp/options.pptpd

cercare la stringa #ms-dns per definire il dns da usare

e mettere il DNS (preferibilmente quello locale) 

3. vim /etc/pptpd.conf

Vanno scelti gli IP dell'interfaccia della VPN (nella lan) e l'IP che verrà assegnato all'utente remoto. 

localip 192.168.0.201

remoteip 192.168.0.2-254  

Aprire:

4. vim /etc/dhcpd.conf

e verificare che il campo range sia 192.168.0.2 192.168.0.200

5. Creiamo gli account che possono collegarsi al server:

vim /etc/ppp/chap-secrets

creare gli account seguendo questo modello:

NomeUtenteClient pptpd PasswordAssociata *

6. service pptpd start 

chkconfig pptpd on 

E' evidente che va aperta la porta sul firewall, la 1723, è sufficiente modificare lo script che si avvia con il superouter e modificare la sezione del port forwarding

7. A questo punto è sufficiente creare una connessione VPN sui sistemi Windows. 


Ricordarsi che per settare il firewall si può usare il seguente comando:

ntsysv 

yum install squid -y

vim /etc/squid/squid.conf

cancellare # per la sezione acl our_networks  e la sezione http_access allow our_networks

modificare la sezione:

acl our_networks src 192.168.0.0/24 

Cercare la sezione TAG: visible_hostname ed aggiungere subito dopo la sezione #none aggiungere:

visible_hostname mioserver

modificare 

http_port 3128  

in

http_port 3128 transparent 

Notate ora il blocco di commenti che inizia con # TAG: https_port presente immediatamente sotto.
Scorrere verso il basso fino a raggiungere la riga che recita soltanto # none

Subito dopo mettere:

https_port 3129 transparent cert=/root/mycert.pem
(mettere il path del proprio certificato digitale, per la creazione del certificato vedere l'articolo relativo nel blog) 

Cercare:

cache_mgr 

trasformarlo in :
cache_mgr a.mazzanti(at)gmail.com

Questa informazione sarà riportata su tutte le pagine "di servizio" mostrate ai client 

service squid start 

chkconfig squid on 

modificare il file routing.sh di megalab.it


e modificarlo nella sezione di SQUID togliendo ogni #  

sh /root/routing.sh 

tail -f /var/log/squid/access.log

provare a navigare e vedere cosa succede stoppando il proxy (sul router adsl bisogna abilitare solo il server a navigare su internet)  

Con la configurazione ottenuta fin qui, tutte le richieste a pagine quali https://google.com  mostreranno un avviso di sicurezza nel browser dell'utente, il quale sarà chiamato a confermare una o più finestre di dialogo prima di poter procedere 

L'alternativa è creare un non transparent proxy (mi riprometto di testare tale soluzione) e poi pubblicarla.

Se uno vuole filtrare i contenuti è sufficiente utilizzare Squiddguard come visto in un altro articolo

Utile per bloccare siti web:

yum install squidguard -y

mkdir /var/log/squidguard 

chown -R squid /var/log/squidguard 

SquidGuard lavora appoggiandosi a lunghe liste di siti già classificati e pronti per essere bloccati (o meno). 

La prima cosa da fare è quindi quella di prelevare uno di questi archivi. La sezione "SquidGuard - Blacklists".

L'uso di questa lista è gratuito sia per i privati, sia per le aziende. Alle realtà professionali è però richiesto di firmare esplicitamente un contratto d'uso.

Scarichiamo:
Free for non commercial/privat use; commercial usage requires a feedback contract at no additional costs; selling the lists is not free of charge. More than 1.5 million entries. Updated regularly.

Salviamo in /var/lib/squidguard/ e scompattiamo con il comando  

tar zxvf shallalist.tar.gz 

ci sarà una cartella BL 

chown -R squid /var/lib/squidguard/* 

creare in /etc/squid/squidguard.conf con le seguenti caratteristiche:

dbhome /var/lib/squidguard/BL
logdir /var/log/squidguard


#Blocca i siti pornografici
dest porn {
        domainlist porn/domains
        urllist porn/urls
        }


#Blocca vari siti che distribuiscono malware
dest spyware {
        domainlist spyware/domains
        urllist spyware/urls
        }


#Blocca i social network, come Facebook
dest socialnet {
        domainlist socialnet/domains
        urllist socialnet/urls
        }


#Blocca i YouTube ed altri siti di streaming
dest movies {
        domainlist movies/domains
        urllist movies/urls
        }


#Blocca i servizi studiati per aggirare il filtro
dest redirector {
        domainlist redirector/domains
        urllist redirector/urls
        }


acl {
        default {
                pass !porn !spyware !socialnet !movies !redirector all

        #Pagina da mostrare per le richieste bloccate
                redirect http://www.sitobloccato.it
        }
 }

inizializziamo le liste di controllo:

squidGuard -C all

Rendete poi accessibili tutti i file creati lanciando  

chown -R squid /var/lib/squidguard/*  

se si sente la necessità di aggiungere siti web particolari o categorie ecco la procedura:

- entrare in /var/lib/squidguard/ e guardare il nome delle cartelle per scegliere le categorie da bloccare

- E' sufficiente prendere spunto dal precedente file per aggiungere nuove sezioni (tenere a mente che ! serve per indicare la negazione)

- Inizializzare tutte le volte le liste di blocco come segue:

chown -R squid /var/lib/squidguard/* && squidGuard -C all && chown -R squid /var/lib/squidguard/* && service squid restart

Per inibire una propria lista di siti web:

mkdir /var/lib/squidguard/BL/personal

touch /var/lib/squidguard/BL/personal/domains && touch /var/lib/squidguard/BL/personal/urls;

inserire un nome di sito da bloccare uno per riga

vim /var/lib/squidguard/BL/personal/domains

se uno mette black.com verrà bloccato anche musica.black.com

...

<------other -----="" articles="" blogs="" related="">

...

SCCM 2012 - How to install AnyConnect VPN with SCCM 2012


Tips - Locating the Cisco AnyConnect Profiles


Linux - Creare un Gateway Server


Backup - Fare il backup delle connessioni di rete e VPN


Tips - Cisco VPN e Vodafone Connect Card


Tips - Cisco errore Secure VPN Connection terminated locally by the Client. Reason 440: Driver Failure.


Tips - Cisco VPN 5.0 e Windows 8