Pubblicità

Come utilizzare un VPS per fare port forwarding in una rete sotto NAT

Negli ultimi anni, la crescente domanda di indirizzi IP pubblici ha portato a una significativa carenza di indirizzi IPv4, il protocollo di rete più comunemente utilizzato per l’identificazione dei dispositivi su Internet. Questo problema ha spinto molti operatori a utilizzare tecniche come il Network Address Translation (NAT), che consente di condividere un singolo indirizzo IP pubblico tra più utenti. Sebbene questa soluzione sia efficace per ridurre il numero di indirizzi IP necessari, presenta delle limitazioni, in particolare quando si tratta di accedere a servizi ospitati in reti locali, come server web, impianti di videosorveglianza o altre applicazioni.

Per affrontare questa sfida, è possibile utilizzare un server Virtual Private Server (VPS) con un indirizzo IP pubblico, che funge da punto di accesso esterno. Combinando questo con una rete privata virtuale (VPN), come WireGuard, è possibile creare un tunnel sicuro che consente di instradare il traffico dalla rete esterna verso i servizi interni, senza dover assegnare un indirizzo IP pubblico a ogni dispositivo della rete locale.

In questo articolo, esploreremo come configurare un VPS su Oracle Cloud Infrastructure e come utilizzare WireGuard per stabilire una connessione sicura tra il VPS e un router Mikrotik nella vostra rete locale. Forniremo istruzioni dettagliate passo dopo passo, rendendo accessibile anche a chi non ha una vasta esperienza nel campo delle reti. Alla fine, sarete in grado di esporre i vostri servizi interni su Internet in modo sicuro e efficiente.

Schema della rete

  • Server VPS su Oracle Cloud Infrastructure
    • Questa sar’ la macchina con IP pubblico che ricevera’ il traffico dal web e tramite VPN fara’ un forwarding sulla rete locale
  • Router/switch Mikrotik
    • Questo sara’ l’oggetto nella nostra rete locale che si occupera’ di ricevere il traffico dal VPS, filtrarlo tramite firewall e poi reindirizzarlo alla rete locale se necessario
    • A questo dispositivo saranno connessi (o almeno raggiungibili) i vari servizi da esporre tramite il VPS
    • E’ richiesto Router OS versione 7 in quanto useremo Wireguard come servizio VPN

Configurazione del server su Oracle

  • Dopo esserci registrati su Oracle Cloud Infrastructure (link) possiamo utilizzare il Free Tier (versione gratuita) del servizio per creare una macchina virtuale del tipo Ampere Micro
    • La macchina dovra’ essere configurata con Ubuntu Server 24.04
    • Facciamo attenzione a scaricare la chiave SSH generata durante il setup della macchina in quanto sara’ l’unico modo per accedervi
  • Dopo aver fatto il deploy della macchina dal cloud, possiamo connetterci in SSH usando la chiave SSH appena scaricata. L’utente di default e’ ubuntu mentre l’indirizzo di connessione e’ l’IP pubblico della macchina stessa che apparira’ al termine della configurazione

Installazione del Docker engine

Il primo passo sulla macchina cloud e’ quello di installare il servizio Docker che useremo per ospitare il server Wireguard, quindi digitiamo:

cd /tmp 
wget get.docker.com
mv index.html docker.sh
chmod +x docker.sh
sudo ./docker.sh 

Al termine della installazione il servizio Docker sara’ correttamente installato. Opzionalmente possiamo anche scegliere di configurarlo in rootless mode usando:

sudo usermod -aG docker ubuntu

E successivamente riavviare la macchina con

sudo reboot

Installazione del server wireguard

Installiamo le dipendenze con:

sudo apt-get update
sudo apt-get install -y nano net-tools wireguard

Useremo un Docker compose per impostare il server Wireguard in modo semplice e veloce

cd ~
mkdir wireguard-server
cd wireguard-server
nano docker-compose.yaml

Ed incolliamo:

volumes:
  etc_wireguard:

