Connexion avec pppoe sous Debian - Modem en bridge

Bonjour à tous,

J’ai fait appel à vous rescemment : viewtopic.php?f=3&t=22706

La nouvelle configuration fonctionne parfaitement, mais je souhaite désormais supprimer le modem DSL actuel qui passe par un DHCP et mettre le tout en pppoe.

En gros, si vous regardez mon ancien message, vous verrez que je suis pollué par les log DHCP car mon ancien modem (Netgear) attribue des baux de 150 secondes…

Je souhaite donc mettre un modem ADSL Linksys AM200.
Je souhaite également gérer la connexion directement sur mon serveur Debian via pppoeconf.

J’ai suivi ce tuto : formation-debian.via.ecp.fr/internet.html
La connexion semble bien se faire… mais ensuite, pas de connexion car le serveur Debian est un routeur et la route n’est pas correcte.

En gros, il me done :

Table de routage IP du noyau Destination Passerelle Genmask Indic Metric Ref Use Iface 193.253.160.0 0.0.0.0 255.255.255.0 U 0 0 0 ppp0 192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1 217.128.xx.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 0.0.0.0 0.0.0.0 0.0.0.0 UG 0 0 0 ppp0
Je viens donc vous poser quelques questions :slightly_smiling:

Déjà, sur le modem, quelle encapsulation dois je choisir entre :

RFC 1483 Bridged
RFC 1483 Routed
RFC 2516 PPPoE
RFC 2364 PPPoA
Bridged Mode Only

Mes tests non fructueux ont été menés en “Bridged Mode Only”.

Il y a t’il une particularité pour le fichier /etc/network/interfaces ?

Pour info, ma connexion est sur ORANGE PRO, avec IP fixe bien entendu…

Merci d’avance pour l’aidre que vous pourrez m’apporter.

Effectivement la table de routage est bizarre à plusieurs égards. Si je me souviens bien, ton adresse IP fixe est en 217.128.xx.xx. Que contient /etc/network/interfaces, et qu’affiche ifconfig (ou ip addr) ?

Je ne connais pas ton modem mais d’après le manuel de son frère ADSL2MUE (que je ne connais pas non plus) toutes les désignations en “RFC xxxx” sont des modes de fonctionnement où c’est le modem qui gère la connexion internet, comme un modem-routeur. Si tu veux gérer la connexion PPPoE sur ton serveur, il faut choisir “bridged mode only” pour que le modem fonctionne comme un simple pont ethernet.

Donc, voici exactement la route qu’il me donne :

Table de routage IP du noyau Destination Passerelle Genmask Indic Metric Ref Use Iface 193.253.160.3 0.0.0.0 255.255.255.255 UH 0 0 0 ppp0 192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1 0.0.0.0 0.0.0.0 0.0.0.0 UG 0 0 0 ppp0
Ensuite, voici mon fichier /etc/network/interfaces :

[code]# The loopback network interface
auto lo
iface lo inet loopback

auto eth1
iface eth1 inet static
address 192.168.1.5
netmask 255.255.255.0
broadcast 192.168.1.255

auto dsl-provider
iface dsl-provider inet ppp
pre-up /sbin/ifconfig eth0 up # line maintained by pppoeconf
provider dsl-provider

auto eth0
iface eth0 inet manual[/code]
A partir de auto dsl-provider, c’est pppoeconf qui a généré ces lignes…
Un ifconfig sur ppp0 donne les bonnes infos :

