[RÉSOLU] Configuration d'un hotspot filaire

Salut,

J’ai une brique internet connectée classiquement à internet via un tunnel tun0 sur son port ethernet intégré eth0. J’ai connecté un hub usb-RJ45 et possède donc un deuxième port eth1.
J’aimerais aussi utiliser ma brique en guise de routeur. Dans un premier temps juste pour connecter un PC en filaire à internet via le VPN. Et à long terme pour connecter mon switch/acces point à la brique et pouvoir y brancher tous les PC fixes chez moi.
Donc je veux paramétrer un serveur DHCP sur l’interface eth1 et je veux que les paquets des clients passent par le VPN (tun0)

J’ai réussi à obtenir une interface eth1 qui récupère une addresse ipv6 avec la phase A de ce tuto
https://wiki.labriqueinter.net/doku.php?id=howto:parametrer_une_brique_avec_un_connecteur_usb-ethernet_au_lieu_d_un_connecteur_usb-wifi
J’ai donc remplacé dans /etc/network/interfaces :

auto usb0
allow-hotplug usb
iface usb0 inet dhcp

par

auto eth1
allow-hotplug eth1
iface eth1 inet dhcp

J’ai ensuite paramétré le serveur DHCP dnsmasq en suivant la phase B. Dans mon cas
/etc/dnsmasq.conf contenait déjà des instructions. J’ai ajouté

dhcp-range=eth1,10.0.242.2,10.0.242.254,4h
dhcp-option=option:dns-server,adresse_dns1,adresse_dns2

où adresse_dns1 (ipV4) et adresse_dns2 (ipV6) sont des ip extraites de /etc/resolv.conf

Ensuite j’ai configuré le DHCP sur eth1 et le firewall en ipv4 en suivant :
https://wiki.labriqueinter.net/doku.php?id=howto:utiliser_la_connexion_vpn_de_la_brique_en_filaire
où bien sur j’ai remplacé eth0 par eth1 dans /usr/local/bin/wiredgw :

#!/bin/bash
  
  case "${1}" in
    start)
      # ipv6
      ip6tables -w -I FORWARD -i tun0 -o eth1 -j DROP
      ip6tables -w -I FORWARD -i tun0 -o eth1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
      ip6tables -w -I FORWARD -i eth1 -o tun0 -j ACCEPT
      #ip6tables -w -I FORWARD -i eth1 -o wlan0 -j ACCEPT
      #ip6tables -w -I FORWARD -i wlan0 -o eth1 -j ACCEPT
      ip6tables -w -I INPUT -i eth1 -j ACCEPT
      ip6tables -w -I OUTPUT -o eth1 -j ACCEPT

  #IPv4
  iptables -w -I FORWARD -i tun0 -o eth1 -j DROP
  iptables -w -I FORWARD -i tun0 -o eth1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
  iptables -w -I FORWARD -i eth1 -o tun0 -j ACCEPT
  #iptables -w -I FORWARD -i eth1 -o wlan0 -j ACCEPT
  #iptables -w -I FORWARD -i wlan0 -o eth1 -j ACCEPT
  iptables -w -I INPUT -i eth1 -j ACCEPT
  iptables -w -I OUTPUT -o eth1 -j ACCEPT
;;
stop)
  # ipv6
  ip6tables -w -D FORWARD -i tun0 -o eth1 -j DROP
  ip6tables -w -D FORWARD -i tun0 -o eth1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
  ip6tables -w -D FORWARD -i eth1 -o tun0 -j ACCEPT
  #ip6tables -w -D FORWARD -i eth1 -o wlan0 -j ACCEPT
  #ip6tables -w -D FORWARD -i wlan0 -o eth1 -j ACCEPT
  ip6tables -w -D INPUT -i eth1 -j ACCEPT
  ip6tables -w -D OUTPUT -o eth1 -j ACCEPT

  # IPv4
  iptables -w -D FORWARD -i tun0 -o eth1 -j DROP
  iptables -w -D FORWARD -i tun0 -o eth1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
  iptables -w -D FORWARD -i eth1 -o tun0 -j ACCEPT
  #iptables -w -D FORWARD -i eth1 -o wlan0 -j ACCEPT
  #iptables -w -D FORWARD -i wlan0 -o eth1 -j ACCEPT
  iptables -w -D INPUT -i eth1 -j ACCEPT
  iptables -w -D OUTPUT -o eth1 -j ACCEPT
;;
*)
  echo "Usage: $0 {start|stop}"
  exit 1
