Port forwarding con IPTABLES su linux

SCENARIO.

Analizziamo il caso in cui il client attraverso la rete internet, voglia accedere alla pagina web che risponde alla porta 8080 sul SERVER A con ip privato 192.168.0.1. Di questa pagina abbiamo una copia perfetta sul SERVER B con ip privato 192.168.0.2 che risponde sulla porta 80.

In condizioni normali, quindi, il client aprira’ il suo browser ed inserira’ nella barra degli indirizzi http://10.1.1.1:8080 corrispondente all’ip pubblico del router. La richiesta arriva al router che tramite le sue regole di nat indirizzera’ la richiesta al SERVER A il quale rispondera’ con la pagina web contenuta nel suo disco rigido.

Oggi pero’ abbiamo deciso di eseguire una manutenzione al WEB del SERVER A e chiaramente non possiamo permetterci che i CLIENT non abbia il servizio se richiesto. Non abbiamo accesso al firewall per modificare gli instradamenti e pertanto dobbiamo escogitare un trucco in modo che ad ogni richiesta della pagina WEB fatta al SERVER A sulla porta 8080, risponda il SERVER B sulla 80.

SOLUZIONE.

Sulle macchine linux ci viene in aiuto IPTABLES. IPTABLES e’ l’utility a riga di comando che ci permette di modificare le regole di firewall e di instadamento sui pacchetti che arrivano al o partono dal server.

Non faro’ qui un trattato su cosa sia un firewall e come lavori in quanto ci vorrebbero pagine e pagine di articoli ma mi limito brutalmente a dire che il firewall e’ quella parte di software che decide del destino dei pacchetti che nascono o che arrivano alla porta ethernet del server(detta veramente in modo brutale).

Vediamo ora cosa dobbiamo fare fisicamente sulla consolle della macchina SERVER A in modo che ad ogni richiesta che gli arriva sulla sua porta ethernet sulla porta 8080 giri la richiesta alla porta 80 del SERVER B.

Innanzi tutto per questo esempio ho usato due SERVER con installato DEBIAN 11, ma il concetto rimane valido per tutti i sistemi LINUX, prima operazione da fare e’ verificare che sia attiva la funzione FORWARDING del KERNEL mediante il seguente comando dal terminale.

root@SERVER_A:cat /proc/sys/net/ipv4/ip_forward

dovrebbe rispondere semplicemente con un 1. Nel caso la risposta sia 0 , sara’ necessario abilitare il forwarding e riavviare il servizio di rete con i seguenti comandi

root@SERVER_A: echo 1 > /proc/sys/net/ipv4/ip_forward
root@SERVER_A: systemctrl restart network 

per le ultime verisioni di UBUNTU e DEBIAN 

root@SERVER_A: systemctrl restart NetworkManager

Fatto questo dobbiamo inserire la regola nel firewall del SERVER_A tramite IPTABLES

root@SERVER_A: iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.0.2:80

Verifichiamo che la regola sia stata inserita con il seguente comando

root@SERVER_A: iptables -t nat -L --line-numbers

Rispondera con una serie di regole tra cui troverete le seguenti righe

Chain PREROUTING (policy ACCEPT)
num target  prot   opt   source      destination
1   DNAT    tcp    --    0.0.0.0/0   0.0.0.0/0  tcp dpt:80 to:192.168.0.2         

A questo punto abbiamo finito, il client richiedera’ quindi la pagina web sempre all’indirizzo:porta pubblico http://10.1.1.1:8080 il router/firewall indirizzera’ la richesta sempre al SERVER A che ora pero’ invece di rispondere con il contenuto della pagina, rimandera’ la richiesta al SERVER B sulla porta 80 il quale mandera’ il contenuto della pagina WEB al client che l’ha richiesta.

Cosa dobbiamo fare invece se volessimo cancellare la regola e ripristinare la situazione iniziale? e sufficiente inserire il seguente comando

root@SERVER_A: iptables -t nat -D PREROUTING 1
dove 1 sta' per il numero di regola(num)

Ora il SERVER A riprendera’ a rispondere direttamente alle richieste sulla porta 8080.

HP Proliant con SmartArray p410

Installare un S.O. su un server HP equipaggiato con un array SmartArray p410 in modalità HBA

PROBLEMA: Il raid hardware p420i e’ configurabile in modalità HBA, questa modalità praticamente consente al sistema operativo di gestire direttamente i dischi connessi al raid in modalità trasparente come se il controller non esistesse. Di contro però vi e’ che nella modalita HBA non e’ possibile usare direttamente i dischi collegati al controller p420 per eseguire il BOOT.

SOLUZIONE:

Esiste una soluzione molto semplice per ovviare a questo limite sui server HP. Questi server all’interno sono provvisti di un ingresso USB e un lettore SD che possono ospitare appunto delle memorie di massa dove sara’ possibile installare il BOOT del sistema operativo mentre i file della directory root andranno installati sui dischi connessi al raid HW .

Vediamo la procedura per l’installazione di PROXMOX (ma puo’ essere usata anche con altri SO) .

STEP 1:

Avviamo il server con la chiavetta di installazione avendo l’accortezza di aver gia’ installato la chiavetta/SD con almeno 4Gb all interno della macchina, procediamo alla normale installazione selezionando come destinazione il disco collegato allo smartarray facendo attenzione a TOGLIERE la spunta sul flag “reboot after sucessful installation”. Al termine della procedura guidata di installazione, invece di cliccare su reboot premere CTRL+SHIFT+F3 o F4 in modo di accedere al terminale.

