Docker e Shorewall


16

Sto usando Shorewall sul mio server come semplice firewall autonomo e vorrei usare anche Docker .

Usando un contenitore Docker e la sua finestra mobile di reindirizzamento delle porte imposta le proprie regole / catene iptables che verranno eliminate se il firewall viene riavviato. Quindi il contenitore diventerà irraggiungibile .

Qualcuno è riuscito a salvare / ripristinare le regole della finestra mobile al riavvio di una riva o qualcuno ha un'altra soluzione?

Guarda anche:

Risposte:


19

Le seguenti modifiche alla configurazione dovrebbero garantire il flusso del traffico tra Docker e l'host Shorewall. Testato su Shorewall 4.5.21.9 ma dovrebbe applicarsi alle versioni più recenti:

/etc/shorewall/shorewall.conf

Assicurati che l'IP forwarding sia abilitato (la maggior parte degli elementi di configurazione sono Sì / No, ma questo è "On"):

IP_FORWARDING=On

/ Etc / shorewall / masq

Abilita il mascheramento (NAT) per la tua rete Docker privata (se usi una rete diversa, ovvero avvii la finestra mobile con --bip=#.#.#.#/#, quindi cambi di conseguenza). Passare eth0a qualsiasi interfaccia sul computer host con connettività esterna:

#INTERFACE:DEST         SOURCE
eth0                    172.17.0.0/16

/ Etc / shorewall / interfacce

Aggiungi una voce di interfaccia in modo che Shorewall sappia a quale interfaccia docksi riferisce la zona:

#ZONE           INTERFACE               OPTIONS
dock            docker0

/ etc / shorewall / zone

Crea una nuova zona; nota, dockerè troppo lungo e causerà un errore "nome zona non valida".

#ZONE   INTERFACE
dock    ipv4

/ Etc / shorewall / Politica

Probabilmente vuoi consentire ai container Docker di comunicare con la macchina host e Internet, quindi questo è un buon punto di partenza:

#SOURCE         DEST            POLICY
# ...(other policies)...
dock            all             ACCEPT
# ...(other policies, catch-all)...

Potresti anche aver bisogno di una ACCEPTpolitica simile per il traffico da fwa dock, se non l'hai già aperto con fwa all.

Si può stringere questo ulteriormente nelle politiche o regole file, se necessario. Ad esempio, quanto sopra non consente esplicitamente al traffico esterno di raggiungere i container Docker; controlla le tue altre zone / politiche / regole per questo.


1
IP_FORWARDING=Yese IP_FORWARDING=Truefunziona pure. Ce l'ho su diversi router di produzione, ma la tua risposta è molto più chiara della mia. Ottimo lavoro.
Aaron C. de Bruyn,

Perdona la mia ignoranza: quando riavvio shorewall dopo aver aggiunto le regole fornite, ricevo un avviso che dock è una "INTERFACCIA VUOTA" ... e in effetti, leggendo quanto sopra, non mi è chiaro come shorewall possa inferire la connessione tra il 172.17 indirizzi e la zona 'dock'. Mi sto perdendo qualcosa di ovvio su come funziona la riva?
John Clements,

Scusatemi, ho perso una modifica nel file interfacce. Ho modificato la risposta, vedi nuova sezione /etc/shorewall/interfaces.
Fazy

Grazie. Funziona bene anche con shorewall 5 (che è compatibile con la finestra mobile), per consentire all'host di unire i propri container.
Drasill,

le impostazioni di masq sono molto importanti, altrimenti un docker-container non sarà in grado di accedere ad un altro container usando un IP esterno - verrà bloccato
Eugen Mayer,

6

Da quando Docker ha introdotto la sua funzione di isolamento della rete, le altre soluzioni menzionate qui non sono più sufficienti se si desidera utilizzare reti personalizzate. Shorewall 5.0.6 introduce il supporto per Docker incluse le reti Docker. Questo:

  • Consente di avviare / arrestare / riavviare shorewall e docker in qualsiasi ordine
  • Evita la necessità di mantenere uno script di estensione

2

L'ho appena scoperto sulla mia scatola. Assicurati che /etc/shorewall.conf abbia:

IP_FORWARDING=Yes

Docker si basa sull'inoltro e ho distanziato quel "pupazzo" impostandolo su "No" su tutti i miei server.

Aggiornamento: probabilmente dovrai anche mascherare il traffico proveniente dalla finestra mobile sulla tua interfaccia WAN.

Modifica /etc/shorewall/masqe avrai bisogno di una linea simile a:

br0 172.17.0.0/12

In questo caso, la mia interfaccia WAN è in realtà br0 (un bridge), ma probabilmente la tua sarà qualcosa come eth0. (Utilizzare ifconfigper visualizzare le interfacce e i loro indirizzi IP). Sulla mia macchina docker utilizza 172.17.0.0/24 che è un intervallo di indirizzi privati ​​RFC1918. Questo può differire su altri sistemi, ma puoi vedere l'intervallo usando ifconfigancora una volta per cercare l'interfaccia docker0.


2

È possibile assicurarsi che il set di regole Docker sopravviva a un riavvio del shorewall creando script di estensione che salvano la DOCKERcatena prima del riavvio e quindi lo ripristinano in seguito. Ho appena pubblicato un post con un esempio di come farlo , anche se sono sicuro che sia tutt'altro che l'unico metodo possibile.


0

Il servizio docker può essere riavviato senza influire sui contenitori in esecuzione e può essere eseguito dopo un riavvio di Shorewall per ricaricare le regole specifiche della finestra mobile. Ci sarà ovviamente un breve periodo in cui la rete ai container verrà interrotta.

Questo è vero almeno nelle mie poche installazioni di Archlinux.


0

L'azione di aggiornamento non elimina iptable, quindi se si desidera solo aggiornare regole o criteri, è possibile eseguire l'aggiornamento anziché riavviare:

sudo shorewall refresh

Ovviamente, il problema persiste se è davvero necessario riavviare shorewall. Quindi, è necessario riavviare la finestra mobile e riavviare i contenitori.


0

Un'opzione possibile è eseguire Docker con l'opzione --net = host, per consentire l'accesso host in container alla rete host senza inoltro ip e NAT.

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.