Sep 24 14:19:04 LINUX-GW pppd[4313]: Plugin rp-pppoe.so loaded. Sep 24 14:19:04 LINUX-GW pppd[4314]: pppd 2.4.4 started by root, uid 0 Sep 24 14:19:04 LINUX-GW pppd[4314]: PPP session is 9043 Sep 24 14:19:04 LINUX-GW pppd[4314]: Using interface ppp0 Sep 24 14:19:04 LINUX-GW pppd[4314]: Connect: ppp0 <--> eth0 Sep 24 14:19:05 LINUX-GW pppd[4314]: CHAP authentication succeeded Sep 24 14:19:05 LINUX-GW pppd[4314]: CHAP authentication succeeded Sep 24 14:19:05 LINUX-GW pppd[4314]: peer from calling number 00:30:88:xx:xx:xx authorized Sep 24 14:19:05 LINUX-GW pppd[4314]: local IP address 217.128.xx.x6 Sep 24 14:19:05 LINUX-GW pppd[4314]: remote IP address 193.253.160.3 Sep 24 14:19:05 LINUX-GW pppd[4314]: primary DNS address 80.10.246.1 Sep 24 14:19:05 LINUX-GW pppd[4314]: secondary DNS address 81.253.149.2
Juste le remote IP qui ne m’est pas nécessaire et qui s’incruste :slightly_smiling:.

Ah, cette table de routage a bien meilleure mine. Elle est conforme à ce qu’on peut attendre. L’adresse de pair ne sert à rien pour une connexion internet (vu que c’est déjà la route par défaut), mais c’est une spécificité de PPP.

Tout m’a l’air bon. Qu’est-ce qui ne marche pas exactement (tests habituels à l’appui : ping, traceroute, résolution dns…) ?
Il y a des règles iptables ? Tu les as mises à jour pour tenir compte de l’interface PPP ?

Ah oui,

0.0.0.0 0.0.0.0 0.0.0.0 UG 0 0 0 ppp0 est normal ?
Je pensais que je devais avoir un truc du genre :

Car comment je fais pour que mon réseau interne qui est sur eth1 se connecte au ppp0 (ou eth0) ?

Sinon, voici mon iptable (je pense qu’en fait, je dois mettre ifc_internet=ppp0 au lieu de eth0 ?):

[code]#!/bin/bash

##############################################

Script de configuration du Firewall

Dernière révision : 02/09/2009

##############################################

case $1 in

stop)
echo "Suppression des tables"
iptables -F # table filter
iptables -X
iptables -t nat -X # table nat
iptables -t nat -F
iptables -t mangle -X # table mangle
iptables -t mangle -F
echo “Arrêt de Fail2Ban”
/etc/init.d/fail2ban stop
;;

start)

#---------------------------------------------------------------------------
#–Variables----------------------------------------------------------------
ifc_loop=lo # Nom de l’interface de la boucle locale
ifc_internet=eth0 # Nom de l’interface Internet
ifc_local=eth1 # Nom de l’interface du réseau locale

reseau_local=192.168.1.0 # IP du réseau local

Les deux lignes suivantes récupèrent ces adresses IP

IP rattachée à l’interface Internet

ip_internet="ifconfig $ifc_internet | grep 'inet ad*r' | sed -e 's/.*inet ad*r://' | sed -e 's/ Bcast.*//'"

IP rattachée à l’interface du réseau local

ip_locale="ifconfig $ifc_local | grep 'inet ad*r' | sed -e 's/.*inet ad*r://' | sed -e 's/ Bcast.*//'"

Services de la passerelle :

HTTP=XXXX # Port d’écoute du serveur HTTP
FTP=XX # Port d’écoute du serveur FTP
SSH=XXXX # Port d’écoute du serveur SSH

Services redirigés :

Serveur de mail SMTP

ip_smtp_externe=xx.xx.xx.xx
ip_smtp_interne=192.168.1.1
port_smtp_public=25
port_smtp_interne=25

#---------------------------------------------------------------------------
#–IpTables-----------------------------------------------------------------
echo
echo “— Configuration du parefeu par IpTables —”

Suppression des anciennes chaines

echo "PAR DEFAUT"
echo " Suppression des anciennes chaines"
iptables -F # table filter
iptables -X
iptables -t nat -X # table nat
iptables -t nat -F
iptables -t mangle -X # table mangle
iptables -t mangle -F

Blocage complet par défaut (table filter)

echo " Blocage complet par défaut (table filter à DROP)"
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

Contre les attaques brutes : lancement de fail2ban

echo " Lancement de fail2ban pour le pré-remplissage des tables"
/etc/init.d/fail2ban start

Initialisation des autres tables