STEP 2:

Creiamo una directory chiamata /drive sulla chiavetta interna e montamo al suo interno la partizione /dev/pve/root (tramite lsvdisplay verifichiamo il corretto percorso con il seguente comando

root@pve:~# lvdisplay -m

Dovremmo ottenere l’elenco dei volumi con il relativo percorso

A questo punto creiamo una directory chiamata drive e montiamo questa partizione

root@pve:~#mkdir drive
root@pve:~#mount /dev/pve/root /drive

Ora creiamo del directory dev, sys, proc e run sotto la /drive e montiamo in modalita’ bind i rispettivi percorsi. Il montaggio in modalita’ bind delle directory significa replicare il contenuto della directory di origine in un altro punto facendo si che ogni modifica sul punto replicato venga immediatamente trasmesso al punto di origine.

Il comando per eseguire questa operazione e’

mount --bind /percorso/cartella/origine /percorso/cartella/destinazione

root@pve:~# mount --bind /dev /drive/dev
root@pve:~# mount --bind /sys /drive/sys
root@pve:~# mount --bind /proc /drive/proc
root@pve:~# mount --bind /run /drive/run

eseguiamo un chroot sulla directory drive

root@pve:~#chroot /drive

STEP 3:

A questo punto e’ necessario variare la tabella di partizioni della nostra USB/SD (ancora vergine o non partizionata) per renderla utilizzabile al boot. Tramite il comando lsblk -f andiamo ad individuare esattamente il nome del device della usb/sd, individueremo cosi ilpercorso corretto /dev/sdX (dove X sta per la lettera della chiavetta o SD card) lanciamo il comnando gdisk,

# gdisk /dev/sd[x] 
Command: (? for help): r 
Recovery/transformation command (? for help): x 
Expert command (? for help): l 
Enter the sector alignment value (1 - [variable], default = 2048): 34 
Expert command (? for help): m 
Command: (? for help): n 
Partition number (1 - 128, default 1:) 1 
First sector (34 - [variable], default = 34): 34 
Last sector (34 - [variable], default = [variable]): 2047 
Current type is 'Linux file system' Hex code or GUID (L to show codes, Enter = 8300): ef02 
Changed type of partition to 'BIOS boot partition' Command: (? for help): r 
Recovery/transformation command (? for help): x 
Expert command (? for help): l 
Enter the sector alignment value (1 - [variable], default = 2048): 2048 
Expert command (? for help): m 
Command: (? for help): n 
Partition number (1 - 128, default 2:) 2 
First sector (2048 - [variable], default = 2048): 2048 
Last sector ([variable] - [variable], default = [variable]): +1G 
Current type is 'Linux file system' Hex code or GUID (L to show codes, Enter = 8300): 8300 
Changed type of partition to 'Linux file system' Command: (? for help): w 
***writing everythin to disk***

STEP 4:

Siamo all’ultimo passaggio, usando i comandi integrati di proxmox (ringraziamo gli sviluppatori) formattiamo la partizione 2 sulla USB/SD creata tramite le procedura dello step 3 e prepariamola per il boot con il seguente comando

root@pve:~#proxmox-boot-tool format /dev/sdX2

Se dovesse restituire qualche errore usiamo l’opzione –force alla fine, potrebbe capitare se la USB/SD fossero state formattate in una vecchia modalita vfat/fat32.

Ultimo comando da lanciare per concludere la preparazione

root@pve:~#proxmoi-boot-tool init /dev/sdX2

Abbiamo concluso la preparazione e siamo pronti a riavviare il server, smontiamo la chiavetta usata per l’installazione e diamo un bel reboot al server.

Ringraziamenti:

Questo articolo e’ una libera traduzione dell’originale che potete trovare qui ,ringrazio vivamente l’autore che mi ha risolto un grosso problema in quanto fino ad oggi avevo trovato solo altri metodi molto complicati.

LINUX – PROCESSO ATTIVO

Vediamo il comando per verificare se un processo e’ attivo. Questo e’ utile per verficare se un servizio e’ avviato oppure se e’ necessario farlo partire, oppure puo essere utile perchè magari il servizio e’ bloccato e voglio killarlo.

Il comando linux e’ pgrep

COME LIMITARE L’USO DELLA CPU

Per limitare l’uso della cpu ad un singolo processo in debian/ubuntu si puo utilizzare un programma scritto in C dal nome cputool.

Questo software non e’ installato di default ma si puo installare dai repository ufficiali con il comando:

$: sudo apt install cputool

al termine dell installazione eseguire un top per identificare il pid del processo da limitare

$: top

se per esempio vogliamo limitare il processo firefox con id = 8726

scriviamo :

$: sudo cputool –cpu-limit 15 -p 8726

dove 15 sta ad indicare che il pid 8726 non potra’ utilizzare piu’ del 15% della cpu

chiaramente il prograsmma firefox risultera’ rallentato ma utilizzabile e non blocchera’ tutto il resto del sistema se dovesse superare la richiesta di CPU.

E’ possibile limitare non solo un pid ma anche un gruppo di pid

$: sudo cputool –cpu-limit 15 -P 8726,1484