允许从本地主机到docker容器的通信

允许从本地主机到docker容器的通信,docker,iptables,Docker,Iptables,我正试图用docker在Ubuntu 16.04服务器上托管我的后端服务。有一个nginx处理所有HTTP请求,并将其代理传递给后端服务 使用iptablesINPUT和OUTPUTACCEPT,一切都能正常工作,但是如果我试图限制除HTTP/HTTPS之外的对nginx的任何访问,则可以在 localhost和docker容器中断 这是我的iptables: 代理传递到的容器正在docker-compose.yml中映射到3003的端口4000上运行: webapi: build:

我正试图用docker在Ubuntu 16.04服务器上托管我的后端服务。有一个nginx处理所有HTTP请求,并将其代理传递给后端服务

使用iptables
INPUT
OUTPUT
ACCEPT
,一切都能正常工作,但是如果我试图限制除HTTP/HTTPS之外的对nginx的任何访问,则可以在 localhost和docker容器中断

这是我的iptables:

代理传递到的容器正在docker-compose.yml中映射到3003的端口4000上运行:

 webapi:
    build: .
    depends_on:
      - mongo
    deploy:
      replicas: 1
      resources:
        limits:
          cpus: "0.1"
          memory: 256M
      restart_policy:
        condition: on-failure
    ports:
      - "3003:4000"
    networks:
      - webnet
但是如果我运行
curlhttp://localhost:3003/api/healthcheck
-我得到
curl:(56)Recv失败:对等方重置连接
,这让我很困惑,因为我对
环回
或转发到
docker0
没有任何限制


我唯一的想法是:从容器的端口4000到本地主机3003的转发被阻止,但我想不出如何允许它。

简单的答案是只在环回接口上发布端口,这样就不需要对它们设置防火墙:

  port:
    - "127.0.0.1:3003:4000"

为了调试防火墙规则,在丢弃数据包之前,我会在其中添加一些日志。Docker使用的不仅仅是Docker-0网桥,发布端口还涉及各种nat/mangle规则和代理进程。

我也遇到了一个问题,我创建了Docker网络,只想公开DNS服务器和Nginx服务。执行此操作时,系统外部的一切工作正常,但在主机内部,只要输入策略被删除,我就没有访问权限。向输入链添加localhost和确切的IP地址和端口没有任何效果

我找到的解决方案是在输入链中接受docker网桥接口。默认情况下,Docker会将其命名为br-(例如br-22153f050ac4)。您可以将这个讨厌的标签添加到iptables配置中,也可以命名docker网桥接口并添加更确定的接口名称

假设您通过以下方式创建网络:

docker network create -d bridge -o com.docker.network.bridge.name=webnet webnet
您应该能够允许localhost->docker容器使用以下内容:

sudo iptables -A INPUT -i webnet -j ACCEPT
假设一切都成功,您现在应该能够通过本地主机地址(即127.0.0.1)和docker容器地址(例如172.X.Y.Z)访问容器

sudo iptables -A INPUT -i webnet -j ACCEPT