我正在运行一个 NGINX 代理容器(proxy_protocol=true)和多个 Web 容器,运行良好。但唯一的问题是,使用代理协议时,代理容器内的防火墙不起作用,因为除了 nginx 之外,由于反向代理,它无法获取真实用户 IP。
现在,我希望将代理协议更改为 NAT 以使防火墙正常工作。但这会立即破坏 nginx,我认为这是因为我必须编写 iptables 规则才能正确转发内容。有谁能帮我吗?
对于那些好奇的人来说,我正在使用 UFW。我只有 1 个 IP 地址,并且当前运行默认配置文件:
description: Default LXD profile
devices:
eth0:
name: eth0
network: lxdbr0
type: nic
nginx 代理容器已经有一个静态 IP 地址。
如果您需要任何其他信息,请随时询问。
答案1
为什么不在主机中设置防火墙,而是在容器中设置?
我猜你设置了一个代理设备来将 HTTP 和 HTTPS 端口转发到容器,如下所示:
lxc config device add nginx myport80 proxy listen=tcp:yourpublicip:80 proxy_protocol=true connect=tcp:127.0.0.1:80
如果您想使用 iptables 执行相同操作,可以使用以下命令:
iptables -t nat -A PREROUTING -d yourpublicip -p tcp --dport 80 -j DNAT --to-destination nginxcontainerip
记得删除代理设备。你可以将该语句保存在启动时为 root 的脚本中,或者使用 iptables-save 使其永久生效(https://www.thomas-krenn.com/en/wiki/Saving_Iptables_Firewall_Rules_Permanently)。您还可以使用一些防火墙脚本,例如arno-iptables-firewall。