Docker 容器只能通过 Cloudflare CDN 访问(选定的 IP 范围)

Docker container accessible only via Cloudflare CDN (selected ip ranges)

我在 docker 容器中有网络服务器,但我无法在我的主机 (Debian) 上配置 iptables。我想允许 only 指定的 ip 地址在端口 80 和 443 上连接到我的机器(主机)。端口 22 应该可以从任何 ip 访问。在我的例子中,允许的应该是 Cloudflare ip 地址。 Cloudflare ips 在 https://www.cloudflare.com/ips-v4.

可用

我应该如何正确阻止端口 80 和 443 上的非 Cloudflare ips 连接?

解决方案:

iptables -F DOCKER-USER
iptables -I DOCKER-USER -j RETURN
iptables -I DOCKER-USER -p tcp -m multiport --dports http,https -j DROP
for i in `curl -s https://www.cloudflare.com/ips-v4`;\
        do iptables -I DOCKER-USER -p tcp -i eth0 -m multiport --dports http,https -s $i -j RETURN;\
done
iptables -I DOCKER-USER -o eth0 -d 0.0.0.0/0 -j ACCEPT

iptables -L 的 DOCKER-USER 的结果:

ACCEPT     all  --  anywhere             anywhere
RETURN     tcp  --  <ACCEPTED IPs>       anywhere             multiport dports http,https
DROP       tcp  --  anywhere             anywhere             multiport dports http,https
RETURN     all  --  anywhere             anywhere

解释:
第一部分 (ACCEPT) 接受来自 Web 服务器(docker 容器)的传出流量。
第二部分 (RETURN) 描述允许连接到端口 80 或 443 的 ip 地址。
第三部分 (DROP) 丢弃端口 80/443 上的连接数据包,这些数据包未在 RETURN 部分中列出。
第四部分(RETURN)是DOCKER-USER链中的默认规则。它可以通过下一个规则处理其他端口上的连接,而不是丢弃非 80/443 端口(例如端口 22 - ssh)上的所有连接。

这也会在端口 80/tcp 上丢弃 docker 容器 运行 的任何数据包,但容器的端口未映射到主机。创建类似于 docker, iptables and cloudflare

的问题