services:
  wg-easy:
    environment:
      # Change Language:
      # (Supports: en, ua, ru, tr, no, pl, fr, de, ca, es, ko, vi, nl, is, pt, chs, cht, it, th, hi)
      - LANG=en
      # Required:
      # Change this to your host's public address
      - WG_HOST=AAA.BBB.CCC.DDD

      # Optional:
      - PASSWORD_HASH=aaaaaaaaaaaaaaaaaaaaaaaaaa 
      - PORT=51821
      - WG_PORT=51822
      # - WG_CONFIG_PORT=92820
      - WG_DEFAULT_ADDRESS=10.8.0.x
      # - WG_DEFAULT_DNS=1.1.1.1
      # - WG_MTU=1420
      - WG_ALLOWED_IPS=10.8.0.0/24
      - WG_PERSISTENT_KEEPALIVE=25
      # - WG_PRE_UP=echo "Pre Up" > /etc/wireguard/pre-up.txt
      # - WG_POST_UP=echo "Post Up" > /etc/wireguard/post-up.txt
      # - WG_PRE_DOWN=echo "Pre Down" > /etc/wireguard/pre-down.txt
      # - WG_POST_DOWN=echo "Post Down" > /etc/wireguard/post-down.txt
      # - UI_TRAFFIC_STATS=true
      # - UI_CHART_TYPE=0 # (0 Charts disabled, 1 # Line chart, 2 # Area chart, 3 # Bar chart)

    image: ghcr.io/wg-easy/wg-easy:14
    container_name: wg-easy
    volumes:
      - etc_wireguard:/etc/wireguard
    ports:
      - "51822:51822/udp"
      - "51821:51821/tcp"
    restart: unless-stopped
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    sysctls:
      - net.ipv4.ip_forward=1
      - net.ipv4.conf.all.src_valid_mark=1

Nel file assicuriamoci di inserire l’IP pubblico della nostr macchina Oracle nel campo WG_HOST e di impostare una password nel campo PASSWORD_HASH usando questo comando:

docker run --rm -it ghcr.io/wg-easy/wg-easy wgpw '<password>'

La string hash ottenuta sar’ il valore da usare nel PASSWORD_HASH

Poi premiamo CTRL+O e CTRL+X per salvare ed uscire.

Se abbiamo configurato tutto correttamente, il server dovrebbe partire usando il comando:

sudo docker-compose up -d

Configurazione del firewall su OCI

Tutte le macchine Oracle sono “protette” da un firewall che consente solo determinate connessioni, dobbiamo quindi aggiungere le porte raggiungibili dall’esterno

Accediamo al pannello OCI, andiamo su Compute > Instances e poi selezioniamo la macchina che abbiamo appena creato, da qui dobbiamo andare su Details e selezionare la virtual cloud network assegnata, poi dal tab Security scegliere la relativa Security List ed aggiungere le porte da pubblicare, nel mio caso la 80 e 443 TCP da inoltrare al Mikrotik e la 51822 UDP per il server Wireguard.

Configurazione del server wireguard

Prima dobbiamo prendere l’indirizzo IP virtuale della macchina da OCI, nel mio caso 10.0.0.243

Sul PC locale, apriamo un tunnel SSH sulla porta 51821, ovvero la GUI del server wireguard tramite il seguente comando in cui dovremo sostituire prima l’indirizzo locale della macchina (nel mio caso 10.0.0.243), poi il percorso verso la chiave privata della macchina cloud, poi l’ip pubblico (AAA.BBB.CCC.DDD):

ssh -L 8080:10.0.0.243:51822 -i /path/to/private/key [email protected] -N

Ora possiamo aprire il browser sul pc locale e andare alla pagina http://127.0.0.1:8080 e dovrebbe apparirci la pagina di Wireguard.

Tramite la pagina di Wireguard dovremo creare due client usando il tasto New. Una ci servira’ per il VPS, una per il Mikrotik.

Usando il tasto di download dobbiamo scaricare entrambe le configurazioni sul nostro PC

Connessione del VPS a Wireguard

Dato che nel passaggio precedente abbiamo installato il client Wireguard sul VPS, ora possiamo caricarne la configurazione. Quindi, accedendo via SSH:

sudo nano /etc/wireguard/wg0.conf

