Sécuriser son serveur dédié proxmox avec iptable

 

Préambule

But de cet article

Dans cette article nous allons mettre en place une solution basée sur iptables-persistent et fail2ban afin de sécuriser notre serveur.

A la fin de l’article :

  • Notre serveur hôte :
    • Bloquera les différentes attaques du grand internet. Il faut le reconnaître qu’elles viennent souvent de Chine, de Russie ou d’Inde.
    • Fera du NAT pour permettre de se connecter aux VM via internet.
    • Permettra aux VM de se connecter à internet pour les mises à jour.
    • Permettra aux VM de communiquer entre elles.
  • Les VM :
    • Auront accès à internet.
    • Accepteront les connexion SSH sur un pour dédié pour l’administration

Architecture mise en place

Nous avons besoin :

  • D’un serveur avec
    • Une IP publique
    • Une ip locale (dans notre cas ce sera 192.168.122.1)
  • Plusieurs VM avec :
    • Une interface réseau pour le réseau local
    • Une interface réseau pour l’accès internet

Plan d’adressage :

  • Chaque vm aura 2 IP.
  • Le port ssh sera défini par l’ip local de la VM . L’ip 192.168.122.XXX donnera le port SSH XXX22

 

Première configuration

Configuration de base iptables

# Vider les tables actuelles
iptables -t filter -F

# Vider les rôles personnelles
iptables -t filter -X

# Interdire toute connexion entrante et sortante
iptables -t filter -P INPUT DROP
iptables -t filter -P FORWARD DROP
iptables -t filter -P OUTPUT DROP

# ---

# Ne pas casser les connexions etablies
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# Autoriser loopback
iptables -t filter -A INPUT -i lo -j ACCEPT
iptables -t filter -A OUTPUT -o lo -j ACCEPT

# ICMP (Ping)
iptables -t filter -A INPUT -p icmp -j ACCEPT
iptables -t filter -A OUTPUT -p icmp -j ACCEPT

# ---

# Autoriser les connexion ssh
iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 22 -j ACCEPT

# DNS In/Out
iptables -t filter -A OUTPUT -p tcp --dport 53 -j ACCEPT
iptables -t filter -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 53 -j ACCEPT
iptables -t filter -A INPUT -p udp --dport 53 -j ACCEPT

# NTP Out
iptables -t filter -A OUTPUT -p udp --dport 123 -j ACCEPT

# Autoriser les connexions HTTP + HTTPS 
iptables -t filter -A OUTPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 443 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 8443 -j ACCEPT

# Autoriser les connexions à l'interface Proxmox
iptables -t filter -A INPUT -p tcp --dport 8006 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 8006 -j ACCEPT

# Autoriser les connexions FTP
iptables -t filter -A OUTPUT -p tcp --dport 20:21 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 20:21 -j ACCEPT
iptables -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Autoriser les connexions au serveur Mail SMTP:25
iptables -t filter -A INPUT -p tcp --dport 25 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 25 -j ACCEPT

# Autoriser les connexions au serveur Mail POP3:110
iptables -t filter -A INPUT -p tcp --dport 110 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 110 -j ACCEPT

# Autoriser les connexions au serveur Mail IMAP:143
iptables -t filter -A INPUT -p tcp --dport 143 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 143 -j ACCEPT

# Autoriser les connexions au serveur Mail POP3S:995
iptables -t filter -A INPUT -p tcp --dport 995 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 995 -j ACCEPT

# Protection contre les flood
iptables -A FORWARD -p tcp --syn -m limit --limit 1/second -j ACCEPT

 

Installation des outils complémentaires

iptables-persistent

Installation de iptables-persistent

apt-get install iptables-persistent

A l’installation on vous demande d’activer ou pas IP V6.

ATTENTION : Depuis debian 8, les services sont gérés via systemctl et le nom du service change également.

Démarrage du service iptables-persistent

service netfilter-persistent start

Sauvegarde des règles iptables de base

iptables-save > /etc/iptables/rules.v4
service netfilter-persistent restart

 

Autoriser les VM à accéder à internet

Présentation de la configuration Réseau

Afin de permettre aux VM de pouvoir communiquer avec le grand internet tout puissant :), Une interface virtuelle « bridgée » sur l’interface principale est créée, comme le montre la capture ci-dessous :

vmbr0     Link encap:Ethernet  HWaddr 14:18:77:5f:0c:d2
          inet addr:WWW.XXX.YYY.ZZZ  Bcast:WWW.XXX.YYY.255  Mask:255.255.255.0
          inet6 addr: 
 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:17080091 errors:0 dropped:4173 overruns:0 frame:0
          TX packets:3969016 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:3780244041 (3.5 GiB)  TX bytes:3224313133 (3.0 GiB)

Comme indiqué en préambule de cet article nous souhaitons avoir un sous réseau pour nos VM. Pour ce faire nous allons créer une deuxieme interface virtuelle.

