在pfsense的网关和服务器中有两种类型的负载平衡功能。网关负载平衡可以通过多个WAN连接分发Internet绑定的流量。服务器负载平衡管理传入流量,因此它利用多个内部服务器进行负载分配和冗余,服务器负载平衡允许流量在多个内部服务器之间分配,它最常用于Web服务器和SMTP服务器。下面我们就以实例来介绍服务器负载平衡的设置。
下面介绍如何通过pfsense2.32配置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: The firewall’s WAN IP address, 198.51.100.6
Port: 80
Virtual Server Pool: WebServers Fall Back Pool: None -
单击 Submit(提交)
-
单击 Apply Changes(应用更改)
-
-
注意
在这个示例中,如果两个池服务器都关闭,则虚拟服务器无法访问。 如果没有配置虚拟服务器,防火墙将会起作用。 如果防火墙上的某些应用绑定到80端口,那么客户端就会直达绑定了这个端口的应用。 这可能包括通过端口80访问内置Web GUI,因此应该在System > Advanced > Admin Access 选项卡上禁用或采用其他端口。
配置防火墙规则
防火墙规则必须配置为允许访问池中的服务器。 规则必须允许流量使用内部IP地址和端口,并且对虚拟服务器配置中使用的外部IP地址和端口不需要任何规则限制。
创建一个包含池中所有服务器的别名,因此可以使用单个防火墙规则进行访问。
-
导航到Firewall > Aliases
-
单击 添加 一个别名
-
如图所示,使用以下设置:
Name: www_servers
Type: Hosts Hosts: 两个Web服务器IP地址: 10.6.0.11
和10.6.0.12
-
单击 Save
-
单击 Apply Changes(应用更改)
图中的“Name”显示了用于此示例配置的别名,其中包含两个Web服务器。
Web 服务器别名设置
下一步,用这个别名创建一个防火墙规则: 导航到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(应用更改)
下图为Web服务器设置的防火墙规则,未显示的选项保留默认值。
为Web服务器添加防火墙规则
列表中显示的规则。
Web 服务器防火墙规则
查看负载平衡状态
现在已经配置了负载平衡器,要查看其状态,请浏览到Status > Load Balancer,然后单击“Virtual Servers”选项卡。此页面显示整个服务器的状态,通常列为“Active(联机)”或“Down(脱机)”。
Pools选项卡显示池的每个成员的单独状态(如图池状态)。如果服务器处于联机状态,服务器的行为绿色,如果服务器处于脱机状态,则为红色。
此外,池中的每个服务器都有一个复选框。 已检查的服务器在池中处于活动状态,池中已禁用未选中的服务器,与在池编辑页面上启用和禁用列表之间移动的服务器相同。 要禁用服务器:取消选中它,然后单击保存。
池状态
如果在其中一个服务器上停止了Web服务器服务,或者如果使用ICMP监视器将服务器完全从网络中删除,则状态将更新为“脱机”,并将服务器从池中删除。
验证负载平衡
为了验证负载平衡, curl
是确保Web浏览器缓存和持久连接不影响测试结果的最佳选择。curl
可以从 curl 官方网站下载,有各种操作系统的版本。 要使用它,只需运行以下命令:
curl http://mysite
在该命令中,将198.51.100.6替换为站点的IP地址或主机名。 这必须从网络外部进行测试(例如,从WAN上的远程网络或客户端)。 例如,在外网用curl进行测试:
# 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
测试负载平衡时,设置每个服务器返回指定其主机名、IP地址或两者,因此明确哪个服务器响应该请求。 如果未启用粘性连接,则不同的服务器将响应每个请求。
故障排除
不能连接到负载平衡
不能连接到负载平衡器通常是使用测试方法不当造成的,这通常是HTTP特有的。 Web浏览器通常会保持与Web服务器建立的连接,并且点击刷新会重新使用现有的连接。 单个连接将永远不会更改为另一个平衡服务器。 另一个常见的问题是网络浏览器缓存,浏览器只从缓存读取数据,未真正再次刷新页面。 最好使用诸如curl等命令行工具来测试,因为它确保测试不受Web浏览器测试中固有问题的影响。curl没有缓存,并在每次运行时都会重新建立与服务器的新连接。
如果启用了粘性连接,请确保从多个源IP地址执行测试。来自单个源IP地址的测试将转到单个服务器,除非连接尝试之间经过了较长的时间。
关闭服务器未标记为脱机
如果服务器关闭但没有标记为脱机,那是因为负载平衡守护程序执行的监视信号仍然处于启动状态。 如果使用TCP监视器,TCP端口必须仍然接受连接。 该端口上的服务可以以多种方式断开,仍然可以回复TCP连接。 对于ICMP监视器,这个问题更加严重,因为服务器可以挂起或故障,没有任何监听服务,仍然可以回答ping。
在线服务器未标记为在线
如果服务器在线,但没有标记为在线,那是因为从负载平衡守护程序监视器的角度来看,它不是联机的。 服务器必须在所使用的TCP端口上回答或响应来自最靠近服务器的防火墙接口IP地址的ping。
例如,如果服务器在LAN上,则服务器必须应答从防火墙的LAN IP地址发起的请求。 要验证ICMP监视器,请导航到到Diagnostics > Ping,并使用服务器所在的接口Ping服务器IP地址。
对于TCP监视器,请使用“Diagnostics > Test Port”,并选择防火墙的LAN接口作为源,将Web服务器的IP地址和端口作为目标。
另一种测试方法是使用防火墙的shell提示符,使用console或ssh菜单选项8
和nc
命令:
# nc -vz 10.6.0.12 80nc:
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!
如果连接失败,请在Web服务器上进一步进行故障排除。
与池服务器在同一子网中的客户端无法访问虚拟服务器
与池服务器在同一子网中的客户端系统将无法使用此负载平衡方法正确连接。 relayd将连接转发到具有客户端源地址的Web服务器。然后,服务器将尝试直接响应客户端。如果服务器具有到客户端的直接路径,例如通过同一子网中的本地连接的NIC,它将不会正常通过防火墙回流,客户端将从服务器的本地IP地址收到回复,而不会在relayd中收到该IP地址。然后,由于从客户端的角度看,服务器IP地址不正确,连接被丢弃为无效。
这样做的一个方法是使用手动出站NAT和制定手动出站NAT规则,以便从LAN子网到达Web服务器的内部接口(LAN)的流量转换为LAN的接口地址。这样,流量似乎源于防火墙,服务器将响应到防火墙,然后防火墙将该流量中继到客户端使用的预期地址。原始的客户端源IP地址在该过程中丢失,最佳的解决方案是将服务器移动到不同的网段。