Qui dobbiamo incollare il contenuto del file di configurazione di Wireguard appena scaricato, nel caso in cui ci sia una linea con DNS=A.B.C.D consiglio di cancellarla per evitare noie di DNS. Premiamo CTRL+O e CTRL+X per salvare.

Per abilitare la connessione automatica possiamo dare i comandi:

sudo systemctl enable wg-quick@wg0
sudo systemctl start wg-quick@wg0

Se tutto e’ andato per il verso giusto dovremmo riuscire a fare ping verso il server Wireguard:

ping 10.8.0.1

Configurazione del port forwarding

Sempre sulla macchina Oracle dobbiamo dare i comandi:

sudo apt-get update
sudo apt-get install -y nftables

Questo installa il software nftables che consente di fare l’inoltro di un set di porte ad un altro dispositivo nella rete locale. Possiamo quindi modificare il file di configurazione tramite:

  sudo nano /etc/nftables.conf

E poi inserire la configurazione desiderata (vedi sotto). Ricordiamoci di cambiare gli indirizzi di sorgente e destinazione, nel mio caso 10.0.0.243 e’ l’indirizzo privato del VPS (preso dalla console OCI), mentre 10.8.0.2 e’ l’indirizzo dedicato da Wireguard al Mikrotik (appare nella lista dei client creati sulla dashboard Wireguard).

table ip my_nat {
  chain my_prerouting {
    type nat hook prerouting priority dstnat;

    ip daddr 10.0.0.243 tcp dport { 80, 443 } dnat to 10.8.0.2;
    ip daddr 10.0.0.243 udp dport { 3478, 1194 } dnat to 10.8.0.2;
  }
  chain my_postrouting {
  type nat hook postrouting priority srcnat;
  ip saddr 0.0.0.0/0 oifname "wg0" masquerade
}
}

Abilitazione del port forwarding IPV4

Sempre sulla macchina Oracle, dobbiamo abilitare il port forwarding del sistema operativo:

sudo nano /etc/sysctl.conf

Ed aggiungere la riga:

net.ipv4.ip_forward = 1

Per poi applicare le modifiche con:

sudo sysctl -p /etc/sysctl.conf

Configurazione del router Mikrotik

Connessione al server Wireguard

Il secondo client da collegare alla rete Wireguard e’ il router Mikrotik. Dobbiamo prima convertire il file di configurazione di Wireguard in comandi Mikrotik, per fare questo possiamo aprire il seguente link: https://iu2frl.github.io/wireguard-to-mikrotik/ ed incollare la configurazione scaricata da Wireguard relativa al client creato per il router Mikrotik. Premendo su Translate ci verra’ convertito in comandi da terminale.

Apriamo ora il terminale da Winbox (o possiamo accedere via SSH/Telnet al Mikrotik) ed incolliamo le righe generate. Se non sono mostrati errori la connessione dovrebbe essere avvenuta e dovremmo riuscire a fare il ping sia verso il server Wireguard che il VPS:

ping 10.8.0.1
ping 10.8.0.3

Configurazione del firewall

Ora dobbiamo aggiungere tutte le porte al firewall e configurare il NAT.

Prima dobbiamo fare il masquerade della rete locale (nel caso non ci sia gia’):

/ip firewall nat add action=masquerade chain=srcnat comment="Masquerade per server VM" !connection-bytes !connection-limit !connection-mark !connection-rate !connection-type !content disabled=no !dscp dst-address=192.168.1.0/24 !dst-address-list !dst-address-type !dst-limit !dst-port !fragment !hotspot !icmp-options !in-bridge-port !in-bridge-port-list !in-interface !in-interface-list !ingress-priority !ipsec-policy !ipv4-options !layer7-protocol !limit log=no log-prefix="" !nth !out-bridge-port !out-bridge-port-list out-interface=bridge1 !out-interface-list !packet-mark !packet-size !per-connection-classifier !port !priority !protocol !psd !random !routing-mark !src-address !src-address-list !src-address-type !src-mac-address !src-port !tcp-mss !time !to-addresses !to-ports !ttl

