限制Internet访问-Docker容器
我的情况是限制负载平衡器网络中容器的internet访问。例如,在下面的图片中 只有容器4连接到互联网;其他三个仅通过集装箱4与外部世界进行沟通。例如,如果container1需要smtp支持,它会将smtp请求转发到container4以获得访问权限 除容器4外,不允许任何容器直接访问Internet!这应该在Docker级别强制执行限制Internet访问-Docker容器,docker,docker-networking,Docker,Docker Networking,我的情况是限制负载平衡器网络中容器的internet访问。例如,在下面的图片中 只有容器4连接到互联网;其他三个仅通过集装箱4与外部世界进行沟通。例如,如果container1需要smtp支持,它会将smtp请求转发到container4以获得访问权限 除容器4外,不允许任何容器直接访问Internet!这应该在Docker级别强制执行 我相信它将在docker network creation上配置,有人能解释一下如何实现吗?访问互联网的网络创建 docker网络创建--子网=172.19.
我相信它将在docker network creation上配置,有人能解释一下如何实现吗?访问互联网的网络创建 docker网络创建--子网=172.19.0.0/16 internet
为阻止internet访问创建网络 docker网络创建--内部--子网10.1.1.0/24无互联网 如果要将docker容器连接到internet
docker network connect internet container-name
如果要阻止internet访问
docker network connect no-internet container-name
注
在内部网络中,我们无法公开连接外部世界的端口,请参阅此以了解更多详细信息正如所发现的,我将此用于docker compose。另存为docker compose.yml:
version: '3'
services:
outgoing-wont-work:
image: alpine
networks:
- no-internet
command: ping -c 3 google.com # will crash
internal-will-work:
image: alpine
networks:
- no-internet
command: ping -c 3 internal-and-external
internal-and-external:
image: alpine
networks:
- no-internet
- internet
command: ping -c 3 google.com
networks:
no-internet:
driver: bridge
internal: true
internet:
driver: bridge
然后运行docker compose up-d
,docker compose ps
几秒钟后将显示如下内容:
Name Command State Ports
----------------------------------------------------------------------------------
dco_inet_internal-and-external_1 ping -c 3 google.com Exit 0
dco_inet_internal-will-work_1 ping -c 3 internal-and-ext ... Exit 0
dco_inet_outgoing-wont-work_1 ping -c 3 google.com Exit 1
另一种选择是,如果您需要在没有internet访问的情况下公开容器上的端口,但希望让它与其他容器通信,则可以提供虚假的DNS配置。但这并不是一个完美的解决方案,因为它不会阻止对外部世界的直接IP访问 docker-compose.yaml
版本:“3”
服务:
服务1:
图片:阿尔卑斯山
命令:sh-c'ping service2-c1;ping google.com-c1'
域名系统:0.0.0.0
服务2:
图片:阿尔卑斯山
命令:sh-c'ping service1-c1;ping google.com-c1'
域名系统:0.0.0.0
正如Bilal的回答中所述,如果您不需要公开端口,那么内部网络是一个很好的解决方案 如果确实需要公开端口,下面使用iptables的解决方案可以满足我的要求:
docker network create --subnet 172.19.0.0/16 no-internet
sudo iptables --insert DOCKER-USER -s 172.19.0.0/16 -j REJECT --reject-with icmp-port-unreachable
sudo iptables --insert DOCKER-USER -s 172.19.0.0/16 -m state --state RELATED,ESTABLISHED -j RETURN
然后加上
--network no-internet
当您运行docker容器时。例如:
$ docker run -it --network no-internet ubuntu:focal /bin/bash
root@9f2181f79985:/# apt update
Err:1 http://archive.ubuntu.com/ubuntu focal InRelease
Temporary failure resolving 'archive.ubuntu.com'
你知道如何配置Docker Compose吗?我不知道@jozefknaperekt
没有互联网的网络上的容器仍然能够进行DNS查询;阅读@BharatKhatri是的,但不是通过互联网。@JozefKnaperek看到了我关于docker-compose解决方案的答案。它不是完美的,但它可能会减少大多数来自软件的互联网访问尝试。我不同意它没有限制任何东西,因此远不是完美的。。。
$ docker run -it --network no-internet ubuntu:focal /bin/bash
root@9f2181f79985:/# apt update
Err:1 http://archive.ubuntu.com/ubuntu focal InRelease
Temporary failure resolving 'archive.ubuntu.com'