这是我在这里的第一个问题,因此,与通常的嫌疑人相比,我的结构很糟糕,请大家原谅。:-)
我希望能够通过 TCP 在 LXC 容器中接收实际连接客户端 IP。目前,使用连接的网桥的当前配置无法实现这一点,默认分配动态 IP 地址,并且使用 LXD 网络类型代理路由流量。
设置
- Ubuntu 18.04 LTS。
- LXD 作为 SNAP 安装(迁移至 v. 4.1)。
- HAProxy 作为原生应用程序安装。
- 范围内的容器与 HAProxy 在同一主机上运行。
容器
- Ubuntu 18.04
- Apache2(提供 Nextcloud 安装)。
- HTTPS 在容器中的 Apache2 中终止
HAProxy 将 SSL 流量传递到容器而不终止它,但是通过使用 req_ssl_sni 检查连接标头来实现这一点。HAProxy 还支持 TCP 流的代理协议(我相信是 v2),因为它可以将客户端 IP 添加到 TCP 标头,以便任何下游代理或应用程序(也理解协议的这一部分)都可以在连接到达实际的 Web 服务器配置之前从标头中提取该 IP。这也适用于启用和配置了正确模块的 Apache2,但如果在 LXD 代理后面,则不行。即使我添加了 proxy_protocol=true,它也只能理解 HTTP 连接,因为它可以在那里访问和读取 HTTP 标头(转发)。
我可以通过将连接的网络设备更改为 NAT 类型来使其工作,这样 LXD 网桥就不会充当反向代理,而只是执行“老式”端口转发。但是我没有足够的时间让它“永久”工作(被覆盖并且 conatiner 在重启后无法启动)。
问题是
如何为 LXD 网络配置设置 DHCP 范围、基于容器别名的固定 DHCP 分配,然后将正确的网络设备添加到容器,以便我在 HAProxy 中要路由到的只是 LXD 桥接地址(网关地址)?
请记住,LXD 已安装并快速运行,因此花哨的(优雅的)lxc-net 技巧很难实现。
答案1
当连接经过一组代理时,丢失客户端 IP 地址是一个常见且意料之中的问题。因为 IP 数据包仅保留最后一个源 IP 地址。
很难说你的具体情况是怎么回事。重要的是,这是可以做到的。这是一个使用 LXD 代理设备并用作nginx
反向代理的教程,https://www.linode.com/docs/applications/containers/beginners-guide-to-lxd-reverse-proxy/如果您逐字逐句地尝试这样的教程,它将帮助您找出任何失误。
凭直觉,您的情况可能存在问题,因为 Apache2 已经失效,默认 LogFormat 未在 access.log 中记录正确的客户端 IP 地址。您需要将 更改为%h
。%a
有关更多详细信息,请参阅上述教程。