E poi il NAT verso il server locale (quello che espone le porte 80 e 443). In queste regole dobbiamo impostare dst-address con l’indirizzo della VPN assegnato al Mikrotik e to-addresses con l’indirizzo della macchina locale che ospita il servizio web:

/ip firewall nat add action=dst-nat chain=dstnat comment=Centralino !connection-bytes !connection-limit !connection-mark !connection-rate !connection-type !content disabled=no !dscp dst-address=10.8.0.2 !dst-address-list !dst-address-type !dst-limit dst-port=80 !fragment !hotspot !icmp-options !in-bridge-port !in-bridge-port-list !in-interface !in-interface-list !ingress-priority !ipsec-policy !ipv4-options !layer7-protocol !limit log=yes log-prefix="NAT - " !nth !out-bridge-port !out-bridge-port-list !out-interface !out-interface-list !packet-mark !packet-size !per-connection-classifier !port !priority protocol=tcp !psd !random !routing-mark !src-address !src-address-list !src-address-type !src-mac-address !src-port !tcp-mss !time to-addresses=192.168.1.100 to-ports=80 !ttl
/ip firewall nat add action=dst-nat chain=dstnat comment=Centralino !connection-bytes !connection-limit !connection-mark !connection-rate !connection-type !content disabled=no !dscp dst-address=10.8.0.2 !dst-address-list !dst-address-type !dst-limit dst-port=443 !fragment !hotspot !icmp-options !in-bridge-port !in-bridge-port-list !in-interface !in-interface-list !ingress-priority !ipsec-policy !ipv4-options !layer7-protocol !limit log=yes log-prefix="NAT - " !nth !out-bridge-port !out-bridge-port-list !out-interface !out-interface-list !packet-mark !packet-size !per-connection-classifier !port !priority protocol=tcp !psd !random !routing-mark !src-address !src-address-list !src-address-type !src-mac-address !src-port !tcp-mss !time to-addresses=192.168.1.100 to-ports=443 !ttl

Controllo finale

Se tutto e’ andato per il verso giusto dovremmo vedere i due client connessi al server Wireguard:

E, aprendo l’indirizzo IP pubblico della macchina Oracle dovremmo vedere il servizio sulla porta 80 o 443

Considerazioni sulla sicurezza

Implementare una soluzione che espone servizi interni su Internet richiede particolare attenzione alla sicurezza. Ecco alcune best practice per proteggere la vostra configurazione:

1. Aggiornamenti e Patch

  • Mantieni aggiornato il software: Assicurati che il sistema operativo del VPS, Docker, WireGuard e il firmware del router Mikrotik siano sempre aggiornati alle ultime versioni. Le patch di sicurezza risolvono vulnerabilità note.
  • Monitora le vulnerabilità: Iscriviti alle mailing list o ai feed RSS dei progetti open source utilizzati (ad esempio, WireGuard) per essere informato su eventuali problemi di sicurezza.

2. Protezione delle Credenziali

  • Usa chiavi SSH robuste: Assicurati che la chiave SSH utilizzata per accedere al VPS sia sufficientemente lunga (almeno 4096 bit) e protetta da una passphrase.
  • Proteggi la configurazione di WireGuard: Utilizza una password forte per l’interfaccia di gestione di WireGuard e limita l’accesso solo agli utenti autorizzati.

3. Configurazione del Firewall

  • Limita l’accesso alle porte esposte: Sul VPS, apri solo le porte strettamente necessarie (ad esempio, 80, 443 e 51822 per WireGuard) e blocca tutto il resto.
  • Utilizza regole di firewall restrittive: Configura il firewall del VPS e del Mikrotik per consentire il traffico solo da indirizzi IP attendibili, se possibile.
  • Proteggi la VPN: Assicurati che WireGuard sia configurato per utilizzare chiavi crittografiche robuste e disabilita protocolli obsoleti o insicuri.

4. Monitoraggio e Logging

  • Abilita il logging: Configura il logging sia sul VPS che sul Mikrotik per tenere traccia delle connessioni e degli eventi sospetti.
  • Monitora il traffico: Utilizza strumenti come tcpdumpWireshark o soluzioni di monitoraggio di rete per rilevare attività anomale.
  • Imposta avvisi di sicurezza: Configura avvisi per notificarti in caso di tentativi di accesso non autorizzati o picchi di traffico insoliti.

