Archives pour juin, 2012

IPv6 : fin du mythe « le NAT en IPv6 çà sert à rien »

http://serverfault.com/questions/184524/switch-to-ipv6-and-get-rid-of-nat-are-you-kidding

That said, there is no reason that NAT couldn’t be used in the exact same way it is being used in IPv4. In fact, a router could be designed to have one IPv6 address on the WAN port with an IPv4 private network behind it that NAT’s onto it(for example). This would be a simple solution for consumer and residential people. Another option is to put all devices with public IPv6 IP’s— the intermediate device then could act as a L2 device, but provide a state table, packet inspection, and fully functioning firewall. Essentially, no NAT, but still blocking any unsolicited inbound frames. The important thing to remember is that you shouldn’t plug your PC’s directly into your WAN connection with no intermediary device. Unless of course you want to rely on the Windows firewall. . . and that’s a different discussion. Every network, even home networks, need an edge device protecting the local network, in addition to using the Windows firewall.

Pour ma part, j’utilise du NAT66 avec PF sous BSD, ce qui correspond au mappage d’une IPv6 publique sur une IPv6 privée. Ceci pour deux raisons :

  • indépendance : le changement d’une adresse IP publique ou privée doit d’être possible et rapide, ce qui n’est pas du tout le cas si on change de FAI (une entreprise çà peut délocaliser déménager) ou dans le cas de la gestion de différents clusters.
  • centralisation : le filtrage du trafic externe s’effectue toujours sur le point d’entrée d’un réseau et non pas après coup sur tous les hôtes. Au niveau administration, la maintenance est évidemment plus rapide. Evidemment, rien n’empêche un filtrage du trafic interne sur chaque hôte.

IPv6 : vérifier la connectivité IPv6 de bout en bout d’un site web

Un petit outil en ligne pour vérifier la connectivité IPv6 de bout en bout :

http://ipv6-test.com/validate.php

Mon blog est évidemment accessible en IPv6 !

ipv6 ready

FreeBSD : patch pour la gestion des alias IPv6 sur interface CARP

Le driver CARP de FreeBSD 8.x contient un bug au niveau de la gestion IPv6. Au lieu d’ajouter chaque adresse IPv6 de l’interface CARP au groupe multicast ff02::1, le driver n’ajoute que la première adresse. Ainsi la prise en compte des alias n’est pas effective et la découverte du voisinage IPv6 n’aboutit pas :

ipv6_ifconfig_carp0="2001:1610:4::102 prefixlen 64"
ipv6_ifconfig_carp0_alias0="2001:1610:4::113 prefixlen 64"
0.000000 fe80::223:4ff:fe17:f840 -> ff02::1:ff00:113 ICMPv6 86 Neighbor Solicitation
0.999052 fe80::223:4ff:fe17:f840 -> ff02::1:ff00:113 ICMPv6 86 Neighbor Solicitation
1.999103 fe80::223:4ff:fe17:f840 -> ff02::1:ff00:113 ICMPv6 86 Neighbor Solicitation
3.000220 fe80::223:4ff:fe17:f840 -> ff02::1:ff00:113 ICMPv6 86 Neighbor Solicitation

Pour corriger ce bug, Paul Herman propose un patch à appliquer aux sources de FreeBSD :

# cd /usr/src
# zcat /path/to/carp_ip6_alias.patch.gz | patch
--- sys/netinet6/in6.c.orig    2011-08-19 07:08:30.000000000 +0000
+++ sys/netinet6/in6.c    2011-08-19 07:09:53.000000000 +0000
@@ -1743,7 +1743,7 @@

ia->ia_addr = *sin6;

-    if (ifacount <= 1 && ifp->if_ioctl) {
+    if ((ifacount <= 1 || ifp->if_type == IFT_CARP) && ifp->if_ioctl) {
error = (*ifp->if_ioctl)(ifp, SIOCSIFADDR, (caddr_t)ia);
if (error) {
splx(s);
--- sys/netinet/ip_carp.c.orig    2011-08-19 07:52:56.000000000 +0000
+++ sys/netinet/ip_carp.c    2011-08-19 07:15:03.000000000 +0000
@@ -1670,9 +1670,11 @@
struct carp_if *cif;
struct in6_ifaddr *ia, *ia_if;
struct ip6_moptions *im6o = &sc->sc_im6o;
+    struct in6_multi *in6m;
struct in6_addr in6;
int own, error;

+
error = 0;

if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) {
@@ -1729,8 +1731,6 @@
}

if (!sc->sc_naddrs6) {
-        struct in6_multi *in6m;
-
im6o->im6o_multicast_ifp = ifp;

/* join CARP multicast address */
@@ -1745,24 +1745,24 @@
goto cleanup;
im6o->im6o_membership[0] = in6m;
im6o->im6o_num_memberships++;
-
-        /* join solicited multicast address */
-        bzero(&in6, sizeof(in6));
-        in6.s6_addr16[0] = htons(0xff02);
-        in6.s6_addr32[1] = 0;
-        in6.s6_addr32[2] = htonl(1);
-        in6.s6_addr32[3] = sin6->sin6_addr.s6_addr32[3];
-        in6.s6_addr8[12] = 0xff;
-        if (in6_setscope(&in6, ifp, NULL) != 0)
-            goto cleanup;
-        in6m = NULL;
-        error = in6_mc_join(ifp, &in6, NULL, &in6m, 0);
-        if (error)
-            goto cleanup;
-        im6o->im6o_membership[1] = in6m;
-        im6o->im6o_num_memberships++;
}

+    /* join solicited multicast address */
+    bzero(&in6, sizeof(in6));
+    in6.s6_addr16[0] = htons(0xff02);
+    in6.s6_addr32[1] = 0;
+    in6.s6_addr32[2] = htonl(1);
+    in6.s6_addr32[3] = sin6->sin6_addr.s6_addr32[3];
+    in6.s6_addr8[12] = 0xff;
+    if (in6_setscope(&in6, ifp, NULL) != 0)
+        goto cleanup;
+    in6m = NULL;
+    error = in6_mc_join(ifp, &in6, NULL, &in6m, 0);
+    if (error)
+        goto cleanup;
+    im6o->im6o_membership[1] = in6m;
+    im6o->im6o_num_memberships++;
+
if (!ifp->if_carp) {
cif = malloc(sizeof(*cif), M_CARP,
M_WAITOK|M_ZERO);

Une fois le noyau de l’hôte patché, le test par ping externe est concluant.

Patch : [Téléchargement introuvable]

Linux : gérer et limiter la mise en swap

Sous Linux, il est possible de gérer la façon dont le noyau met en swap les données par le biais du paramètre noyau vm.swappiness dont la valeur varie entre 0 et 100. Plus cette valeur est grande, plus le système aura recours rapidement à la mise en swap, tandis qu’une valeur faible l’évitera ce qui améliorera la réactivité de la machine.

Par exemple, dans le cas d’un serveur MySQL avec suffisamment de RAM, la mise à 0 du paramètre est utile :

burns ~ # sysctl vm.swappiness=0

Évidemment, il faut s’appuyer sur le monitoring pour éviter de faire n’importe quoi.

Haut de page