Marvin Pascale

[B.Log]

24 Ottobre 2020

Hetzner Online

Hetzner

Hetzner Online GmbH è una società di hosting Internet e un operatore di data center con sede a Gunzenhausen, in Germania.

Hetzner Online fornisce hosting dedicato, web hosting condiviso, server privati virtuali, server gestiti, nomi di dominio, certificati SSL, object storage, e soluzioni cloud. Nei data center situati a Norimberga (Germania), Falkenstein (Germania) e Helsinki (Finlandia), i clienti possono anche collegare il proprio hardware all’infrastruttura e alla rete di Hetzner Online (housing).

Le tecnologie utilizzate sono tutte opensource (es: kvm per la virtualizzazione) e i prezzi sono competitivi (circa 4€/mese per una istanza con 2 Vcpu, 4 GB di ram e 40 GB di disco).

Hetzner

Servizi Cloud

Ho avuto il piacere di utilizzare i loro servizi e ho messo in piedi un’intera infrastruttura con terraform (del quale ho già parlato).

Server

Credo sia il tipo di risorsa più utilizza dagli utenti. Con pochi click è possibile avere a disposizione un’istanza linux ( a scelta tra Debian, Centos, Ubuntu e Fedora) e un IP pubblico IPV4 + IPV6.

Volume

Storage aggiuntivo utilizzabile dalle istanze server (una per volta). Di default propone xfs e ext4 come filesystem ma è anche possibile inizializzarli manualmente come fossero dei “semplici” hard drive. Il grande vantaggio è quello di poterli espandere a caldo (il costo verrà calcolato in base alla nuova dimensione).

Load balancer

È un servizio relativamente giovane ma offre spunti interessanti. Molto vicino ad un reverse proxy, permette di pubblicare i propri servizi (http e https) con funzioni di load balancing e fail over.

IP pubblici

È possibile aggiungere altri ip pubblici alle istanze e riassegnarli velocemente.

Rete

In questa sezione è possibile creare delle reti private e subnet. A mio avviso si potrebbe migliorare in quanto gli ip rilasciati/assegnati alle istanze sono tutti dei /32. Ci ho messo un po’ a capire bene come sfruttare la cosa per avere delle istanze private e delle istanza pubbliche.

Nell’esempio che mostrerò più avanti ho voluto creare una rete complessa con un firewall, due ip pubblici aggiuntivi, una rete lan e una rete dmz.

Sicurezza

In questa sezione è possibile aggiungere le chiavi ssh utilizzabili in fase in inizializzazione di un server e i token necessari per poter operare via api (es: terraform, curl, …).

Esempio con terraform

In questo esempio creeremo:

  • 1 istanza firewall;
  • 2 istanze Debian 10;
  • 1 istanza Windows server 2016;
  • 2 reti con relative subnet;
  • 2 IP pubblici aggiuntivi;

Dopo aver generato un tocken valido nella sezione sicurezza creiamo il file terraform.tfvars

terraform.tfvars

hcloud_token = "CHEBELTOKENSEGRETO"

Ora possiamo procedere con il progetto vero e proprio

provider.tf


variable "hcloud_token" {}

# Configure the Hetzner Cloud Provider
provider "hcloud" {
  token = var.hcloud_token
}

network.tf

resource "hcloud_network" "dmzNet" {
  name = "dmz-net"
  ip_range = "10.0.99.0/24"
}

resource "hcloud_network_subnet" "dmzSub" {
  network_id = hcloud_network.dmzNet.id
  type = "cloud"
  network_zone = "eu-central"
  ip_range   = "10.0.99.0/24"
}

resource "hcloud_network_route" "dmzRouteNet" {
  network_id = hcloud_network.dmzNet.id
  destination = "0.0.0.0/0"
  gateway = "10.0.99.10"
}

resource "hcloud_network" "lanNet" {
  name = "lan-net"
  ip_range = "10.0.9.0/24"
}

resource "hcloud_network_subnet" "lanSub" {
  network_id = hcloud_network.lanNet.id
  type = "cloud"
  network_zone = "eu-central"
  ip_range   = "10.0.9.0/24"
}

resource "hcloud_network_route" "lanRouteNet" {
  network_id = hcloud_network.lanNet.id
  destination = "0.0.0.0/0"
  gateway = "10.0.9.10"
}

resource "hcloud_floating_ip" "pub01" {
  type = "ipv4"
  server_id = hcloud_server.pfsense.id
  home_location = "nbg1"
}

resource "hcloud_floating_ip" "pub02" {
  type = "ipv4"
  server_id = hcloud_server.pfsense.id
  home_location = "nbg1"
}

resources.tf


resource "hcloud_ssh_key" "user" {
  name = "Utente"
  public_key = file("~/.ssh/id_rsa.pub")
}

# Firewall

resource "hcloud_server" "pfsense" {
  name = "Firewall"
  image = "debian-10"
  server_type = "cx11"
  backups = true
  location = "nbg1"
  iso = "pfSense-CE-2.4.5-RELEASE-amd64.iso"
  ssh_keys = [hcloud_ssh_key.user.name]
}

