我正在尝试使公共 IP 上的端口(由 docker-compose 公开)仅供我的其他一些 IP 地址使用。我仍需要其他端口来接受来自任何 IP 的连接。
我曾尝试使用 ufw 来实现这一点,但显然 docker 本身对 iptables 做了一些更改,因此我无法以正常方式做到这一点。
答案1
不确定这对 UFW 来说有多好,但执行这些步骤的 iptables 规则涉及以下内容:
iptables -I DOCKER-USER -i eth0 -s 10.0.0.0/24 -p tcp \
-m conntrack --ctorigdstport 8080 -j ACCEPT
iptables -I DOCKER-USER -i eth0 ! -s 10.0.0.0/24 -p tcp \
-m conntrack --ctorigdstport 8080 -j DROP
以下是这些命令各部分的详细信息:
- 该表需要由
DOCKER-USER
docker提供,运行所有请求,并且不会像修改其他表那样修改此表。 - 您希望插入
DOCKER-USER
而不是追加,因为此表末尾的默认规则是接受所有内容。在此之后追加规则将被忽略。 - 接口
eth0
是外部网络接口。您通常不希望在内部阻止请求,无论是使用环回还是在容器之间。 - 源 IP CIDR 指定您要允许的地址范围,在本例中
10.0.0.0/24
为 C 类网络10.0.0.*
。第二条规则阻止到目标端口的所有其他内容。 conntrack
需要使用和来ctorigdstport
指定原始目标端口(即已发布端口),而不是容器端口。在 mangle 规则修改数据包以与容器通信后,iptables 看到的端口将是容器端口,并且多个容器可以在内部监听同一个端口,并发布到主机上的不同端口。
答案2
一种选择可能是利用反向代理(nginx\traefik\haproxy 容器?)来为您执行过滤的应用程序。