仅限特定IP地址的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 

您的策略是白名单,最好是单独创build一个用户自定义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 

创build我们的自定义链:

 $ 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 

用自定义链replace原始规则:

 $ 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

从docker指南这里 :

Docker的转发规则默认允许所有外部源IP。 要仅允许特定的IP或networking访问容器,请在DOCKERfilter链的顶部插入否定规则。 例如,要限制外部访问,只有源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