Le but ici : transformer un mini-pc possédant 2 cartes ethernet en une box internet !
Tout d'abord, si vous n'êtes pas en entreprise, il y a peu de chances que vous puissiez suivre ce tuto.
En effet, impossible de suivre ce tuto si vous accédez à internet au travers d'une Box d'un FAI (orangette, bouyguou, ElleSFRite, Freedent etc... :-D).
Il faut avoir un FAI qui vous donne directement accès au boîtier ONT.
Désolé par avance !
Pour les particuliers et les entreprises, des FAI alternatifs comme FDN, Aquilenet, MilkyWay (etc...) vous permettent de jouer dans la cour des grands !
Avec ces opérateurs : plus de box !
On vient vous poser un boîter ONT (liaison fibre) avec un port ethernet, on vous donne des identifiants PPPoE et ensuite débrouillez-vous !
Il vous faudra donc un routeur sur lequel configurer une connexion PPPoE, un DHCP etc...
Les Cudy R700 à 49€ sur amazon sont parfaits pour une petite utilisation, mais dès qu'on demande un peu de patate ou que l'on configure plusieurs services en même temps (serveur VPN, filtrage dns etc.. là, ça crash vite. Trop peu de ressources matérielles).
Et justement, l'idée ici, c'est de descendre dans les bafonds des ressources matérielles !
Comment faire pour consommer le moins de ressources possibles ?
C'est là que NetBSD est tout bonnement fantastique !
Nous allons configurer une box internet consommant moins de 70Mo de RAM avec pare-feu, NAT, serveur DHCP distribuant sur le LAN, et un Fail2ban actif pour nous protéger en cas d'ouverture de flux (hébergement de serveur).
NetBSD sera installé en version minimaliste, nul besoin de plus !
Il est très difficile de faire mieux en terme de ressources !
Mais.. ce n'est pas très simple à mettre en œuvre.
Il faut donc scrupuleusement respecter le déroulement de la configuration ci-dessous !
Nous l'appelerons 'BOX' par habitude
- Toujours la même rengaine :
--- i. Effacer le SSD du mini-pc avec une clef USB Gparted par exemple. Effacez toutes les partitions et créez une table 'bsd' (ça ne présente aucun autre intérêt que de pouvoir laisser NetBSD créer lui-même une table GPT lors de l'installation... Chacun ses petits trucs !).
--- ii. Une fois l'effacement terminé et le mini-pc éteint, vous devez brancher la carte ethernet WAN à votre LAN (pour l'accès internet). Il va falloir pouvoir installer des logiciels sur la BOX avant de pouvoir s'en servir comme d'une vraie passerelle !
--- iii. Installer NetBSD en version minimaliste avec pkgin, ssh, ntp, ntpupdate (pas de xdm, mdsnd, lvm).
Lors de l'installation, essayez de vous démerder pour que la première interface soit la WAN (genre si vous avez re0 et re1 qui apparaissent à l'installation, faîtes en sorte que re0 soit la WAN !... Et notez le sur une étiquette que vous collerez en face de la carte ethernet sur le mini-pc pour bien la différencier de la LAN ! ça paraît con mais je vous jure que ça simplifie considérablement le travail ensuite, surtout quand on revient devant le boîtier pour la première fois 8 mois après pour débugger !).
Utilisez le serveur DHCP sur votre LAN si vous en avez un pour la première phase.
On a besoin d'installer des softs, et moins on perd de temps lors de cette étape, mieux c'est.
Refaîtes l'installation si nécessaire !
Pour la suite, nous allons donc considérer que re0 est la WAN et re1 la LAN.
N'oubliez pas de créer un utilisateur et de le mettre dans le groupe wheel.
Je ne reviens pas sur comment installer NetBSD : un CD avec un lecteur de CD USB, point !
Une fois l'installation de NetBSD terminée, démarrez la BOX pour la première fois.
Identifiez-vous directement en root. Nous allons faire toute la configuration en root.
Nous allons à présent pouvoir commencer la configuration.
- dans /etc/rc.conf, ajoutez la configuration pour votre interface LAN :
ifconfig_re1='inet 192.168.10.1 netmask 0xffffff00'
Cette interface LAN sera donc la passerelle pour toutes les machines qui seront reliées à la BOX.
Choisissez l'IP et le masque appropriés à vos besoins. Je traduis pour celles et ceux qui ne comprennent pas cette notation : ici c'est 255.255.255.0 (/24)
Qui dit routeur, dit forwarding IP :
sysctl -w net.inet.ip.forwarding=1 # pour l'IPv4
sysctl -w net.inet6.ip6.forwarding=1 # pour l'IPv6
Ajoutez également les directives à /etc/sysctl.conf pour qu'elles soient permanentes (copiez/collez directement la ligne ci-dessous).
printf '\n' >> /etc/sysctl.conf ; echo '# FORWARDING IP' >> /etc/sysctl.conf ; echo 'net.inet.ip.forwarding=1' >> /etc/sysctl.conf ; echo 'net.inet6.ip6.forwarding=1' >> /etc/sysctl.conf
Il va nous falloir créer un fichier de règles méticuleusement choisies.
Pour cela, installer un éditeur de texte (moi j'utilise vi.. mais je sens que certains vont pleurer).
Installez nano ou pico par exemple :
pkgin -y in nano pico
Puis créez le fichier de règles suivant.
Adaptez-le selon vos besoins, mais je vous suggère de ne pas vous écarter de la config par défaut que j'ai faîte ici. Changer le $LAN_net si vous ne voulez pas de 192.168.10.0/24 comme réseau LAN, mais ne touchez pas à la $WAN_if ni à $WAN_addrs !!!
pico /etc/npf.conf
########################################################################
# 1 - Provide information about your network interface(s):
# Interface WAN
$WAN_if = 'ppp0'
$WAN_addrs = ifaddrs(ppp0)
# Interface LAN
$LAN_if = 're1'
$LAN_addrs = ifaddrs(re1)
alg 'icmp'
########################################################################
# 2 - Define the networks
# The RFC protects the server from private networks in case it is directly facing the internet.
# (Uncomment only if the WAN IP is a public IP address)
$RFC1918 = { 10.0.0.0/8, 172.16.0.0/14, 192.168.0.0/16 }
# (Uncomment only if the server acts as a gateway)
$LAN_net = { 192.168.10.0/24 }
########################################################################
# 3 - Create a NAT mapping for the LAN.
# (Uncomment only if the server acts as a gateway)
map inet4($WAN_if) dynamic $LAN_net -> inet4($WAN_if)
########################################################################
# 4 - Create a procedure for logging connections:
procedure 'log' {
# Send all events to a log (see npfd))
log: npflog0
}
########################################################################
# 5 - Create tables
# Create a table for fail2ban
table <fail2ban> type ipset
########################################################################
# 6 - Rule group for the WAN interface:
group 'WAN' on $WAN_if {
# Block IP from fail2ban table
block in final from <fail2ban> apply 'log'
# Autoriser tout le trafic sortant stateful en choisissant le protocole :
#pass stateful out final proto tcp all
#pass stateful out final proto udp all
#pass stateful out final proto icmp all
#pass stateful out final proto ipv6-icmp all
# Autoriser tout le trafic sortant stateful (tous les protocoles) :
pass stateful out final all
# SSH : Autoriser les connexions SSH au serveur
#pass stateful in on $WAN_if proto tcp to $WAN_addrs port ssh
# Serveur Web : Autoriser les connexions http et https au serveur
#pass in final proto tcp from any to $WAN_addrs port http
#pass in final proto tcp from any to $WAN_addrs port https
# DHCP : Autoriser les reponses entrantes du serveur DHCP.
#pass in family inet4 proto udp from any port bootps to any port bootpc
#pass in family inet6 proto udp from any to any port 'dhcpv6-client'
# Ping : Autoriser les ping rentrants
#pass in family inet4 proto icmp icmp-type echo all
#pass in final proto icmp icmp-type echo all
#pass in final proto icmp icmp-type timxceed all
#pass in final proto icmp icmp-type unreach all
#pass in final proto icmp icmp-type echoreply all
#pass in final proto icmp icmp-type sourcequench all
#pass in final proto icmp icmp-type paramprob all
#pass in final proto ipv6-icmp all
#pass family inet6 proto ipv6-icmp all
# Traceroute : Autoriser les traceroute rentrant.
#pass in proto udp to any port 33434-33600
# DNS : autoriser les requêtes entrantes
#pass stateful out final proto udp to any port domain
# mDNS : Autoriser le trafic de voisinage
#pass in proto udp to any port mdns
# Bloquer les reseaux prives arrivant par la WAN
block in final from $RFC1918 apply 'log'
block out final to $RFC1918 apply 'log'
# IP interdites : (configuration separee)
#ruleset 'blacklistd'
# IP Spoofing : se proteger (attention à ne pas vous couper l'accès SSH avec !)
#block in final from 127.0.0.1 apply 'log'
# L2TP/IPSEC-NAT-T Tunnels.
#pass in final proto esp from any to inet4($WAN_if)
#pass out final proto esp from inet4($WAN_if) to any
#pass stateful in final from any to inet4($WAN_if) port 'ipsec-nat-t'
#pass stateful in final from any to inet4($WAN_if) port l2tp
# IGMP sur 224.0.0.1.
#pass in final proto igmp all
#pass in final from any to 224.0.0.0/4
# VNC
#pass in final proto tcp from any to any port 5900
}
########################################################################
# 7 - Rule group for the LAN interface:
# (This group manages rules for the LAN interface when the server acts as a gateway)
group 'LAN' on $LAN_if {
# Autoriser le trafic stateful entrant et sortant
pass stateful out final all
pass stateful in final all
# Autoriser les connexions provenant du reseau LAN :
pass in final from $LAN_net
# Autoriser tout le trafic
#pass in final all
#pass out final all
}
########################################################################
# 8 - Default rule group:
group default {
# Loopback : Autoriser le trafic
pass final on lo0 all
# Refermer le pare-feu
block all apply 'log'
}
########################################################################
Une fois que tout est ok avec les règles, on active le lancement de NPF au démarrage du serveur
echo 'npf=YES' >> /etc/rc.conf
Et surtout, on ne démarre pas le pare-feu !!! (pas maintenant !)
(attention à la doc officielle NetBSD... il ont fait une bêtise et se sont trompés sur la ligne du masque).
- On rédige un fichier de configuration /etc/dhcpd.conf contenant les éléments voulus :
subnet 192.168.10.0 netmask 255.255.255.0 {
option routers 192.168.10.1;
option domain-name-servers 1.1.1.1, 1.0.0.1;
option subnet-mask 255.255.255.0;
range 192.168.10.2 192.168.10.199;
default-lease-time 604800;
}
(changez ce que vous avez besoin de changer).
- On ajoute dhcpd à /etc/rc.conf pour permettre le démarrage automatique du service au redémarrage du serveur
echo 'dhcpd=YES' >> /etc/rc.conf
echo 'dhcpd_flags='re1'' >> /etc/rc.conf
(Attention !! dhcpd n'est pas dhcpcd ! dhcpcd est le client qui permet à votre machine de récupérer une configuration IP auprès d'un serveur DHCP sur votre réseau. dhcpd est le serveur DHCP ! Nous configurons ici un serveur DHCP qui attribuera des configurations IP à nos machines du LAN)
Là non plus, on ne démarre rien pour l'instant.
pkgin -y in rp-pppoe
cp /usr/pkg/share/examples/rc.d/* /etc/rc.d/
echo 'pppoe=YES' >> /etc/rc.conf
mkdir /etc/ppp
cp /usr/pkg/share/examples/rp-pppoe/pppoe.conf /etc/ppp/
- Nous allons à présent configurer notre connexion PPPoE
Ouvrez le fichier /etc/ppp/pppoe.conf
pico /etc/ppp/pppoe.conf
Dans ce fichier, vous devrez modifier les champs suivants :
--- ETH=re0
--- USER=votreidentifiant@fai.bidule
--- DEMAND=no
--- DNSTYPE=SPECIFY
--- PEERDNS=yes
--- DNS1 : 1.1.1.1 # en fait, celui que vous voulez... C'est pour ne pas utiliser le DNS du FAI
--- DNS2 : 1.0.0.1 # idem
--- DEFAULTROUTE=yes
--- CONNECT_TIMEOUT=0 # par défaut, c'est 30 ! Il faut absolument changer pour 0 !! pépins assurés sinon.
Le reste n'a pas d'importance.
- A présent, il nous faut indiquer le mot de passe de notre connexion PPPoE.
pico /etc/ppp/pap-secrets
# Secrets for authentication using PAP
# client server secret IP
votreidentifiant@fai.bidule * motdepassefourni #IP publique pas obligatoire
Voilà, notre configuration PPPoE est prête.
Comme on a utilisé un serveur DHCP pour récupérer notre configuration IP pour installer les softs, on va désactiver dhcpcd (et non dhcpd !). On ne veut pas d'un client DHCP qui émette sur le WAN !
Et surtout !!! On va indiquer la route par défaut à notre BOX !!!
Si vous connaissez déjà votre IP publique, on va gagner beaucoup de temps (et de sueur)
pico /etc/rc.conf
Ajoutez dans le fichier :
dhcpcd=NO
defaultrouter='votreIPpubliqueici'
Voilà, à présent on éteint la BOX :
poweroff
On fait les branchements définitifs : on branche la WAN (re0) sur le câble ethernet relié au boîtier ONT (liaison fibre) et la LAN (re1) sur notre réseau LAN... et on démarre !
Vous voilà connectés !
Bien sûr, rien n'empêche de se connecter en SSH pour monitorer de temps en temps (à défaut d'installer des sondes nagios...)... Et vous pourrez rapidement constater à quel point la consommation en ressources est faible !
C'est vraiment très impressionnant.
N'importe quel mini-pc équipé d'un intel celeron et c'est Byzance !
pppoe-start # pour démarrer la connexion PPPoE
pppoe-status # pour voir si vous êtes connectés
pppoe-stop # pour stopper la connexion PPPoE
N'hésitez pas à installer fail2ban et à le configurer (j'ai posté un article pour NetBSD), pour plus de sécurité si vous hébergez un serveur.