Docker ve Shorewall


17

Ben kullanıyorum Shorewall basit olarak benim sunucuda bağımsız güvenlik duvarı ve kullanmak istiyorum Docker sıra.

Bir Docker kapsayıcısı ve bağlantı noktası yeniden yönlendirme kullanarak, docker, geri çağrının yeniden başlatılması durumunda öldürülecek olan kendi iptables kurallarını / zincirlerini kurar. Böylece konteynere ulaşılamaz hale gelecektir .

Herkes bir yeniden başlatıldığında docker kurallarını kaydetmeyi / geri yüklemeyi başardı mı veya başka bir çözümü var mı?

Ayrıca bakınız:

Yanıtlar:


19

Aşağıdaki yapılandırma değişiklikleri, Docker ve Shorewall ana bilgisayarı arasındaki trafik akışını sağlamalıdır. Shorewall 4.5.21.9 üzerinde test edilmiştir, ancak en son sürümler için geçerli olmalıdır:

/etc/shorewall/shorewall.conf

IP yönlendirmenin etkin olduğundan emin olun (çoğu yapılandırma öğesi Evet / Hayır, ancak bu "Açık"):

IP_FORWARDING=On

/ Etc / shorewall / Maske

Özel Docker ağınız için masquerading'i (NAT) etkinleştirin (farklı bir ağ kullanıyorsanız, yani docker'ı başlattıysanız --bip=#.#.#.#/#, buna göre değiştirin). eth0Harici bağlantı ile ana makinedeki herhangi bir arayüzle değiştirin :

#INTERFACE:DEST         SOURCE
eth0                    172.17.0.0/16

/ Etc / shorewall / arayüzleri

Shorewall'ın dockbölgenin hangi arayüzüyle ilgili olduğunu bilmesi için bir arayüz girişi ekleyin :

#ZONE           INTERFACE               OPTIONS
dock            docker0

/ Etc / shorewall / bölgeleri

Yeni bir bölge oluşturun; not, dockerçok uzun ve "geçersiz bölge adı" hatasına neden olacak.

#ZONE   INTERFACE
dock    ipv4

/ Etc / shorewall / politika

Muhtemelen Docker kapsayıcılarının ana makine ve Internet ile konuşmasına izin vermek istersiniz , bu nedenle bu iyi bir başlangıç ​​noktasıdır:

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

Ayrıca benzer bir gerekebilir ACCEPTgelen trafik için politikayı fwiçin dockhalihazırda bu kadar açık olmasaydı, fwhiç all.

Bunu, ilke veya kural dosyalarında gerektiği gibi daha da sıkılaştırabilirsiniz . Örneğin, yukarıdakiler dışarıdaki trafiğin Docker kapsayıcılarınıza ulaşmasına açıkça izin vermez; bunun için diğer bölgelerinizi / politikalarınızı / kurallarınızı kontrol edin.


1
IP_FORWARDING=Yesve IP_FORWARDING=Trueçalışmak. Birkaç üretim yönlendiricisine sahibim, ancak cevabınız benimkinden çok daha net. Harika iş.
Aaron C. de Bruyn

Cehaletimi affet - verilen kuralları ekledikten sonra shorewall'u yeniden başlattığımda, dock'un "BOŞ ARAYÜZ" olduğu konusunda bir uyarı alıyorum ... ve aslında, yukarıdakileri okumak, shorewall'ın 172.17 adresleri ve 'dock' bölgesi. Shorewall'un nasıl çalıştığı hakkında bariz bir şey mi kaçırıyorum?
John Clements

Üzgünüm, arayüz dosyasındaki bir değişikliği kaçırdım. Cevabı düzenledim, yeni bölüme bakın /etc/shorewall/interfaces.
fazy

Teşekkür ederim. Ev sahibinin konteynırlarına katılması için shorewall 5 (liman işçisine duyarlı) ile de iyi çalışıyor.
17'de Drasill

masq ayarları çok önemlidir, aksi halde bir docker-konteyner harici bir IP kullanarak başka bir konteynere erişemez - bloke olur
Eugen Mayer

6

Docker ağ yalıtım özelliğini sunduğundan, özel ağları kullanmak istiyorsanız burada belirtilen diğer çözümler artık yeterli değildir. Shorewall 5.0.6, Docker ağları dahil Docker desteği sunar . Bu:

  • Shorewall ve docker'ın herhangi bir sırada başlatılmasına / durdurulmasına / yeniden başlatılmasına izin verir
  • Bir uzantı komut dosyasının bakım ihtiyacını ortadan kaldırır

2

Sadece kutumda buldum. /Etc/shorewall.conf dosyasının şunlara sahip olduğundan emin olun:

IP_FORWARDING=Yes

Docker yönlendirmeye dayanıyor ve ben 'kukla'nın tüm sunucularımda' Hayır 'olarak ayarlamasını sağladım.

Güncelleme: Muhtemelen WAN arabiriminizden docker'dan gelen trafiği de maskelemeniz gerekir.

Düzenleyin /etc/shorewall/masqve aşağıdakine benzer bir satıra ihtiyacınız olacak:

br0 172.17.0.0/12

Bu durumda, WAN arayüzüm aslında br0 (bir köprü), ancak sizinki muhtemelen eth0 gibi bir şey olacak. ( ifconfigArayüzlerinizi ve IP adreslerini görmek için kullanın ). Makinemde docker, RFC1918 özel adres aralığı olan 172.17.0.0/24 kullanıyor. Bu, diğer sistemlerde farklılık gösterebilir, ancak ifconfigarayüzü aramak için aralığı bir kez daha kullanarak görebilirsiniz docker0.


2

Yeniden başlatma işleminden DOCKERönce zinciri kaydeden uzantı komut dosyaları oluşturarak Docker kural kümesinin bir ada çapında yeniden başlatmanın sağ kalmasını sağlayabilir ve daha sonra yeniden geri yükleyebilirsiniz. Sadece bunun nasıl yapılacağına dair bir örnek verdim, ancak tek olası yöntemden uzak olduğundan eminim.


0

Docker hizmeti, çalışan kapsayıcıları etkilemeden yeniden başlatılabilir ve Dorewall yeniden başlatıldıktan sonra docker'a özgü kuralları yeniden yüklemek için çalıştırılabilir. Açıkçası, konteynır (lar) a ağ bağlantısının kesildiği kısa bir süre olacaktır.

Bu en azından birkaç Archlinux kurulumumda geçerlidir.


0

Yenileme eylemi iptable'ı temizlemez, bu nedenle sadece kuralları veya politikaları yenilemek istiyorsanız, yeniden başlatma yerine yenileme çalıştırabilirsiniz:

sudo shorewall refresh

Açıkçası, gerçekten shorewall'u yeniden başlatmanız gerekiyorsa sorun hala devam ediyor. Ardından, bağlantı istasyonunu yeniden başlatmanız ve kaplarınızı yeniden yüklemeniz gerekir.


0

Olası bir seçenek Docker'ı ip yönlendirme ve NAT olmadan kapsayıcı uygulama erişim ana bilgisayar ağına izin vermek için --net = ana bilgisayar seçeneğiyle çalıştırmaktır.

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.