logo Debian Debian Debian-France Debian-Facile Debian-fr.org Forum-Debian.fr Debian ? Communautés logo inclusivité

Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).

#1 29-12-2016 17:26:09

totof68
Membre
Lieu : Colmar
Inscription : 09-02-2015

Problème réseau avec LXC

Bien le bonjour tout le monde.

Voila je commence à devenir fou avec iptables, le pire sur un truc que j'ai déjà fait, qui fonctionnait... mais j'ai voulu repartir de zéro. Et la je ne sais pas du tout pourquoi cela bloque.

Alors pour vous faire un récap de ce que cela doit faire au final :
J'ai un serveur, avec LXC qui tourne, et pour le moment, pour les test, juste un www et un mysql
IP du serveur : 192.168.1.4
IP de br0 : 192.168.10.254
IP WWW : 192.168.10.3
IP MYSQL : 192.168.10.4

Du coup, voici toutes la mise en place, avec les tests, je vois ou cela coince, mais j'ai aucune idée du pourquoi

- Mise en place des dépots backport

echo "deb http://httpredir.debian.org/debian jessie-backports main contrib non-free" >> /etc/apt/sources.list && apt-get update



- Installation LXC

apt-get install lxc=1:2.0.6-1~bpo8+1 bridge-utils



- Vérification LXC

Kernel configuration not found at /proc/config.gz; searching...
  Kernel configuration found at /boot/config-3.16.0-4-amd64
  --- Namespaces ---
  Namespaces: enabled
  Utsname namespace: enabled
  Ipc namespace: enabled
  Pid namespace: enabled
  User namespace: enabled
  Network namespace: enabled
  Multiple /dev/pts instances: enabled

  --- Control groups ---
  Cgroup: enabled
  Cgroup clone_children flag: enabled
  Cgroup device: enabled
  Cgroup sched: enabled
  Cgroup cpu account: enabled
  Cgroup memory controller: enabled
  Cgroup cpuset: enabled

  --- Misc ---
  Veth pair device: enabled
  Macvlan: enabled
  Vlan: enabled
  Bridges: enabled
  Advanced netfilter: enabled
  CONFIG_NF_NAT_IPV4: enabled
  CONFIG_NF_NAT_IPV6: enabled
  CONFIG_IP_NF_TARGET_MASQUERADE: enabled
  CONFIG_IP6_NF_TARGET_MASQUERADE: enabled
  CONFIG_NETFILTER_XT_TARGET_CHECKSUM: enabled
  FUSE (for use with lxcfs): enabled

  --- Checkpoint/Restore ---
  checkpoint restore: enabled
  CONFIG_FHANDLE: enabled
  CONFIG_EVENTFD: enabled
  CONFIG_EPOLL: enabled
  CONFIG_UNIX_DIAG: enabled
  CONFIG_INET_DIAG: enabled
  CONFIG_PACKET_DIAG: enabled
  CONFIG_NETLINK_DIAG: enabled
  File capabilities: enabled

  Note : Before booting a new kernel, you can check its configuration
  usage : CONFIG=/path/to/config /usr/bin/lxc-checkconfig



- Activation du forward dans le fichier /etc/sysctl.conf

net.ipv4.ip_forward=1



- Application des modifications

sysctl -p



- Activation du masquerade eth0

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE



Résultat 


15:06 [ root @ dev ][  /etc/apt ] >  iptables -L -t nat -nv
    Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
    pkts bytes target     prot opt in     out     source               destination        

    Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
    pkts bytes target     prot opt in     out     source               destination        

    Chain OUTPUT (policy ACCEPT 1 packets, 160 bytes)
    pkts bytes target     prot opt in     out     source               destination        

    Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
    pkts bytes target     prot opt in     out     source               destination        
    1   160 MASQUERADE  all  --  *      eth0    0.0.0.0/0
 



- Activation de l'interface br0
Fichier /etc/network/interfaces


auto br0
iface br0 inet static
address 192.168.10.254
netmask 255.255.255.0
bridge_ports none
 



Avec un ifup


