阻止 Docker 端口并通过少数 IP 地址访问它

阻止 Docker 端口并通过少数 IP 地址访问它

我需要阻止 Ubuntu 服务器 16.04 上端口 8090 的所有输入流量。我使用了 iptables 但它不起作用。我使用的命令:

iptables -A INPUT -p tcp --dport 8090 -j DROP iptables -A INPUT -p tcp --dport 8090 -s <IP> -j ACCEPT

在 NAT 中我有: Chain DOCKER (2 references) target prot opt source destination DNAT tcp -- anywhere <VM local IP> tcp dpt:8090 to:172.21.0.2:8080

公共接口命名eth0和 docker 接口命名docker0

答案1

因为DNAT,你现在路由。您的 INPUT 链不再用于此 DNATed 流量,现在改为遍历 FORWARD 链。新的目的地是172.21.0.2:8080,这就是规则现在应该关心的,不再是了<VM local IP>:8090

因此,使用 DNAT 后,您应该使用以下方法阻止流量(按照正确的顺序:允许例外,然后禁止其他所有内容):

iptables -A FORWARD -s <IP> -d 172.21.0.2 -p tcp --dport 8080 -j ACCEPT
iptables -A FORWARD -d 172.21.0.2 -p tcp --dport 8080 -j DROP

为了确保它实际上是在任何系统规则之前完成的,您可以这样做:

iptables -I FORWARD 1 -s <IP> -d 172.21.0.2 -p tcp --dport 8080 -j ACCEPT
iptables -I FORWARD 2 -d 172.21.0.2 -p tcp --dport 8080 -j DROP

根据配置,这些规则可能会阻止其他容器访问此容器,因此您可能必须调整它们(例如,通过声明外部输入接口)。无论如何,您必须找到一种方法将其与系统的防火墙方法很好地集成。

答案2

关于这些行:

iptables -A INPUT -p tcp --dport 8090 -j DROP
iptables -A INPUT -p tcp --dport 8090 -s <IP> -j ACCEPT

你应该改变它们的顺序,因为IP表规则在冲突状态下会相互覆盖,这是正确的方法,因此首先纠正这些规则并检查所有其他角色以防止覆盖。

关于网络地址转换您的问题的一部分,尚不清楚,但是,在 docker 上,您应该在启动容器时分配端口:

docker run ... -p 8090:8080 ... 

相关内容