Uncomplicated Firewall (UFW) non blocca nulla quando si utilizza Docker


44

Questa è la prima volta che installo un server Ubuntu (14.04 LTS) e non riesco a configurare il firewall (UFW).

Ho solo bisogno sshe http, quindi, sto facendo questo:

sudo ufw disable

sudo ufw reset
sudo ufw default deny incoming
sudo ufw default allow outgoing

sudo ufw allow 22/tcp
sudo ufw allow 80/tcp

sudo ufw enable
sudo reboot

Ma posso ancora collegarmi ai database su altre porte di questa macchina . Qualche idea su cosa sto facendo di sbagliato?

EDIT : questi database sono su contenitori Docker. Questo potrebbe essere correlato? sta scavalcando la mia configurazione?

EDIT2 : output disudo ufw status verbose

Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), deny (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW IN    Anywhere
80/tcp                     ALLOW IN    Anywhere
22/tcp (v6)                ALLOW IN    Anywhere (v6)
80/tcp (v6)                ALLOW IN    Anywhere (v6)

quale database? quale porta? Sei sicuro che sia la stessa macchina? qual è l'output di ufw status
solsTiCe

@solsTiCe sì, sono sicuro che sia la stessa macchina. Il database è InfluxDB (su un contenitore docker) con porte 8083e 8086. Ho aggiunto l' ufw status verboseoutput nella domanda. Grazie.
ESala,

Risposte:


64

Il problema stava usando la -pbandiera sui contenitori.

Si scopre che Docker apporta modifiche direttamente sul tuo iptables, che non sono mostrate con ufw status.

Le possibili soluzioni sono:

  1. Smetti di usare la -pbandiera. Utilizzare invece collegamenti docker o reti docker .

  2. Associare i contenitori localmente in modo che non siano esposti all'esterno della macchina:

    docker run -p 127.0.0.1:8080:8080 ...

  3. Se si insiste sull'uso della -pbandiera, dire alla finestra mobile di non toccarla iptablesdisabilitandola /etc/docker/daemon.jsone riavviando:

    { "iptables" : false }

Raccomando l'opzione 1 o 2. Attenzione che l'opzione 3 ha effetti collaterali , come i container che non riescono a connettersi a Internet.


8
Questo è così utile - Stavo impazzendo con la possibilità di accedere alle porte che non avevo permesso in ufw. L'uso di iptables = false si interrompe molto, come i contenitori che diventano accessibili su localhost, ad esempio per il proxy inverso. Meglio assicurarsi che il contenitore ascolti correttamente, non usare -p 80:80 ma usare -p 127.0.0.1:80:80 o una porta diversa come 127.0.0.1:3000:80 per il proxy inverso con nginx o apache e nessuna porta scontri.
Andreas Reiff,

2
@AndreasReiff hai ragione, ma ultimamente ho trovato il modo migliore per evitare -pil più possibile. Ad esempio, nel caso di un proxy inverso, non eseguo il mapping di alcuna porta per i contenitori di lavoro, quindi inserisco nginx nel suo contenitore con -p 80:80e --linka sugli altri. In questo modo non ci possono essere scontri con le porte e l'unico punto di accesso è tramite nginx.
ESala,

1
Controlla anche questo post per una terza precauzione che devi prendere! svenv.nl/unixandlinux/dockerufw
Henk

1
Importante : /etc/default/dockerè un file di configurazione utilizzato dalla configurazione upstart. Se sei passato da upstart a systemd, questo file non verrà utilizzato.
Orshachar,

@ESala Dovresti pensare a deselezionare questa risposta come corretta poiché è datata.
ctbrown,

8

16.04 presenta nuove sfide. Ho fatto tutti i passaggi come mostrato Running Docker dietro il firewall ufw MA NON sono riuscito a far funzionare docker più UFW su 16.04. In altre parole, qualunque cosa facessi, tutte le porte docker sono diventate globalmente esposte a Internet. Fino a quando non ho trovato questo: Come impostare Docker 1.12+ su NON interferire con IPTABLES / FirewallD

Ho dovuto creare il file /etc/docker/daemon.jsone inserire quanto segue:

{
    "iptables": false
}

Ho poi emesso sudo service docker stopquindi sudo service docker startFINALMENTE finestra mobile è semplicemente seguendo le regole appropriate nel UFW.

Dati aggiuntivi: Docker ignora UFW!


Con Ubuntu 16.04 e Docker versione 17.09, questa soluzione interrompe la connessione in uscita dai contenitori. Vedi risposta askubuntu.com/a/833363/262702 e askubuntu.com/a/954041/262702
ctbrown,

5

Se stai usando il sistema init di systemd (Ubuntu 15.10 e versioni successive) modifica /etc/docker/daemon.json(potrebbe essere necessario crearlo se non esiste), assicurati che abbia la iptableschiave configurata:

{   "iptables" : false }

EDIT : questo potrebbe farti perdere la connessione a Internet dall'interno dei container

Se hai abilitato UFW, verifica di poter accedere a Internet dall'interno dei contenitori. se non - è necessario definire DEFAULT_FORWARD_POLICYcome ACCEPTsu /etc/default/ufwe applicare il trucco descritto qui: https://stackoverflow.com/a/17498195/507564


2

Una soluzione rapida è quando si esegue Docker e si esegue il mapping delle porte. Puoi sempre fare

docker run ...-p 127.0.0.1:<ext pot>:<internal port> ...

per impedire l'accesso alla Docker dall'esterno.


2

Uso /etc/docker/daemon.jsoncon contenuto

{
  "iptables": false
}

potrebbe sembrare una soluzione ma funziona solo fino al prossimo riavvio . Dopodiché potresti notare che nessuno dei tuoi contenitori ha accesso a Internet, quindi non puoi ad esempio eseguire il ping di alcun sito Web. Potrebbe essere un comportamento indesiderato.

Lo stesso vale per l'associazione di un contenitore a un IP specifico. Potresti non volerlo fare. L'ultima opzione è quella di creare un contenitore e averlo dietro UFW, non importa cosa succede e come si crea questo contenitore, quindi c'è una soluzione:

Dopo aver creato il /etc/docker/daemon.jsonfile, invoca:

sed -i -e 's/DEFAULT_FORWARD_POLICY="DROP"/DEFAULT_FORWARD_POLICY="ACCEPT"/g' /etc/default/ufw
ufw reload

quindi imposti la politica di inoltro predefinita in UFW per accettare e usi:

iptables -t nat -A POSTROUTING ! -o docker0 -s 172.17.0.0/16 -j MASQUERADE

Se stai per usare docker-compose, allora l'IP dal comando sopra dovrebbe essere sostituito con IP della rete docker-compose crea quando lo esegui docker-compose up.

Ho descritto il problema e la soluzione in modo più completo in questo articolo

Spero che sia d'aiuto!


1

Nel mio caso ho finito per modificare iptables per consentire l'accesso a Docker solo da IP specifici.

Secondo la risposta di ESala :

Se usi -pflag sui container Docker apporta le modifiche direttamente a iptables, ignorando la ufw.

Esempio di record aggiunti a iptables da Docker

Instradamento alla catena "DOCKER":

-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER

Inoltro di pacchetti dalla catena "DOCKER" al contenitore:

-A DOCKER -i docker0 -j RETURN
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 6379 -j DNAT --to-destination 172.17.0.3:6379

È possibile modificare iptables per consentire l'accesso alla catena DOCKER solo dall'IP sorgente specificato (ad es. 1.1.1.1):

-A PREROUTING -s 1.1.1.1 -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT -s 1.1.1.1 ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER

È possibile che si desideri utilizzare iptables-save > /tmp/iptables.confe iptables-restore < /tmp/iptables.confscaricare, modificare e ripristinare le regole di iptables.


0

Usa --network = host quando avvii il container in modo che la finestra mobile mapperà la porta su una rete solo host isolata invece della rete bridge predefinita. Non vedo alcun modo legale per bloccare la rete con bridge. In alternativa è possibile utilizzare la rete personalizzata definita dall'utente con isolamento.


0
  1. Accedi alla tua console docker:

    sudo docker exec -i -t docker_image_name / bin / bash

  2. E poi nella tua console docker:

    sudo apt-get update
    sudo apt-get install ufw
    sudo ufw allow 22
    
  3. Aggiungi le tue regole ufw e abilita ufw

    sudo ufw enable

    • L'immagine Docker deve essere avviata con --cap-add = NET_ADMIN

Per abilitare l'opzione Docker "NET_ADMIN":

1. Fermare il contenitore:

la finestra mobile ferma il tuo contenitore; 2. Ottieni ID contenitore:

la finestra mobile ispeziona il contenitore; 3.Modifica hostconfig.json (percorso docker predefinito: / var / lib / docker, è possibile modificare il proprio)

vim /var/lib/docker/containers/containerid/hostconfig.json

4. Cerca "CapAdd" e modifica null in ["NET_ADMIN"];

...., "VolumesFrom": null, "CapAdd": ["NET_ADMIN"], "CapDrop": null, .... 5. Riavvia la finestra mobile nella macchina host;

riavvio della finestra mobile di servizio; 6.Avvia il tuo connettore;

docker avvia il tuo contenitore;


0

docker-composeAvviavo diversi container e ho anche avuto il problema che una porta era esposta al mondo ignorando le regole uww.

La correzione per rendere la porta disponibile solo per i miei contenitori docker è stata questa modifica nel mio docker-compose.ymlfile:

ports:
- "1234:1234"

a questa:

ports:
- "1234"

Ora gli altri container docker possono ancora utilizzare la porta, ma non riesco ad accedervi dall'esterno.

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.