Le but d’avoir un routeur firewall virtuel est de disposer d’une solution de sécurisation de la plateforme. L’avantage d’un routeur virtuel par rapport à un routeur physique n’est pas seulement une question de coût mais aussi une question de flexibilité et de monter en charge. Il est bien plus facile d’avoir un serveur physique qu’un firewall physique chez des hébergeurs. Un firewall virtuel peut être déployer dans n’importe quel cloud public, privé. D’ailleurs un article sur ce sujet est en cours de rédaction : comment interconnecté notre private cloud avec les publics cloud du moment Azure, AWS, GCP, OVH…

Le choix d’un firewall virtuel dépend surtout de la maitrise des intervenants. Cependant, voici les exigences fonctionnelles que doit couvrir le firewall virtuel :

  • Gérer les protocoles de routage : BGP, OSPF
  • Gérer les ipv4 et ipv6
  • Gérer les tunnels GRE, Wireguard, IPSEC, VPN SSL

 

# pfSense (https://www.pfsense.org/)

# Vyos (https://www.vyos.io/)

Il existe beaucoup de firewall virtuel qu’ils soient commerciaux ou opensource. Selon les moyens disponibles les critères de sélection seront complètement différents d’un utilisateur à un autre.

Pour notre part, nous utiliserons Vyos pour les raisons suivantes :

  • Distribution basée sur des composants opensource (Debian, Zebra, Openssl, OpenVPN, iptables)
  • API pour automatisation
  • Interopérable
  • Documentation importante en raison de l’utilisation de briques opensource références du monde du réseau

 

 

Récapitulatif de ce qui a été fait dans les précédents articles

 

Dans ce schéma, on voit que c’est le port physique eth0 qui porte l’adresse ip publique. Hors le système n’est pas adapté pour faire du routage à moins d’y passer un effort humaine importante.

 

La cible avec un firewall virtuel

 

 

D’un point de vue logique, nous pouvons représenter l’architecture physique précédente en cette représentation logique. Cela fait apparaitre les réseau de l’architecture de référence.

 

Mettons en place la VM routeur qui fera office de passerelle de la plateforme.

 

Il faut récupérer une image iso de Vyos ou en construire une. Je vous recommande de lire leur section qui possède toutes les étapes pour construire une image stable de leur solution.

 

Lancement de la VM

 

virt-install -n routeur \
  --ram 4096 \
  --vcpus 2 \
  --cdrom /var/lib/libvirt/images/vyos.iso \
  --os-type linux \
  --os-variant debian10 \
  --network network=internet \
  --network network=admin \
  --graphics vnc \
  --hvm \
  --virt-type kvm \
  --disk path=/var/lib/libvirt/images/routeur.qcow2,bus=virtio,size=8 \
  --noautoconsole

les éléments importants de la configuration de la vm sont la définition des réseaux internet et admin et le type de virtualisation utilisé kvm. Pour faire simple, kvm  n’émule pas un CPU d’une autre famille que celui du physique. Il utilise les instructions présentes dans le CPU de la machine hôte.

Lorsque la création de la VM est complète, il faut se connecter à la console pour terminer l’installation de vyos.

 

virsh console routeur
vyos@vyos:~$ install image

L’installation nécessite un redémarrage. Après le reboot, commençons la configuration basique.

 

set interfaces ethernet eth0 address dhcp
set interfaces ethernet eth0 description 'internet'
set interfaces ethernet eth1 address '192.168.200.1/24'
set interfaces ethernet eth1 description 'admin'
set service ssh port '22'

#dhcp sur admin
set service dhcp-server shared-network-name LAN subnet 192.168.200.0/24 default-router '192.168.200.1'
set service dhcp-server shared-network-name LAN subnet 192.168.200.0/24 dns-server '192.168.200.1'
set service dhcp-server shared-network-name LAN subnet 192.168.200.0/24 domain-name 'demo.ezydata.fr'
set service dhcp-server shared-network-name LAN subnet 192.168.200.0/24 lease '86400'
set service dhcp-server shared-network-name LAN subnet 192.168.200.0/24 range 0 start 192.168.200.100
set service dhcp-server shared-network-name LAN subnet 192.168.200.0/24 range 0 stop '192.168.200.254'

# dns forwarder
set service dns forwarding cache-size '0'
set service dns forwarding listen-address '192.168.200.1'
set service dns forwarding allow-from '192.168.200.0/24'

# masquage d'adresse sortant vers internet
set nat source rule 100 outbound-interface 'eth0'
set nat source rule 100 source address '192.168.200.0/24'
set nat source rule 100 translation address masquerade

# règle firewall
set firewall name internet-reseau default-action 'drop'
set firewall name internet-reseau rule 10 action 'accept'
set firewall name internet-reseau rule 10 state established 'enable'
set firewall name internet-reseau rule 10 state related 'enable'

set firewall name internet-routeur default-action 'drop'
set firewall name internet-routeur rule 10 action 'accept'
set firewall name internet-routeur rule 10 state established 'enable'
set firewall name internet-routeur rule 10 state related 'enable'
set firewall name internet-routeur rule 20 action 'accept'
set firewall name internet-routeur rule 20 icmp type-name 'echo-request'
set firewall name internet-routeur rule 20 protocol 'icmp'
set firewall name internet-routeur rule 20 state new 'enable'

set firewall name internet-routeur rule 30 action 'drop'
set firewall name internet-routeur rule 30 destination port '22'
set firewall name internet-routeur rule 30 protocol 'tcp'
set firewall name internet-routeur rule 30 recent count '4'
set firewall name internet-routeur rule 30 recent time '60'
set firewall name internet-routeur rule 30 state new 'enable'

set firewall name internet-routeur rule 31 action 'accept'
set firewall name internet-routeur rule 31 destination port '22'
set firewall name internet-routeur rule 31 protocol 'tcp'
set firewall name internet-routeur rule 31 state new 'enable'

# appliquer les regles a l'interface internet
set interfaces ethernet eth0 firewall in name internet-reseau
set interfaces ethernet eth0 firewall local name internet-routeur

# appliquer la cofiguration
commit

# sauvegarder la configuration
save

Pour tester le routeur, nous allons affecté l’adresse ip 192.168.200.2 au serveur physique sur le port admin

 

 

jph@serveur~  sudo ifconfig admin 192.168.200.2/24
jph@serveur~  sudo ip route add default via 192.168.200.1
jph@serveur~  ping -c 4 google.fr
PING google.fr (216.58.198.195) 56(84) bytes of data.
64 bytes from par10s27-in-f3.1e100.net (216.58.198.195): icmp_seq=1 ttl=118 time=1.64 ms
64 bytes from par10s27-in-f3.1e100.net (216.58.198.195): icmp_seq=2 ttl=118 time=1.29 ms
64 bytes from par10s27-in-f3.1e100.net (216.58.198.195): icmp_seq=3 ttl=118 time=1.37 ms
64 bytes from par10s27-in-f3.1e100.net (216.58.198.195): icmp_seq=4 ttl=118 time=1.26 ms
--- google.fr ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 1.262/1.394/1.641/0.148 ms

Nous avons mis en place un routeur firewall pour la plateforme. Il nous permet de sécurité et d’ouvrir l’accès internet aux vms de la plateforme et surtout de connecter ce réseau vers un autre réseau.

Ce sera le prochain billet : vpn site to site.

N’hésitez pas à mettre des commentaires.