;;
  esac

Plutôt que de créer /etc/dnsmasq.d/dhcpdv4-eth0.conf, j’ai modifié /etc/dnsmasq.conf qui contient :

domain-needed
expand-hosts

listen-address=127.0.0.1
resolv-file=/etc/resolv.dnsmasq.conf
cache-size=256

dhcp-range=eth1,10.0.242.2,10.0.242.254,4h
dhcp-option=option:dns-server,adresse_dns1,adresse_dns2
dhcp-authoritative
bind-interfaces

En me connectant sur le dongle avec un ordi, évidemment avec ce bidouillage je ne récupère aucune adresse IP et je ne peux donc pas accéder au net.
Quelqu’un saurait-il comment résoudre mon problème? J’imagine qu’il doit y avoir des conflits entre le serveur DHCP mis en place par l’application hotspot wifi et la configuration proposée par ces tutos.

J’ai aussi trouvé ces posts qui m’ont semblé intéressant, mais je ne sais pas s’ils sont applicables directement sur une brique
https://www.linuxquestions.org/questions/linux-software-2/bridge-vpn-to-ethernet-tun0-to-eth1-4175534796-print/


https://wiki.debian.org/fr/NetworkConfiguration#Relais
https://openvpn.net/index.php/open-source/documentation/miscellaneous/76-ethernet-bridging.html

J’avais déjà posé la question sur le post YunoHost à la place d’un routeur? . @scith avait proposé la création d’une app pour configurer ce genre de connexions. Que permettent les apps style pihole? Serait-il possible de faire évoluer l’application hotspot vers quelque-chose qui ressemblerait à une interface de configuration de routeur? Quid de openWRT pour yunohost?

Alors déjà c’est effectivement une mauvaise idée d’avoir 2 serveurs DHCP sur le même réseau à moins de les avoir configurés pour qu’ils se synchronisent, ce qui n’est pas forcément évident à faire.
Le mieux serait de les isoler en connectant ton switch uniquement sur le dongle USB-ethernet ou en désactivant carrément celui de ta bidulebox. Mais dans un premier temps, le temps de configurer correctement ton DHCP sur la brique, tu devrais te contenter de ne connecter qu’un seul ordinateur derrière ton dongle USB-ethernet.

Maintenant concernant la config dnsmasq il semble que ta modif soit inopérante.
C’est peut-être à cause d’un conflit avec la config existante pour le Wifi (je ne sais pas si tu as conservé le hotspot). Regarde le dhcp-range spécifié dans le fichier /etc/dnsmasq.dhcpd/dhcpdv4-ssid0.conf.

Si la modification du dhcp-range ne suffit pas, essaye de lancer une instance séparée de dnsmasq juste pour les besoins de tes tests. Par exemple en créant un fichier de config /home/admin/test.dnsmasq.conf :

interface=eth1
dhcp-range=eth1,10.0.243.2,10.0.243.254,4h
dhcp-option=option:dns-server, 84.200.69.80,80.67.169.40
dhcp-authoritative
bind-interfaces

Et en lançant dnsmasq en mode debug comme ceci :

sudo dnsmasq -C /home/admin/test.dnsmasq.conf -p0 --no-daemon --log-facility -
1 Like

En lançant le mode debug :

J’obtiens

Jun 20 20:18:11 dnsmasq[5236]: démarrage avec le DNS désactivé (version 2.72)
Jun 20 20:18:11 dnsmasq[5236]: options à la compilation : IPv6 GNU-getopt DBus i18n IDN DHCP DHCPv6 no-Lua TFTP conntrack ipset auth DNSSEC loop-detect
Jun 20 20:18:11 dnsmasq-dhcp[5236]: DHCP, plage d'adresses IP 10.0.243.2 -- 10.0.243.254, durée de bail 4h
Jun 20 20:18:11 dnsmasq-dhcp[5236]: DHCP, sockets bound exclusively to interface eth1
Jun 20 20:20:57 dnsmasq-dhcp[5236]: Paquet DHCP reçu sur eth1 qui n'a pas d'adresse

Ca m’a fait penser que l’interface eth1 ne reçoit pas d’adresse via DHCP étant donné que c’est le serveur. Donc je l’ai passé en ip fixe

auto eth1
allow-hotplug eth1
iface eth1 inet static
address 10.0.243.1
netmask 255.255.255.0
network 10.0.243.0
broadcast 10.0.243.255
gateway 10.0.243.254

Et là, toujours en mode debug j’obtiens après branchement de mon ordi

Jun 20 20:49:30 dnsmasq[2746]: démarrage avec le DNS désactivé (version 2.72)
Jun 20 20:49:30 dnsmasq[2746]: options à la compilation : IPv6 GNU-getopt DBus i18n IDN DHCP DHCPv6 no-Lua TFTP conntrack ipset auth DNSSEC loop-detect
Jun 20 20:49:30 dnsmasq-dhcp[2746]: DHCP, plage d'adresses IP 10.0.243.2 -- 10.0.243.254, durée de bail 4h
Jun 20 20:49:30 dnsmasq-dhcp[2746]: DHCP, sockets bound exclusively to interface eth1
Jun 20 20:50:10 dnsmasq-dhcp[2746]: DHCPREQUEST(eth1) **** ***** 
Jun 20 20:50:10 dnsmasq-dhcp[2746]: DHCPNAK(eth1) **** *****  mauvais réseau
Jun 20 20:50:13 dnsmasq-dhcp[2746]: DHCPDISCOVER(eth1)   ***** 
Jun 20 20:50:13 dnsmasq-dhcp[2746]: DHCPOFFER(eth1) 10.0.243.198  ****
Jun 20 20:50:13 dnsmasq-dhcp[2746]: DHCPREQUEST(eth1) 10.0.243.198  **** 
Jun 20 20:50:13 dnsmasq-dhcp[2746]: DHCPACK(eth1) 10.0.243.198  **** *****  ****

Et mon ordi reçoit bien une lease.

Par contre après avoir reboot, donc hors mode debug, je n’obtiens plus de lease.

Dans /etc/dnsmasq.conf je me demande si les lignes suivantes sont nécessaires :

domain-needed
expand-hosts

listen-address=127.0.0.1
resolv-file=/etc/resolv.dnsmasq.conf
cache-size=256

Si tu parles d’un reboot de la brique c’est normal que ça ne marche plus, tu avais lancé dnsmasq manuellement. Pour que ta nouvelle config DHCP (qui semble fonctionner) soit utilisée au boot, il faut la déplacer dans le dossier /etc/dnsmasq.d/, si possible avec un nom parlant. Par exemple en tapant ceci :

sudo mv /home/admin/test.dnsmasq.conf /etc/dnsmasq.d/nat-on-eth1.conf

puis

sudo systemctl restart dnsmasq

Ensuite consulte les logs de dnsmasq et vois ce qui se passe lorsque tu connectes ton PC :

sudo journalctl -f -u dnsmasq

J’ai déplacé la déclaration du serveur dhcp de eth1 dans /etc/dnsmasq.d/dhcpdv4-eth0.conf et ajouté listen-address=10.0.243.1

Il me reste les lignes suivantes dans /etc/dnsmasq.conf, je me demande si elles sont nécessaires/justes :

domain-needed
expand-hosts

listen-address=127.0.0.1
resolv-file=/etc/resolv.dnsmasq.conf
cache-size=256

Dans /etc/resolv.dnsmasq.conf j’ai remplacé les ip existantes par les 2 serveurs dns
qui étaient donnés dans la config du hotspot wifi.

Mon ordi reçoit bien une lease, mais rien ne ping. journalctl -f -u dnsmasq me renvoie :

juin 21 01:49:15 DOMAIN dnsmasq[2961]: started, version 2.72 cachesize 256
juin 21 01:49:15 DOMAIN dnsmasq[2961]: compile time options: IPv6 GNU-getopt DBus i18n IDN DHCP DHCPv6 no-Lua TFTP conntrack ipset auth DNSSEC loop-detect
juin 21 01:49:15 DOMAIN dnsmasq-dhcp[2961]: DHCP, IP range 10.0.243.10 -- 10.0.243.200, lease time 4h
juin 21 01:49:15 DOMAIN dnsmasq-dhcp[2961]: DHCP, sockets bound exclusively to interface eth1
juin 21 01:49:15 DOMAIN dnsmasq[2961]: reading /etc/resolv.dnsmasq.conf
juin 21 01:49:15 DOMAIN dnsmasq[2961]: using nameserver adresse_dns1#53
juin 21 01:49:15 DOMAIN dnsmasq[2961]: using nameserver adresse_dns2#53
juin 21 01:49:15 DOMAIN dnsmasq[2961]: read /etc/hosts - 10 addresses
juin 21 01:49:17 DOMAIN dnsmasq[2962]: /etc/resolvconf/update.d/libc: Warning: /etc/resolv.conf is not a symbolic link to /etc/resolvconf/run/resolv.conf
juin 21 01:49:17 DOMAIN systemd[1]: Started dnsmasq - A lightweight DHCP and caching DNS server.
juin 21 01:49:50 DOMAIN dnsmasq-dhcp[2961]: DHCPREQUEST(eth1) 10.0.243.198 ******
juin 21 01:49:50 DOMAIN dnsmasq-dhcp[2961]: DHCPACK(eth1) 10.0.243.198 ****** ******

