仅限于特定IP地址的Docker公开端口

时间:2017-03-21 15:52:55

标签: networking docker iptables

如何仅从IP列表中限制Docker公开的容器端口?只有这个IP列表才能访问此端口。

我试过了:

iptables -I DOCKER -p tcp --dport PORT_X -j REJECT --reject-with icmp-port-unreachable
iptables -I DOCKER -p tcp --dport PORT_X --source EXTERNAL_IP_1 --destination HOST_IP_1 -j ACCEPT
iptables -I DOCKER -p tcp --dport PORT_X --source EXTERNAL_IP_2 --destination HOST_IP_1 -j ACCEPT
iptables -I DOCKER -p tcp --dport PORT_X --source EXTERNAL_IP_3 --destination HOST_IP_1 -j ACCEPT

5 个答案:

答案 0 :(得分:3)

来自码头工具指南here

  

Docker的转发规则默认允许所有外部源IP。要仅允许特定IP或网络访问容器,请在DOCKER过滤器链的顶部插入否定规则。例如,要限制外部访问以便只有源IP 8.8.8.8可以访问容器,可以添加以下规则:

$ iptables -I DOCKER -i ext_if ! -s 8.8.8.8 -j DROP

在你的情况下,因为你想允许多个IP地址,我认为这样的事情应该有效:

iptables -I DOCKER -s EXTERNAL_IP_1 -p tcp --dport PORT_X -j ACCEPT
iptables -I DOCKER -s EXTERNAL_IP_2 -p tcp --dport PORT_X -j ACCEPT
iptables -I DOCKER -s EXTERNAL_IP_3 -p tcp --dport PORT_X -j ACCEPT
iptables -I DOCKER -p tcp --dport PORT_X -j REJECT --reject-with icmp-port-unreachable

答案 1 :(得分:3)

您的政策是白名单,单独创建用户自定义chain句柄会更好。

例如,我有一个redis容器,我希望它只用于特定的IP:

$ docker run -d -p 6379:6379 redis:2.8

启动redis容器后,iptables看起来像这样:

$ iptables -t filter -nL
Chain DOCKER (1 references)
target     prot opt source               destination
ACCEPT  tcp  --  0.0.0.0/0            172.17.0.2           tcp dpt:6379

创建我们的自定义链:

$ iptables -N CUSTOM_REDIS
$ iptables -A CUSTOM_REDIS -p tcp --dport 6379 --source 172.31.101.37 --destination 172.17.0.2 -j ACCEPT
$ iptables -A CUSTOM_REDIS -p tcp --dport 6379 --source 172.31.101.38 --destination 172.17.0.2 -j ACCEPT
$ iptables -A CUSTOM_REDIS -p tcp --dport 6379 --source 0.0.0.0/0 --destination 172.17.0.2 -j DROP

用自定义链替换原始规则:

$ iptables -R DOCKER 1 -p tcp --source 0.0.0.0/0 --destination 172.17.0.2 --dport 6379 -j CUSTOM_REDIS

现在我的redis只能通过ip访问:172.31.101.37172.31.101.38

注意:

  • 172.17.0.2是redis容器的IP

答案 2 :(得分:1)

我遇到了同样的问题。我用这个规则解决了它:

iptables -I DOCKER-USER -i <your_interface_name> -j DROP
iptables -I DOCKER-USER -i <your_interface_name> -s <your_first_ip> -j ACCEPT
iptables -I DOCKER-USER -i <your_interface_name> -s <your_second_ip> -j ACCEPT

谨慎,DOCKER-USER是一个在service docker restart

时不会被删除的链

你应该可以添加你的端口标志,但我不是专家,这不是我的需要。

答案 3 :(得分:0)

您可能还希望使用要监听的特定IP(例如-p 1.2.3.4:6379:6379/tcp语法)直接阻止docker访问,这样容器将仅在该IP和接口上进行监听。

如果将该IP用作私有IP,则可以完全避免iptables,因为仅限制了从本地/私有网络的访问。

答案 4 :(得分:0)

您可以在docker容器内部使用ufw

sudo ufw [--dry-run] [delete] [insert NUM]  allow|deny|reject|limit  [in|out on INTERFACE] [log|log-all] [proto protocol] [from ADDRESS [port PORT]][to ADDRESS [port PORT]]