À la suite de mon changement de FAI, voici donc un tutoriel assez complet pour configurer un routeur Mikrotik, afin de fournir un accès à Internet via une fibre FTTH, avoir une configuration IPv6 complète et un pare-feu pleinement opérationnel. Une partie des instructions seront affichées pour un usage via la console SSH et une autre partie pour la console graphique (via l'interface Web ou Winbox).
Winbox est un utilitaire graphique pour administrer des routeurs et switchs Mikrotik. Il remplace efficacement l'interface de ces derniers si elle n'est pas activée. Mikrotik fournit Winbox en tant que binaire Windows, mais il est entièrement compatible avec Wine (Linux, MacOS).
J'utilise notamment une version toute prête pour MacOS qui est disponible ici : https://github.com/nrlquaker/winbox-mac/releases
Avertissement
Dans le cadre de ce tutoriel, l'adresse du routeur et la plage IP par défaut ont été changées avant d'effectuer les opérations qui vont suivre : la plage utilisée est donc 10.10.1.0/24
au lieu de 192.168.88.0/24
. Cette modification est assez simple à réaliser dans le logiciel Winbox, mais ne sera pas abordée ici. Les commandes seront donc à adapter en fonction de la plage utilisée sur votre machine.
Une base minimale
Avant de commencer, nous allons déjà configurer le système de base pour avoir la dernière version de RouterOS et activer quelques paramètres utiles. La première chose à faire est d'avoir la version 7.x de RouterOS. Vous pouvez suivre le guide officiel pour installer la dernière version de la 6.x et ensuite passer sur la 7.x si votre routeur est encore sur une version précédente. Dans mon cas, j'ai utilisé l'interface Web pour le faire.
Le mot de passe du compte admin sera aussi à changer lors de la première connexion à la machine.
Une fois cela fait, on se connecte en SSH sur la console du Mikrotik (l'adresse IP à indiquer est celle de votre routeur) :
$ ssh admin@10.10.1.1
admin@10.10.1.1's password:
MMM MMM KKK TTTTTTTTTTT KKK
MMMM MMMM KKK TTTTTTTTTTT KKK
MMM MMMM MMM III KKK KKK RRRRRR OOOOOO TTT III KKK KKK
MMM MM MMM III KKKKK RRR RRR OOO OOO TTT III KKKKK
MMM MMM III KKK KKK RRRRRR OOO OOO TTT III KKK KKK
MMM MMM III KKK KKK RRR RRR OOOOOO TTT III KKK KKK
MikroTik RouterOS 7.10.2 (c) 1999-2023 https://www.mikrotik.com/
Press F1 for help
[admin@mikrotik] >
On commence par les quelques commandes suivantes :
## Options de base
/system package update set channel=stable # sur ROS v7
/system clock set time-zone-name=Europe/Paris
/system identity set name=mikrotik
/system ntp client
set enabled=yes
servers add address=0.fr.pool.ntp.org
Cela va activer le canal de mises à jour en mode "stable", mettre à jour l'horloge du Mikrotik et changer son nom pour mikrotik
. Vous pouvez mettre autre chose si vous le souhaitez.
Mettre en place le PPPoE
Nous passons maintenant à la partie PPPoE qui nous permettra de nous connecter sur le réseau de Milkywan et donc échanger avec Internet.
Dans l'ordre, voici ce qui va être mis en place :
- Modification de la MTU de nos interfaces réseau pour nous assurer une bonne stabilité réseau
- Création d'une interface PPPoE avec le VLAN et les informations de connexion fournies par Milkywan pour nous connecter
- Changement du DNS utilisé pour utiliser celui de Milkywan (non ouvert au public)
- Activation du masquerade sur l'interface du PPPoE
- Mise en place de quelques règles de pare-feu pour garder l'accès au routeur et bloquer ce qui est inutile
- Mise en place d'un pool DHCP avec les adresses que nous souhaitons pour le réseau principal (à modifier pour correspondre à la plage utilisée par l'adresse IP de votre routeur)
- Activation du serveur DHCP sur ce nouveau pool
Les commandes à taper sont les suivantes :
/interface ethernet
set [ find default-name=ether1 ] comment=WAN
set [ find default-name=ether2 ] l2mtu=2000 mtu=1500
set [ find default-name=ether3 ] l2mtu=2000 mtu=1500
set [ find default-name=ether4 ] l2mtu=2000 mtu=1500
set [ find default-name=ether5 ] l2mtu=2000 mtu=1500
/interface vlan add interface=ether1 name=vlan4001 vlan-id=4001
/interface pppoe-client
add add-default-route=yes allow=pap,chap comment=WAN disabled=no interface=vlan4001 max-mru=1500 max-mtu=1500 name=pppoe0 use-peer-dns=yes user=UTILISATEUR password=MOTDEPASSE
/ip dns set servers=130.117.11.11
/ip firewall nat add action=masquerade chain=srcnat out-interface=pppoe0
/ip firewall filter
add action=accept chain=input dst-port=8291 protocol=tcp
add action=accept chain=input dst-port=22 protocol=tcp
add action=drop chain=input in-interface=pppoe0
/ip firewall service-port
set ftp disabled=yes
set tftp disabled=yes
set sip disabled=yes
set pptp disabled=yes
/ip address add address=10.10.1.1/24 interface=bridge network=10.10.1.0
/ip pool add name=pool-dhcp ranges=10.10.1.50-10.10.1.200
/ip dhcp-server add address-pool=pool-dhcp interface=bridge lease-time=1d name=server1
/ip dhcp-server network add address=10.10.1.0/24 dns-server=130.117.11.11 gateway=10.10.1.1 netmask=24
Une déconnexion peut survenir après avoir tapé ces commandes, mais normalement, l'accès est toujours possible et on peut se reconnecter directement en SSH via la commande du début.
On peut lancer alors un ping 8.8.8.8
ou ping 9.9.9.9
pour voir si la connexion Internet fonctionne et si le routeur arrive à communiquer avec l'infra de Milkywan.
IPv6 ? Oui bien sûr !
Une fois IPv4 fonctionnel, on peut passer à la partie drôle : configurer IPv6. Ayant gardé le nom du bridge par défaut, j'ai donc simplement repris les instructions de Milkywan pour mettre en place ma configuration. Nous allons donc :
- Activer le client DHCPv6 pour récupérer le bloc /48 fourni par Milkywan
- Activer le serveur DHCPv6 pour distribuer les IPv6 sur notre réseau local
- Mettre en place la découverte des adresses sur toutes les interfaces via le bridge par défaut
- Ajouter quelques règles de pare-feu pour avoir une configuration fonctionnelle
Les commandes à envoyer sont les suivantes :
## Config en IPv6
/ipv6 dhcp-server
add address-pool=mw interface=bridge name=mw
/ipv6 address
add address=::1 from-pool=mw interface=bridge
/ipv6 dhcp-client
add interface=pppoe0 pool-name=mw request=prefix
/ipv6 nd
set [ find default=yes ] advertise-dns=no hop-limit=64 interface=bridge
/ipv6 firewall filter
add action=accept chain=input comment="defconf: accept ICMPv6" protocol=icmpv6
add action=accept chain=input comment="defconf: accept UDP traceroute" port=33434-33534 protocol=udp
add action=accept chain=input comment="defconf: accept DHCPv6-Client prefix delegation." dst-port=546 protocol=udp src-address=fe80::/10
Au bout de quelques minutes, notre machine cliente recevra une adresse IPv6 et on pourra se connecter sur https://ip.lafibre.info/ pour vérifier que tout est en vert et que IPv6 est notre protocole par défaut pour aller sur Internet.
Pour information, la configuration par défaut de Mikrotik avait ajoutée automatiquement la liste des adresses utilisées par le pare-feu IPv6, mais j'ai laissé les instructions pour les cas où cela ne serait pas présent. Vous noterez aussi que cela n'a pris que quelques minutes pour activer et faire fonctionner IPv6 !
L'Internet du Futur est maintenant à notre portée !
Un peu de personnalisation
Modifier l'identifiant de connexion
Via Winbox ou l'interface web, il est possible de créer un nouvel utilisateur avec des droits administrateur et désactiver le compte par défaut. Cela peut servir à ralentir la surface d'attaque sur votre routeur. Cela se fait dans la section System > Users et il suffit d'attribuer le groupe Full au nouvel utilisateur pour lui donner les droits complets.
En mode console, cela se fait comme ceci :
/user add name=votreuser group=full password=monsupermotdepasse
# Après déconnexion et reconnexion avec votre nouvel utilisateur
/user disable admin
Utiliser une clé SSH
RouterOS est compatible avec des clés SSH générées au format RSA et permet ainsi de s'authentifier sans mot de passe depuis la console.
Sous Linux et MacOS, il vous suffit de générer une nouvelle clé si vous n'en utilisez pas encore. Dans mon cas, je suis parti sur une clé RSA 4096 bits et je laisse le nom par défaut de l'assistant, soit /home/$USER/.ssh/id_rsa :
$ ssh-keygen -t rsa -b 4096 -C Mikrotik-vinson
On se connecte ensuite via Winbox ou l'interface Web. Aller dans Files puis cliquer sur Browse pour choisir le fichier généré et le téléverser sur le routeur. Il apparaît au bout de quelques secondes.
Pour l'importer, vous pouvez utiliser la console depuis Winbox (en cliquant sur New Terminal) ou bien vous connecter directement depuis la console en SSH pour lancer la commande suivante :
/user ssh-keys import public-key-file=id_rsa.pub
Le nom id_rsa.pub est à remplacer par le nom du fichier que vous avez téléversé sur le routeur.
Vous pouvez maintenant tester la connexion en utilisant la commande ssh avec votre clé favorite !
Des VLANs
Vu que j'ai besoin de séparer mon réseau en sections distinctes pour des questions de sécurité, j'ai mis en place 4 VLANs sur mon routeur : un réservé aux serveurs que j'ai dans mon infra, un pour les clients en tout genre (PC personnels notamment), un pour les applications demandant une isolation particulière et un VLAN dédié à la gestion des routeurs. Ce VLAN de gestion aura aussi le droit de chercher les autres routeurs présents sur le réseau :
/interface bridge add name=bridge1 protocol-mode=none vlan-filtering=no
/interface vlan
add name=vlan-10 vlan-id=10 interface=bridge1 disabled=no
add name=vlan-20 vlan-id=20 interface=bridge1 disabled=no
add name=vlan-30 vlan-id=30 interface=bridge1 disabled=no
add name=base-vlan vlan-id=99 interface=bridge1 disabled=no
/interface bridge port
add bridge=bridge1 interface=ether2
add bridge=bridge1 interface=ether3
add bridge=bridge1 interface=ether4
add bridge=bridge1 interface=vlan-10
add bridge=bridge1 interface=vlan-20
add bridge=bridge1 interface=vlan-30
/interface bridge vlan
add bridge=bridge1 tagged=bridge1,ether2,ether3,ether4 vlan-ids=10
add bridge=bridge1 tagged=bridge1,ether2,ether3,ether4 vlan-ids=20
add bridge=bridge1 tagged=bridge1,ether2,ether3,ether4 vlan-ids=30
add bridge=bridge1 tagged=bridge1,ether2,ether3,ether4 vlan-ids=99
/interface list add name=BASE
/interface list member
add interface=vlan-20 list=LAN
add interface=vlan-30 list=LAN
add interface=vlan-10 list=LAN
add interface=bridge1 list=LAN
add interface=base-vlan list=BASE
/ip address
add address=10.10.10.1/24 interface=vlan-10 network=10.10.10.0
add address=10.10.20.1/24 interface=vlan-20 network=10.10.20.0
add address=10.10.30.1/24 interface=vlan-30 network=10.10.30.0
add address=10.10.99.1/24 interface=base-vlan network=10.10.99.0
/ip pool
add name=pool-v10 ranges=10.10.10.2-10.10.10.150
add name=pool-v20 ranges=10.10.20.50-10.10.20.200
add name=pool-v30 ranges=10.10.30.10-10.10.30.100
add name=base-pool ranges=10.10.99.2-10.10.99.20
/ip dhcp-server
add address-pool=pool-v10 interface=vlan-10 lease-time=1d name=server-v10
add address-pool=pool-v20 interface=vlan-20 lease-time=1d name=server-v20
add address-pool=pool-v30 interface=vlan-30 lease-time=1d name=server-v30
add address-pool=base-pool interface=base-vlan name=server-base
network add address=10.10.10.0/24 dns-server=10.10.10.10 gateway=10.10.10.1 netmask=24
network add address=10.10.20.0/24 dns-server=10.10.10.10 gateway=10.10.20.1 netmask=24
network add address=10.10.30.0/24 dns-server=130.117.11.11 gateway=10.10.30.1 netmask=24
network add address=10.10.99.0/24 dns-server=10.10.10.10 gateway=10.10.99.1
/ip neighbor discovery-settings set discover-interface-list=BASE
Une fois la configuration en place, j'en profite pour configurer le pare-feu afin de limiter les accès de chaque VLAN : le VLAN 30 est le plus restreint, puisqu'il ne peut pas communiquer avec les autres VLAN. Le VLAN 20 est le plus permissif, car il peut aller sur les deux autres sans souci (ce qui est pratique pour gérer mes serveurs). J'active aussi le filtrage au niveau des ports réseau pour ne laisser passer que le trafic dédié à chaque port :
/ip firewall filter
add action=drop chain=forward in-interface=vlan-30 out-interface=vlan-10
add action=drop chain=forward in-interface=vlan-30 out-interface=vlan-20
add action=drop chain=forward in-interface=vlan-30 out-interface=bridge
add action=drop chain=forward in-interface=vlan-30 out-interface=base-vlan
add action=drop chain=forward in-interface=vlan-10 out-interface=vlan-20
add action=drop chain=forward in-interface=vlan-10 out-interface=bridge
add action=drop chain=forward in-interface=vlan-10 out-interface=base-vlan
/interface bridge port
set bridge=bridge1 ingress-filtering=yes frame-types=admit-only-vlan-tagged [find interface=ether2]
set bridge=bridge1 ingress-filtering=yes frame-types=admit-only-vlan-tagged [find interface=ether3]
set bridge=bridge1 ingress-filtering=yes frame-types=admit-only-vlan-tagged [find interface=ether4]
/interface bridge set bridge1 vlan-filtering=yes
Ayant une machine virtuelle avec un serveur DNS interne pour avoir des noms plus sympas, j'utilise directement son adresse IP dans la configuration DNS de mon serveur DHCP. Seul le VLAN dédié aux applications isolées ne l'utilise pas pour éviter de divulguer trop d'informations.
Ces VLANs sont ensuite gérés par un switch manageable qui se charge de répartir le tout sur les bons ports. Un switch "classique" du commerce ne fonctionnera pas, il faut donc bien faire attention à ce qu'on utilise.
Voici une liste de switchs compatibles (lien non sponsorisé) : https://www.ldlc.com/informatique/reseau/switch/c4315/+fc781-1.html?sort=1
Sécuriser les accès à la console d'administration
Une fois que les VLAN sont en place et sont fonctionnels, on peut modifier le pare-feu pour limiter l'accès à la console d'administration du routeur. Vu que tous les routeurs Mikrotik ne sont pas équipés d'un port série, il est important de s'assurer que tout fonctionne avant de faire le changement.
On va alors modifier les règles concernant le port 22 (SSH) et 8291 (Winbox) pour n'autoriser que les VLANS 20 et 99, au cas où on a besoin de faire une modification plus tard. La méthode est donc d'afficher les règles de pare-feu pour obtenir leur numéro et éditer les deux règles pour ajouter l'option src-address-list
avec les deux VLAN souhaités :
/ip/firewall/filter
print
...
22 chain=input action=accept protocol=tcp dst-port=8291
23 chain=input action=accept protocol=tcp dst-port=22
...
edit 22 src-address-list # sauvegarder en faisant Ctrl+O
vlan20,vlan-base
edit 23 src-address-list # sauvegarder en faisant Ctrl+O
vlan20,vlan-base
On peut alors tester la connexion en ouvrant un nouveau terminal et en essayant de se connecter au routeur. Vu que l'on a autorisé les connexions déjà établies auparavant, il est possible de faire un retour arrière en cas d'erreur par ce biais. Normalement, vous devriez pouvoir vous connecter sans problème.
IPv6 sur mes VLANs
Vu que l'Internet du Futur est activé sur le réseau local par défaut, il est temps de faire de même pour les différents VLANs. Milkywan fournit par défaut un préfixe en /48 : on peut donc le découper en plusieurs préfixes /64 pour donner IPv6 à toutes nos machines. Il est possible de laisser le routeur attribuer automatique un préfixe /64 par VLAN, mais j'ai préféré faire le découpage moi-même, comme ceci :
/ipv6 address
add address=2001:db8:cafe::1/64 interface=vlan-10 advertise=yes
add address=2001:db8:1020::1/64 interface=vlan-20 advertise=yes
add address=2001:db8:1030::11/64 interface=vlan-30 advertise=yes
Je précise ici que le préfixe affiché est réservé à la documentation et doit être remplacé par votre préfixe alloué. Dans le cas d'un découpage automatique, il suffit de remplacer l'argument address= de la première série de commandes par from-pool=mw. Le VLAN de gestion (VLAN 99) n'est pas non plus configuré en IPv6, car il ne sert qu'à la communication entre les deux routeurs et il n'y a donc pas d'intérêt de l'exposer sur Internet.
Si besoin, vous pouvez utiliser les deux outils suivants pour vous aider à déterminer vos préfixes en /64 :
- Valideur d'adresse IPv6 (en anglais)
- Calculateur de préfixes IPv6 (en anglais) pour obtenir une liste non-exhaustive de préfixes valides
On pourra alors faire un nouveau test de connectivité IPv6 avec une de nos machines pour vérifier que tout est bon.
Ouvrir quelques ports depuis l'extérieur (IPv4 uniquement)
Pour ouvrir des ports depuis l'extérieur en IPv4, vous devez mettre en place des règles DNAT pour rediriger le trafic au bon endroit. Je vous donne quelques exemples ci-dessous, sachant que tous les ports redirigent sur plusieurs machines de mon infra maison. L'adresse en 145.x.x.x
est à remplacer par votre adresse IPv4 publique, fournie par le FAI.
## Ouverture des ports
/ip firewall nat
add chain=dstnat dst-address=145.x.x.x dst-port=1965 action=dst-nat protocol=tcp to-address=10.10.10.16 comment="Allow Gemini"
add chain=dstnat dst-address=145.x.x.x dst-port=23 action=dst-nat protocol=tcp to-address=10.10.10.16 to-port=22 comment="Allow SFTP for Gemini"
add chain=dstnat dst-address=145.x.x.x dst-port=24 action=dst-nat protocol=tcp to-address=10.10.30.60 to-port=22 comment="Allow SSH for a friend"
add chain=dstnat dst-address=145.x.x.x dst-port=80 action=dst-nat protocol=tcp to-address=10.10.10.17 comment="Allow HTTP"
add chain=dstnat dst-address=145.x.x.x dst-port=443 action=dst-nat protocol=tcp to-address=10.10.10.17 comment="Allow HTTPS"
add chain=dstnat dst-address=145.x.x.x dst-port=22 action=dst-nat protocol=tcp to-address=10.10.10.13 comment="Allow SSH for Gitea"
En IPv6, vous n'avez pas besoin de toucher au routeur. Il suffit d'ouvrir les bons ports sur le pare-feu de la machine à accéder depuis Internet.
Pour conclure
Avec cette configuration, je peux enfin pleinement utiliser ma connexion Internet pour m'auto-héberger et toucher un peu au réseau, bien que je sois encore débutant dans le domaine.
Un axe d'amélioration possible serait de mettre en place de la redondance avec l'aide d'une connexion 4G, mais ce sujet sera pour un prochain article.