Ini adalah pertama kalinya saya membuat Server Ubuntu (14,04 LTS) dan saya mengalami kesulitan mengkonfigurasi firewall (UFW).
Saya hanya perlu ssh
dan 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)
ufw status
8083
dan8086
. Saya menambahkanufw status verbose
output dalam pertanyaan. Terima kasih.Jawaban:
Masalahnya adalah menggunakan
-p
bendera pada wadah.Ternyata Docker membuat perubahan langsung pada Anda
iptables
, yang tidak ditunjukkan denganufw status
.Solusi yang mungkin adalah:
Berhenti menggunakan
-p
bendera. Sebaliknya, gunakan tautan buruh pelabuhan atau jaringan buruh pelabuhan .Bind kontainer secara lokal sehingga mereka tidak terkena di luar mesin Anda:
docker run -p 127.0.0.1:8080:8080 ...
Jika Anda bersikeras menggunakan
-p
bendera, beri tahu buruh pelabuhan untuk tidak menyentuh Andaiptables
dengan menonaktifkannya/etc/docker/daemon.json
dan 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.
sumber
-p
sebanyak 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:80
dan--link
ke yang lain. Dengan cara ini tidak mungkin ada bentrokan port dan satu-satunya titik akses adalah melalui nginx./etc/default/docker
adalah file konfigurasi yang digunakan oleh konfigurasi pemula. Jika Anda telah pindah dari pemula ke systemd, file ini tidak akan digunakan.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.json
dan memasukkan yang berikut ini:Saya kemudian mengeluarkan
sudo service docker stop
makasudo service docker start
AKHIRNYA buruh pelabuhan hanya mengikuti aturan yang sesuai di UFW.Data tambahan: Docker membatalkan UFW!
sumber
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 sudahiptables
terkonfigurasi kunci: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_POLICY
sebagaiACCEPT
di/etc/default/ufw
dan menerapkan trik yang dijelaskan di sini: https://stackoverflow.com/a/17498195/507564sumber
Solusi cepat adalah ketika menjalankan Docker dan melakukan pemetaan port. Anda selalu bisa melakukannya
untuk mencegah Docker Anda diakses dari luar.
sumber
Penggunaan
/etc/docker/daemon.json
dengan kontenmungkin 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.json
file, aktifkan:sehingga Anda mengatur kebijakan penerusan default di UFW untuk menerima, dan menggunakan:
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!
sumber
Dalam kasus saya, saya akhirnya memodifikasi iptables untuk memungkinkan akses ke Docker hanya dari IP tertentu.
Sesuai jawaban ESala :
Contoh catatan ditambahkan ke iptables oleh Docker
Routing ke rantai 'DOCKER':
Paket penerusan dari rantai 'DOCKER' ke wadah:
Anda dapat memodifikasi iptables untuk memungkinkan akses ke rantai DOCKER hanya dari IP sumber yang ditentukan (mis.
1.1.1.1
):Anda mungkin ingin menggunakan
iptables-save > /tmp/iptables.conf
daniptables-restore < /tmp/iptables.conf
membuang, mengedit, dan mengembalikan aturan iptables.sumber
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.
sumber
Masuk ke konsol buruh pelabuhan Anda:
Dan kemudian di dalam konsol buruh pelabuhan Anda:
Tambahkan aturan ufw Anda dan aktifkan ufw
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)
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;
sumber
Aku digunakan
docker-compose
untuk 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.yml
file saya :untuk ini:
Sekarang buruh pelabuhan-wadah lain masih dapat menggunakan port, tetapi saya tidak dapat mengaksesnya dari luar.
sumber