echo " Initialisation des autres tables à ACCEPT"
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT
iptables -t mangle -P PREROUTING ACCEPT
iptables -t mangle -P POSTROUTING ACCEPT
iptables -t mangle -P INPUT ACCEPT
iptables -t mangle -P OUTPUT ACCEPT
iptables -t mangle -P FORWARD ACCEPT

Autorisation de communication des processus locaux

echo
echo "PASSERELLE"
echo " Autorisation de communication des processus locaux"
iptables -A INPUT -i $ifc_loop -j ACCEPT
iptables -A OUTPUT -o $ifc_loop -j ACCEPT

Autorisation de communication entre la passerelle et le réseau local

echo
echo "PASSERELLE - RESEAU LOCAL"
echo " Toutes communications entre la passerelle et le réseau local autorisées"
iptables -A INPUT -i $ifc_local -j ACCEPT
iptables -A OUTPUT -o $ifc_local -j ACCEPT

Autorisation de communication entre la passerelle et internet si connexion établie par la passerelle

echo
echo "PASSERELLE - INTERNET"
echo " Toute communication vers l’extérieur acceptée (sauf state INVALID)"
iptables -A OUTPUT -o $ifc_internet -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
echo " Communications depuis Internet autorisées si établies ou relatives"
iptables -A INPUT -i $ifc_internet -m state --state ESTABLISHED,RELATED -j ACCEPT
echo " Accès autorisé au serveur HTTP ($HTTP)“
iptables -A INPUT -i $ifc_internet -p TCP --dport $HTTP -m state --state NEW -j ACCEPT
echo " Accès autorisé au serveur FTP ($FTP)”

Le mode passif nécessite seulement le port de commandes ftp

iptables -A INPUT -i $ifc_internet -p TCP --dport $FTP -m state --state NEW -j ACCEPT

Le mode actif nécessite en plus le module ip_conntrack_ftp

modprobe ip_conntrack_ftp
echo " Accès autorisé au serveur SSH ($SSH)"
iptables -A INPUT -i $ifc_internet -p TCP --dport $SSH -m state --state NEW -j ACCEPT

Toute communication vers l’extérieur acceptée (sauf state INVALID)

echo
echo "RESEAU LOCAL - INTERNET"
echo " Toute communication vers l’extérieur acceptée (sauf state INVALID)"
iptables -A FORWARD -i $ifc_local -o $ifc_internet -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

Communications depuis Internet autorisées si :

-déjà établies (initiées en local)

-relatives à une connexion déjà établie (ex FTP)

echo " Communications depuis Internet autorisées si établies ou relatives"
iptables -A FORWARD -i $ifc_internet -o $ifc_local -m state --state ESTABLISHED,RELATED -j ACCEPT

Activation du SNAT

On “masque” l’adresse source de tous les paquets qui sortent vers Internet.

echo " Activation du masquage d’adresse de source (SNAT)"
iptables -t nat -A POSTROUTING -s $reseau_local/24 -o $ifc_internet -j MASQUERADE

Redirections de ports

echo ""
echo “— Redirections de ports —”

echo " * HTTP:XXXX vers 192.168.1.1"

Le port tcp XXXX de l’IP publique est redirigé sur le port XXXX de 192.168.1.1

iptables -A FORWARD -i $ifc_internet -o $ifc_local -p tcp --dport XXXX -m state --state NEW -j ACCEPT
iptables -t nat -A PREROUTING -d $ip_internet -i $ifc_internet -p tcp --dport XXXX -j DNAT --to-destination 192.168.1.1:XXXX

echo " * Serveur Exchange (SMTP) $port_smtp_public->$ip_smtp_interne:$port_smtp_interne (depuis $ip_smtp_externe seulement)"

Autoriser le forwarding (port tcp 25 de l’IP publique redirigé sur le port 25 du serveur interne)

iptables -A FORWARD -i $ifc_internet -o $ifc_local -p tcp --dport $port_smtp_interne -m state --state NEW -j ACCEPT
iptables -t nat -A PREROUTING -s $ip_smtp_externe -d $ip_internet -i $ifc_internet -p tcp --dport $port_smtp_public -j DNAT --to-destination $ip_smtp_interne