resource "hcloud_server_network" "firewallDmzIP" {
  server_id = hcloud_server.pfsense.id
  network_id = hcloud_network.dmzNet.id
  ip = "10.0.99.10"
}

resource "hcloud_server_network" "firewallLanIP" {
  server_id = hcloud_server.pfsense.id
  network_id = hcloud_network.lanNet.id
  ip = "10.0.9.10"
}

resource "hcloud_floating_ip_assignment" "pub01" {
  floating_ip_id = hcloud_floating_ip.pub01.id
  server_id = hcloud_server.pfsense.id
}

resource "hcloud_floating_ip_assignment" "pub02" {
  floating_ip_id = hcloud_floating_ip.pub02.id
  server_id = hcloud_server.pfsense.id
}

# Istances

resource "hcloud_server" "debian10" {
  name = "debianIsTheBest"
  image = "debian-10"
  server_type = "cx11"
  backups = true
  location = "nbg1"
  ssh_keys = [hcloud_ssh_key.user.name]
  user_data = file("kickstart.sh")
}

resource "hcloud_server_network" "dmzIP" {
  server_id = hcloud_server.debian10.id
  network_id = hcloud_network.dmzNet.id
  ip = "10.0.99.11"
}

resource "hcloud_server" "debian10-02" {
  name = "debianIsTheBest02"
  image = "debian-10"
  server_type = "cx11"
  backups = true
  location = "nbg1"
  ssh_keys = [hcloud_ssh_key.user.name]
  user_data = file("kickstart.sh")
}

resource "hcloud_server_network" "dmzIP-02" {
  server_id = hcloud_server.debian10-02.id
  network_id = hcloud_network.dmzNet.id
  ip = "10.0.99.12"
}

resource "hcloud_server" "WS2K19" {
  name = "WServer2k16"
  image = "debian-10"
  server_type = "cpx21"
  backups = true
  location = "nbg1"
  ssh_keys = [hcloud_ssh_key.user.name]
  iso = "SW_DVD9_Win_Svr_STD_Core_and_DataCtr_Core_2016_64Bit_English_-2_MLF_X21-22843.iso"
}

resource "hcloud_server_network" "lanIP-01" {
  server_id = hcloud_server.WS2K19.id
  network_id = hcloud_network.lanNet.id
  ip = "10.0.9.11"
}

output "pfSense_Public_IP" {
    value = hcloud_server.pfsense.ipv4_address
}

output "Debian_Public_IP" {
    value = hcloud_server.debian10.ipv4_address
}

output "Debian02_Public_IP" {
    value = hcloud_server.debian10-02.ipv4_address
}

Ci sono delle azioni da fare manualmente. Le installazioni di pfSense e Windows server, e la configurazione delle interfacce di rete.

Se vogliamo che le nostre istanze non siano esposte è necessario disabilitare l’interfaccia di rete relativa all’ip pubblico e bisogna configurare pfSense per fai in modo che diventi il gateway delle due reti.

pfSense

Una volta terminata l’installazione è necessario configurare le interfacce di rete e le rotte.

Come prima cosa accediamo alla shell per abilitare l’accesso all’interfaccia web

easyrule pass wan tcp any any 443

nb: è cosa buona e giusta limitare l’accesso solo al vosto ip (sperando di averne uno statico)

Ora che abbiamo l’accesso alla web-gui possiamo procedere con le configurazioni.

System -> Routing -> Static Routes

Destination network: 10.0.99.0/24
Gateway: 10.0.99.1
Description: pfSense on dmz

per la dmz

Destination network: 10.0.9.0/24
Gateway: 10.0.9.1
Description: pfSense on lan

per la lan.

A questo punto configuriamo le regole per l’outbound

Firewall -> NAT -> Outbound

Interface: WAN
Address Family: IPv4+IPv6
Protocol: any
Source: 10.0.99.0/24
Destination: any
Translation -> Address: Interface Address

per la dmz

Interface: WAN
Address Family: IPv4+IPv6
Protocol: any
Source: 10.0.9.0/24
Destination: any
Translation -> Address: Interface Address

per la lan.

Windows Server

Durante l’installazione, per poter aver acceso ai dischi sarà necessario montare la iso dei vitio drivers. Una volta terminata l’installazione è necessario disabilitare la scheda di rete a cui è assegnato l’ip pubblico.

Linux (Debian 10)

L’installazione viene fatta da Hetzner ma bisogna anche qui disabilitare manualmente la scheda di rete a cui è assegnato l’ip pubblico.

Nel file /etc/network/interfaces.d/50-cloud-init commentare la configurazione relativa all’ip pubblico e aggiungere le configurazioni relative alla rete privata.

auto ens10
iface ens10 inet dhcp
	post-up ip route add default via 10.0.99.1

nel nostro caso si tratta della dmz.

Come detto in precedenza avrei preferito poter disporre in maniera diversa delle reti ma anche con questa configurazione possiamo avere un livello di protezione accettabile.


Le opinioni in quanto tali sono opinabili e nulla ti vieta di approfondire l’argomento.

Risorse: