允许从本地主机到docker容器的通信
我正试图用docker在Ubuntu 16.04服务器上托管我的后端服务。有一个nginx处理所有HTTP请求,并将其代理传递给后端服务 使用iptables允许从本地主机到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:
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