;;

Fin du cas start

*)
echo “Usage : $0 {start|stop}”
;;

esac

exit 0
[/code]

est parfaitement normal. C'est la route par défaut via la connexion PPP. Pas besoin d'adresse de passerelle car c'est une liaison point à point, donc tout ce qui est envoyé par ppp0 est forcément reçu par le pair à l'autre bout.
[code]217.128.xx.0    0.0.0.0         255.255.255.0   U     0      0        0 ppp0[/code]
n'a pas de sens car primo tu ne sais pas s'il y a un sous-réseau 217.128.xx.0/24 de l'autre côté de la connexion PPP, secundo elle ne sert à rien puisque cette plage de destination est déjà couverte par la route par défaut ci-dessus. Avec l'ancien modem ce sous-réseau était créé sur eth0 car l'interface était de type ethernet pour lequel il fallait définir un sous-réseau IP et une passerelle de façon artificielle. Pas besoin de tout ça avec une interface point à point.

Pour le script iptables, il faut bien sûr remplacer eth0 par ppp0 en tant qu'interface internet. Il faut éventuellement ajouter des règles sur eth0 pour autoriser le trafic IP avec le modem si tu as besoin d'accéder à son interface de configuration. En revanche le trafic PPPoE entre eth0 et le modem n'est pas du trafic IP, donc il échappe aux règles iptables (en revanche le trafic IP transporté par PPPoE et visible sur ppp0 n'y échappe pas).

est parfaitement normal. C’est la route par défaut via la connexion PPP. Pas besoin d’adresse de passerelle car c’est une liaison point à point, donc tout ce qui est envoyé par ppp0 est forcément reçu par le pair à l’autre bout.

n’a pas de sens car primo tu ne sais pas s’il y a un sous-réseau 217.128.xx.0/24 de l’autre côté de la connexion PPP, secundo elle ne sert à rien puisque cette plage de destination est déjà couverte par la route par défaut ci-dessus. Avec l’ancien modem ce sous-réseau était créé sur eth0 car l’interface était de type ethernet pour lequel il fallait définir un sous-réseau IP et une passerelle de façon artificielle. Pas besoin de tout ça avec une interface point à point.

Pour le script iptables, il faut bien sûr remplacer eth0 par ppp0 en tant qu’interface internet. Il faut éventuellement ajouter des règles sur eth0 pour autoriser le trafic IP avec le modem si tu as besoin d’accéder à son interface de configuration. En revanche le trafic PPPoE entre eth0 et le modem n’est pas du trafic IP, donc il échappe aux règles iptables (en revanche le trafic IP transporté par PPPoE et visible sur ppp0 n’y échappe pas).

Merci, en effet, ça fonctionne… par contre, comment gérer les redirections de ports maintenant ?

Car là, j’ai cette erreur :

Bad argument `P-t-P:193.253.160.3' Try `iptables -h' or 'iptables --help' for more information.

C’est le filtre de ton sed pour extraire l’adresse IP de l’interface internet qui ne marche pas avec une interface PPP. Tu peux supprimer " Bcast", car de toute façon l’adresse IP finit au premier espace.

[EDIT] Je tiens à signaler qu’il existe un moyen bien plus propre pour gérer les règles iptables liées à une interface PPP : les scripts placés dans /etc/ppp/ip-up.d/ et /etc/ppp/ip-down.d/ qui sont exécutés respectivement lorsque la connexion est établie ou se termine et qui recoivent des paramètres tels que adresse IP local et du pair, nom de l’interface… en variables d’environnement.

Le souci de ton script, c’est qu’il ne marche que si ppp0 est déjà activée. Moi je divise en deux : un script avec les règles statiques qui est exécuté au démarrage avant la configuration réseau, et un script dans /etc/ppp/ip-up.d/ pour créer les règles spécifiques aux interfaces PPP (et dans ip-down.d pour supprimer les règles lorsque la connexion se termine (en fait c’est le même script, il y a juste une variable qui contient -A ou -D selon le cas)).

