Menggunakan aturan iptables tidak berfungsi dengan wadah Docker

Cukup siapkan wadah ElasticSearch untuk digunakan dengan aplikasi Laravel perusahaan.Membuat docker-compose.yml dan menjalankannya tanpa cacat dan lurus ke depan tetapi masalah terjadi ketika saya ingin firewall hal ini sehingga hanya dapat diakses dari satu, IP spesifik dari aplikasi Laravel yang disebutkan.

Saat meneliti, saya perhatikan bahwa banyak orang mengalami masalah ini di mana lalu lintas ke port yang diteruskan oleh buruh pelabuhan benar-benar terpapar ke publik dan mereka tidak dapat melakukan firewall dengan benar.

Saya menemukan beberapa solusi dalam 6 jam terakhir yang tidak ada yang bekerja. Saya berasumsi ini ada hubungannya dengan cara Docker memproses/meneruskan lalu lintas masuk dan pengetahuan iptables saya tidak begitu luas sehingga saya dapat memahami apa yang terjadi sendiri.

Ini adalah docker-compose saya.yml (untuk apa itu layak):

version: '3.4'services:  elasticsearch:    image: khezen/elasticsearch:6.1.1    container_name: elasticsearch    environment:      NETWORK_HOST: 0.0.0.0      HOSTS: 127.0.0.1      CLUSTER_NAME: fd-es      NODE_NAME: node-1      HEAP_SIZE: 31g      HTTP_SSL: "true"      ELASTIC_PWD: "somepasswd"      HTTP_CORS_ENABLE: "true"      HTTP_CORS_ALLOW_ORIGIN: /https?:\/\/localhost(:[0-9]+)?/    ulimits:      memlock:       soft: -1       hard: -1    volumes:      - ./config/elasticsearch.yml:/elasticsearch/config/elasticsearch.yml      - ./data:/elasticsearch/data      - ./logs:/elasticsearch/logs    ports:      - 9200:9200    networks:      - es-network    restart: alwaysnetworks:  es-network:    driver: bridge

Ini adalah aturan iptables saya yang saat ini digunakan yang sampai taraf tertentu sesuai dengan yang saya inginkan tetapi semua lalu lintas ke port 9200 dari klien mana pun masih diizinkan alih-alih hanya dapat diakses dari aplikasi saya:

*filter:INPUT DROP [0:0]:FORWARD DROP [0:0]:OUTPUT ACCEPT [779:162776]:DOCKER - [0:0]-A DOCKER -s xxx.xxx.xxx.xxx -p tcp -m tcp --dport 9200 -j ACCEPT-A DOCKER -o docker0 -p tcp -m tcp --dport 9200 -j ACCEPT-A DOCKER -p tcp --dport 9200 -j DROP-A INPUT -i lo -j ACCEPT-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT-A INPUT -m conntrack --ctstate INVALID -j DROP-A INPUT -p icmp -m icmp --icmp-type 8 -m conntrack --ctstate NEW -j ACCEPT-A INPUT -p udp -m conntrack --ctstate NEW -j ACCEPT-A INPUT -p tcp --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j ACCEPT-A INPUT -p tcp -m tcp --dport 44344 -j ACCEPT-A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable-A INPUT -p tcp -j REJECT --reject-with tcp-reset-A INPUT -j REJECT --reject-with icmp-proto-unreachable-A INPUT -j DROP

Saya mencoba menonaktifkan dukungan iptables Docker dan menonaktifkan jaringan jembatan dan mengubah aturan iptables beberapa lusin kali tetapi tidak berhasil.

Saya akan menghargai saran dan bantuan apa pun untuk mewujudkannya karena saya kehabisan ide dan hasil pencarian untuk masalah ini.

Terima kasih sebelumnya!

Untuk semua orang yang mencari solusi untuk masalah ini, jawabannya adalah ini:

*filter:INPUT ACCEPT [0:0]:FORWARD DROP [0:0]:OUTPUT ACCEPT [0:0]:FILTERS - [0:0]:DOCKER-USER - [0:0]-F INPUT-F DOCKER-USER-F FILTERS-A INPUT -i lo -j ACCEPT-A INPUT -p icmp --icmp-type any -j ACCEPT-A INPUT -j FILTERS-A DOCKER-USER -i ens33 -j FILTERS-A FILTERS -m state --state ESTABLISHED,RELATED -j ACCEPT-A FILTERS -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT-A FILTERS -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT-A FILTERS -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT-A FILTERS -j REJECT --reject-with icmp-host-prohibitedCOMMIT

Menemukannya di sini: https://unrouted.io/2017/08/15/docker-firewall/

Bekerja dengan sempurna.

Saya akan menjelaskan skenario saya di mana saya telah menguji apa yang ingin Anda capai.

Saya telah meluncurkan wadah docker di mana port 9010 diteruskan ke port 8080:

docker run -p 9010:8080 swaggerapi/swagger-editor

Docker membuat aturan DNAT untuk rantai PREROUTING yang meneruskan lalu lintas dari port 9010 ke port 8080:

DNAT       tcp  --  !docker0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:9010 to:172.17.0.5:8080

Docker juga membuat aturan dalam rantai DOCKER yang memungkinkan semua lalu lintas dikirim ke alamat IP container dan port 8080.

ACCEPT     tcp  --  !docker0 docker0  0.0.0.0/0            172.17.0.5           tcp dpt:8080

Rantai DOCKER digunakan dalam rantai maju, di mana semua lalu lintas yang dikirim ke Jembatan docker0 diproses oleh aturan dalam rantai DOCKER.

DOCKER     all  --  *      docker0  0.0.0.0/0            0.0.0.0/0

Sekarang saya ingin memfilter lalu lintas yang dikirim ke port 8080 (lalu lintas ke port 9010 telah diproses oleh PREROUTING dan sekarang lalu lintas dikirim ke port 8080) memblokir semua alamat IP sambil mengizinkan lalu lintas dari IP 192.168.1.142. Alamat IP wadah dapat ditambahkan ke aturan tersebut untuk meningkatkan granularitas tentu saja.

Saya menambahkan aturan berikut di awal Maju rantai. Atau Anda bisa mengganti FORWARD dengan DOCKER.

iptables -I FORWARD -p tcp --dport 8080 -j DROPiptables -I FORWARD -p tcp -s 192.168.1.142 --dport 8080 -j ACCEPT

Berkat aturan tersebut, hanya IP 192.168.1.142 yang dapat mencapai port 8080 yang digunakan oleh wadah.

Bagi mereka yang mengunjungi jawaban ini jika Anda hanya ingin mengizinkan satu alamat IP tertentu untuk mengakses wadah, gunakan perintah iptables yang disarankan di Docker docs.

Saya pikir menambahkan baris ini akan memperbaiki masalah Anda :

*filter:INPUT DROP [0:0]:FORWARD DROP [0:0]:OUTPUT ACCEPT [779:162776]:DOCKER - [0:0]**-A INPUT -p tcp -m tcp --dport 9200 -j DOCKER**-A DOCKER -s xxx.xxx.xxx.xxx -p tcp -m tcp --dport 9200 -j ACCEPT