Configurer un routeur Mikrotik sur une fibre FTTH Milkywan

Publié le 20/06/2023 et écrit par Vincent Finance, dans la catégorie : #infra

À 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

Ce tutoriel n'est pas un tutoriel officiel pour configurer une fibre FTTH chez Milkywan. Il s'agit d'une configuration compatible avec ce que l'équipe préconise. Vous seul êtes responsable de la bonne configuration de votre équipement. Je vous invite à contacter le support en cas de problème.

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 :

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 :

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 !

Note : si jamais vous utilisez ces instructions pour ajouter IPv6 et que vous n'utilisez pas une interface PPPoE, il est nécessaire de rajouter l'option add-default-route=yes dans la commande /ipv6 dhcp-client pour pouvoir obtenir les routes nécessaires à son bon fonctionnement.

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 :

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.


Un commentaire à ajouter ?

Pour ajouter votre commentaire, envoyez directement un mail ici