Différences entre versions de « Passerelle Internet »
imported>SylvainBeucler m |
imported>SylvainBeucler m (→Routage IP) |
||
(38 versions intermédiaires par 3 utilisateurs non affichées) | |||
Ligne 8 : | Ligne 8 : | ||
=== Nommage des cartes réseau === | === Nommage des cartes réseau === | ||
− | Pour s'y retrouver facilement, on peut renommer eth0, eth1, etc. avec des noms plus | + | Pour s'y retrouver facilement, on peut renommer eth0, eth1, etc. avec des noms plus explicites: <code>eth-inet</code> pour la carte raccordée à Internet, et <code>eth-local</code> pour la carte raccordée au réseau local. |
− | + | Solution 1: utiliser udev. Sous Debian GNU/Linux, modifier les NAME dans: | |
− | eth- | + | * Lenny / 5.0: <code>/etc/udev/rules.d/70-persistent-net.rules</code> |
− | eth- | + | SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0e:3e:ce:27:d3", ATTR{type}=="1", KERNEL=="eth*", NAME="eth-admin" |
+ | * Etch / 4.0: <code>/etc/udev/rules.d/z25_persistent-net.rules</code> | ||
+ | SUBSYSTEM=="net", DRIVERS=="?*", ATTRS{address}=="00:0e:3e:ce:27:d3", NAME="eth-admin" | ||
+ | |||
+ | Solution 2: utiliser <code>ifrename</code> (dans le paquet du même nom). | ||
+ | Exemple de configuration dans <code>/etc/iftab</code>: | ||
+ | eth-inet mac 00:0C:57:85:FE:45 | ||
+ | eth-local mac 00:19:71:54:AB:83 | ||
Le changement est pris en compte au redémarrage, ou en tapant <code>ifrename</code> avec les interfaces concernées down (<code>iptables eth0 down</code>). | Le changement est pris en compte au redémarrage, ou en tapant <code>ifrename</code> avec les interfaces concernées down (<code>iptables eth0 down</code>). | ||
− | + | ||
+ | Attention: ifrename et udev ne doivent pas être utilisés simultanément [http://www.us.debian.org/releases/etch/i386/release-notes/ch-upgrading.fr.html#fr11]. | ||
=== Configuration des cartes réseau === | === Configuration des cartes réseau === | ||
Ligne 23 : | Ligne 31 : | ||
Exemple pour le réseau local: | Exemple pour le réseau local: | ||
− | auto eth- | + | auto eth-local |
− | iface eth- | + | iface eth-local inet static |
address 192.168.1.1 | address 192.168.1.1 | ||
netmask 255.255.255.0 | netmask 255.255.255.0 | ||
− | Pour le réseau | + | Pour le réseau Internet, cela dépend du type de connexion (PPPoE, DHCP sur le routeur, etc.) |
== Routage IP == | == Routage IP == | ||
− | Pour toute la suite, récupérer [http:// | + | Pour toute la suite, récupérer [http://hg.savannah.gnu.org/hgweb/debmaintenance/file/tip/basic-firewall.txt basic-firewall.txt], du projet debmaintenance. |
Utilisez ce fichier pour amorcer la configuration du pare-feu. N'hésitez pas à vous reporter à <code>man iptables</code> pour mieux comprendre les options utilisées. Voir aussi [[Pare-feu]]. | Utilisez ce fichier pour amorcer la configuration du pare-feu. N'hésitez pas à vous reporter à <code>man iptables</code> pour mieux comprendre les options utilisées. Voir aussi [[Pare-feu]]. | ||
Ligne 42 : | Ligne 50 : | ||
La passerelle doit transmettre les paquets qu'elle reçoit du réseau local vers l'Internet. | La passerelle doit transmettre les paquets qu'elle reçoit du réseau local vers l'Internet. | ||
− | Facile, c'est le noyau Linux qui s'en occupe. Cela se configure via <code>/etc/sysctl.conf</code>: | + | Facile, c'est le noyau Linux qui s'en occupe. Cela se configure via <code>/etc/sysctl.conf</code> (cf. [http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=418804 bug debian]): |
− | net.ipv4. | + | net.ipv4.ip_forward=1 |
Pour prendre en compte les paramètres: | Pour prendre en compte les paramètres: | ||
− | sysctl -p | + | sysctl -p |
Pour vérifier: | Pour vérifier: | ||
sysctl -a | grep default.forwarding | sysctl -a | grep default.forwarding | ||
Ligne 80 : | Ligne 88 : | ||
On ne fait du routage que pour le réseau interne. Pas question de router des paquets pour les extérieurs. Les paquets transmis, avant d'êtres NATés, passent par la règle FORWARD d'iptables: | On ne fait du routage que pour le réseau interne. Pas question de router des paquets pour les extérieurs. Les paquets transmis, avant d'êtres NATés, passent par la règle FORWARD d'iptables: | ||
− | iptables -A FORWARD -i eth- | + | iptables -A FORWARD -i ! eth-inet -o eth-inet -j ACCEPT |
− | iptables -A FORWARD -i eth-inet | + | iptables -A FORWARD -i eth-inet -m state --state RELATED,ESTABLISHED -j ACCEPT |
iptables -A FORWARD -j REJECT | iptables -A FORWARD -j REJECT | ||
Ligne 93 : | Ligne 101 : | ||
authoritative; | authoritative; | ||
− | option domain-name "masociete.local"; | + | option domain-name "masociete.local."; |
option domain-name-servers 192.168.1.1; | option domain-name-servers 192.168.1.1; | ||
#option domain-name-servers ns1.example.org, ns2.example.org; | #option domain-name-servers ns1.example.org, ns2.example.org; | ||
subnet 192.168.1.0 netmask 255.255.255.0 { | subnet 192.168.1.0 netmask 255.255.255.0 { | ||
− | + | option domain-name-servers 192.168.1.1; | |
− | + | option routers 192.168.1.1; | |
− | + | # Adresses dynamiques | |
− | + | range 192.168.1.101 192.168.1.150; | |
+ | } | ||
− | + | # Adresses statiques | |
− | + | host hplj4200n { hardware ethernet 00:01:E6:84:7F:34; fixed-address 192.168.1.21; } | |
− | + | host miroir { hardware ethernet 00:11:11:90:DF:37; fixed-address 192.168.1.50; } | |
− | |||
Notez ensuite le nom de l'interface réseau locale dans <code>/etc/default/dhcp3-server</code>: | Notez ensuite le nom de l'interface réseau locale dans <code>/etc/default/dhcp3-server</code>: | ||
− | INTERFACES="eth- | + | INTERFACES="eth-local" |
Penser à ouvrir les ports dans le pare-feu pour DHCP (cf. basic-firewall.txt). | Penser à ouvrir les ports dans le pare-feu pour DHCP (cf. basic-firewall.txt). | ||
Ligne 120 : | Ligne 128 : | ||
On va ici utiliser bind (paquet <code>bind9</code>). Configuration dans <code>/etc/bind</code> | On va ici utiliser bind (paquet <code>bind9</code>). Configuration dans <code>/etc/bind</code> | ||
− | Sous Debian, on ne touche qu'à <code>named.conf.options</code> et <code>named.conf.local</code>, <code>named.conf</ | + | Sous Debian, on ne touche qu'à <code>named.conf.options</code> et <code>named.conf.local</code>, <code>named.conf</code> étant géré par le paquet, sauf configuration non triviale. |
− | Restriction d'accès au réseau local | + | Restriction d'accès au réseau local: ajouter dans <code>named.conf.options</code>, section <code>options {</code>: |
− | allow-query { 192.168.1.0/24; localhost; }; | + | allow-query { 192.168.1.0/24; localhost; }; // default: any |
− | allow-recursion { 192.168.1.0/24; localhost; }; | + | allow-recursion { 192.168.1.0/24; localhost; }; // default: localnets; localhost; |
− | allow-transfer { 192.168.1.0/24; localhost; }; | + | allow-transfer { 192.168.1.0/24; localhost; }; // default: any |
+ | Note: on peut être tenté d'utiliser l'ACL prédéfinie <code>localnets</code>, mais cela donnerait des accès également à une partie du réseau public Internet. À réserver pour le cas où les adresses IP du serveur DNS se situent exclusivement sur le réseau interne. | ||
Définition de la zone locale, et de son reverse, dans <code>named.conf.local</code>: | Définition de la zone locale, et de son reverse, dans <code>named.conf.local</code>: | ||
Ligne 133 : | Ligne 142 : | ||
file "/etc/bind/master/masociete.local"; | file "/etc/bind/master/masociete.local"; | ||
}; | }; | ||
+ | // Note: the IP network adress is written in reverse here: | ||
zone "1.168.192.in-addr.arpa" { | zone "1.168.192.in-addr.arpa" { | ||
type master; | type master; | ||
Ligne 153 : | Ligne 163 : | ||
Squelettes de zones, dans <code>/etc/bind/master</code>: | Squelettes de zones, dans <code>/etc/bind/master</code>: | ||
− | + | * <code>/etc/bind/master/masociete.local</code>: | |
− | $TTL | + | $TTL 3600 ; non-slaves refresh after 1 hour (e.g.: ISPs) |
@ IN SOA passerelle.masociete.local. hostmaster.passerelle.masociete.local. ( | @ IN SOA passerelle.masociete.local. hostmaster.passerelle.masociete.local. ( | ||
− | + | 2007091202 ; serial (YYMMDDxx) | |
− | + | 3600 ; slaves refresh after 1 hour | |
− | + | 3600 ; slaves retry after 1 hour on failure | |
− | + | 1209600 ; slaves expire after 2 weeks | |
− | + | 3600 ; minimum negative cache TTL of 1 hour | |
− | + | ) | |
− | NS passerelle | + | NS passerelle |
passerelle A 192.168.1.1 | passerelle A 192.168.1.1 | ||
Ligne 169 : | Ligne 179 : | ||
alias CNAME miroir | alias CNAME miroir | ||
− | + | * <code>/etc/bind/master/192.168.1</code> - reverse: | |
− | $TTL | + | $TTL 3600 |
@ IN SOA passerelle.masociete.local. hostmaster.passerelle.masociete.local. ( | @ IN SOA passerelle.masociete.local. hostmaster.passerelle.masociete.local. ( | ||
− | + | 2007041601 ; serial (année+mois+jour+compteur) | |
− | + | 3600 ; slaves refresh after 1 hour | |
− | + | 3600 ; slaves retry after 1 hour on failure | |
− | + | 1209600 ; slaves expire after 2 weeks | |
− | + | 3600 ; minimum negative cache TTL of 1 hour | |
− | + | ) | |
− | + | ||
+ | NS passerelle.masociete.local. | ||
; Don't forget the trailing '.' | ; Don't forget the trailing '.' | ||
Ligne 184 : | Ligne 195 : | ||
21 PTR hplj4200n.masociete.local. | 21 PTR hplj4200n.masociete.local. | ||
50 PTR miroir.masociete.local. | 50 PTR miroir.masociete.local. | ||
+ | |||
+ | Pour générer le reverse à partir des <code>A</code> de la zone <code>.local</code> avec une regexp Emacs: | ||
+ | \([-a-z]+\) +A +192\.168\.1\.\(.*\) | ||
+ | \2 PTR \1.masociete.local. | ||
Avec ces fichiers, vous devriez avoir un serveur DNS fonctionnel. | Avec ces fichiers, vous devriez avoir un serveur DNS fonctionnel. | ||
Ligne 193 : | Ligne 208 : | ||
Penser à ouvrir le port 53 udp+tcp (cf. basic-firewall.txt). | Penser à ouvrir le port 53 udp+tcp (cf. basic-firewall.txt). | ||
+ | |||
+ | Pour le débogage, ajouter dans <code>/etc/bind/named.options</code>: | ||
+ | <pre> | ||
+ | logging { | ||
+ | channel simple_log { | ||
+ | file "/tmp/bind.log" versions 3 size 5m; | ||
+ | severity debug 10; | ||
+ | print-time yes; | ||
+ | print-severity yes; | ||
+ | print-category yes; | ||
+ | }; | ||
+ | category default { | ||
+ | simple_log; | ||
+ | }; | ||
+ | }; | ||
+ | </pre> | ||
+ | |||
+ | Pour tester: | ||
+ | named-checkzone masociete.local /etc/bind/master/masociete.local | ||
== Alternative: Dnsmasq == | == Alternative: Dnsmasq == | ||
Ligne 210 : | Ligne 244 : | ||
** [[DynDNS]] | ** [[DynDNS]] | ||
** Installer des clefs SSH dans <code>/root/.ssh/authorized_keys</code> | ** Installer des clefs SSH dans <code>/root/.ssh/authorized_keys</code> | ||
− | ** Supprimer l'authentification par mot de passe, pour éviter les attaques force brute: | + | ** Supprimer l'authentification par mot de passe, pour éviter les attaques force brute, dans <code>/etc/ssh/sshd_config</code>: |
− | + | ChallengeResponseAuthentication no | |
+ | PasswordAuthentication no |
Version actuelle datée du 23 juin 2010 à 13:37
Comment partager une connexion Internet avec le reste des locaux, ou comment faire un boitier routeur manuellement.
On étudie ici la configuration à partir d'une Debian Etch.
Configuration IP de la passerelle
Nommage des cartes réseau
Pour s'y retrouver facilement, on peut renommer eth0, eth1, etc. avec des noms plus explicites: eth-inet
pour la carte raccordée à Internet, et eth-local
pour la carte raccordée au réseau local.
Solution 1: utiliser udev. Sous Debian GNU/Linux, modifier les NAME dans:
- Lenny / 5.0:
/etc/udev/rules.d/70-persistent-net.rules
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0e:3e:ce:27:d3", ATTR{type}=="1", KERNEL=="eth*", NAME="eth-admin"
- Etch / 4.0:
/etc/udev/rules.d/z25_persistent-net.rules
SUBSYSTEM=="net", DRIVERS=="?*", ATTRS{address}=="00:0e:3e:ce:27:d3", NAME="eth-admin"
Solution 2: utiliser ifrename
(dans le paquet du même nom).
Exemple de configuration dans /etc/iftab
:
eth-inet mac 00:0C:57:85:FE:45 eth-local mac 00:19:71:54:AB:83
Le changement est pris en compte au redémarrage, ou en tapant ifrename
avec les interfaces concernées down (iptables eth0 down
).
Attention: ifrename et udev ne doivent pas être utilisés simultanément [1].
Configuration des cartes réseau
La configuration est centralisée, sous Debian, dans /etc/network/interfaces
.
Exemple pour le réseau local:
auto eth-local iface eth-local inet static address 192.168.1.1 netmask 255.255.255.0
Pour le réseau Internet, cela dépend du type de connexion (PPPoE, DHCP sur le routeur, etc.)
Routage IP
Pour toute la suite, récupérer basic-firewall.txt, du projet debmaintenance.
Utilisez ce fichier pour amorcer la configuration du pare-feu. N'hésitez pas à vous reporter à man iptables
pour mieux comprendre les options utilisées. Voir aussi Pare-feu.
Reportez-vous ensuite à sa partie "Shared Internet access", détaillée ci-après:
IP forwarding
La passerelle doit transmettre les paquets qu'elle reçoit du réseau local vers l'Internet.
Facile, c'est le noyau Linux qui s'en occupe. Cela se configure via /etc/sysctl.conf
(cf. bug debian):
net.ipv4.ip_forward=1
Pour prendre en compte les paramètres:
sysctl -p
Pour vérifier:
sysctl -a | grep default.forwarding
Note: précedemment configuré dans /etc/network/options
- à migrer si c'est le cas sur une ancienne machine (cf. /usr/share/doc/netbase/README.Debian
).
IP masquerading
Un serveur Internet ne saura pas où envoyer une réponse à 192.168.1.10
, par exemple. Du coup, il faut modifier l'adresse IP source des paquets, et la remplacer l'adresse IP publique de la passerelle.
Cette technique s'appelle le masquerading, et fait partie du concept plus général du NAT (network address translation). Cela se fait au niveau du pare-feu, iptables.
Cf. basic-firewall.txt
iptables -t nat -A POSTROUTING -o eth-inet -j MASQUERADE
Modules noyau
Le masquerading est très utilisé mais ne respecte pas le protocole IP. Il peut occasionner des soucis, par exemple pour le protocole FTP qui utilise deux connexions simultanées (contrôle et données).
Rajouter dans /etc/modules
:
ip_conntrack_ftp ip_nat_ftp
Note: Je n'ai pas eu besoin d'installer les modules pour IRC, ce n'est peut-être nécessaire que pour le DCC.
MTU
Il y a également des problèmes de taille de paquets trop gros. Sans entrer dans les détails, il s'agit du problème du MTU (maximum transfert unit).
Rajouter la ligne correspondante dans le pare-feu.
iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS -o eth-inet --clamp-mss-to-pmtu
Droits
On ne fait du routage que pour le réseau interne. Pas question de router des paquets pour les extérieurs. Les paquets transmis, avant d'êtres NATés, passent par la règle FORWARD d'iptables:
iptables -A FORWARD -i ! eth-inet -o eth-inet -j ACCEPT iptables -A FORWARD -i eth-inet -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A FORWARD -j REJECT
Serveur DHCP
DHCP permet d'attribuer des adresses locales aux postes connectés au réseau, avec configuration automatique de l'adresse du routeur et des serveurs DNS.
Configuration minimale, /etc/dhcp3/dhcpd.conf
:
ddns-update-style none; log-facility local7; authoritative; option domain-name "masociete.local."; option domain-name-servers 192.168.1.1; #option domain-name-servers ns1.example.org, ns2.example.org; subnet 192.168.1.0 netmask 255.255.255.0 { option domain-name-servers 192.168.1.1; option routers 192.168.1.1; # Adresses dynamiques range 192.168.1.101 192.168.1.150; } # Adresses statiques host hplj4200n { hardware ethernet 00:01:E6:84:7F:34; fixed-address 192.168.1.21; } host miroir { hardware ethernet 00:11:11:90:DF:37; fixed-address 192.168.1.50; }
Notez ensuite le nom de l'interface réseau locale dans /etc/default/dhcp3-server
:
INTERFACES="eth-local"
Penser à ouvrir les ports dans le pare-feu pour DHCP (cf. basic-firewall.txt).
Serveur DNS
Il ne manque plus que la résolution de nom, pour lier par exemple www.cliss21.com
à 87.98.154.26
.
On va ici utiliser bind (paquet bind9
). Configuration dans /etc/bind
Sous Debian, on ne touche qu'à named.conf.options
et named.conf.local
, named.conf
étant géré par le paquet, sauf configuration non triviale.
Restriction d'accès au réseau local: ajouter dans named.conf.options
, section options {
:
allow-query { 192.168.1.0/24; localhost; }; // default: any allow-recursion { 192.168.1.0/24; localhost; }; // default: localnets; localhost; allow-transfer { 192.168.1.0/24; localhost; }; // default: any
Note: on peut être tenté d'utiliser l'ACL prédéfinie localnets
, mais cela donnerait des accès également à une partie du réseau public Internet. À réserver pour le cas où les adresses IP du serveur DNS se situent exclusivement sur le réseau interne.
Définition de la zone locale, et de son reverse, dans named.conf.local
:
zone "masociete.local" { type master; notify no; file "/etc/bind/master/masociete.local"; }; // Note: the IP network adress is written in reverse here: zone "1.168.192.in-addr.arpa" { type master; notify no; file "/etc/bind/master/192.168.1"; };
On a ici un serveur DNS autonome, sans besoin de passer par les DNS du fournisseur d'accès (pour les curieux, voir /etc/bind/db.root
). Si vous êtes dépendant des DNS du FAI (ex: pour récupérer la bonne IP de smtp.wanadoo.fr
), passez en mode délégation dans named.conf.options
:
forwarders { 80.10.246.130; 80.10.246.3; };
(Note: alternativement on peut rajouter une zone dans named.conf.local
juste pour cette adresse:)
// The public smtp.w.f is not a relay, // you need to ask Wanadoo's DNS for the real IPs: zone "smtp.wanadoo.fr" { type forward; forward only; // don't ask anybody else forwarders { 80.10.246.130; 80.10.246.3; }; };
Squelettes de zones, dans /etc/bind/master
:
/etc/bind/master/masociete.local
:
$TTL 3600 ; non-slaves refresh after 1 hour (e.g.: ISPs) @ IN SOA passerelle.masociete.local. hostmaster.passerelle.masociete.local. ( 2007091202 ; serial (YYMMDDxx) 3600 ; slaves refresh after 1 hour 3600 ; slaves retry after 1 hour on failure 1209600 ; slaves expire after 2 weeks 3600 ; minimum negative cache TTL of 1 hour ) NS passerelle passerelle A 192.168.1.1 hplj4200n A 192.168.1.21 miroir A 192.168.1.50 alias CNAME miroir
/etc/bind/master/192.168.1
- reverse:
$TTL 3600 @ IN SOA passerelle.masociete.local. hostmaster.passerelle.masociete.local. ( 2007041601 ; serial (année+mois+jour+compteur) 3600 ; slaves refresh after 1 hour 3600 ; slaves retry after 1 hour on failure 1209600 ; slaves expire after 2 weeks 3600 ; minimum negative cache TTL of 1 hour ) NS passerelle.masociete.local. ; Don't forget the trailing '.' 1 PTR passerelle.masociete.local. 21 PTR hplj4200n.masociete.local. 50 PTR miroir.masociete.local.
Pour générer le reverse à partir des A
de la zone .local
avec une regexp Emacs:
\([-a-z]+\) +A +192\.168\.1\.\(.*\) \2 PTR \1.masociete.local.
Avec ces fichiers, vous devriez avoir un serveur DNS fonctionnel. Pour tester:
host passerelle.masociete.local 192.168.1.1 dig passerelle.masociete.local @192.168.1.1 host 192.168.1.50 192.168.1.1 dig -x 192.168.1.50 @192.168.1.1
Penser à ouvrir le port 53 udp+tcp (cf. basic-firewall.txt).
Pour le débogage, ajouter dans /etc/bind/named.options
:
logging { channel simple_log { file "/tmp/bind.log" versions 3 size 5m; severity debug 10; print-time yes; print-severity yes; print-category yes; }; category default { simple_log; }; };
Pour tester:
named-checkzone masociete.local /etc/bind/master/masociete.local
Alternative: Dnsmasq
Le paquet dnsmasq
fournit en même temps DHCP et DNS. Il relaie les requêtes DNS en utilisant le /etc/resolv.conf
local. Je crois qu'il utilise également /etc/hosts
pour configurer les adresses locales.
La configuration réseau et le partage de connexion reste à votre charge.
Il suffit dans la plupart des cas, mais peut s'avérer plus limité qu'une configuration avec dhcp3-server et bind. La configuration bind en particulier est nettement plus difficile et redondante, mais c'est un savoir réutilisable pour configurer un "vrai" DNS sur Internet.
Configuration minimale /etc/dnsmasq.conf
:
dhcp-range=192.168.1.101,192.168.1.150,12h
Finitions
- Accès distant:
- DynDNS
- Installer des clefs SSH dans
/root/.ssh/authorized_keys
- Supprimer l'authentification par mot de passe, pour éviter les attaques force brute, dans
/etc/ssh/sshd_config
:
ChallengeResponseAuthentication no PasswordAuthentication no