在pfSense的网关和服务器中有两种类型的负载平衡功能。网关负载平衡可以通过多个WAN连接分发Internet绑定的流量。服务器负载平衡管理传入流量,它利用多个内部服务器进行负载分配和冗余,服务器负载平衡允许流量在多个内部服务器之间分配,通常用于Web服务器和SMTP服务器。下面以实例介绍如何在pfSense 2.3.2中配置Web服务器的负载平衡。
网络环境

上图为示例网络环境:由单个防火墙组成,使用其WAN IP地址池,DMZ段上有两个Web服务器。
配置地址池
- 导航到 Services > Load Balancer
- 单击 Pools 标签
- 单击添加按钮,添加一个新的地址池
使用以下设置:
- Name: WebServers
- Mode: Load Balance
- Description: Web server Pool
- Port: 80
- Retry: 5
- Pool Members: 添加两个Web服务器 (10.6.0.11 和 10.6.0.12)
- 单击 Save

配置虚拟服务器

- 单击 Virtual Servers 标签
- 单击添加按钮,添加一个新的虚拟服务器
使用以下设置:
- Name: WebVirtualServer
- Description: Web Server
- IP Address: 防火墙的WAN IP地址,198.51.100.6
- Port: 80
- Virtual Server Pool: WebServers
- Fall Back Pool: None
- 单击 Submit
- 单击 Apply Changes
注意:如果两个池服务器都关闭,则虚拟服务器无法访问。如果没有配置虚拟服务器,防火墙将按原有规则处理。如果防火墙上的某些应用(如Web GUI)绑定到80端口,客户端可能会直达该应用。建议在 System > Advanced > Admin Access 选项卡上禁用或变更Web GUI端口。
配置防火墙规则
防火墙规则必须配置为允许访问池中的服务器。规则应使用内部IP地址和端口,无需为虚拟服务器的外部IP地址和端口额外设置规则。
首先创建一个包含池中所有服务器的别名,以便使用单个规则。
- 导航到 Firewall > Aliases
- 单击添加按钮,添加一个别名
使用以下设置:
- Name: www_servers
- Type: Hosts
- Hosts: 10.6.0.11 和 10.6.0.12
- 单击 Save
- 单击 Apply Changes

接着,用该别名创建防火墙规则:
- 导航到 Firewall > Rules,切换到外部访问接口(如WAN)
单击添加规则按钮,使用以下配置:
- Interface: WAN
- Protocol: TCP
- Source: any
- Destination Type: Single Host or Alias
- Destination Address: www_servers
- Destination Port Range: HTTP
- Description: Allow to Web Server
- 单击 Save
- 单击 Apply Changes


查看负载平衡状态
配置完成后,可浏览到 Status > Load Balancer,单击 Virtual Servers 选项卡查看整体状态。Pools 选项卡会显示每个成员的单独状态(如下图所示)。服务器在线显示为绿色,离线则为红色。池中每个服务器前都有复选框,已勾选的服务器处于活动状态,取消勾选并保存则可临时禁用该服务器。

验证负载平衡
建议使用 curl 进行测试,以避免浏览器缓存和持久连接干扰。curl 可从其官方网站下载。在外部网络执行以下命令(将IP替换为实际地址):
curl http://198.51.100.6示例输出:
# curl http://198.51.100.6
This is server www2 - 10.6.0.12
# curl http://198.51.100.6
This is server www1 - 10.6.0.11如未启用粘性连接,每次请求可能会由不同的服务器响应。
故障排除
无法连接到负载平衡器
通常由测试方法不当引起(尤其针对HTTP)。Web浏览器会保持已建立的连接,刷新时重用同一连接,无法切换到另一台服务器;浏览器缓存也可能导致未发送真实请求。请使用 curl 等命令行工具进行测试。如果启用了粘性连接,需从多个源IP地址测试,否则单个IP的请求会始终指向同一服务器,除非间隔时间足够长。
已关闭的服务器未标记为离线
若服务器已关机但仍显示在线,是因为负载平衡守护进程的监视器仍能收到回复。对于TCP监视,TCP端口可能仍能接受连接;对于ICMP监视,即使服务完全挂起,服务器仍可能响应ping。
在线服务器未标记为在线
若服务器在线但显示离线,说明监视器无法检测到它。服务器必须能从离它最近的防火墙接口IP地址处正常响应(如LAN服务器需应答来自防火墙LAN IP的请求)。可通过以下方法验证:
- ICMP监视:导航到 Diagnostics > Ping,使用服务器所在接口ping其IP。
- TCP监视:使用 Diagnostics > Test Port,选择防火墙LAN接口作为源,Web服务器的IP和端口作为目标。
- 或通过SSH/Console进入防火墙Shell,使用
nc命令测试:
# nc -vz 10.6.0.12 80
nc: connect to 10.6.0.12 port 80 (tcp) failed: Operation timed out失败示例。
# nc -vz 10.6.0.12 80
Connection to 10.6.0.12 80 port [tcp/http] succeeded!成功示例。
与池服务器在同一子网中的客户端无法访问虚拟服务器
若客户端与后端服务器处于同一子网,负载平衡可能会失效。relayd 会将请求以客户端原始源地址转发给服务器,服务器可能尝试直接回复客户端(拥有本地直连路径),导致回复绕过防火墙,客户端收到非预期的源地址而丢弃连接。
一种临时解决方法:添加手动出站NAT规则,将来自该子网且目标为Web服务器的流量源地址转换为防火墙的LAN接口地址,使所有流量看似源自防火墙。但这样会丢失原始客户端IP。最佳解决方案是将服务器移到不同的网段。
觉得内容不错?我要