Docker & Shorewall

16

Saya menggunakan Shorewall di server saya sebagai firewall mandiri sederhana dan ingin menggunakan Docker juga.

Dengan menggunakan wadah Docker dan dock redirection port -nya membuat aturan / rantai iptables sendiri yang akan dimatikan jika shorewall dihidupkan ulang. Jadi wadah itu akan menjadi tidak terjangkau .

Apakah ada yang berhasil menyimpan / mengembalikan aturan buruh pelabuhan saat restart dinding atau apakah ada yang punya solusi lain?

Lihat juga:

jaltek
sumber

Jawaban:

19

Perubahan konfigurasi berikut harus memastikan aliran lalu lintas antara Docker dan host Shorewall. Diuji pada Shorewall 4.5.21.9 tetapi harus berlaku untuk versi terbaru:

/etc/shorewall/shorewall.conf

Pastikan penerusan IP diaktifkan (sebagian besar item konfigurasi Ya / Tidak, tetapi yang ini "Aktif"):

IP_FORWARDING=On

/ etc / shorewall / masq

Aktifkan penyamaran (NAT) untuk jaringan Docker pribadi Anda (jika Anda menggunakan jaringan yang berbeda, yaitu dengan meluncurkan docker --bip=#.#.#.#/#, lalu ubah sesuai itu). Ubah eth0ke antarmuka apa pun pada mesin host dengan konektivitas eksternal:

#INTERFACE:DEST         SOURCE
eth0                    172.17.0.0/16

/ etc / shorewall / interfaces

Tambahkan entri antarmuka sehingga Shorewall tahu antarmuka mana yang dockterkait dengan zona:

#ZONE           INTERFACE               OPTIONS
dock            docker0

/ etc / shorewall / zona

Buat zona baru; perhatikan, dockerterlalu panjang dan akan menyebabkan kesalahan "nama zona tidak valid".

#ZONE   INTERFACE
dock    ipv4

/ etc / shorewall / kebijakan

Anda mungkin ingin mengizinkan wadah Docker untuk berbicara dengan mesin host dan Internet, jadi ini adalah titik awal yang baik:

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

Anda mungkin juga perlu serupa ACCEPTkebijakan untuk lalu lintas dari fwke dock, jika Anda tidak sudah membukanya dengan fwke all.

Anda dapat memperketat ini lebih lanjut dalam file kebijakan atau aturan yang diperlukan. Misalnya, hal di atas tidak secara eksplisit mengizinkan lalu lintas luar untuk mencapai wadah Docker Anda; periksa zona / kebijakan / aturan Anda yang lain untuk itu.

membingungkan
sumber
1
IP_FORWARDING=Yesdan IP_FORWARDING=Truebekerja juga. Saya memilikinya di beberapa router produksi, tetapi jawaban Anda jauh lebih jelas daripada saya. Kerja bagus.
Aaron C. de Bruyn
Maafkan ketidaktahuan saya - ketika saya me-restart shorewall setelah menambahkan aturan yang diberikan, saya mendapat peringatan bahwa dock adalah "INTERFACE KOSONG" ... dan memang, membaca di atas, tidak jelas bagi saya bagaimana shorewall dapat menyimpulkan hubungan antara 172.17 alamat dan zona 'dermaga'. Apakah saya kehilangan sesuatu yang jelas tentang cara kerja shorewall?
John Clements
Maaf tentang itu, saya melewatkan perubahan dalam file antarmuka. Saya sudah mengedit jawabannya, lihat bagian baru /etc/shorewall/interfaces.
fazy
Terima kasih. Ini bekerja dengan baik juga dengan shorewall 5 (yang sadar buruh pelabuhan), untuk membuat host bergabung dengan wadahnya.
Drasill
pengaturan masq sangat penting, jika tidak buruh pelabuhan-wadah tidak akan dapat mengakses wadah lain menggunakan IP eksternal - itu akan diblokir
Eugen Mayer
6

Sejak Docker memperkenalkan fitur isolasi jaringannya, solusi lain yang disebutkan di sini tidak lagi memadai jika Anda ingin menggunakan jaringan khusus. Shorewall 5.0.6 memperkenalkan dukungan untuk Docker termasuk jaringan Docker. Ini:

  • Mengizinkan shorewall dan buruh pelabuhan untuk dimulai / dihentikan / dimulai ulang dalam urutan apa pun
  • Hindari perlunya mempertahankan skrip ekstensi
linuxhackerman
sumber
2

Baru saja menemukannya di kotak saya. Pastikan /etc/shorewall.conf memiliki:

IP_FORWARDING=Yes

Docker bergantung pada penerusan, dan saya mengatur bahwa 'boneka' membuatnya menjadi 'Tidak' di semua server saya.

Pembaruan: Anda mungkin juga perlu menyamarkan lalu lintas yang berasal dari buruh pelabuhan dari antarmuka WAN.

Edit /etc/shorewall/masqdan Anda akan membutuhkan garis yang mirip dengan:

br0 172.17.0.0/12

Dalam hal ini, antarmuka WAN saya sebenarnya adalah br0 (jembatan), tetapi milik Anda mungkin akan seperti eth0. (Gunakan ifconfiguntuk melihat antarmuka Anda dan alamat IP-nya). Pada docker mesin saya menggunakan 172.17.0.0/24 yang merupakan rentang alamat pribadi RFC1918. Ini mungkin berbeda pada sistem lain, tetapi Anda dapat melihat jangkauan dengan menggunakan ifconfigsekali lagi untuk mencari antarmuka docker0.

Aaron C. de Bruyn
sumber
2

Anda dapat memastikan bahwa Docker ruleset selamat dari restart shorewall dengan membuat skrip ekstensi yang menyimpan DOCKERrantai sebelum restart, dan kemudian mengembalikannya lagi sesudahnya. Saya baru saja memasang posting dengan contoh bagaimana melakukan ini , walaupun saya yakin itu jauh dari satu-satunya metode yang mungkin.

womble
sumber
0

Layanan buruh pelabuhan dapat dimulai kembali tanpa memengaruhi wadah yang sedang berjalan, dan dapat dijalankan setelah Shorewall memulai kembali untuk memuat kembali aturan khusus buruh pelabuhan. Jelas akan ada waktu singkat di mana jaringan ke wadah terganggu.

Ini berlaku setidaknya pada beberapa pemasangan Archlinux saya.

atom
sumber
0

Tindakan refresh tidak membersihkan iptable jadi ini jika Anda hanya ingin me-refresh aturan atau kebijakan, Anda bisa menjalankan refresh bukannya me-restart:

sudo shorewall refresh

Jelas, masalahnya masih ada jika Anda benar-benar perlu memulai ulang shorewall. Kemudian, Anda harus memulai kembali buruh pelabuhan dan menyalakan kembali wadah Anda.

lenybernard
sumber
0

Salah satu opsi yang memungkinkan adalah menjalankan Docker dengan opsi --net = host, untuk memungkinkan jaringan host akses aplikasi kemas tanpa penerusan ip dan NAT.

DukeLion
sumber