Karmaşık Güvenlik Duvarı (UFW) Docker kullanırken hiçbir şeyi engellemiyor


44

Bu benim ilk kez bir Ubuntu Sunucusu (14.04 LTS) kuruyor ve güvenlik duvarını (UFW) yapılandırmakta sorun yaşıyorum.

Sadece ihtiyacım var sshve httpbu yüzden bunu yapıyorum:

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

Ancak yine de bu makinenin diğer portlarındaki veritabanlarına bağlanabiliyorum . Neyi yanlış yapıyorum hakkında bir fikrin var mı?

EDIT : Bu veritabanları Docker kapsayıcılarındadır. Bu ilişkili olabilir mi? UFW yapılandırmamı geçersiz kılıyor mu?

EDIT2 : çıktısısudo 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)

hangi veritabanı hangi liman Aynı makine olduğundan emin misin? çıktıları ufw status
solsTiCe

@solsTiCe evet, aynı makine olduğundan eminim. Veritabanı bağlantı noktaları (a docker taşıyıcılar) InfluxDB olduğu 8083ve 8086. ufw status verboseSoruya çıktı ekledim . Teşekkürler.
ESala

Yanıtlar:


64

Sorun -pbayrağın konteynırlarda kullanılmasıydı.

Docker'ın, üzerinde iptablesgösterilmeyen doğrudan sizin üzerinde değişiklik yaptığı ortaya çıktı ufw status.

Olası çözümler:

  1. -pBayrağı kullanmayı bırak . Bunun yerine liman işçisi veya liman ağları kullanın.

  2. Kapları yerel olarak bağlayın, böylece makinenizin dışında kalmazlar:

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

  3. -pBayrağı kullanmakta ısrar ediyorsanız , docker'a iptables, devre dışı bırakıp /etc/docker/daemon.jsonyeniden başlatarak kendinize dokunmamasını söyleyin :

    { "iptables" : false }

Seçenek 1 veya 2'yi öneririm. Seçenek 3'ün , internete bağlanamayan kaplar gibi yan etkileri olduğunu unutmayın .


8
Bu çok faydalı - ufw'a izin vermediğim bağlantı noktalarına erişebildiğim için deliriyordum. İptables = false kullanıldığında çok kırılır, örneğin localhost'ta erişilebilir konteynırlar, örneğin ters proxy'ler için. Konteynırın doğru dinlendiğinden emin olmak daha iyidir, -p 80:80 kullanmayın, ancak -p 127.0.0.1:80:80 veya nginx veya apache ile ters proxy yapmak için ve 127.0.0.1:3000:80 gibi farklı bir port kullanın çatışmalar.
Andreas Reiff

2
@AndreasReiff haklısın, ama son zamanlarda -pmümkün olduğunca kaçınmak için en iyi buldum . Örneğin, ters proxy durumunda, çalışan kaplar için herhangi bir bağlantı noktasını eşleştirmiyorum ve sonra nginx'i diğer kaplara -p 80:80ve kendi kaplarına koyarız --link. Bu şekilde herhangi bir bağlantı noktası çatışması olamaz ve tek erişim noktası nginx'tir.
ESala

1
Ayrıca bu yazıyı almanız gereken üçüncü bir önlem için de kontrol edin! svenv.nl/unixandlinux/dockerufw
Henk

1
Önemli : /etc/default/dockerupstart config tarafından kullanılan bir yapılandırma dosyasıdır. Başlangıçtan sisteme geçtiyseniz, bu dosya kullanılmayacaktır.
orshachar

@ESala Bu cevabı işaretlendiğinden beri doğru olarak işaretlemeyi düşünmelisiniz.
ctbrown

8

16.04 yeni zorluklar sunuyor. Ben gösterildiği gibi tüm adımları yaptım UFW güvenlik duvarının arkasında Docker Koşu ANCAK ben 16.04 tarihinde işe liman işçisi artı UFW alamadım. Başka bir deyişle, ne yaparsam yapayım, tüm liman limanları küresel olarak internete maruz kaldı. Bunu bulana kadar: Docker 1.12+ 'yu IPTABLES / FirewallD ile etkileşime girmeyecek şekilde ayarlama

Dosyayı oluşturmak /etc/docker/daemon.jsonve şunu koymak zorunda kaldım :

{
    "iptables": false
}

Daha sonra yayınladıktan sudo service docker stopsonra sudo service docker startFINALLY docker UFW’de uygun kuralları izliyor.

Ek veri: Docker UFW!


Ubuntu 16.04 ve Docker 17.09 sürümüyle bu çözüm kaplardan giden bağlantıyı keser. Yanıtı görün askubuntu.com/a/833363/262702 ve askubuntu.com/a/954041/262702
ctbrown

5

İnit systemd sistemini kullanıyorsanız (Ubuntu 15.10 ve üstü) düzenleyin /etc/docker/daemon.json(mevcut değilse oluşturmanız gerekebilir), iptablesyapılandırılmış anahtar olduğundan emin olun :

{   "iptables" : false }

