LXC, Port forwarding e iptables


8

Ho un container LXC ( 10.0.3.2) in esecuzione su un host. Un servizio è in esecuzione all'interno del contenitore sulla porta 7000.

Dall'host ( 10.0.3.1, lxcbr0), posso raggiungere il servizio:

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

Mi piacerebbe rendere il servizio all'interno del container accessibile al mondo esterno. Pertanto, desidero inoltrare la porta 7002sull'host alla porta 7000sul contenitore:

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

Che risulta in ( iptables -t nat -L):

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

Tuttavia, non riesco ad accedere al servizio dall'host utilizzando la porta inoltrata:

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

Sento che mi manca qualcosa di stupido qui. Quali cose dovrei controllare? Qual è una buona strategia per il debug di queste situazioni?

Per completezza, ecco come iptablessono impostati sull'host:

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

Hai controllato la INPUTcatena? Forse la politica è REJECTlì.
Michael Härtl,

La politica èACCEPT
Roberto Aloi,

Scusa, intendevo la FORWARDcatena. Controlla anche se l'IP forwarding è abilitato: cat /proc/sys/net/ipv4/ip_forward.
Michael Härtl,

ip_forwardè impostato su1
Roberto Aloi il

FORWARDla politica è ancheACCEPT
Roberto Aloi

Risposte:


3

Sembra che tu abbia bloccato la porta 7002 su 10.0.3.1 poiché la tua politica predefinita è DROP

Prova ad aggiungerlo alle regole INPUT:

iptables -A INPUT -p tcp --dport 7002 -j ACCEPT

1

Ho riscontrato lo stesso problema. Non ho ancora trovato una soluzione, ma in seguito annoto alcune osservazioni.

Ho una ${host}macchina host (Ubuntu 12.04) ed esegue una macchina ospite tramite LXC. L'ospite è acceso IP 10.0.3.248e il gateway lo è 10.0.3.1. Eseguo un server Web nel guest e desidero trasferire il traffico da ${host}:8888a 10.0.3.248:80. Di seguito sono riportate le voci relative a iptables:

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

Con la configurazione corrente, posso visitare con successo il server Web 10.0.3.248:80 da un'altra macchina fisica. Tuttavia, non riesce quando provo a visitare 10.0.3.248:80 da ${host}. Forse puoi provare a visitare quel servizio all'interno di LXC da un'altra macchina.

La mia comprensione è che, quando visito ${host}, il pacchetto passa attraverso l'interfaccia di loopback ed entra direttamente nella catena INPUT. Anche se consento tutto su INPUT, non è disponibile alcun servizio di ascolto ${host}:8888. Da WireShark, vedo che viene inviato un RST ricevuto. Quando visito un altro computer fisico, il pacchetto entra nella catena PREROUTING ed era DNAT-ed come previsto.

Un post correlato:


0

Avevo bisogno di aggiungere una regola FORWARD

iptables -A FORWARD -p tcp -d 10.0.3.2 --dport 7002 -j ACCEPT

0

ok, i miei 5 centesimi dall'anno 2018:

Ho installato LXC e ci ho giocato. Il mio IP contenitore è10.0.0.10

Ho aggiunto questa regola:

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

Non ha funzionato Poi ho capito che anche la politica FORWARD è ACCETTA, esiste una regola che blocca tutte le 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

Quindi ho dovuto iniettare la regola in alto:

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

Ora avanti host:81-> 10.0.0.10:22funziona.


-2

Il contenitore è accessibile dalla LAN tramite un'interfaccia bridge host e quindi connesso alla stessa sottorete dell'host.

È necessario che il router inoltri tali porte al proprio contenitore.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.