Création d’une interface virtuelle

Nous allons donc ajouter dans le fichier /etc/network/interfaces l’interface vmbr1 qui permettra aux VM de communiquer avec notre serveur proxmox via le sous réseau.

auto vmbr1
iface vmbr1 inet static
        address  192.168.122.1
        netmask  255.255.255.0
        bridge_ports none
        bridge_stp off
        bridge_fd 0

Une fois le fichier à jour il faut démarrer notre interface nouvellement créer. Notre réseau local aura donc une plage de 192.168.122.0/32.

ifup vmbr1

Waiting for vmbr1 to get ready (MAXWAIT is 2 seconds).

Comme nous avons autorisé ICMP dans iptables, nous pouvons donc faire un ping sur notre nouvelle interface pour en vérifier son bon fonctionnement

ping 192.168.122.1
PING 192.168.122.1 (192.168.122.1) 56(84) bytes of data.
64 bytes from 192.168.122.1: icmp_seq=1 ttl=64 time=0.031 ms
64 bytes from 192.168.122.1: icmp_seq=2 ttl=64 time=0.039 ms
64 bytes from 192.168.122.1: icmp_seq=3 ttl=64 time=0.045 ms
^C
--- 192.168.122.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1998ms
rtt min/avg/max/mdev = 0.031/0.038/0.045/0.007 ms

Autoriser nos VM à se connecter à internet

Comme expliqué plus haut :

  • L’ip publique, dont l’accès à internet se fait via l’interface réseau vmbr0
  • L’ip locale de notre serveur est sur l’interface vmbr1

il faut donc autoriser notre plage d’ip locale à accéder à internet.

Etape 1 : on autorise les entrées et le transfert des paquets depuis l’interface vmbr0

iptables -t filter -A INPUT -i vmbr0 -j ACCEPT
iptables -t filter -A FORWARD -i vmbr0 -j ACCEPT

Etape 2 : on fait du masquerade sur les interfaces et la plage d’adresse locale :

iptables -t nat -A POSTROUTING -o vmbr0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o vmbr1 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 192.168.122.0/32 -o vmbr0 -j MASQUERADE

A partir de la nous pouvons tester un update sur une de nos VM pour contrôler que les paquets se mettent bien à jour.

Permettre les connexions ssh sur les VM depuis internet

Les règles à mettre en place

  1. Nous devons avoir un port ssh dédié pour chaque VM
  2. Le port dédié sera redirigé vers le port ssh de la VM
  3. Le port ssh de la VM devra répondre sur le port dédié du serveur hôte
  4. L’ip publique devra être « natée » vers l’ip locale de la VM
  5. Pour des raisons de commodité la plage réelle des VM commencera à 100 (La raison principale est ci-dessous).
  6. Le dernier digit de l’ip de la VM détermine le port ssh publique de la VM
    • Donc la VM ayant l’adresse IP locale 192.168.122.100 aura comme port ssh publique 10022

Mise en place des règles

Etape 1 : Autoriser la redirection sur le port ssh de la VM.

iptables -t filter -A FORWARD -d 192.168.122.100/32 -p tcp -m tcp --dport 22 -m state --state NEW -j ACCEPT

 

Etape 2 : on redirige le port ssh et l’ip public vers le port ssh et l’ip locale de la VM

iptables -t nat -A PREROUTING -d XXX.XXX.XXX.XXX/32 -p tcp -m tcp --dport 10022 -j DNAT --to-destination 192.168.122.100:22

Etape 4 : On sauve les règles dans iptables-persistent

iptables-save > /etc/iptables/rules.v4
service netfilter-persistent restart

Etape 5 : On configure les interfaces réseau de la VM

Si vous n’avais pas configurer les 2 interfaces de votre VM vous devrais le faire manuellement

  • interface eth0 en DHCP (nat vers vmbr0)
  • interface eth1 en ipfixe (Bridge vers vmbr1)

Etape 6 : On configure putty pour se connecter au serveur

Les champs nécessaires :

  • IP du serveur hôte
  • port ssh publique
  • identifiant de connexion
  • mot de passe de connexion

Une fois la connexion établie la commande ifconfig nous confirmeras que l’interface avec l’ip locale est bien active

ifconfig eth1
eth1      Link encap:Ethernet  HWaddr 22:72:12:40:BE:E0
          inet addr:192.168.122.100  Bcast:192.168.122.255  Mask:255.255.255.0
          inet6 addr: fe80::2072:12ff:fe40:bee0/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:326 errors:7 dropped:0 overruns:0 frame:7
          TX packets:320 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:36856 (35.9 KiB)  TX bytes:37628 (36.7 KiB)

Pour aller plus loin

Nous venons de configurer les accès à notre serveur et à ses VM.

Nous pouvons aller plus loin en se protégeant des attaques du grand internet grace à Fail2Ban

Laisser un commentaire