Le DHCP semblant fonctionner correctement, je suppose que ça vient de la configuration du firewall? Avant ces tests j’ai supprimé l’appli hotspot wifi

As-tu essayé de pinguer une adresse IP ou bien un nom de domaine ?
Pour voir si c’est un problème lié à iptables ou bien juste un problème de résolution DNS, sur ton PC essaye de pinguer une adresse IP publique. Par exemple ping 80.67.169.52.

J’avais pingué en 9.9.9.9 et je viens de revérifier, ça ne fonctionne pas.

Au niveau de la config de l’interface eth1, la gateway c’est le serveur DHCP? Donc on aurait ça :

address 10.0.243.1
netmask 255.255.255.0
network 10.0.243.0
broadcast 10.0.243.255
gateway 10.0.243.1

Retire la ligne gateway 10.0.243.1, je n’ai pas d’idée précise de ce que ça peut provoquer mais ça ne peut rien apporter de bon à mon avis.

Ok c’est fait.

Et concernant la configuration iptables, tu penses qu’il peut y avoir une erreur là? Ou tu suspectes autre-chose?

Oui il faut t’assurer qu’il y a une règle iptables qui assure la fonction NAT.
Normalement cette règle iptables est activée automatiquement par l’appli hotspot.
Pour vérifier que le NAT est bien activé tapes ça :

iptables -nvt nat -L POSTROUTING

Tu devrais alors voir quelque chose comme ça :

Chain POSTROUTING (policy ACCEPT 799 packets, 67272 bytes)
 pkts bytes target     prot opt in     out     source               destination
  310 26729 MASQUERADE  all  --  *     tun0    0.0.0.0/0            0.0.0.0/0
1 Like

J’avais désinstallé le hotspot wifi et iptables -nvt nat -L POSTROUTING ne me renvoyait rien.

Je l’ai ensuite réinstallé, et effectivement j’obtiens ça :

Chain POSTROUTING (policy ACCEPT 385 packets, 23606 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  244 19029 MASQUERADE  all  --  *      tun0    0.0.0.0/0            0.0.0.0/0

Le hotspot wifi et le “hotspot filaire” eth1 fonctionnent maintenant correctement. J’ai débranché l’antenne et ça continue à fonctionner (hotspot running)

J’ai aussi fait d’autres modifs sur la configuration ipv6. Je posterai la solution la semaine pro.

Merci beaucoup @pitchum , ça faisait des mois que je voulais réussir à faire ça!

1 Like

Les fichiers de configuration nécessaires au bon fonctionnement du hotspot filaire sont :

  • /etc/network/interfaces

auto lo
iface lo inet loopback

auto eth0
allow-hotplug eth0
iface eth0 inet dhcp
post-up ip a a fe80::42:babe/128 dev eth0

auto eth1
allow-hotplug eth1
iface eth1 inet static
address 10.0.243.1
netmask 255.255.255.0

iface eth1 inet6 static
address 2a00:5881:8118:1700::42
netmask 64
post-up ip a a fe80::42:babe/128 dev eth1

auto usb0
allow-hotplug usb0
iface usb0 inet dhcp

Je me suis arrangé pour “copier” la configuration wlan0 du hotspot wifi en remplaçant 10.0.242.x par 10.0.243.x

  • /etc/dnsmasq.d/dhcpdv6-eth1.conf

interface=eth1
listen-address=2a00:5881:8118:1700::42
dhcp-range=2a00:5881:8118:1700::,slaac,64,4h
dhcp-option=option6:dns-server, [2001:913::8],[2001:910:800::12]

  • /etc/dnsmasq.d/dhcpdv4-eth1.conf

interface=eth1
listen-address=10.0.243.1
dhcp-range=eth1,10.0.243.10,10.0.243.100,4h
dhcp-option=option:dns-server, 80.67.188.188,80.67.169.12
dhcp-authoritative
bind-interfaces

  • /etc/resolv.dnsmasq.conf

nameserver 89.234.141.66
nameserver 2a00:5881:8100:1000::3

  • /etc/dnsmasq.conf

domain-needed
expand-hosts

listen-address=127.0.0.1
resolv-file=/etc/resolv.dnsmasq.conf
cache-size=256

  • /usr/local/bin/wiredgw

#!/bin/bash

case “${1}” in
start)
# ipv6
ip6tables -w -I FORWARD -i tun0 -o eth1 -j DROP
ip6tables -w -I FORWARD -i tun0 -o eth1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
ip6tables -w -I FORWARD -i eth1 -o tun0 -j ACCEPT
#ip6tables -w -I FORWARD -i eth1 -o wlan0 -j ACCEPT
#ip6tables -w -I FORWARD -i wlan0 -o eth1 -j ACCEPT
ip6tables -w -I INPUT -i eth1 -j ACCEPT
ip6tables -w -I OUTPUT -o eth1 -j ACCEPT

  #IPv4
  iptables -w -I FORWARD -i tun0 -o eth1 -j DROP
  iptables -w -I FORWARD -i tun0 -o eth1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
  iptables -w -I FORWARD -i eth1 -o tun0 -j ACCEPT
  #iptables -w -I FORWARD -i eth1 -o wlan0 -j ACCEPT
  #iptables -w -I FORWARD -i wlan0 -o eth1 -j ACCEPT
  iptables -w -I INPUT -i eth1 -j ACCEPT
  iptables -w -I OUTPUT -o eth1 -j ACCEPT
