限制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.

我的情况是限制负载平衡器网络中容器的internet访问。例如,在下面的图片中

只有容器4连接到互联网;其他三个仅通过集装箱4与外部世界进行沟通。例如,如果container1需要smtp支持,它会将smtp请求转发到container4以获得访问权限

除容器4外,不允许任何容器直接访问Internet!这应该在Docker级别强制执行


我相信它将在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'