限制Internet访问 - Docker容器

时间:2016-10-07 09:20:40

标签: docker docker-networking

我有限制在负载均衡器网络中限制容器的互联网访问的情况。例如,在下面的图片中

easy for your reference

只有 container4 才能连接到互联网;其他只能通过 container4 与外界进行通信。例如,如果 container1 需要smtp支持,它会将smtp请求转发到 container4 以获取访问权限。

不应允许 container4 以外的容器直接访问互联网!这应该在Docker级别上强制执行。

我相信它可以在 docker network creation 上进行配置,任何人都可以解释如何实现这个目标吗?

4 个答案:

答案 0 :(得分:20)

访问互联网的网络创建

  

docker network create --subnet = 172.19.0.0 / 16 internet

阻止互联网访问的网络创建

  

docker network create --internal --subnet 10.1.1.0/24 no-internet

如果要将docker容器连接到Internet

docker network connect internet container-name

如果您想阻止互联网访问

docker network connect no-internet container-name

注意

在内部网络中,我们无法公开端口以连接外部世界,请参阅此question了解更多详情

答案 1 :(得分:14)

here所示,我将其与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 -ddocker-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      

答案 2 :(得分:1)

另一种选择是,如果需要在没有Internet访问的情况下暴露容器上的端口,但想让它与其他容器通信,则将是提供一个伪造的DNS配置。不过,这并不是一个完美的解决方案,因为它不会阻止IP直接访问外界。

docker-compose.yaml

version: '3'

services:
  service1:
    image: alpine
    command: sh -c 'ping service2 -c 1; ping google.com -c 1'
    dns: 0.0.0.0
  service2:
    image: alpine
    command: sh -c 'ping service1 -c 1; ping google.com -c 1'
    dns: 0.0.0.0
isolated> docker-compose up
Recreating isolated_service1_1 ... done                                                                                 Recreating isolated_service2_1 ... done                                                                                 Attaching to isolated_service2_1, isolated_service1_1
service1_1  | PING service2 (172.18.0.2) 56(84) bytes of data.
service1_1  | 64 bytes from isolated_service2_1.isolated_default (172.18.0.2): icmp_seq=1 ttl=64 time=0.038 ms
service1_1  |
service1_1  | --- service2 ping statistics ---
service1_1  | 1 packets transmitted, 1 received, 0% packet loss, time 0ms
service1_1  | rtt min/avg/max/mdev = 0.038/0.038/0.038/0.000 ms
service2_1  | PING service1 (172.18.0.3) 56(84) bytes of data.
service2_1  | 64 bytes from isolated_service1_1.isolated_default (172.18.0.3): icmp_seq=1 ttl=64 time=0.093 ms
service2_1  |
service2_1  | --- service1 ping statistics ---
service2_1  | 1 packets transmitted, 1 received, 0% packet loss, time 0ms
service2_1  | rtt min/avg/max/mdev = 0.093/0.093/0.093/0.000 ms
service1_1  | ping: google.com: Temporary failure in name resolution
service2_1  | ping: google.com: Temporary failure in name resolution
isolated_service1_1 exited with code 2
isolated_service2_1 exited with code 2

答案 3 :(得分:0)

如Bilal的回答所述,如果您不需要公开端口,则内部网络是一个很好的解决方案。

如果确实需要公开端口,则以下使用iptables的解决方案可以满足我的要求:

--network no-internet

然后添加

$ 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容器时。例如:

out_channels