这段配置乍看之下很合理:

acl team_a myportname 3128 src 198.51.100.0/24

但一个 ACL 定义只有一种类型。这里的类型是 myportname;再加上 src 这个词并不会开始第二项检查。剩下的词都属于第一种类型的取值列表。那一行并没有表达“这个监听器加这个客户端网段”。

给每个条件单独命名

为监听套接字起一个名字,再写一个独立的来源 ACL。下面的片段使用文档地址,实际部署时要换成合适的地址:

http_port 192.0.2.10:3128 name=team_a_port
acl team_a_port myportname team_a_port
acl team_a_clients src 198.51.100.0/24

http_access allow team_a_port team_a_clients
http_access deny all

这条 allow 规则要放在针对危险目标端口、受限 CONNECT 目标和管理访问的既有保护之后。片段只演示客户端/监听器这一条件,并不取代那些保护。

同一行 http_access 上的条件按 AND 组合。拆成两条独立的 allow 行会让两个条件各自单独放行,策略会因此大幅改变。同一个 ACL 里的多个值通常只是为这一次检查提供备选。

出口要单独选择

匹配到的监听器还可以交给 tcp_outgoing_address,用来 选择本地源地址。那属于路由选择,不是允许使用代理。出口地址规则无法让被拒绝的请求通过 http_access。

如果多地址配置在升级后失效,要把证据分开看:解析错误指向配置语法;访问被拒指向规则匹配;请求被放行却走错出口,指向出口选择或后续 NAT。三件事一起改,一个很小的 ACL 错误会变得难找得多。

相关文章