Merci pour tout ! Ca fonctionne parfaitement.

Dis moi, ai je des modifications à faire pour sécuriser le ppp0 en plus de ce que j’ai déjà dans mon iptable ?

Sinon, depuis cette modification, j’ai quelques sites qui ne fonctionnent plus, est ce possible que cela vienne de la mise en place du ppp0 ?

Les sites fonctionnent parfaitement avec un autre FAI sur un second réseau que j’ai ici…

Je n’ai pas examiné tes règles, mais la sécurisation d’une connexion internet n’est pas différente que l’interface soit de type ethernet ou PPP.

Pour les sites inaccessibles, cela peut venir d’un problème de “trou noir de MTU” classique en PPPoE qui fait que les paquets de taille supérieure à 1492 octets dans le sens descendant sont perdus, mais je pensais qu’il ne se produisait pas avec Orange. Une chose importante est de ne pas bloquer les messages d’erreur ICMP qui ont l’état RELATED.

Est-ce que cela se produit depuis le serveur et/ou depuis d’autres postes ? Si tu baisses le MTU de l’interface réseau du poste client à 1400 (ifconfig mtu 1400), cela se produit toujours ?

Alors chose étonnante… j’utilise un proxy (squid) et les sites qui ne fonctionnent pas sans proxy fonctionnent lorsque ce dernier est activé.

On dirait que des routes fonctionnent, et d’autres non lorsqu’on est hors du proxy.

Cela se produit sur tous les pc du réseau (reliés à switche, lui même branché sur l’interface eth1).

Sinon, quand tu écris : Une chose importante est de ne pas bloquer les messages d’erreur ICMP qui ont l’état RELATED

Cela signifie que je dois mettre ça ?

Rien d’étonnant, le coup du proxy peut s’expliquer par le problème de MTU que j’ai évoqué.
Si c’est un problème de route, tu peux tester avec

Si ça aboutit, ce n’est pas un problème de route.
Je répète ma question : est-ce que ça affecte le serveur lui-même ? S’il ne l’est pas, alors cela va dans le sens du MTU. Dans ce cas, as essayé de baisser le MTU sur un poste client ?

Pour l’ICMP RELATED, il suffit d’accepter les paquets RELATED, ce qui est le cas d’après ton script.

J’ignore si cela affecte le serveur lui même car ce dernier est en ligne de commande, je n’ai pas d’interface graphique et donc de navigation…

Je vais tenter avec w3m.

Ou lynx, links, voire wget.

Prenons le site www.vizada.com

J’y accède sans soucis depuis le serveur (via w3m).
Par contre, je n’y accède pas depuis un poste du réseau configuré en dehors du proxy.

En modifiant le MTU à 1400… ça passe.
Donc apparemment, les sites un peu lourd rencontrent ce soucis.

La seule solution est de modifier la taille MTU machine par machine ???

Donc c’est bien le trou noir de MTU, et ça n’a rien à voir avec la lourdeur des sites.
Pour info, c’est ce problème qui m’a fait abandonner PPPoE.
Pour les communications TCP (donc web, mail, FTP…), il y a un moyen de contourner en modifiant le MSS (taille de segment TCP maximum) sur le serveur avec la cible TCPMSS d’iptables. La règle figure carrément dans la page de manuel d’iptables :

Mais ça n’a aucun effet sur les protocoles non TCP (UDP, ICMP, IPSec, GRE…). Le problème peut se manifester avec les applications de ces protocoles susceptibles d’envoyer des paquets de taille maximum, notamment les VPN et tunnels.

Merci pour ton aide… je vais appliquer tes recommandations.

Mais que puis je faire à la place du PPPoE ? Comment fonctionnes tu toi ?

J’utilise un vieux modem SpeedTouch configuré en relais PPPoA-PPTP. La connexion PPP passe dans un tunnel PPTP entre ma passerelle et le modem puis est encapsulée en PPPoA sur l’ADSL.

Si tu voulais juste éviter la pollution des logs par DHCP, il suffisait de garder ton ancien modem et de configurer l’interface internet en statique puisque tu as le confort d’une adresse IP fixe.