限制 Docker 公开端口仅来自特定 IP 地址

Son*_*ony 4 networking iptables 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
Run Code Online (Sandbox Code Playgroud)

Dav*_*vid 9

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

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
Run Code Online (Sandbox Code Playgroud)

care,DOCKER-USER是一条不会被删除的链service docker restart

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


Sha*_*eok 6

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

例如,我有一个redis容器,我希望它只为特定的 IP 服务:

$ docker run -d -p 6379:6379 redis:2.8
Run Code Online (Sandbox Code Playgroud)

启动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
Run Code Online (Sandbox Code Playgroud)

创建我们的自定义链:

$ 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
Run Code Online (Sandbox Code Playgroud)

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

$ iptables -R DOCKER 1 -p tcp --source 0.0.0.0/0 --destination 172.17.0.2 --dport 6379 -j CUSTOM_REDIS
Run Code Online (Sandbox Code Playgroud)

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

笔记:

  • 172.17.0.2 是redis容器的ip

  • 如果您指定 --destination 172.17.0.2 您正在为特定 IP 绑定规则,该 IP 可能会在您下次重新启动时更改 (2认同)

小智 4

从这里的docker 指南

\n\n
\n

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

\n
\n\n

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

\n\n

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

\n\n
iptables -I DOCKER -s EXTERNAL_IP_1 -p tcp --dport PORT_X -j ACCEPT\niptables -I DOCKER -s EXTERNAL_IP_2 -p tcp --dport PORT_X -j ACCEPT\niptables -I DOCKER -s EXTERNAL_IP_3 -p tcp --dport PORT_X -j ACCEPT\niptables -I DOCKER -p tcp --dport PORT_X -j REJECT --reject-with icmp-port-unreachable\n
Run Code Online (Sandbox Code Playgroud)\n