LXC, redirection de port et iptables

8

J'ai un conteneur LXC ( 10.0.3.2) en cours d'exécution sur un hôte. Un service s'exécute à l'intérieur du conteneur sur le port 7000.

Depuis l'hôte ( 10.0.3.1, lxcbr0), je peux accéder au service:

$ telnet 10.0.3.2 7000
Trying 10.0.3.2...
Connected to 10.0.3.2.
Escape character is '^]'.

J'aimerais rendre le service accessible à l'intérieur du conteneur accessible au monde extérieur. Par conséquent, je veux transférer le port 7002sur l'hôte vers le port 7000sur le conteneur:

iptables -t nat -A PREROUTING -p tcp --dport 7002 -j DNAT --to 10.0.3.2:7000

Ce qui donne ( iptables -t nat -L):

DNAT   tcp  --  anywhere     anywhere     tcp dpt:afs3-prserver to:10.0.3.2:7000

Pourtant, je ne peux pas accéder au service depuis l'hôte en utilisant le port redirigé:

$ telnet 10.0.3.1 7002
Trying 10.0.3.1...
telnet: Unable to connect to remote host: Connection refused

J'ai l'impression de manquer quelque chose de stupide ici. Quelles choses dois-je vérifier? Quelle est une bonne stratégie pour déboguer ces situations?

Pour être complet, voici comment iptablessont définis sur l'hôte:

iptables -F
iptables -F -t nat
iptables -F -t mangle
iptables -X

iptables -P INPUT DROP
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

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

iptables -t nat -A PREROUTING -p tcp --dport 7002 -j DNAT --to 10.0.3.2:7000
Roberto Aloi
la source
Avez-vous vérifié la INPUTchaîne? Peut-être que la politique est REJECTlà.
Michael Härtl
La politique estACCEPT
Roberto Aloi
Désolé, je voulais dire la FORWARDchaîne. Vérifiez également si le transfert IP est activé: cat /proc/sys/net/ipv4/ip_forward.
Michael Härtl
ip_forwardest fixé à1
Roberto Aloi
FORWARDla politique est aussiACCEPT
Roberto Aloi

Réponses:

3

Il semble que vous ayez bloqué le port 7002 sur 10.0.3.1 car votre stratégie par défaut est DROP

Essayez de l'ajouter aux règles INPUT:

iptables -A INPUT -p tcp --dport 7002 -j ACCEPT
initié
la source
1

J'ai rencontré le même problème. Je n'ai pas encore trouvé de solution, mais après je note quelques observations.

J'ai une ${host}machine hôte (Ubuntu 12.04) et elle exécute une machine invitée via LXC. L'invité est IP 10.0.3.248activé et la passerelle est 10.0.3.1. J'exécute un serveur Web dans l'invité et je souhaite transférer le trafic de ${host}:8888à 10.0.3.248:80. Voici les entrées iptables pertinentes:

-A PREROUTING -p tcp --dport 8888 -j DNAT --to-destination 10.0.3.248:80
-A POSTROUTING -j MASQUERADE

Avec la configuration actuelle, je peux visiter le serveur Web avec succès le 10.0.3.248:80 à partir d'une autre machine physique. Cependant, il échoue lorsque j'essaie de visiter 10.0.3.248:80 à partir de ${host}. Vous pouvez peut-être essayer de visiter ce service dans LXC à partir d'une autre machine.

Ma compréhension est que, lorsque je visite depuis ${host}, le paquet passe par l'interface de bouclage et entre directement dans la chaîne INPUT. Bien que j'autorise tout sur INPUT, il n'y a pas de service d'écoute sur ${host}:8888. De Wireshark, je vois un RST est envoyé reçu. Lorsque je visite depuis une autre machine physique, le paquet entre dans la chaîne PREROUTING et a été édité par DNAT comme prévu.

Un poste connexe:

user199716
la source
0

Je devais ajouter une règle FORWARD

iptables -A FORWARD -p tcp -d 10.0.3.2 --dport 7002 -j ACCEPT
teknopaul
la source
0

ok, mes 5 cents de l'année 2018:

J'ai installé LXC et joué avec. Mon IP de conteneur est10.0.0.10

J'ai ajouté cette règle:

iptables -t nat -A PREROUTING -p tcp -i ens192 --dport 81 -j DNAT --to-destination 10.0.0.10:22

Cela n'a pas fonctionné. Puis j'ai réalisé que même la politique FORWARD est ACCEPT, il y a une règle qui bloque tous les FORWARD.

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     all  --  *      virbr0  0.0.0.0/0            10.0.0.0/24          ctstate RELATED,ESTABLISHED
    0     0 ACCEPT     all  --  virbr0 *       10.0.0.0/24          0.0.0.0/0           
    0     0 ACCEPT     all  --  virbr0 virbr0  0.0.0.0/0            0.0.0.0/0           
    5   268 REJECT     all  --  *      virbr0  0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
    0     0 REJECT     all  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

J'ai donc dû injecter la règle en haut:

iptables -I FORWARD -p tcp -d 10.0.0.10 --dport 22 -j ACCEPT

Maintenant en avant host:81-> 10.0.0.10:22fonctionne.

pseudo
la source
-2

Votre conteneur est accessible à partir du LAN via une interface de pont hôte, et donc connecté au même sous-réseau que l'hôte.

Vous devez demander à votre routeur de transmettre ces ports à votre conteneur.

mVincent
la source