在应用旁边监听的本地代理并不能复现一个必须经过代理才能访问的网络。应用可能忽略已配置的代理,直接连接,却仍然报告成功。

把应用的网络与代理对外的路径分开。一种基于容器的方式只让应用接入内部网络,而给代理再接一个出口网络。在已有的 Compose 定义中,网络挂接可以写成这样:

services:
  app:
    networks: [clients]
  proxy:
    networks: [clients, egress]
networks:
  clients:
    internal: true
  egress: {}

这是给已经定义好的服务用的网络片段。请分别配置经过批准的转发代理和应用的真正客户端。Docker 把内部网络记录为与外部隔离;在这样的安排里,只有代理才有额外的对外网络。

还要加入一个去掉代理使用的反向用例:应用对外的请求应当失败。对于需要认证的 HTTP 代理,被拒绝的账号应当产生它自己的认证失败,而被接受的账号应当在代理侧留下相应观察的前提下到达目标。

分别测试代理允许与拒绝的情形。让应用远离其他外部网络,也不要添加绕过代理的宿主网络模式。只有当测试只提供预期的那条路径时,一次成功的请求才算有用的证据。

相关文章