5. Protezione dei Servizi Esposti

  • Utilizza HTTPS: Se esponi un server web, assicurati di utilizzare certificati SSL/TLS validi per crittografare il traffico.
  • Limita l’accesso ai servizi: Configura i servizi esposti per consentire l’accesso solo a utenti autorizzati, utilizzando autenticazione a più fattori (MFA) se possibile.
  • Isola i servizi: Se possibile, esponi solo i servizi strettamente necessari e mantieni gli altri isolati dalla rete esterna.

6. Backup e Ripristino

  • Esegui backup regolari: Crea backup periodici della configurazione del VPS, del Mikrotik e dei dati dei servizi esposti.
  • Testa i backup: Assicurati che i backup siano funzionanti e che sia possibile ripristinare rapidamente i servizi in caso di incidente.

7. Sicurezza della Rete Locale

  • Isola i dispositivi critici: Se possibile, utilizza VLAN o reti separate per isolare i dispositivi che ospitano servizi esposti da quelli della rete interna.
  • Configura il NAT correttamente: Assicurati che il NAT sul Mikrotik sia configurato in modo da non esporre accidentalmente dispositivi interni.
  • Rivedi periodicamente la configurazione: Esegui controlli regolari per verificare che la configurazione sia ancora sicura e allineata alle esigenze attuali.
PubblicitàPubblicità
Post Disclaimer

Creative common license BY-NC_SA

Informazioni Importanti

Note generali: Le informazioni contenute in questo articolo sono di carattere informativo e rispecchiano le opinioni personali del autore. Tutte le guide nel sito vengono proposte "as it is" puramente a scopo didattico. L'utente che accetta di seguirne i passaggi si assume ogni responsabilità in caso di guasto/malfunzionamento o altro problema come conseguenza della modifica.

Link di affiliazione e contenuti promozionali: Nei post di iu2frl.it posso includere collegamenti a rivenditori. Posso ricevere una piccola commissione dal rivenditore se effettui un acquisto dopo aver fatto clic su uno di questi link. I post non sono espressamente sponsorizzati da rivenditori, editori, promotori o produttori, se non diversamente specificato chiaramente e tutte le decisioni editoriali sono prese esclusivamente dagli autori dei singoli articoli.

Contenuti riguardanti regolamenti e/o normative: Eventuali riferimenti a normative non costituiscono valore legale, si tratta di libere interpretazioni ed estratti di circolari corredate da eventuali commenti, si invitano tutti gli utenti a verificare la veridicità di tali informazioni sugli organi ufficiali di riferimento, nessuna colpa o responsabilità può essere data agli autori degli articoli.

Licenza di utilizzo: Tutti i contenuti vengono condivisi con licenza CC BY-NC-SA 4.0: Questa licenza consente ad altri di remixare, adattare e sviluppare i contenuti in modo non commerciale, purché accreditino l'autore originale e concedano in licenza le loro nuove creazioni con gli stessi termini. Per maggiori informazioni visitare il sito Creative Commons.

Important Informations

General notes: The information contained in this article is of an informative nature and reflects the personal opinions of the author. All the guides/tutorial on the website are offered "as it is" for educational purposes only. The user who agrees to follow the steps assumes all responsibility in case of failure/malfunctioning or other problem as a result of the modification.

Affiliate links and promotional products: In some posts of iu2frl.it I can include links to resellers. I can get a small commission from the reseller if you make a purchase after clicking on one of these links. The posts are not expressly sponsored by resellers, publishers, promoters or producers, unless otherwise clearly specified and all editorial decisions are made solely by the authors of the individual articles.

Contents about rules and laws: Some articles may contain portions or whole laws or rules regarding specific areas, these kind of content are meant to be indicative only, no responsability can be given to the authors. Always refer to official sources when looking for rules or laws.

Contents licenses: All the contents are published as CC BY-NC-SA 4.0: This license lets others remix, adapt, and build upon your work non-commercially, as long as they credit you and license their new creations under the identical terms.. For more informations please visit Creative Commons website.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *