VPN site-to-site dietro router, NAT e firewall: quando non vi sono i requisiti standard

La realizzazione delle VPN site to site richiedono requisiti strutturali ben precisi per realizzare connessioni fra uffici stabili e prestanti. Ci si trova in situazioni dove non è possibile avere:

  • pool di IP pubblici statici
  • configurazione dell’ip pubblico sulla interfaccia WAN del proprio device di rete (normalmente firewall)
  • router in gestione autonoma

Questo articolo propone una soluzione di VPN site-to-site basata sul protocollo PPTP di Microsoft.

Rete A – 192.168.0.0 / 24 (sede centrale)

Rete B – 192.168.10.0/24 (sede remota, ad es: magazzino)

Diagramma di rete.

vpn-pptp

Composizione della rete A.

Server Windows: 192.168.0.100 / 255.255.255.0, gateway 192.168.0.254
Firewall: LAN 192.168.0.254 / 255.255.255.255.0 – WAN 192.168.1.254 /255.255.255.0 – GW 192.168.1.1
Router operatore: LAN 192.168.1.1 – WAN: IP-Pubblico-Rete-A (assegnato dall’operatore)

vpn-pptp-A

Composizione della rete B.

Linux PPTP-client-gateway: 192.168.10.254 / 255.255.255.0, gateway 192.168.10.1
Router operatore: LAN 192.168.10.1 – WAN: IP-Pubblico-Rete-B (assegnato dall’operatore)

vpn-pptp-B

Configurazione apparati della rete A.

Le parti che necessitano configurazioni sono il Server Windows e il firewall. L’installazione da svolgere sul server windows riguarda l’attivazione del ruolo di “Servizio di accesso e criteri di rete” e la relativa configurazione VPN (è necessario avere un servizio DHCP attivo e limitare il numero di connessioni lato VPN per non saturare il range DHCP).

ruolo

Nella definizione dell’utente per la connession VPN (in esempio “magazzinovpn”) va definita correttamente la proprietà “chiamate in ingresso”

account

e va inoltre definita la parte “Assegna inidirizzi IP statici”

indirizzo-ip-statico

definendo così (ad es: 192.168.0.20) l’ip che avrà la connessione con utente “magazzinovpn” e che rappresenterà il gateway della rete-A verso la rete-B.

Lato firewall vanno definite le regole di port-forwarding verso il server windows (192.168.0.100) delle porte TCP/1723 e GRE/47 (è probabile che il la porta GRE/47, quella responsabile del tunnel VPN non si definibile perché implicitamente già aperta). Lato firewall va definita una route statica dove si indica che tutte le sorgenti LAN (rete-A: 192.168.0.0/24) che hanno come destinazione la rete magazzino (rete-B: 192.168.10.0/24) il next-hop è il 192.168.0.20. Il router dell’operatore deve “girare” tutte le richieste da “Internet” sull’ip del firewall 192.168.1.254.

IMPORTANTE. Ora serve un’ultima definizione di routing: le destinazioni che devono raggiungere la rete-B (192.168.10.0/24) devono attraversare il tunnel VPN. Questa definizione deve essere scritta all’interno del server windows (è il sistema operativo che ha in gestione il tunnel VPN). Inoltre questa definizione deve essere attivata tutte le volte che viene accessa la VPN. In caso di caduta di linea la VPN cade, la route viene eliminata dal sistema operativo e quando la connettività riprende la VPN si ristabilisce e con sè si deve ristabilire anche la route statica di attraversamento tunnel.

Per realizzare questo meccanismo creiamo un file di script all’interno di c:\scripts e lo chiamiamo routevpn.cmd e al suo interno le seguenti righe:

route add 192.168.10.0 mask 255.255.255.0 192.168.0.20

Per “far scattare” questo meccanismo tutte le volte che il tunnel VPN si attiva, utilizziamo la tecnica delle schedulazioni Microsoft basate su evento. L’evento di attivazione tunnel VPN è nel registro di “Sistema” con event-ID=20274.

pianificazioneavvio-script

Configurazioni apparati della rete B.

Sulle sedi remote, nell’esempio “magazzino”, viene richiesta una macchina Linux con una interfaccia di rete. La configurazione che si andrà a predisporre è molto “leggera” e non richiede nessun intervento da parte dell’operatore. Nell’architettura VPN site-to-site routing, deve comunque essere rispettata la regola di non sovrapposizione di rete: i due segmenti di rete sono disgiunti, proprio come nel nostro esempio.

Il PC Linux deve avere come ruoli il routing, client PPTP e gateway principale della rete. Indico i pacchetti di “rito” da installare da una versione Linux CentOS 6.8 minimal e il pacchetto necessario per eseguire la funzione di PPTP client:

yum install -y nano telnet wget lynx bind-utils crontabs.noarch ntpdate dnsmasq sysstat nc sudo screen system-config-network-tui.noarch setuptool system-config-firewall-tui.noarch setup.noarch
yum install nano wget lynx telnet bind-utils
yum install dnsmasq
yum install -y compat-libstdc++-33 compat-glibc glibc-common glibc glibc-headers glibc-devel glibc-static glibc-utils
yum groupinstall “Development Tools”
yum install pptp

Una volta installato il software si passa alle parti di configurazione. In elenco files e relativa configurazione.

SELINUX

[root@gw ~]# cat /etc/selinux/config

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing – SELinux security policy is enforced.
# permissive – SELinux prints warnings instead of enforcing.
# disabled – No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of these two values:
# targeted – Targeted processes are protected,
# mls – Multi Level Security protection.
SELINUXTYPE=targeted

SYSCTL.CONF

[root@gw ~]# cat /etc/sysctl.conf
# Kernel sysctl configuration file for Red Hat Linux
#
# For binary values, 0 is disabled, 1 is enabled. See sysctl(8) and
# sysctl.conf(5) for more details.
#
# Use ‘/sbin/sysctl -a’ to list all possible parameters.

# Controls IP packet forwarding
net.ipv4.ip_forward = 1

# Controls source route verification
net.ipv4.conf.default.rp_filter = 0

# Do not accept source routing
net.ipv4.conf.default.accept_source_route = 0

# Controls the System Request debugging functionality of the kernel
kernel.sysrq = 0

# Controls whether core dumps will append the PID to the core filename.
# Useful for debugging multi-threaded applications.
kernel.core_uses_pid = 1

# Controls the use of TCP syncookies
net.ipv4.tcp_syncookies = 1

# Controls the default maxmimum size of a mesage queue
kernel.msgmnb = 65536

# Controls the maximum size of a message, in bytes
kernel.msgmax = 65536

# Controls the maximum shared segment size, in bytes
kernel.shmmax = 4294967295

# Controls the maximum number of shared memory segments, in pages
kernel.shmall = 268435456

IP-UP.LOCAL (con permessi di esecuzione, chmod 755)

[root@gw ppp]# cat /etc/ppp/ip-up.local
#!/bin/bash

ip route add 192.168.0.0/24 dev ppp0

PPTPVPN

[root@gw peers]# cat /etc/ppp/peers/pptpvpn
pty “pptp <ip-pubblico-statico-rete-A> –nolaunchpppd”
lock
noauth
nobsdcomp
nodeflate
refuse-eap
refuse-pap
name magazzinovpn
password <password-utente-magazzinovpn-definito-in-ms-windows>
persist
remotename PPTP
require-mppe-128
ipparam pptpvpn

CON.SH (con permessi di esecuzione, chmod 755)

[root@gw peers]# cat /root/con.sh
#!/bin/bash
pppd call pptpvpn
sleep 10
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

RC.LOCAL

[root@gw peers]# cat /etc/rc.local
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don’t
# want to do the full Sys V style init stuff.

/root/con.sh

touch /var/lock/subsys/local

Il client Linux creerà il tunnel VPN ed essendo il gateway della rete-B smisterà le chiamate pubbliche verso il router dell’operatore, mentre le chiamate con destinazione la rete-A verranno instradate nel tunnel VPN.

Se siete interessati a approfondimenti o valutazioni di scenari diversi potete contattarmi compilando il form al link http://www.abconsultinggroup.eu/contatti/index.php .