carp0.1.0Services: CARP (failover)CARP Settings/pkg_edit.php?xml=carp.xmlCARP Statuscarp_status.php/usr/local/pkg/pf/a+xhttp://www.pfsense.com/packages/config/carp_rules.php/usr/local/www/a+xhttp://www.pfsense.com/packages/config/carp_status.php['installedpackages']['carp']['config']VHID GroupvhidVirtual IP AddressipaddressAdvertising FrequencyadvskewSynchronize StatepfsynccheckboxLoad BalancingbalancingcheckboxNetmasknetmaskPreemptionpremptioncheckboxVirtual IP AddressipaddressEnter the IP Address that you would like to share on both machinesinputVirtual IP NetmasknetmaskEnter the IP Address's netmask that you would like to share on both machinesselect24Virtual IP PasswordpasswordEnter the VHID group password.passwordVHID GroupvhidEnter the VHID group that the machines will shareselect1Advertising FrequencyadvskewThe frequency that this machine will advertiseselect0Synchrnoize StatepfsyncPFSync transfers state insertion, update, and deletion messages between firewalls. Each firewall sends these messages out via multicast on a specified interface, using the PFSYNC protocol (IP Protocol 240). It also listens on that interface for similar messages from other firewalls, and imports them into the local state table.checkboxSynchronize Interfacesyncifaceinterfaces_selectionIf Synchronize State is enabled, it will utilize this interface for communication.Load BalancingbalancingIf this feature is enabled, CARP source-hashes the originating IP of a request. The hash is then used to select a virtual host from the available pool to handle the request. This is disabled by default.checkboxPreemptionpremptionWhen preemption is enabled, each CARP host will look at the advskew (Advertising Frequency) parameter in the advertisements it receives from the master, to try to determine whether it can advertise more frequently. If so, it will begin advertising, and the current master, seeing that there is another host with a lower advskew, will bow out.checkbox
function sync_package() {
/*
* XXX: find out how many carp and pfsync interfaces are established
* and destroy/down them before sweeping through the list
*/
conf_mount_rw();
config_lock();
$fout = fopen("/usr/local/etc/rc.d/carp.sh","w");
fwrite($fout, "#!/bin/sh \n");
global $config;
$using_arp_balance = 0;
$using_preempt = 0;
$carp_instances_counter = 0;
$pfsync_instances_counter = 0;
if($config['installedpackages']['carp']['config'] != "") {
foreach($config['installedpackages']['carp']['config'] as $carp) {
$pfsync = 0;
/*
* create the carp interface
*/
fwrite($fout, "echo Creating {$pfsync_instances_counter} ...\n");
fwrite($fout, "/sbin/ifconfig carp" . $carp_instances_counter . " create\n");
$broadcast_address = gen_subnet_max($carp['ipaddress'], $carp['netmask']);
if($carp['password'] != "") {
$password = " pass " . $carp['password'];
}
$carp_command = "/sbin/ifconfig carp" . $carp_instances_counter . " " . $carp['ipaddress'] . "/" . $carp['netmask'];
$carp_command .= " broadcast " . $broadcast_address . " vhid " . $carp['vhid'] . $carp['advskew'] . $password;
if($carp['balancing'] == "true") $using_arp_balance = 1;
if($carp['preempt'] == "true") $using_preempt = 1;
fwrite($fout, $carp_command . "\n");
if($carp['pfsync'] != "") $pfsync = 1;
if($pfsync != 0) {
/*
* user has selected pfsync, bring it up.
*/
fwrite($fout, "/sbin/ifconfig pfsync" . $pfsync_instances_counter . " create \n");
fwrite($fout, "/sbin/ifconfig pfsync" . $pfsync_instances_counter . " up syncif " . convert_friendly_interface_to_real_interface_name($carp['synciface']) . "\n");
$pfsync_instances_counter++;
}
fwrite($fout, "sleep 1\n");
$carp_instances_counter++;
}
}
fwrite($fout, "/etc/rc.filter_configure");
fclose($fout);
mwexec("chmod a+x /usr/local/etc/rc.d/carp.sh");
mwexec("/usr/local/etc/rc.d/carp.sh");
if($using_arp_balance == 1) system("sysctl net.inet.arpbalance=1");
if($preempt == 1) system("sysctl net.inet.carp.preempt=1");
conf_mount_ro();
config_unlock();
}
sync_package();
sync_package();
system("/bin/rm /usr/local/www/carp*");
system("/bin/rm /usr/local/pkg/pf/carp*");
system("/bin/rm /usr/local/etc/rc.d/carp*");