Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
阻止外部访问docker容器_Docker_Iptables_Centos7 - Fatal编程技术网

阻止外部访问docker容器

阻止外部访问docker容器,docker,iptables,centos7,Docker,Iptables,Centos7,我想阻止从外面直接进入docker集装箱。我使用haproxy,只允许访问端口80443 我在iptables中添加了以下规则。但我仍然可以通过不同的端口访问docker容器 *filter :INPUT DROP [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -

我想阻止从外面直接进入docker集装箱。我使用haproxy,只允许访问端口80443

我在iptables中添加了以下规则。但我仍然可以通过不同的端口访问docker容器

*filter
:INPUT DROP [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
COMMIT
这可能是因为DOCKER链

# iptables -L
Chain INPUT (policy DROP)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
ACCEPT     icmp --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
ACCEPT     tcp  --  anywhere             anywhere             state NEW tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere             state NEW tcp dpt:http
ACCEPT     tcp  --  anywhere             anywhere             state NEW tcp dpt:https

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
DOCKER-ISOLATION  all  --  anywhere             anywhere
DOCKER     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
DOCKER     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
DOCKER     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
DOCKER     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain DOCKER (4 references)
target     prot opt source               destination
ACCEPT     tcp  --  anywhere             172.18.0.2           tcp dpt:http

Chain DOCKER-ISOLATION (1 references)
target     prot opt source               destination
DROP       all  --  anywhere             anywhere
DROP       all  --  anywhere             anywhere
DROP       all  --  anywhere             anywhere
DROP       all  --  anywhere             anywhere
DROP       all  --  anywhere             anywhere
DROP       all  --  anywhere             anywhere
DROP       all  --  anywhere             anywhere
DROP       all  --  anywhere             anywhere
DROP       all  --  anywhere             anywhere
DROP       all  --  anywhere             anywhere
DROP       all  --  anywhere             anywhere
DROP       all  --  anywhere             anywhere
RETURN     all  --  anywhere             anywhere

我需要创建哪些规则来阻止直接访问?

您可以使用
docker network create network
命令创建一个网络来连接应用程序和代理,而不是对IP表执行此操作。也不要在任何端口上公开应用程序。您应该公开的唯一容器是您的代理。然后,您可以在代理中使用容器名称作为主机名来路由流量。同一网络上的每个容器都可以被其他容器访问

例如,如果

  • 我有一个容器,其名称为
    我的服务
    ,一个服务运行在端口3000上,没有向主机发布端口
  • 容器B是在端口80上运行的代理,已发布到主机。我的代理可以将请求传递给,并将流量路由到容器
  • 如果我尝试转到此端口,将无法工作,因为端口尚未公开,访问应用程序的唯一方法是通过端口80上的代理
我建议你读一读这本书,因为它解释了如何开始与人交往

完全披露:我在个人VPS上运行这种设置,无法通过端口直接访问我的容器。使用内置docker网络可能比摆弄IP表更好

希望这是有用的

迪伦

编辑
我已经概括了这个过程,因为我不知道您关于代理的设置细节,网络限制等。我也没有进入具体的命令,因为上面的链接比我更好地覆盖了它。

您可以使用
docker network create network
命令创建一个网络,将您的应用程序和代理程序连接起来。也不要在任何端口上公开应用程序。您应该公开的唯一容器是您的代理。然后,您可以在代理中使用容器名称作为主机名来路由流量。同一网络上的每个容器都可以被其他容器访问

例如,如果

  • 我有一个容器,其名称为
    我的服务
    ,一个服务运行在端口3000上,没有向主机发布端口
  • 容器B是在端口80上运行的代理,已发布到主机。我的代理可以将请求传递给,并将流量路由到容器
  • 如果我尝试转到此端口,将无法工作,因为端口尚未公开,访问应用程序的唯一方法是通过端口80上的代理
我建议你读一读这本书,因为它解释了如何开始与人交往

完全披露:我在个人VPS上运行这种设置,无法通过端口直接访问我的容器。使用内置docker网络可能比摆弄IP表更好

希望这是有用的

迪伦

编辑
我已经概括了这个过程,因为我不知道您的设置在代理、网络限制等方面的细节。我也没有进入具体的命令,因为上面的链接比我更好地涵盖了它。

我意识到我在响应一个旧线程,但我花了一个上午的大部分时间对这个问题感到沮丧。这篇文章显示在谷歌搜索的顶部,但我觉得被接受的答案并没有回答OP的问题,而是提供了一种不同的设计,以避免原始问题中所述的问题。该解决方案需要建立一个新的docker映像,作为原始docker的网关

有可能在提出原始问题时,以下信息不可用,但我从Docker.com上找到的是此链接 这似乎回答了最初的问题,它指出:

" 默认情况下,允许所有外部源IP连接到Docker守护程序。若要仅允许特定IP或网络访问容器,请在Docker筛选器链的顶部插入否定规则。例如,以下规则限制对除192.168.1.1以外的所有IP地址的外部访问:

$iptables-I DOCKER-USER-I ext_if!-s 192.168.1.1-j DROP“

如果需要添加在Docker规则之前加载的规则,请将其添加到Docker-USER链中


但遗憾的是,我尝试了这个解决方案,但在docker版本17.05.0-ce上似乎也不适用于我

我意识到我在响应一个旧线程,但我花了一个上午的大部分时间对这个问题感到沮丧。这篇文章显示在谷歌搜索的顶部,但我觉得被接受的答案并没有回答OP的问题,而是提供了一种不同的设计,以避免原始问题中所述的问题。该解决方案需要建立一个新的docker映像,作为原始docker的网关

有可能在提出原始问题时,以下信息不可用,但我从Docker.com上找到的是此链接 这似乎回答了最初的问题,它指出:

" 默认情况下,允许所有外部源IP连接到Docker守护程序。若要仅允许特定IP或网络访问容器,请在Docker筛选器链的顶部插入否定规则。例如,以下规则限制对除192.168.1.1以外的所有IP地址的外部访问:

$iptables-I DOCKER-USER-I ext_if!-s 192.168.1.1-j DROP“

如果需要添加在Docker规则之前加载的规则,请将其添加到Docker-USER链中

但遗憾的是,我已经尝试了这个解决方案,而且在docker版本17上它似乎也不适用于我
sudo iptables -I DOCKER-USER -p tcp -i eth0 ! -s 192.27.27.90 --dport 6782 -j REJECT
sudo iptables -I DOCKER-USER -p tcp -i eth0 ! -s 192.27.27.90 --dport 80 -j REJECT