br0       Link encap:Ethernet  HWaddr 02:d3:f7:cc:24:91  
      inet adr:192.168.10.254  Bcast:192.168.10.255  Masque:255.255.255.0
      adr inet6: fe80::d3:f7ff:fecc:2491/64 Scope:Lien
      UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
      RX packets:0 errors:0 dropped:0 overruns:0 frame:0
      TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 lg file transmission:0
      RX bytes:0 (0.0 B)  TX bytes:508 (508.0 B)



Création du WWW


lxc-create -n www -t debian -- -r wheezy
 



Config réseau WWW


lxc.network.type = veth
    # Nom de l'interface pont
    lxc.network.link = br0
    # IP conteneur
    lxc.network.ipv4 = 192.168.10.3/24
    # Définissez la passerelle pour avoir un accès à Internet
    lxc.network.ipv4.gateway = 192.168.10.254
 



Vérification


15:29 [ root @ dev ][  /etc/apt ] >  lxc-ls --fancy
    NAME STATE   AUTOSTART GROUPS IPV4         IPV6
    www  RUNNING 0         -      192.168.10.3 -  
 



La on regarde si le CT arrive à joindre le monde merveilleux d'internet


15:29 [ root @ dev ][  /etc/apt ] >  lxc-attach -n www
    root@www:/etc/apt# apt-get update
    Réception de : 1 http://security.debian.org wheezy/updates Release.gpg [1 554 B]
    Réception de : 2 http://security.debian.org wheezy/updates Release [39,0 kB]              
    Réception de : 3 http://security.debian.org wheezy/updates/main amd64 Packages [457 kB]
    Atteint http://httpredir.debian.org wheezy Release.gpg                  
    Atteint http://httpredir.debian.org wheezy Release                      
    Réception de : 4 http://security.debian.org wheezy/updates/main Translation-en [251 kB]                                                        
    Atteint http://httpredir.debian.org wheezy/main amd64 Packages                                                                                  
    Réception de : 5 http://httpredir.debian.org wheezy/main Translation-fr [751 kB]                                                                      
    Réception de : 6 http://httpredir.debian.org wheezy/main Translation-en [3 846 kB]                                                                        
    5 346 ko réceptionnés en 7s (752 ko/s)                                                                                                                                
    Lecture des listes de paquets... Fait
 



Mais c'est que ça marche, c'est cool, maintenant on installe apache


root@www:/etc/apt# apt-cache policy apache2
    apache2:
      Installé : 2.2.22-13+deb7u7
      Candidat : 2.2.22-13+deb7u7  
 



On se dit, un petit DNAT et on en parle plus

iptables -t nat -A PREROUTING -i eth0 --dst 192.168.1.4 -p tcp --dport 80 -j DNAT --to-destination 192.168.10.3



On vérifie


15:34 [ root @ dev ][  /etc/apt ] >  iptables -L -t nat -nv
    Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
     pkts bytes target     prot opt in     out     source               destination        
      0     0 DNAT       tcp  --  eth0   *       0.0.0.0/0            192.168.1.4          tcp dpt:80 to:192.168.10.3

    Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
     pkts bytes target     prot opt in     out     source               destination        

    Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
     pkts bytes target     prot opt in     out     source               destination        

    Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
     pkts bytes target     prot opt in     out     source               destination        
      441 27711 MASQUERADE  all  --  *      eth0    0.0.0.0/0            0.0.0.0/0



Et la c'est le drame, cela ne marche pas, on ne peut pas joindre 192.168.1.4 (qui doit renvoyer vers 10.3) depuis un client 1.69 par exemple.

Par contre,  maintenant si je passe le masquerade sur br0, j'arrive à joindre 192.168.1.4 qui redirige bien vers le CT WWW 10.3. Mais par contre, dans un conteneur, on ne peut plus faire un simple apt-get update big_smile

Maintenant, je change encore mon masquerade pour avoir ceci :


17:03 [ root @ dev ][  /home/totof ] >  iptables -L -nv
        Chain INPUT (policy ACCEPT 1132 packets, 70056 bytes)
         pkts bytes target     prot opt in     out     source               destination        
          0     0 LOG        tcp  --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp spt:80 LOG flags 0 level 4 prefix "INPUT packets"

        Chain FORWARD (policy ACCEPT 6166 packets, 5725K bytes)
         pkts bytes target     prot opt in     out     source               destination        
         2338  131K LOG        tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 LOG flags 0 level 4 prefix "FORWARD packets"
         3785 5585K LOG        tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp spt:80 LOG flags 0 level 4 prefix "FORWARD packets"

        Chain OUTPUT (policy ACCEPT 1347 packets, 821K bytes)
         pkts bytes target     prot opt in     out     source               destination        
          0     0 LOG        tcp  --  *      eth0    0.0.0.0/0            0.0.0.0/0            tcp dpt:80 LOG flags 0 level 4 prefix "OUTPUT packets"
   
       
        17:03 [ root @ dev ][  /home/totof ] >  iptables -L -t nat -nv
        Chain PREROUTING (policy ACCEPT 19 packets, 1902 bytes)
         pkts bytes target     prot opt in     out     source               destination        
           20  1962 LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0            LOG flags 0 level 4 prefix "PREROUTING packets"
          1    60 DNAT       tcp  --  eth0   *       0.0.0.0/0            192.168.1.4          tcp dpt:80 to:192.168.10.3

        Chain INPUT (policy ACCEPT 1 packets, 240 bytes)
         pkts bytes target     prot opt in     out     source               destination        

        Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
         pkts bytes target     prot opt in     out     source               destination        
          0     0 LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0            LOG flags 0 level 4 prefix "OUTPUT NAT packets"

        Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
         pkts bytes target     prot opt in     out     source               destination        
           19  1722 LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0            LOG flags 0 level 4 prefix "POSTROUTING packets"
           19  1722 MASQUERADE  all  --  *      *       0.0.0.0/0            0.0.0.0/0



Et la nickel, je peux joindre 1.4 --> 10.3 ET un update depuis un WWW

La ou ça va bloquer, c'est que j'ai un CT MYSQL et un WWW.


CREATE USER 'test'@'192.168.10.3' IDENTIFIED BY 'test';
Query OK, 0 rows affected (0.00 sec)
CREATE DATABASE TEST;
Query OK, 1 row affected (0.00 sec)
GRANT ALL PRIVILEGES ON TEST.* TO 'test'@'192.168.10.3';
Query OK, 0 rows affected (0.00 sec)
FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
root@www:/# mysql -h 192.168.10.4 -u test -p
Enter password:
ERROR 1130 (HY000): Host '192.168.10.254' is not allowed to connect to this MySQL server
 



Je vois bien que le soucis viens du masquerade, par contre je n'arrive pas a comprendre pourquoi. Je sais que cela fonctionnais bien avant.
A la fin, iptables sera en DROP par défaut, et j'aurais une règle FORWARD ACCEPT uniquement entre WWW et MYSQL pour le port 3306.

Quelqu'un aurais une petite idée ?

Hors ligne

#2 29-12-2016 19:21:43

totof68
Membre
Lieu : Colmar
Inscription : 09-02-2015

Re : Problème réseau avec LXC

Alors je ne sais pas si c'est un bug de brigde-utils ou pas, parce que je viens d'essayer avec libvirt... et comment dire, voici ce que j'ai fais :

Installation de libvirt

apt-get install libvirt-bin



Configuration du réseau libvirt (fichier /etc/libvirt/qemu/networks/default.xml)


<network>
                  <name>default</name>
                  <bridge name="virbr0"/>
                  <forward/>
                  <ip address="192.168.10.254" netmask="255.255.255.0">
                  <dhcp>
                    <range start="192.168.10.1" end="192.168.10.253"/>
                    <host mac="00:FF:AA:00:00:01" name="www.t89s.lan" ip="192.168.10.3" />
                    <host mac="00:FF:AA:00:00:02" name="mysql.t89s.lan" ip="192.168.10.4" />
                  </dhcp>
                  </ip>
                </network>
 



Configuration des machines

www


lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = virbr0
lxc.network.hwaddr = 00:FF:AA:00:00:01
lxc.network.ipv4 = 0.0.0.0/24
 



mysql


lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = virbr0
lxc.network.hwaddr = 00:FF:AA:00:00:02
lxc.network.ipv4 = 0.0.0.0/24
 



Redémarrage du serveur

Arrêt de l'interface br0

