Networking 仅从特定IP地址限制Docker暴露端口

Networking 仅从特定IP地址限制Docker暴露端口,networking,docker,iptables,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 -

如何仅从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
从docker指南:

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

$iptables-I DOCKER-I ext\u if-s 8.8.8.8-j下降

在您的情况下,由于您希望允许多个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

您的策略是白名单,最好创建一个用户自定义
单独处理

例如,我有一个
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
将原始规则替换为自定义链:

$ 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.37
172.31.101.38

注意:

  • 172.17.0.2
    是redis容器的ip

    • 我也有同样的问题。我用这个规则解决了它:

      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
      
      iptables-I DOCKER-USER-I-j DROP
      iptables-I DOCKER-USER-I-s-j接受
      iptables-I DOCKER-USER-I-s-j接受
      
      注意,
      DOCKER-USER
      是一个链,在
      服务DOCKER重新启动时不会删除该链


      您应该能够添加您的端口标志,但我不是专家,这不是我的需要。

      您可能还希望使用您要侦听的特定IP阻止docker直接访问,如-p 1.2.3.4:6379:6379/tcp语法,这样容器将只侦听该IP和接口


      如果您将该IP用作专用IP,则可以完全避免使用iptables,因为您仅限制从本地/专用网络进行访问。

      您可以从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]]
      

      这个问题有用吗?iptables是顺序敏感的。你在接受规则之前就拒绝了。我也面临着同样的问题,我仍在努力让我的大脑绕过Docker。目前,我创建了包含JavaREST服务的容器,并将其转发给Devop进行部署。我想知道这个脚本是否可以嵌入Dockerfile中?谢谢如果您指定了--destination 172.17.0.2,您将绑定特定IP的规则,该IP可能会在下一次重启时发生更改。我想限制specefic容器