Networking

使用 iptables 規則不適用於 Docker 容器

  • February 9, 2021

只需設置一個 ElasticSearch 容器即可與公司的 Laravel 應用程序一起使用。創建 docker-compose.yml 並執行它是完美而直接的,但是當我想為這個東西設置防火牆以便它只能從提到的 Laravel 應用程序的一個特定 IP 訪問時,就會出現問題。

在研究過程中,我注意到很多人都遇到了這些問題,即 Docker 轉發的埠流量完全暴露給公眾,並且他們無法正確設置防火牆。

我在過去 6 小時內找到了幾個解決方案,但沒有一個有效。我認為這與 Docker 處理/轉發入站流量的方式有關,而且我的 iptables 知識並不豐富,因此我可以自己理解正在發生的事情。

這是我的 docker-compose.yml (物有所值):

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: always

networks:
 es-network:
   driver: bridge

這些是我目前使用的 iptables 規則,這在某種程度上是我想要的,但仍然允許從任何客戶端到埠 9200 的所有流量通過,而不是只能從我的應用程序訪問:

*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

我嘗試禁用 Docker 的 iptables 支持並禁用橋接網路並調整 iptables 規則幾十次,但無濟於事。

我很感激任何建議和幫助來實現這一點,因為我沒有這個問題的想法和搜尋結果。

提前致謝!

對於每個尋求解決這個問題的人來說,答案是這樣的:

*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-prohibited

COMMIT

在這裡找到它:https ://unrouted.io/2017/08/15/docker-firewall/

完美執行。

引用自:https://serverfault.com/questions/894683