我需要阻止 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 ...