Hetzner Online
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).
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: