使用 iptables 规则不适用于 Docker 容器

dzh*_*zhi 7 networking iptables docker docker-compose

只需设置一个 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
Run Code Online (Sandbox Code Playgroud)

这些是我当前使用的 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
Run Code Online (Sandbox Code Playgroud)

我尝试禁用 Docker 的 iptables 支持并禁用桥接网络,并调整 iptables 规则数十次,但无济于事。

我很感激任何建议和帮助实现这一目标,因为我对这个问题没有想法和搜索结果。

提前致谢!

dzh*_*zhi 3

对于每个寻求此问题解决方案的人来说,答案是:

*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
Run Code Online (Sandbox Code Playgroud)

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

工作完美。