;;
stop)
  # ipv6
  ip6tables -w -D FORWARD -i tun0 -o eth1 -j DROP
  ip6tables -w -D FORWARD -i tun0 -o eth1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
  ip6tables -w -D FORWARD -i eth1 -o tun0 -j ACCEPT
  #ip6tables -w -D FORWARD -i eth1 -o wlan0 -j ACCEPT
  #ip6tables -w -D FORWARD -i wlan0 -o eth1 -j ACCEPT
  ip6tables -w -D INPUT -i eth1 -j ACCEPT
  ip6tables -w -D OUTPUT -o eth1 -j ACCEPT

  # IPv4
  iptables -w -D FORWARD -i tun0 -o eth1 -j DROP
  iptables -w -D FORWARD -i tun0 -o eth1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
  iptables -w -D FORWARD -i eth1 -o tun0 -j ACCEPT
  #iptables -w -D FORWARD -i eth1 -o wlan0 -j ACCEPT
  #iptables -w -D FORWARD -i wlan0 -o eth1 -j ACCEPT
  iptables -w -D INPUT -i eth1 -j ACCEPT
  iptables -w -D OUTPUT -o eth1 -j ACCEPT
;;
*)
  echo "Usage: $0 {start|stop}"
  exit 1
;;

esac

  • /etc/systemd/system/wiredgw.service

[Unit]
Description=Gateway for wire link
Requires=network.target
After=ynh-vpnclient.service
Wants=ynh-vpnclient.service

[Service]
Type=oneshot
ExecStart=/usr/local/bin/wiredgw start
ExecStop=/usr/local/bin/wiredgw stop
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

If people are interested, I made a small POC script for this. Though it relies on isc-dhcp-server and not dnsmasq … Mostly because I have no idea what I’m doing :+1:

Could be turned into an app

Cool, thanks! I tested it after reinstalling my internet cube from scratch. I ran it connected as root in ssh, but I guess should be run as admin with:

sudo bash deploy.sh

It created a DHCP server on my usb ethernet adapter. All devices connected to this eth1 interface go through my VPN at ARN. It works like a charm but after some testing it looks like it requires the hotspot_ynh wifi app.

Thus I wonder why not just adapting the hotspot_ynh app to provide an optional eth1 configuration.

While doing some test I realized that the POC script only configures IPV4, while vpnclient_ynh is configured mainly on an IPV6 basis with the ARN .cube.
Thus I’m wondering if hotspot_ynh is not providing some configuration that handles the missing IPV4-IPV6 bridging issues.

Hi @Aleks ,

Is this script still usable ?

Thanks a lot !
Charly

I think so … but I havent tried it since then … would be interested to get any feedback :+1:

Yup, it indeed works.
Once again, thanks a lot man.

CHeers!

1 Like

You mean it just works out of the box ? No particular tweaking required ? :thinking: (That sounds too good to be true :sweat_smile: )