ifdown br0



Lancement de l'interface

virsh net-start default



Vérif


virbr0    Link encap:Ethernet  HWaddr fe:3a:41:33:87:cd  
          inet adr:192.168.10.254  Bcast:192.168.10.255  Masque:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:38 errors:0 dropped:0 overruns:0 frame:0
          TX packets:35 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 lg file transmission:0
          RX bytes:4159 (4.0 KiB)  TX bytes:4559 (4.4 KiB)
 



Démarrage du contenaire www et mysql
lxc-start -n www && lxc-start -n mysql   
                       
Vérif

       
18:50 [ root @ dev ][  /home/totof ] >  lxc-ls --fancy
NAME  STATE   AUTOSTART GROUPS IPV4         IPV6
mysql RUNNING 0         -      192.168.10.4 -    
www   RUNNING 0         -      192.168.10.3 -
 

   
                               
Rappel es règles iptables en cours


19:00 [ root @ dev ][  ~/scripts ] >  iptables -L -nv
Chain INPUT (policy ACCEPT 507 packets, 108K bytes)
 pkts bytes target     prot opt in     out     source               destination        
   56 78499 LOG        tcp  --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp spt:80 LOG flags 0 level 4 prefix "INPUT packets"

Chain FORWARD (policy ACCEPT 46 packets, 4408 bytes)
 pkts bytes target     prot opt in     out     source               destination        
   11  1243 LOG        tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 LOG flags 0 level 4 prefix "FORWARD packets"
    9  1180 LOG        tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp spt:80 LOG flags 0 level 4 prefix "FORWARD packets"

Chain OUTPUT (policy ACCEPT 340 packets, 45802 bytes)
 pkts bytes target     prot opt in     out     source               destination        
   57  3258 LOG        tcp  --  *      eth0    0.0.0.0/0            0.0.0.0/0            tcp dpt:80 LOG flags 0 level 4 prefix "OUTPUT packets"
 





19:08 [ root @ dev ][  ~/scripts ] >  iptables -L -t nat -nv
Chain PREROUTING (policy ACCEPT 6 packets, 560 bytes)
 pkts bytes target     prot opt in     out     source               destination        
    8   680 LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0            LOG flags 0 level 4 prefix "PREROUTING packets"
    2   120 DNAT       tcp  --  eth0   *       0.0.0.0/0            192.168.1.4          tcp dpt:80 to:192.168.10.3

Chain INPUT (policy ACCEPT 4 packets, 440 bytes)
 pkts bytes target     prot opt in     out     source               destination        

Chain OUTPUT (policy ACCEPT 2 packets, 123 bytes)
 pkts bytes target     prot opt in     out     source               destination        
    2   123 LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0            LOG flags 0 level 4 prefix "OUTPUT NAT packets"

Chain POSTROUTING (policy ACCEPT 4 packets, 240 bytes)
 pkts bytes target     prot opt in     out     source               destination        
    6   363 LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0            LOG flags 0 level 4 prefix "POSTROUTING packets"
    2   123 MASQUERADE  all  --  *      eth0    0.0.0.0/0            0.0.0.0/0
 



-> Test connexion sur 192.168.1.4 --> 10.3 --> OK


