所以我有一个运行 PF 和 Squid 的 FreeBSD 路由器,它有三个网络接口:两个连接到上游提供商(em0
和em1
分别),一个用于re0
我们服务的 LAN( )。有一些使用 PF 配置的负载平衡。基本上,它1-1024
通过一个接口 ( em0
) 将所有流量路由到端口,并通过另一个 ( ) 将所有流量路由到端口em1
。
现在,我有一个 Squid 代理也在盒子上运行,它透明地将任何 HTTP 请求从 LAN 重定向到 port 3128
in 127.0.0.1
。既然 Squid 将这个请求重定向到外部的 HTTP,它应该遵循负载均衡规则em0
,不是吗?问题是,当我们测试时(从局域网中的电脑浏览http://whatismyip.com,它会报告em1
接口的外部 IP!当我们关闭 Squid 时,em0
会报告外部 IP,如预期的。
如何使 Squid 符合我们设置的负载平衡规则?
这是我拥有的相关设置/etc/pf.conf
:
ext_if1="em1" # DSL
ext_if2="em0" # T1
int_if="re0"
ext_gw1="x.x.x.1"
ext_gw2="y.y.y.1"
int_addr="10.0.0.1"
int_net="10.0.0.0/16"
dsl_ports = "1024:65535"
t1_ports = "1:1023"
...
squid=3128
rdr on $int_if inet proto tcp from $int_net \
to any port 80 -> 127.0.0.1 port $squid
pass in quick on $int_if route-to lo0 inet proto tcp \
from $int_net to 127.0.0.1 port $squid keep state
...
# load balancing
pass in on $int_if route-to ($ext_if1 $ext_gw1) \
proto tcp from $int_net to any port $dsl_ports keep state
pass in on $int_if route-to ($ext_if1 $ext_gw1) \
proto udp from $int_net to any port $dsl_ports
pass in on $int_if route-to ($ext_if2 $ext_gw2) \
proto tcp from $int_net to any port $t1_ports keep state
pass in on $int_if route-to ($ext_if2 $ext_gw2) \
proto udp from $int_net to any port $t1_ports
pass out on $ext_if1 route-to ($ext_if2 $ext_gw2) from $ext_if2 to any
pass out on $ext_if2 route-to ($ext_if1 $ext_gw1) from $ext_if1 to any
我尝试附加以下规则,但它什么也没做:
pass in on $int_if route-to ($ext_if2 $ext_gw2) \
proto tcp from 127.0.0.1 to any port $t1_ports keep state
谢谢!