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 7002
sur l'hôte vers le port 7000
sur 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 iptables
sont 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
iptables
port-forwarding
lxc
Roberto Aloi
la source
la source
INPUT
chaîne? Peut-être que la politique estREJECT
là.ACCEPT
FORWARD
chaîne. Vérifiez également si le transfert IP est activé:cat /proc/sys/net/ipv4/ip_forward
.ip_forward
est fixé à1
FORWARD
la politique est aussiACCEPT
Réponses:
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:
la source
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é estIP 10.0.3.248
activé et la passerelle est10.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: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:
la source
Je devais ajouter une règle FORWARD
la source
ok, mes 5 cents de l'année 2018:
J'ai installé LXC et joué avec. Mon IP de conteneur est
10.0.0.10
J'ai ajouté cette règle:
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.
J'ai donc dû injecter la règle en haut:
Maintenant en avant
host:81
->10.0.0.10:22
fonctionne.la source
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.
la source