Uncomplicated Firewall (UFW) tidak memblokir apa pun saat menggunakan Docker

44

Ini adalah pertama kalinya saya membuat Server Ubuntu (14,04 LTS) dan saya mengalami kesulitan mengkonfigurasi firewall (UFW).

Saya hanya perlu sshdan http, jadi saya melakukan ini:

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

Tapi saya masih bisa terhubung ke database di port lain dari mesin ini . Adakah ide tentang kesalahan saya?

SUNTING : basis data ini ada di wadah Docker. Mungkinkah ini terkait? Apakah itu menimpa konfigurasi ufw saya?

EDIT2 : output darisudo 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)
ESala
sumber
database apa? port mana? Apakah Anda yakin ini adalah mesin yang sama? apa output dari ufw status
solsTiCe
@ solTiCe ya, saya yakin ini adalah mesin yang sama. Basis data adalah InfluxDB (pada wadah buruh pelabuhan) dengan port 8083dan 8086. Saya menambahkan ufw status verboseoutput dalam pertanyaan. Terima kasih.
ESala

Jawaban:

64

Masalahnya adalah menggunakan -pbendera pada wadah.

Ternyata Docker membuat perubahan langsung pada Anda iptables, yang tidak ditunjukkan dengan ufw status.

Solusi yang mungkin adalah:

  1. Berhenti menggunakan -pbendera. Sebaliknya, gunakan tautan buruh pelabuhan atau jaringan buruh pelabuhan .

  2. Bind kontainer secara lokal sehingga mereka tidak terkena di luar mesin Anda:

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

  3. Jika Anda bersikeras menggunakan -pbendera, beri tahu buruh pelabuhan untuk tidak menyentuh Anda iptablesdengan menonaktifkannya /etc/docker/daemon.jsondan memulai kembali:

    { "iptables" : false }

Saya merekomendasikan opsi 1 atau 2. Berhati-hatilah karena opsi 3 memiliki efek samping , seperti wadah yang tidak dapat terhubung ke internet.

ESala
sumber
8
Ini sangat berguna - saya jadi gila karena bisa mengakses port yang saya tidak izinkan di ufw. Namun, menggunakan iptables = false break, seperti wadah yang dapat diakses di localhost, misalnya untuk reverse proxying. Lebih baik memastikan bahwa wadah mendengarkan dengan benar, jangan gunakan -p 80:80 tetapi gunakan -p 127.0.0.1:80:80 atau port yang berbeda seperti 127.0.0.1:3000:80 untuk membalikkan proxy dengan nginx atau apache dan tanpa port bentrokan.
Andreas Reiff
2
@ AndrewReiff Anda benar, tetapi belakangan ini saya telah menemukan yang terbaik untuk menghindari -psebanyak mungkin. Misalnya, dalam kasus proxy terbalik saya tidak memetakan port apa pun untuk kontainer pekerja, dan kemudian menempatkan nginx di wadah itu sendiri dengan -p 80:80dan --linkke yang lain. Dengan cara ini tidak mungkin ada bentrokan port dan satu-satunya titik akses adalah melalui nginx.
ESala
1
Periksa juga pos ini untuk tindakan pencegahan ketiga yang harus Anda ambil! svenv.nl/unixandlinux/dockerufw
Henk
1
Penting : /etc/default/dockeradalah file konfigurasi yang digunakan oleh konfigurasi pemula. Jika Anda telah pindah dari pemula ke systemd, file ini tidak akan digunakan.
orshachar
@ Eala Anda harus berpikir tentang tidak menandai jawaban ini sebagai benar karena ini bertanggal.
ctbrown
8

16.04 menghadirkan tantangan baru. Saya melakukan semua langkah seperti yang ditunjukkan Menjalankan Docker di belakang ufw firewall TETAPI saya TIDAK bisa mendapatkan buruh pelabuhan ditambah UFW untuk bekerja pada 16.04. Dengan kata lain, apa pun yang saya lakukan, semua port dock menjadi terpapar secara global ke internet. Sampai saya menemukan ini: Cara mengatur Docker 1.12+ untuk TIDAK mengganggu IPTABLES / FirewallD

Saya harus membuat file /etc/docker/daemon.jsondan memasukkan yang berikut ini:

{
    "iptables": false
}

Saya kemudian mengeluarkan sudo service docker stopmaka sudo service docker startAKHIRNYA buruh pelabuhan hanya mengikuti aturan yang sesuai di UFW.

Data tambahan: Docker membatalkan UFW!

Hal Jordan
sumber
Dengan Ubuntu 16.04 dan Docker versi 17.09, solusi ini memutuskan koneksi keluar dari kontainer. Lihat respons askubuntu.com/a/833363/262702 dan askubuntu.com/a/954041/262702
ctbrown
5

Jika Anda menggunakan sistem init dari systemd (Ubuntu 15.10 dan yang lebih baru), sunting /etc/docker/daemon.json(mungkin perlu membuatnya jika tidak ada), pastikan sudah iptablesterkonfigurasi kunci:

{   "iptables" : false }

EDIT : ini mungkin menyebabkan Anda kehilangan koneksi ke internet dari wadah di dalam

Jika Anda mengaktifkan UFW, pastikan Anda dapat mengakses internet dari dalam wadah. jika tidak - Anda harus menentukan DEFAULT_FORWARD_POLICYsebagai ACCEPTdi /etc/default/ufwdan menerapkan trik yang dijelaskan di sini: https://stackoverflow.com/a/17498195/507564

orachar
sumber
2

Solusi cepat adalah ketika menjalankan Docker dan melakukan pemetaan port. Anda selalu bisa melakukannya

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

untuk mencegah Docker Anda diakses dari luar.

Kimy82
sumber
2

Penggunaan /etc/docker/daemon.jsondengan konten

{
  "iptables": false
}

mungkin terdengar seperti solusi tetapi hanya berfungsi sampai reboot berikutnya . Setelah itu, Anda mungkin memperhatikan bahwa tidak ada wadah Anda yang memiliki akses ke Internet sehingga Anda tidak dapat misalnya melakukan ping ke situs web mana pun. Mungkin perilaku yang tidak diinginkan.

Hal yang sama berlaku untuk mengikat wadah ke IP tertentu. Anda mungkin tidak ingin melakukan itu. Pilihan utama adalah membuat wadah dan memilikinya di belakang UFW tidak peduli apa yang terjadi dan bagaimana Anda membuat wadah ini, jadi ada solusinya:

Setelah Anda membuat /etc/docker/daemon.jsonfile, aktifkan:

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

sehingga Anda mengatur kebijakan penerusan default di UFW untuk menerima, dan menggunakan:

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

Jika Anda akan menggunakan docker-compose, maka IP dari perintah di atas harus diganti dengan IP dari network dock-compose create ketika menjalankannya docker-compose up.

Saya menjelaskan masalah dan solusinya secara lebih komprehensif dalam artikel ini

Semoga ini bisa membantu!

mkubaczyk
sumber
1

Dalam kasus saya, saya akhirnya memodifikasi iptables untuk memungkinkan akses ke Docker hanya dari IP tertentu.

Sesuai jawaban ESala :

Jika Anda menggunakan -pflag pada wadah, Docker membuat perubahan langsung ke iptables, mengabaikan ufw.

Contoh catatan ditambahkan ke iptables oleh Docker

Routing ke rantai '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

Paket penerusan dari rantai 'DOCKER' ke wadah:

-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

Anda dapat memodifikasi iptables untuk memungkinkan akses ke rantai DOCKER hanya dari IP sumber yang ditentukan (mis. 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

Anda mungkin ingin menggunakan iptables-save > /tmp/iptables.confdan iptables-restore < /tmp/iptables.confmembuang, mengedit, dan mengembalikan aturan iptables.

Mekanik AI
sumber
0

Gunakan --network = host ketika Anda memulai container sehingga buruh pelabuhan akan memetakan port ke jaringan host-only yang terisolasi alih-alih jaringan bridge default. Saya tidak melihat cara hukum untuk memblokir jaringan yang dijembatani. Atau Anda dapat menggunakan jaringan yang ditentukan pengguna khusus dengan isolasi.

programmer
sumber
0
  1. Masuk ke konsol buruh pelabuhan Anda:

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

  2. Dan kemudian di dalam konsol buruh pelabuhan Anda:

    sudo apt-get update
    sudo apt-get install ufw
    sudo ufw allow 22
    
  3. Tambahkan aturan ufw Anda dan aktifkan ufw

    sudo ufw aktifkan

    • Gambar Docker Anda harus dimulai dengan --cap-add = NET_ADMIN

Untuk mengaktifkan opsi Docker "NET_ADMIN":

1. Stop Kontainer:

buruh pelabuhan menghentikan kontainer Anda; 2. Dapatkan id kontainer:

buruh pelabuhan memeriksa wadah Anda; 3.Modifikasi hostconfig.json (jalur buruh pelabuhan default: / var / lib / docker, Anda dapat mengubah milik Anda)

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

4. Cari "CapAdd", dan ubah null menjadi ["NET_ADMIN"];

...., "VolumesFrom": null, "CapAdd": ["NET_ADMIN"], "CapDrop": null, .... 5.Mulai ulang buruh pelabuhan di mesin host;

layanan docker restart; 6. Mulailah konser Anda;

buruh pelabuhan memulai wadah Anda;

Stefan
sumber
0

Aku digunakan docker-composeuntuk memulai beberapa kontainer dan juga memiliki masalah yang satu port terkena dunia mengabaikan aturan ufw.

Perbaikan untuk hanya membuat port tersedia untuk wadah buruh pelabuhan saya adalah perubahan ini di docker-compose.ymlfile saya :

ports:
- "1234:1234"

untuk ini:

ports:
- "1234"

Sekarang buruh pelabuhan-wadah lain masih dapat menggunakan port, tetapi saya tidak dapat mengaksesnya dari luar.

TmTron
sumber