Dec 29 18:57:25 dev kernel: [  506.990443] PREROUTING packetsIN=eth0 OUT= MAC=00:22:68:4a:49:af:f4:6d:04:7f:78:fd:08:00 SRC=192.168.1.69 DST=192.168.1.4 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=45339 DF PROTO=TCP SPT=40132 DPT=80 WINDOW=29200 RES=0x00 SYN URGP=0
Dec 29 18:57:25 dev kernel: [  506.990462] FORWARD packetsIN=eth0 OUT=virbr0 MAC=00:22:68:4a:49:af:f4:6d:04:7f:78:fd:08:00 SRC=192.168.1.69 DST=192.168.10.3 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=45339 DF PROTO=TCP SPT=40132 DPT=80 WINDOW=29200 RES=0x00 SYN URGP=0
Dec 29 18:57:25 dev kernel: [  506.990468] POSTROUTING packetsIN= OUT=virbr0 SRC=192.168.1.69 DST=192.168.10.3 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=45339 DF PROTO=TCP SPT=40132 DPT=80 WINDOW=29200 RES=0x00 SYN URGP=0
Dec 29 18:57:25 dev kernel: [  506.990514] FORWARD packetsIN=virbr0 OUT=eth0 PHYSIN=vethUHDKBA MAC=fe:3a:41:33:87:cd:00:ff:aa:00:00:01:08:00 SRC=192.168.10.3 DST=192.168.1.69 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=0 DF PROTO=TCP SPT=80 DPT=40132 WINDOW=28960 RES=0x00 ACK SYN URGP=0
Dec 29 18:57:25 dev kernel: [  506.990788] FORWARD packetsIN=eth0 OUT=virbr0 MAC=00:22:68:4a:49:af:f4:6d:04:7f:78:fd:08:00 SRC=192.168.1.69 DST=192.168.10.3 LEN=52 TOS=0x00 PREC=0x00 TTL=63 ID=45340 DF PROTO=TCP SPT=40132 DPT=80 WINDOW=229 RES=0x00 ACK URGP=0
 




--> Tes de connexion www --> mysql --> OK


Dec 29 18:56:40 dev kernel: [  461.883934] PREROUTING packetsIN=virbr0 OUT= PHYSIN=vethUHDKBA MAC=00:ff:aa:00:00:02:00:ff:aa:00:00:01:08:00 SRC=192.168.10.3 DST=192.168.10.4 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=8184 DF PROTO=TCP SPT=38792 DPT=3306 WINDOW=29200 RES=0x00 SYN URGP=0
Dec 29 18:56:40 dev kernel: [  461.883943] POSTROUTING packetsIN= OUT=virbr0 PHYSIN=vethUHDKBA PHYSOUT=vethSOQ4QU SRC=192.168.10.3 DST=192.168.10.4 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=8184 DF PROTO=TCP SPT=38792 DPT=3306 WINDOW=29200 RES=0x00 SYN URGP=0
 



Du coup la je ne m'explique pas trop pourquoi cela marche avec libvirt mais ne fonctionne pas avec bridge utils. Au niveau de la conf des contenaires c'est la même, et le parefeu n'a pas changer depuis hier avec tous les test... Mais cela semble marcher

Hors ligne

#3 29-12-2016 23:34:55

raleur
Membre
Inscription : 03-10-2014

Re : Problème réseau avec LXC

iptables peut se comporter de façon inattendue avec un pont.
Utilise plutôt iptables-save pour lister les règles, c'est beaucoup plus lisible.
Il aurait fallu fournir la table de routage de chacune des machines impliquées (client, serveur, conteneur).

Il vaut mieux montrer que raconter.

Hors ligne

#4 30-12-2016 07:48:36

totof68
Membre
Lieu : Colmar
Inscription : 09-02-2015

Re : Problème réseau avec LXC

Je peux tout remettre sur br0 (sur le serveur de dev) et prendre les routes des host. Mais je ne pense pas que ce soit la route en cause.

Mais ce qui est bizarre, c'est que c'était soit la connexion port 80 qui fonctionnait, soit le 3306 mais pas les deux en même temps.

Hors ligne

#5 30-12-2016 11:25:30

raleur
Membre
Inscription : 03-10-2014

Re : Problème réseau avec LXC

Les tables de routage, c'est pour avoir une vue précise du routage sur ton réseau. Si tu as besoin de SNAT/MASQUERADE et de DNAT sur un réseau local privé, c'est probablement qu'il manque des routes quelque part. La table de routage du routeur peut aussi être utile.

Depuis quelle(s) adresse(s) essaies-tu de te connecter aux serveurs ?

Je pense que l'erreur avec MySQL vient justement du MASQUERADE sur br0 qui modifie l'adresse source du client, et l'adresse apparente n'est pas autorisée dans MySQL.

Pour info, quand je soupçonne un problème entre iptables et un pont je désactive l'interaction entre les deux avec la commande suivante pour vérifier :

sysctl -w net.bridge.bridge-nf-call-iptables=0

Dernière modification par raleur (30-12-2016 11:27:28)


Il vaut mieux montrer que raconter.

Hors ligne

Pied de page des forums