DÜZENLEME : Bu, internete bağlanmayı konteynerlerin içinden kaybetmenize neden olabilir

UFW'yi etkinleştirdiyseniz, internete konteynerlerin içinden erişebildiğinizi doğrulayın. değilse - Sen tanımlamanız gerekir DEFAULT_FORWARD_POLICYolarak ACCEPTüzerinde /etc/default/ufwve uygulamak hüner Burada anlatılan: https://stackoverflow.com/a/17498195/507564


2

Docker'ı çalıştırırken ve bağlantı noktası eşleştirmesini yaparken hızlı bir geçici çözümdür. Her zaman yapabilirsin

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

Docker'ınıza dışardan erişilmesini önlemek için.


2

/etc/docker/daemon.jsonİçeriği ile kullanımı

{
  "iptables": false
}

bir çözüm gibi gelebilir, ancak yalnızca bir sonraki yeniden başlatmaya kadar çalışır . Bundan sonra, konteynerlerinizden hiçbirinin İnternete erişimi olmadığını fark edebilirsiniz, böylece örneğin herhangi bir web sitesine ping gönderemezsiniz. İstenmeyen davranış olabilir.

Aynı şey bir kabın spesifik IP'ye bağlanması için de geçerlidir. Bunu yapmak istemeyebilirsin. Nihai seçenek, bir konteyner oluşturmak ve ne olduğu ve bu kabı nasıl oluşturduğunuzdan bağımsız olarak UFW'nin arkasında olmasını sağlamaktır , bu nedenle bir çözüm vardır:

Dosyayı oluşturduktan sonra /etc/docker/daemon.jsonçağır:

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

bu nedenle, kabul etmek için UFW’de varsayılan ileri politika ayarladınız ve

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

Docker-compose kullanmak üzereseniz, yukarıdaki IP from komutu, çalıştırırken oluşturulan docker-compose ağının IP'si ile değiştirilmelidir docker-compose up.

Problemi ve çözümü bu makalede daha kapsamlı bir şekilde tarif ettim.

Umarım yardımcı olur!


1

Benim durumumda Docker’a yalnızca belirli IP’lerden erişime izin vermek için iptables’ı değiştirdim.

Gereğince Esala cevabı :

-pKaplarda bayrak kullanıyorsanız Docker, ufw'yi yok sayarak doğrudan iptables üzerinde değişiklik yapar.

Docker tarafından iptables'a eklenen kayıtlara örnek

'DOCKER' zincirine yönlendirme:

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

Paketleri 'DOCKER' zincirinden kaba aktarma:

-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

DOCKER zincirine yalnızca belirtilen kaynak IP'den erişime izin vermek için iptables'ı değiştirebilirsiniz (örn. 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

İptables kurallarını kullanmak iptables-save > /tmp/iptables.conf, iptables-restore < /tmp/iptables.confbırakmak, düzenlemek ve geri yüklemek isteyebilirsiniz .


0

Konteyneri başlattığınızda --network = host kullanın, böylece docker, bağlantı noktasını varsayılan köprü ağı yerine yalıtılmış ana bilgisayar ağına eşler. Köprülü ağı engellemenin yasal bir yolunu görmüyorum. Alternatif olarak, özel kullanıcı tanımlı ağı yalıtımlı olarak kullanabilirsiniz.


0
  1. Liman konsolunuza giriş yapın:

    sudo liman işçisi exec -i -t docker_image_name / bin / bash

  2. Sonra liman konsolunuzda:

    sudo apt-get update
    sudo apt-get install ufw
    sudo ufw allow 22
    
  3. Ufw kurallarınızı ekleyin ve ufw'yi etkinleştirin

    sudo ufw etkinleştirme

    • Docker resminizin --cap-add = NET_ADMIN ile başlatılması gerekir.

"NET_ADMIN" Docker seçeneğini etkinleştirmek için:

1. Durdurma Konteyner:

liman işçisi konteynerini durdurur; 2. konteyner kimliği alın:

liman işçisi kontrol eder; 3. hostconfig.json (varsayılan docker yolu: / var / lib / docker, kendiniz değiştirebilirsiniz) değiştirin

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

4. "CapAdd" aratın ve [[NET_ADMIN "] olarak boş bırakın;

...., "VolumesFrom": null, "CapAdd": ["NET_ADMIN"], "CapDrop": null, .... 5. Ana makinede docker'ı başlatın;

servis limanını yeniden başlatma; 6.Konatlayıcınızı başlatın;

liman işçisi senin konteyneri başlat;


0

docker-composeBirkaç konteynır başlatmak için kullanılırdım ve aynı zamanda bir limanın dünyaya ufw kurallarını görmezden gelmesi sorunu vardı.

Bağlantı noktasını yalnızca liman konteynerlerimin kullanımına sunma düzeltmesi dosyamdaki değişiklik oldu docker-compose.yml:

ports:
- "1234:1234"

buna:

ports:
- "1234"

Şimdi diğer liman işçisi konteynırları hala limanı kullanabiliyor, fakat ben dışarıdan erişemiyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.