aboutsummaryrefslogtreecommitdiffstats
path: root/config/Fit123/bin/cpaddon/filter.inc
diff options
context:
space:
mode:
Diffstat (limited to 'config/Fit123/bin/cpaddon/filter.inc')
-rw-r--r--config/Fit123/bin/cpaddon/filter.inc3332
1 files changed, 0 insertions, 3332 deletions
diff --git a/config/Fit123/bin/cpaddon/filter.inc b/config/Fit123/bin/cpaddon/filter.inc
deleted file mode 100644
index e9ca153a..00000000
--- a/config/Fit123/bin/cpaddon/filter.inc
+++ /dev/null
@@ -1,3332 +0,0 @@
-<?php
-/* $Id$ */
-/*
- filter.inc
- Copyright (C) 2004-2006 Scott Ullrich
- Copyright (C) 2005 Bill Marquette
- Copyright (C) 2006 Peter Allgeyer
- All rights reserved.
-
- originally part of m0n0wall (http://m0n0.ch/wall)
- Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
-
-*/
-
-/* include all configuration functions */
-require_once("functions.inc");
-require_once("pkg-utils.inc");
-require_once("notices.inc");
-
-if(!function_exists("filter_configure"))
- require_once("filter.inc");
-
-if($config['system']['shapertype'] <> "m0n0")
- require_once ("shaper.inc");
-
-/* holds the items that will be executed *AFTER* the filter is fully loaded */
-$after_filter_configure_run = array();
-
-function filter_pflog_start() {
- global $config, $g;
-
- if(isset($config['system']['developerspew'])) {
- $mt = microtime();
- echo "filter_pflog_start() being called $mt\n";
- }
-
- mute_kernel_msgs();
-
- $pid = `ps awwwux | grep -v "grep" | grep "tcpdump -s 256 -v -l -n -e -ttt -i pflog0" | awk '{ print $2 }'`;
- if(!$pid)
- mwexec_bg("/usr/sbin/tcpdump -s 256 -v -l -n -e -ttt -i pflog0 | logger -t pf -p local0.info");
-
- unmute_kernel_msgs();
-
-}
-
-/* reload filter async */
-function filter_configure() {
- if(isset($config['system']['developerspew'])) {
- $mt = microtime();
- echo "filter_configure() being called $mt\n";
- }
- global $g;
-
- touch($g['tmp_path'] . "/filter_dirty");
-}
-
-/* reload filter sync */
-function filter_configure_sync() {
- global $config, $g, $after_filter_configure_run;
- filter_pflog_start();
- update_filter_reload_status("Initializing");
- /* invalidate interface cache */
- get_interface_arr(true);
- if(isset($config['system']['developerspew'])) {
- $mt = microtime();
- echo "filter_configure_sync() being called $mt\n";
- }
-
- /* load ipfw / dummynet early on if required */
- if($config['system']['dummynetshaper']) {
- $status = intval(`kldstat | grep ipfw | wc -l | awk '{ print $1 }'`);
- if($status == "0") {
- mwexec("/sbin/kldload ipfw");
- mwexec("/sbin/kldload dummynet");
- }
- } else {
- /* check to see if any rules reference a schedule
- * and if so load ipfw for later usage.
- */
- foreach($config['filter']['rule'] as $rule) {
- if($rule['sched'])
- $time_based_rules = true;
- }
- if($time_based_rules == true) {
- $status = intval(`kldstat | grep ipfw | wc -l | awk '{ print $1 }'`);
- if($status == "0") {
- mute_kernel_msgs();
- mwexec("/sbin/kldload ipfw");
- unmute_kernel_msgs();
- }
- if ($config['system']['maximumstates'] <> "" && is_numeric($config['system']['maximumstates'])) {
- /* Set ipfw states to user defined maximum states in Advanced menu. */
- mwexec("sysctl net.inet.ip.fw.dyn_max={$config['system']['maximumstates']}");
- } else {
- /* Set to default 10,000 */
- mwexec("sysctl net.inet.ip.fw.dyn_max=10000");
- }
- exec("/sbin/ipfw delete set 9");
- exec("/sbin/ipfw delete 2");
- exec("/sbin/ipfw delete 3");
- }
- }
-
- $lan_if = $config['interfaces']['lan']['if'];
- $wan_if = get_real_wan_interface();
-
- /* generate aliases */
- if($g['booting'] == true) echo ".";
- update_filter_reload_status("Creating aliases");
- $aliases = filter_generate_aliases();
- /* generate nat rules */
- if($g['booting'] == true) echo ".";
- update_filter_reload_status("Generating NAT rules");
- $natrules = filter_nat_rules_generate();
- /* generate pfctl rules */
- if($g['booting'] == true) echo ".";
- update_filter_reload_status("Generating filter rules");
- $pfrules = filter_rules_generate();
-
- if (isset($config['shaper']['enable']) and $config['system']['shapertype'] <> "m0n0") {
- /* generate altq interface setup parms */
- if($g['booting'] == true) echo ".";
- update_filter_reload_status("Generating ALTQ interfaces");
- $altq_ints = filter_setup_altq_interfaces();
- /* generate altq queues */
- if($g['booting'] == true) echo ".";
- update_filter_reload_status("Generating ALTQ queues");
- $altq_queues = filter_generate_altq_queues($altq_ints);
- /* generate altq rules */
- if($g['booting'] == true) echo ".";
- /* Setup a default rule that tags ALL packets as unshaped
- * we'll match only unshaped packets in the shaper code later
- * this allows the shaper to be first match
- */
- $pf_altq_rules = "block in all tag unshaped label \"SHAPER: first match rule\"\n";
- update_filter_reload_status("Generating ALTQ rules");
- $pf_altq_rules .= filter_generate_pf_altq_rules();
- }
-
- update_filter_reload_status("Loading filter rules");
-
- /* enable pf if we need to, otherwise disable */
- if (!isset ($config['system']['disablefilter'])) {
- mwexec("/sbin/pfctl -e", true);
- } else {
- mwexec("/sbin/pfctl -d");
- unlink_if_exists("{$g['tmp_path']}/filter_loading");
- update_filter_reload_status("Filter is disabled. Not loading rules.");
- return;
- }
-
- // Copy rules.debug to rules.debug.old
- if(file_exists("{$g['tmp_path']}/rules.debug"))
- exec("cp {$g['tmp_path']}/rules.debug {$g['tmp_path']}/rules.debug.old");
-
- $fd = fopen("{$g['tmp_path']}/rules.debug", "w");
- $rules = $aliases . " \n";
-
- update_filter_reload_status("Setting up logging information");
-
- $rules .= setup_logging_interfaces();
-
- if ($config['system']['optimization'] <> "") {
- $rules .= "set optimization {$config['system']['optimization']}\n";
- if ($config['system']['optimization'] == "conservative") {
- $rules .= "set timeout { udp.first 300, udp.single 150, udp.multiple 900 }\n";
- }
- } else {
- $rules .= "set optimization normal\n";
- }
-
- if ($config['system']['maximumstates'] <> "" && is_numeric($config['system']['maximumstates'])) {
- /* User defined maximum states in Advanced menu. */
- $rules .= "set limit states {$config['system']['maximumstates']}\n";
- }
- $rules .= "\n";
-
- update_filter_reload_status("Setting up SCRUB information");
- /* get our wan interface? */
- $wanif = get_real_wan_interface();
-
- /* disable scrub option */
- if(!isset($config['system']['disablescrub'])) {
- /* set up MSS clamping */
- if ($config['interfaces']['wan']['mtu'] <> "" and is_numeric($config['interfaces']['wan']['mtu']))
- $mssclamp = "max-mss " . (intval($config['interfaces']['wan']['mtu'] - 40));
- else
- if ($config['interfaces']['wan']['ipaddr'] == "pppoe")
- $mssclamp = "max-mss 1452";
- else
- $mssclamp = "";
-
- /* configure no-df for linux nfs and others */
- if ($config['system']['scrubnodf'])
- $scrubnodf = "no-df random-id";
- else
- $scrubnodf = "random-id";
- $rules .= "scrub all {$scrubnodf} {$mssclamp} fragment reassemble\n"; // reassemble all directions
- } else if ($config['interfaces']['wan']['mtu'] <> "" and is_numeric($config['interfaces']['wan']['mtu'])) {
- $rules .= "scrub {$mssclamp}\n"; // reassemble all directions
- }
-
- if($config['system']['shapertype'] <> "m0n0") {
- $rules.= "{$altq_ints}\n";
- $rules.= "{$altq_queues}\n";
- }
- $rules.= "{$natrules}\n";
- if($config['system']['shapertype'] <> "m0n0")
- $rules.= "{$pf_altq_rules}\n";
- $rules.= "{$pfrules}\n";
- fwrite($fd, $rules);
- fclose($fd);
-
- $rules = "1"; // force to be diff from oldrules
- $oldrules = "2"; // force to be diff from rules
-
- if(file_exists("{$g['tmp_path']}/rules.debug"))
- $rules = file_get_contents("{$g['tmp_path']}/rules.debug");
- if(file_exists("{$g['tmp_path']}/rules.debug.old"))
- $oldrules = file_get_contents("{$g['tmp_path']}/rules.debug.old");
-
- if(isset($config['system']['developerspew'])) {
- $mt = microtime();
- echo "pfctl being called at $mt\n";
- }
- $rules_loading = mwexec("/sbin/pfctl -o basic -f {$g['tmp_path']}/rules.debug");
- if(isset($config['system']['developerspew'])) {
- $mt = microtime();
- echo "pfctl done at $mt\n";
- }
-
- /* check for a error while loading the rules file. if an error has occured
- then output the contents of the error to the caller */
- if($rules_loading <> 0) {
- $rules_error = exec_command("/sbin/pfctl -f {$g['tmp_path']}/rules.debug");
- $line_error = split("\:", $rules_error);
- $line_number = $line_error[1];
- $rules_file = `/bin/cat {$g['tmp_path']}/rules.debug`;
- $line_split = split("\n", $rules_file);
- if(is_array($line_split))
- $line_error = "The line in question reads [{$line_number}]: {$line_split[$line_number-1]}";
- if($line_error and $line_number) {
- file_notice("filter_load", "There were error(s) loading the rules: {$rules_error} {$line_error}", "Filter Reload", "");
- log_error("There were error(s) loading the rules: {$rules_error} - {$line_error}");
- update_filter_reload_status("There were error(s) loading the rules: {$rules_error} - {$line_error}");
- return;
- }
- }
-
- unlink_if_exists("/usr/local/pkg/pf/carp_sync_client.php");
-
- /* run items scheduled for after filter configure run */
- $fda = fopen("/tmp/commands.txt", "w");
- foreach($after_filter_configure_run as $afcr)
- fwrite($fda, $afcr . "\n");
- fclose($fda);
- if(file_exists("/tmp/commands.txt")) {
- mwexec("sh /tmp/commands.txt &");
- unlink("/tmp/commands.txt");
- }
-
- update_filter_reload_status("Running plugins");
-
- if(is_dir("/usr/local/pkg/pf/")) {
- /* process packager manager custom rules */
- update_filter_reload_status("Running plugins (pf)");
- run_plugins("/usr/local/pkg/pf/");
- update_filter_reload_status("Plugins completed.");
- }
-
- system_start_ftp_helpers();
-
- if($config['system']['shapertype'] == "m0n0") {
- require_once ("/etc/inc/m0n0/shaper.inc");
- shaper_configure();
- }
-
- /* if time based rules are enabled then swap in the set */
- if($time_based_rules == true) {
- tdr_install_cron(true);
- tdr_install_set();
- } else {
- tdr_install_cron(false);
- }
-
- /*
- we need a way to let a user run a shell cmd after each
- filter_configure() call. run this xml command after
- each change.
- */
- if($config['system']['afterfilterchangeshellcmd'] <> "")
- mwexec($config['system']['afterfilterchangeshellcmd']);
-
- /* sync carp entries to other firewalls */
- update_filter_reload_status("Syncing CARP data");
- carp_sync_client();
-
- system_routing_configure();
-
- update_filter_reload_status("Done");
-
- return 0;
-}
-
-function filter_generate_aliases() {
- global $config, $g;
- if(isset($config['system']['developerspew'])) {
- $mt = microtime();
- echo "filter_generate_aliases() being called $mt\n";
- }
- $aliases = "";
-
- $i = 0;
-
- $lanip = find_interface_ip($config['interfaces']['lan']['if']);
- $wanip = find_interface_ip(get_real_wan_interface());
-
- $aliases .= "# System Aliases \n";
- $aliases .= "loopback = \"{ lo0 }\"\n";
- $aliases .= "lan = \"{ {$config['interfaces']['lan']['if']}{$lan_aliases} }\"\n";
-
- if($config['interfaces']['wan']['ipaddr'] == "pppoe" or $config['interfaces']['wan']['ipaddr'] == "pptp") {
- $aliases .= "ng0 = \"{ " . $config['interfaces']['wan']['if'] . " " . get_real_wan_interface() . " }\" \n";
- $aliases .= "wan = \"{ " . $config['interfaces']['wan']['if'] . " ng0 }\"\n";
- } else {
- $aliases .= "wan = \"{ " . get_real_wan_interface() . " }\"\n";
- }
-
- $aliases .= "enc0 = \"{ enc0 }\"\n";
-
- /* used to count netgraph interfaces */
- $counter = 0;
-
- /* ng ordering is VERY important here. do not alter order */
- if($config['pptpd']['mode'] == "server") {
- /* build pptp alias */
- $tmp = "pptp = \"{ ";
- $starting_pptp = 1;
- if($config['interfaces']['wan']['ipaddr'] == "pppoe")
- $starting_pptp = 1;
- for($x=$starting_pptp; $x<$g["n_pptp_units"]+$starting_pptp; $x++)
- $tmp .= "ng{$x} ";
- $counter = $x;
- $tmp .= "}\" \n";
- if($counter > 0)
- $aliases .= $tmp;
- }
- if($config['pppoe']['mode'] == "server") {
- /* build pppoe alias */
- $tmp = "pppoe = \"{ ";
- $starting_pppoe = 1;
- if($config['interfaces']['wan']['ipaddr'] == "pppoe")
- $starting_pppoe = 1;
- for($x=0; $x<$g["n_pppoe_units"]+$starting_pppoe; $x++) {
- $tmp .= "ng{$counter} ";
- $counter++;
- }
- $tmp .= "}\" \n";
- if($x > 0)
- $aliases .= $tmp;
- }
-
- $ifdescrs = array();
- for ($j = 1; isset($config['interfaces']['opt' . $j]); $j++) {
- $ifdescrs['opt' . $j] = "opt" . $j;
- }
- $bridgetracker = 0;
- foreach ($ifdescrs as $ifdescr => $ifname) {
- /* do not process tun interfaces */
- /* do process tun interfaces for openvpn compatibility */
- /* if(stristr(filter_opt_interface_to_real($ifname), "tun") == true) continue; */
- $aliases .= convert_friendly_interface_to_friendly_descr($ifname) . " = \"{ " . filter_opt_interface_to_real($ifname);
-// if(link_int_to_bridge_interface($ifname))
-// $aliases .= " " . link_int_to_bridge_interface($ifname);
- $optip = find_interface_ip($config['interfaces'][$ifname]['if']);
- if($optip) {
- $opt_carp_ints = link_ip_to_carp_interface($optip);
- if($opt_carp_ints)
- $aliases .= $opt_carp_ints;
- }
- $aliases .= " }\"\n";
- }
- $aliases .= "# User Aliases \n";
- /* Setup pf groups */
- if (isset($config['aliases']['alias'])) {
- foreach ($config['aliases']['alias'] as $alias) {
- $extraalias = "";
- $ip = find_interface_ip($alias['address']);
- $extraalias = " " . link_ip_to_carp_interface($ip);
- $aliases .= "{$alias['name']} = \"{ {$alias['address']}{$extralias} }\"\n";
- }
- }
-
- return $aliases;
-}
-
-function get_vpns_list() {
- global $config;
- /* build list of vpns */
- $vpns = "";
- $isfirst = true;
- /* ipsec */
- if ($config['ipsec']['tunnel']) {
- foreach ($config['ipsec']['tunnel'] as $tunnel) {
- if ($isfirst == false)
- $vpns .= " ";
- $vpns .= $tunnel['remote-subnet'];
- $isfirst = false;
- }
- }
- /* openvpn */
- foreach (array('client', 'server') as $type) {
- $conf =& $config['installedpackages']["openvpn$type"]['config'];
- if (!is_array($conf)) continue;
- foreach ($conf as $tunnel) {
- if ($isfirst == false)
- $vpns .= " ";
- $vpns .= $tunnel['remote_network'];
- $isfirst = false;
- }
- }
- /* pppoe */
- if ($config['pppoe']['remoteip']) {
- if ($isfirst == false)
- $vpns .= " ";
- $vpns .= $config['pppoe']['remoteip'] ."/". $config['pppoe']['pppoe_subnet'];
- $isfirst = false;
- }
- $vpns .= " ";
- return $vpns;
-}
-
-function generate_optcfg_array(& $optcfg) {
- global $config;
- if(isset($config['system']['developerspew'])) {
- $mt = microtime();
- echo "generate_optcfg_array() being called $mt\n";
- }
-
- for ($i = 1; isset($config['interfaces']['opt' . $i]); $i++) {
- $oc = $config['interfaces']['opt' . $i];
-
- if (isset($oc['enable']) && $oc['if']) {
- $oic = array();
- $oic['if'] = $oc['if'];
-
- if ($oc['bridge']) {
- if (!strstr($oc['bridge'], "opt") ||
- isset($config['interfaces'][$oc['bridge']]['enable'])) {
- if (is_ipaddr($config['interfaces'][$oc['bridge']]['ipaddr'])) {
- $oic['ip'] = $config['interfaces'][$oc['bridge']]['ipaddr'];
- $oic['sn'] = $config['interfaces'][$oc['bridge']]['subnet'];
- $oic['sa'] = gen_subnet($oic['ip'], $oic['sn']);
- }
- }
- $oic['bridge'] = 1;
- } else {
- $oic['ip'] = $oc['ipaddr'];
- $oic['sn'] = $oc['subnet'];
- $oic['sa'] = gen_subnet($oic['ip'], $oic['sn']);
- $oic['descr'] = $oc['descr'];
- }
-
- $optcfg['opt' . $i] = $oic;
- }
- }
-}
-
-function filter_flush_nat_table() {
- global $config, $g;
- if(isset($config['system']['developerspew'])) {
- $mt = microtime();
- echo "filter_flush_nat_table() being called $mt\n";
- }
- return mwexec("/sbin/pfctl -F nat");
-}
-
-function filter_flush_state_table() {
- global $config, $g;
-
- return mwexec("/sbin/pfctl -F state");
-}
-
-/* Generate a 'nat on' or 'no nat on' rule for given interface */
-function filter_nat_rules_generate_if($if, $src = "any", $srcport = "", $dst = "any", $dstport = "", $natip = "", $natport = "", $nonat = false, $staticnatport = false) {
- global $config;
-
- /* XXX: billm - any idea if this code is needed? */
- if($src == "/32" || $src{0} == "/")
- return;
-
- /* Use interface name if IP isn't specified */
- if ($natip != "")
- $tgt = "{$natip}/32";
- else
- $tgt = "($if)";
-
- /* Add the hard set source port (useful for ISAKMP) */
- if ($natport != "")
- $tgt .= " port {$natport}";
-
- /* sometimes this gets called with "" instead of a value */
- if ($src == "")
- $src = "any";
-
- /* Match on this source port */
- if ($srcport != "")
- $src .= " port {$srcport}";
-
- /* sometimes this gets called with "" instead of a value */
- if ($dst == "")
- $dst = "any";
-
- /* Match on this dest port */
- if ($dstport != "")
- $dst .= " port {$dstport}";
-
- /* Allow for negating NAT entries */
- if ($nonat) {
- $nat = "no nat";
- $target = "";
- } else {
- $nat = "nat";
- $target = "-> {$tgt}";
- }
-
- /* outgoing static-port option, hamachi, Grandstream, VOIP, etc */
- if($staticnatport)
- $staticnatport_txt = " static-port";
- else
- if(!$natport)
- $staticnatport_txt = " port 1024:65535"; // set source port range
- else
- $staticnatport_txt = "";
-
- $if_friendly = convert_real_interface_to_friendly_descr($if);
-
- /* Put all the pieces together */
- if($if_friendly)
- $natrule = "{$nat} on \${$if_friendly} from {$src} to {$dst} {$target}{$staticnatport_txt}\n";
-
- return $natrule;
-}
-
-function is_one_to_one_or_server_nat_rule($iptocheck) {
- global $config, $target;
- if(isset($config['system']['developerspew'])) {
- $mt = microtime();
- echo "is_one_to_one_or_server_nat_rule() being called $mt\n";
- }
-
- if($config['nat']['onetoone'] <> "")
- foreach($config['nat']['onetoone'] as $onetoone) {
- if(ip_in_subnet($iptocheck,$onetoone['internal']."/".$onetoone['subnet']) == true)
- return true;
- if($onetoone['internal'] == $target)
- return true;
- }
-
- if($config['nat']['servernat'] <> "")
- foreach($config['nat']['servernat'] as $onetoone) {
- $int = explode("/", $onetoone['ipaddr']);
- if(ip_in_subnet($iptocheck,$onetoone['ipaddr']."/".$onetoone['subnet']) == true)
- return true;
- if($onetoone['ipaddr'] == $target)
- return true;
- }
-
- if($config['nat']['rule'] <> "")
- foreach($config['nat']['rule'] as $onetoone) {
- $int = explode("/", $onetoone['target']);
- if(ip_in_subnet($iptocheck,$onetoone['target']."/".$onetoone['subnet']) == true)
- return true;
- if($onetoone['target'] == $target)
- return true;
- }
-
- return FALSE;
-}
-
-function filter_nat_rules_generate() {
- global $config, $g, $after_filter_configure_run;
-
- $wancfg = $config['interfaces']['wan'];
- $lancfg = $config['interfaces']['lan'];
-
- $pptpdcfg = $config['pptpd'];
- $pppoecfg = $config['pppoe'];
- $wanif = get_real_wan_interface();
-
- $lanif = $config['interfaces']['lan']['if'];
- $lanip = $config['interfaces']['lan']['ipaddr'];
-
- $lansa = gen_subnet($lancfg['ipaddr'], $lancfg['subnet']);
-
- $natrules .= "nat-anchor \"pftpx/*\"\n";
-
- $natrules .= "nat-anchor \"natearly/*\"\n";
- $natrules .= "nat-anchor \"natrules/*\"\n";
-
- $natrules .= "# FTP proxy\n";
- $natrules .= "rdr-anchor \"pftpx/*\"\n";
-
- update_filter_reload_status("Creating 1:1 rules...");
-
- /* any 1:1 mappings? */
- if (is_array($config['nat']['onetoone'])) {
- foreach ($config['nat']['onetoone'] as $natent) {
- if (!is_numeric($natent['subnet']))
- $sn = 32;
- else
- $sn = $natent['subnet'];
-
- if (!$natent['interface'] || ($natent['interface'] == "wan"))
- $natif = $wanif;
- else
- $natif = $config['interfaces'][$natent['interface']]['if'];
-
- if($natif)
- $natrules .= "binat on $natif from {$natent['internal']}/{$sn} to any -> {$natent['external']}/{$sn}\n";
- }
- }
-
- $natrules .= "\n# Outbound NAT rules\n";
-
- /* outbound rules - advanced or standard */
- if (isset($config['nat']['advancedoutbound']['enable'])) {
- /* advanced outbound rules */
- if (is_array($config['nat']['advancedoutbound']['rule'])) {
- foreach ($config['nat']['advancedoutbound']['rule'] as $obent) {
-
- update_filter_reload_status("Creating advanced outbound rule {$obent['descr']}");
-
- $src = $obent['source']['network'];
- if (isset($obent['destination']['not']) && !isset($obent['destination']['any']))
- $dst = "!" . $obent['destination']['address'];
- else
- $dst = $obent['destination']['address'];
-
-
- if (!$obent['interface'] || ($obent['interface'] == "wan"))
- $natif = $wanif;
- else
- $natif = $config['interfaces'][$obent['interface']]['if'];
-
- $natrules .= filter_nat_rules_generate_if($natif,
- $src,
- $obent['sourceport'],
- $dst,
- $obent['dstport'],
- $obent['target'],
- $obent['natport'],
- isset($obent['nonat']),
- isset($obent['staticnatport'])
- );
- }
- }
- } else {
- /* standard outbound rules (one for each interface) */
- update_filter_reload_status("Creating outbound NAT rules");
-
- $natrules .= filter_nat_rules_generate_if($wanif,
- "{$lansa}/{$lancfg['subnet']}", 500, "", 500, null, 500, false);
- $natrules .= filter_nat_rules_generate_if($wanif,
- "{$lansa}/{$lancfg['subnet']}", 5060, "", 5060, null, 5060, false);
- $natrules .= filter_nat_rules_generate_if($wanif,
- "{$lansa}/{$lancfg['subnet']}");
-
- $optints = array();
- generate_optcfg_array($optints);
-
- /* generate lan nat mappings for opts with a gateway opts */
- foreach($optints as $oc) {
- $opt_interface = $oc['if'];
- if (interface_has_gateway("$opt_interface")) {
- $natrules .= filter_nat_rules_generate_if($opt_interface,
- "{$lansa}/{$lancfg['subnet']}", 500, "", 500, null, 500, false);
- $natrules .= filter_nat_rules_generate_if($opt_interface,
- "{$lansa}/{$lancfg['subnet']}", 5060, "", 5060, null, 5060, false);
- $natrules .= filter_nat_rules_generate_if($opt_interface,
- "{$lansa}/{$lancfg['subnet']}");
- }
- }
-
- /* optional interfaces */
- for ($i = 1; isset($config['interfaces']['opt' . $i]); $i++) {
- update_filter_reload_status("Creating outbound rules (opt{$i})");
- $optcfg = $config['interfaces']['opt' . $i];
-
- if ((isset ($optcfg['enable'])) && (!$optcfg['bridge']) && (!interface_has_gateway("opt{$i}"))) {
- $optsa = gen_subnet($optcfg['ipaddr'], $optcfg['subnet']);
-
- /* create outbound nat entries for primary wan */
- $natrules .= filter_nat_rules_generate_if($wanif,
- "{$optsa}/{$optcfg['subnet']}", 500, "", 500, null, 500, false);
- $natrules .= filter_nat_rules_generate_if($wanif,
- "{$optsa}/{$optcfg['subnet']}", 5060, "", 5060, null, 5060, false);
- $natrules .= filter_nat_rules_generate_if($wanif,
- "{$optsa}/{$optcfg['subnet']}", null, "", null, null, null, isset($optcfg['nonat']));
-
- /* create outbound nat entries for all opt wans */
- foreach($optints as $oc) {
- $opt_interface = $oc['if'];
- if (interface_has_gateway("$opt_interface")) {
- $natrules .= filter_nat_rules_generate_if($opt_interface,
- "{$optsa}/{$optcfg['subnet']}", 500, "", 500, null, 500, false);
- $natrules .= filter_nat_rules_generate_if($opt_interface,
- "{$optsa}/{$optcfg['subnet']}", 5060, "", 5060, null, 5060, false);
- $natrules .= filter_nat_rules_generate_if($opt_interface,
- "{$optsa}/{$optcfg['subnet']}", null, "", null, null, null, isset($optcfg['nonat']));
- }
- }
- }
- }
-
- /* PPTP subnet */
- if ($pptpdcfg['mode'] == "server") {
- $pptp_subnet = $g['pptp_subnet'];
- if($config['pptp']['pptp_subnet'] <> "")
- $pptp_subnet = $config['pptp']['pptp_subnet'];
- $natrules .= filter_nat_rules_generate_if($wanif,
- "{$pptpdcfg['remoteip']}/{$pptp_subnet}", 500, "", 500, null, 500, false);
- $natrules .= filter_nat_rules_generate_if($wanif,
- "{$pptpdcfg['remoteip']}/{$pptp_subnet}", 5060, "", 5060, null, 5060, false);
- $natrules .= filter_nat_rules_generate_if($wanif,
- "{$pptpdcfg['remoteip']}/{$pptp_subnet}");
-
- /* generate nat mappings for opts with a gateway opts */
- foreach($optints as $oc) {
- $opt_interface = $oc['if'];
- if ((is_private_ip($pptpdcfg['remoteip'])) && (interface_has_gateway($opt_interface))) {
- $natrules .= filter_nat_rules_generate_if($opt_interface,
- "{$pptpdcfg['remoteip']}/{$pptp_subnet}", 500, "", 500, null, 500, false);
- $natrules .= filter_nat_rules_generate_if($opt_interface,
- "{$pptpdcfg['remoteip']}/{$pptp_subnet}", 5060, "", 5060, null, 5060, false);
- $natrules .= filter_nat_rules_generate_if($opt_interface,
- "{$pptpdcfg['remoteip']}/{$pptp_subnet}");
- }
- }
- }
-
- /* PPPoE subnet */
- if ($pppoecfg['mode'] == "server") {
- $pppoe_subnet = $g['pppoe_subnet'];
- if($config['pppoe']['pppoe_subnet'] <> "")
- $pppoe_subnet = $config['pppoe']['pppoe_subnet'];
- $natrules .= filter_nat_rules_generate_if($wanif,
- "{$pppoecfg['remoteip']}/{$pppoe_subnet}", 500, "", 500, null, 500, false);
- $natrules .= filter_nat_rules_generate_if($wanif,
- "{$pppoecfg['remoteip']}/{$pppoe_subnet}", 5060, "", 5060, null, 5060, false);
- $natrules .= filter_nat_rules_generate_if($wanif,
- "{$pppoecfg['remoteip']}/{$pppoe_subnet}");
-
- /* generate nat mappings for opts with a gateway opts */
- foreach($optints as $oc) {
- $opt_interface = $oc['if'];
- if ((is_private_ip($pppoecfg['remoteip'])) && (interface_has_gateway($opt_interface))) {
- $natrules .= filter_nat_rules_generate_if($opt_interface,
- "{$pppoecfg['remoteip']}/{$pppoe_subnet}", 500, "", 500, null, 500, false);
- $natrules .= filter_nat_rules_generate_if($opt_interface,
- "{$pppoecfg['remoteip']}/{$pppoe_subnet}", 5060, "", 5060, null, 5060, false);
- $natrules .= filter_nat_rules_generate_if($opt_interface,
- "{$pppoecfg['remoteip']}/{$pppoe_subnet}");
- }
- }
- }
-
- /* static routes */
- if (is_array($config['staticroutes']['route'])) {
- foreach ($config['staticroutes']['route'] as $route) {
- $netip = explode("/", $route['network']);
- if ((! interface_has_gateway($route['interface'])) && (is_private_ip($netip[0]))) {
- $natrules .= filter_nat_rules_generate_if($wanif,
- "{$route['network']}", 500, "", 500, null, 500, false);
- $natrules .= filter_nat_rules_generate_if($wanif,
- "{$route['network']}", 5060, "", 5060, null, 5060, false);
- $natrules .= filter_nat_rules_generate_if($wanif,
- "{$route['network']}", "", null);
- }
- /* generate nat mapping for static routes on opts */
- foreach($optints as $oc) {
- $opt_interface = $oc['if'];
- if ((! interface_has_gateway($route['interface'])) && (is_private_ip($netip[0])) && (interface_has_gateway($opt_interface))) {
- $natrules .= filter_nat_rules_generate_if($opt_interface,
- "{$route['network']}", 500, "", 500, null, 500, false);
- $natrules .= filter_nat_rules_generate_if($opt_interface,
- "{$route['network']}", 5060, "", 5060, null, 5060, false);
- $natrules .= filter_nat_rules_generate_if($opt_interface,
- "{$route['network']}", "", null);
- }
- }
-
- }
- }
-
- }
-
- $natrules .= "\n#SSH Lockout Table\n";
- $natrules .= "table <sshlockout> persist\n\n";
-
- /* is SPAMD insalled? */
- if (is_package_installed("spamd") == 1) {
- $natrules .= "\n# spam table \n";
-
- $natrules .= "table <whitelist> persist\n";
- $natrules .= "table <blacklist> persist\n";
- $natrules .= "table <spamd> persist\n";
- if(file_exists("/var/db/whitelist.txt"))
- $natrules .= "table <spamd-white> persist file \"/var/db/whitelist.txt\"\n";
- $natrules .= "rdr pass on {$wanif} proto tcp from <blacklist> to port smtp -> 127.0.0.1 port spamd\n";
- $natrules .= "rdr pass on {$wanif} proto tcp from <spamd> to port smtp -> 127.0.0.1 port spamd\n";
- $natrules .= "rdr pass on {$wanif} proto tcp from !<spamd-white> to port smtp -> 127.0.0.1 port spamd\n";
- if($config['installedpackages']['spamdsettings']['config'])
- foreach($config['installedpackages']['spamdsettings']['config'] as $ss)
- $nextmta = $ss['nextmta'];
- if($nextmta <> "") {
- $natrules .= "rdr pass on {$wanif} proto tcp from <spamd-white> to port smtp -> {$nextmta} port smtp\n";
- }
- }
-
- /* load balancer anchor */
- $natrules .= "\n# Load balancing anchor - slbd updates\n";
- $natrules .= "rdr-anchor \"slb\"\n";
-
- update_filter_reload_status("Setting up FTP helper");
-
- $natrules .= "\n# FTP Proxy/helper\n";
- /* build an array of interfaces to work with */
- $iflist = array("lan" => "LAN");
- for ($i = 1; isset($config['interfaces']['opt' . $i]); $i++)
- $iflist['opt' . $i] = "opt{$i}";
- $interface_counter = 0;
- $vpns_list = get_vpns_list();
- /* prevent 1:1 ips from pftpx, they will be handled by ftp-sesame */
- if($config['nat']['onetoone'])
- foreach ($config['nat']['onetoone'] as $vipent)
- $onetoone_list .= "{$vipent['internal']} ";
- if($onetoone_list)
- $natrules .= "table <onetoonelist> { $onetoone_list }\n";
- if($vpns_list)
- $natrules .= "table <vpns> { $vpns_list }\n";
- /* loop through all interfaces and handle pftpx redirections */
- foreach ($iflist as $ifent => $ifname) {
- $ifname_lower = convert_friendly_interface_to_friendly_descr(strtolower($ifname));
- $realif = convert_friendly_interface_to_real_interface_name(strtolower($ifname));
- $int_ip = find_interface_ip($realif);
- if(isset($config['interfaces'][strtolower($ifname)]['disableftpproxy'])) {
- if($g['debug'])
- log_error("Filter: FTP proxy disabled for interface {$ifname} - ignoring.");
- $interface_counter++;
- continue;
- }
- if(stristr($ifname, "opt")) {
- if(!isset($config['interfaces'][$ifname]['enable'])) {
- continue;
- }
- }
- /* are we in routed mode? no source nat rules and not a outside interface? */
- /* If we have advanced outbound nat we skip the FTP proxy, we use ftpsesame */
- if((isset($config['nat']['advancedoutbound']['enable'])) && (! interface_has_gateway($ifname))) {
- $sourcenat = 0;
- /* we are using advanced outbound nat, are we in routing mode? */
- $realif = convert_friendly_interface_to_real_interface_name($ifname);
- /* if the interface address lies within a outbound NAT source network we should skip */
- if(! empty($config['nat']['advancedoutbound']['rule'])) {
- foreach($config['nat']['advancedoutbound']['rule'] as $natnetwork) {
- if(ip_in_subnet($int_ip, $natnetwork['source']['network'])) {
- /* if the interface address is matched in the AON Rule we need the ftp proxy */
- $sourcenat++;
- }
- }
- }
- if($sourcenat == 0) {
- if($g['debug'])
- log_error("Filter: No AON rule matched for interface {$ifname} - not using the FTP proxy");
- $interface_counter++;
- continue;
- } else {
- if($g['debug'])
- log_error("Filter: AON Rule matched for interface {$ifname} - using FTP proxy");
- }
- }
- $tmp_port = 8021 + $interface_counter;
- $tmp_interface = convert_friendly_interface_to_real_interface_name($ifname);
- $ifname_lower = strtolower(convert_friendly_interface_to_friendly_descr($ifname));
- $vpns = get_vpns_list();
- /* if the user has defined, include the alias so that we do not redirect ftp
- connections across the tunnels to pftpx */
- $int_ip = find_interface_ip($tmp_interface);
- /* if interface lacks an ip, dont setup a rdr for ftp. they are most likely on a bridged interface */
- if($int_ip and $vpns_list)
- if($ifname_lower) {
- $natrules .= "no rdr on $tmp_interface proto tcp from any to <vpns> port 21\n";
- if($onetoone_list)
- $natrules .= "no rdr on $tmp_interface proto tcp from <onetoonelist> to any port 21\n";
- }
- if($ifname_lower)
- $natrules .= "rdr on $tmp_interface proto tcp from any to any port 21 -> 127.0.0.1 port {$tmp_port}\n";
- $interface_counter++;
- }
- $natrules .= "\n";
-
- /* DIAG: add ipv6 NAT, if requested */
- if (isset($config['diag']['ipv6nat']['enable']) and $config['diag']['ipv6nat']['ipaddr'] <> "") {
- /* XXX: FIX ME! IPV6 */
- $natrules .= "rdr on \$wan proto ipv6 from any to any -> {$config['diag']['ipv6nat']['ipaddr']}\n";
- }
-
- if(file_exists("/var/etc/inetd.conf"))
- mwexec("rm /var/etc/inetd.conf");
- touch("/var/etc/inetd.conf");
-
- if (isset($config['nat']['rule'])) {
- $natrules .= "# NAT Inbound Redirects\n";
-
- if(!isset($config['system']['disablenatreflection'])) {
- $inetd_fd = fopen("/var/etc/inetd.conf","w");
- /* start redirects on port 19000 of localhost */
- $starting_localhost_port = 19000;
- }
-
- foreach ($config['nat']['rule'] as $rule) {
-
- update_filter_reload_status("Creating NAT rule {$rule['descr']}");
-
- /* if item is an alias, expand */
- $extport = "";
- unset($extport);
- if(alias_expand($rule['external-port']))
- $extport[0] = alias_expand_value($rule['external-port']);
- else
- $extport = explode("-", $rule['external-port']);
-
- /* if item is an alias, expand */
- if(alias_expand($rule['local-port']))
- $localport = "";
- else
- $localport = " port {$rule['local-port']}";
-
- $target = alias_expand_host($rule['target']);
-
- if (!$target) {
- $natrules .= "# Unresolvable alias {$rule['target']}\n";
- continue; /* unresolvable alias */
- }
-
- # use tables for aliases in rdr
- if (!is_ipaddr($target)) {
- $natrules .= "table <{$rule['target']}> { $target }\n";
- $target = "<{$rule['target']}>";
- }
-
- if ($rule['external-address'])
- if($rule['external-address'] <> "any")
- $extaddr = $rule['external-address'] . "/32";
- else
- $extaddr = $rule['external-address'];
- else
- $extaddr = get_current_wan_address($rule['interface']);
-
- if (!$rule['interface'] || ($rule['interface'] == "wan"))
- $natif = $wanif;
- else if($rule['interface'] == "\$pptp")
- $natif = "pptp";
- else if($rule['interface'] == "\$pppoe")
- $natif = "pppoe";
- else
- $natif = $config['interfaces'][$rule['interface']]['if'];
-
- $lanif = $lancfg['if'];
-
- /*
- * Expand aliases
- * XXX: may want to integrate this into pf macros
- */
- if(alias_expand($target))
- $target = alias_expand($target);
- if(alias_expand($extaddr))
- $extaddr = alias_expand($extaddr);
-
- /*
- * If FTP Proxy Helper is enabled and the
- * operator has requested a port forward to
- * a ftp server then launch a helper
- */
- $dontinstallrdr = false;
- if($target <> "") {
- $external_address = $rule['external-address'];
- if($extport[0] == "21" and !isset($config['interfaces'][strtolower($rule['interface'])]['disableftpproxy'])) {
- $helpers = exec("/bin/ps awux | grep \"{$target} -b {$external_address}\" | grep -v grep");
- if(!$helpers) {
- if($external_address == "")
- $external_address = find_interface_ip(get_real_wan_interface());
- /* install a pftpx helper, do not set a rule. also use the delay filter configure run
- * routines because if this is the first bootup the filter is not completely configured
- * and thus pf is not fully running. otherwise we end up with: pftpx: pf is disabled
- */
- if(isset($config['shaper']['enable'])) {
- if(isset($config['ezshaper']['step5']['p2pcatchall'])) {
- $shaper_queue = "-q qP2PUp ";
- } else {
- $upq = "q" . convert_friendly_interface_to_friendly_descr($config['ezshaper']['step2']['outside_int']);
- $shaper_queue = "-q {$upq}def ";
- }
- } else {
- $shaper_queue = "";
- }
- $after_filter_configure_run[] = "/usr/local/sbin/pftpx {$shaper_queue}-f {$target} -b {$external_address} -c 21 -g 21";
- }
- $dontinstallrdr = true;
- }
- }
-
- if($extaddr == "")
- $dontinstallrdr = true;
-
- $rdr_on = convert_real_interface_to_friendly_descr($rule['interface']);
-
- if($dontinstallrdr == false) {
- /* is rule a port range? */
- if ((!$extport[1]) || ($extport[0] == $extport[1])) {
-
- switch ($rule['protocol']) {
- case "tcp/udp":
- if($natif) {
- if($rule['external-port'] <> $rule['local-port'])
- $natrules .= "{$nordr}rdr on $natif proto { tcp udp } from any to {$extaddr} port { {$extport[0]} } -> {$target}{$localport}";
- else
- $natrules .= "{$nordr}rdr on $natif proto { tcp udp } from any to {$extaddr} port { {$extport[0]} } -> {$target}";
- }
- break;
- case "udp":
- case "tcp":
- if($extport[0])
- if($natif) {
- if($rule['external-port'] <> $rule['local-port'])
- $natrules .= "rdr on $natif proto {$rule['protocol']} from any to {$extaddr} port { {$extport[0]} } -> {$target}{$localport}";
- else
- $natrules .= "rdr on $natif proto {$rule['protocol']} from any to {$extaddr} port { {$extport[0]} } -> {$target}";
- }
- else
- if($natif)
- $natrules .= "rdr on $natif proto {$rule['protocol']} from any to {$extaddr} -> {$target}{$localport}";
- break;
- default:
- $natrules .= "rdr on $natif proto {$rule['protocol']} from any to {$extaddr} -> {$target}";
- break;
- }
- } else {
- switch ($rule['protocol']) {
- case "tcp/udp":
- if($natif)
- $natrules .= "{$nordr}rdr on $natif proto { tcp udp } from any to {$extaddr} port {$extport[0]}:{$extport[1]} -> {$target}{$localport}:*";
- break;
- case "udp":
- case "tcp":
- if($natif)
- $natrules .= "{$nordr}rdr on $natif proto {$rule['protocol']} from any to {$extaddr} port {$extport[0]}:{$extport[1]} -> {$target}{$localport}:*";
- break;
- default:
- if($natif)
- $natrules .= "{$nordr}rdr on $natif proto {$rule['protocol']} from any to {$extaddr} -> {$target}";
- }
- }
- }
-
- /* does this rule redirect back to a internal host?
- * if so, add some extra goo to help this work.
- */
- $rule_friendly_if = convert_friendly_interface_to_real_interface_name($rule['interface']);
- $rule_interface_ip = find_interface_ip($rule_friendly_if);
- $rule_interface_subnet = $config['interfaces'][$rule['interface']]['subnet'];
- $rule_subnet = gen_subnet($rule_interface_ip, $rule_interface_subnet);
- if($rule['external-address'] == "any" and $rule['interface'] == "lan") {
- $natrules .= "\n";
- if($rule_friendly_if)
- $natrules .= "no nat on {$rule_friendly_if} proto tcp from {$rule_friendly_if} to {$rule_subnet}/{$rule_interface_subnet}\n";
- if($rule_friendly_if)
- $natrules .= "nat on {$rule_friendly_if} proto tcp from {$rule_subnet}/{$rule_interface_subnet} to {$target} port {$extport[0]} -> {$rule_friendly_if}\n";
- }
-
- if(!isset($config['system']['disablenatreflection'])) {
-
- update_filter_reload_status("Setting up reflection");
-
- $natrules .= "\n# Reflection redirects\n";
- foreach ($iflist as $ifent => $ifname) {
-
- /* do not process interfaces with gateways*/
- if($config['interfaces'][$ifname]['gateway'] <> "")
- continue;
-
- /* do not process interfaces that will end up with gateways */
- if($config['interfaces'][$ifname]['ipaddr'] == "dhcp" or
- $config['interfaces'][$ifname]['ipaddr'] == "bigpond" or
- $config['interfaces'][$ifname]['ipaddr'] == "pppoe" or
- $config['interfaces'][$ifname]['ipaddr'] == "pptp")
- continue;
-
- $ifname_real = convert_friendly_interface_to_real_interface_name($ifname);
-
- if($extport[1])
- $range_end = ($extport[1]);
- else
- $range_end = ($extport[0]);
-
- $range_end++;
-
- if($rule['local-port'])
- $lrange_start = $rule['local-port'];
-
- if($range_end - $extport[0] > 500) {
- $range_end = $extport[0]+1;
- log_error("Not installing nat reflection rules for a port range > 500");
- } else {
- /* only install reflection rules for < 19991 items */
- if($starting_localhost_port < 19991) {
- $loc_pt = $lrange_start;
- for($x=$extport[0]; $x<$range_end; $x++) {
-
- $xxx = $x;
-
- /* do not install reflection rules for FTP. This simply
- * opens up pandoras box.
- */
- if($xxx == "21")
- continue;
-
- update_filter_reload_status("Creating reflection rule for {$rule['descr']}...");
-
- $ifname_real = convert_friendly_interface_to_friendly_descr(strtolower($ifname));
-
- if($config['system']['reflectiontimeout'])
- $reflectiontimeout = $config['system']['reflectiontimeout'];
- else
- $reflectiontimeout = "2000";
-
- switch($rule['protocol']) {
-
- case "tcp/udp":
- $protocol = "{ tcp udp }";
- $toadd_array = array();
- if(is_alias($loc_pt)) {
- $loc_pt_translated = alias_expand_value($loc_pt);
- if(stristr($loc_pt_translated, " ")) {
- /* XXX: we should deal with multiple ports */
- $loc_pt_translated_split = split(" ", $loc_pt_translated);
- foreach($loc_pt_translated_split as $lpts)
- $toadd_array[] = $lpts;
- } else {
- $toadd_array[] = $loc_pt_translated;
- }
- } else {
- $loc_pt_translated = $loc_pt;
- $toadd_array[] = $loc_pt_translated;
- }
- foreach($toadd_array as $tda){
- fwrite($inetd_fd, "{$starting_localhost_port}\tstream\ttcp/udp\tnowait/0\tnobody\t/usr/bin/nc nc -w {$reflectiontimeout} {$target} {$tda}\n");
- if($ifname_real)
- $natrules .= "rdr on \${$ifname_real} proto tcp from any to {$extaddr} port { {$xxx} } -> 127.0.0.1 port {$starting_localhost_port}\n";
- $starting_localhost_port++;
- fwrite($inetd_fd, "{$starting_localhost_port}\tstream\ttcp/udp\tnowait/0\tnobody\t/usr/bin/nc nc -u -w {$reflectiontimeout} {$target} {$tda}\n");
- if($ifname_real)
- $natrules .= "rdr on \${$ifname_real} proto udp from any to {$extaddr} port { {$xxx} } -> 127.0.0.1 port {$starting_localhost_port}\n";
- $xxx++;
- $starting_localhost_port++;
- }
- break;
- case "tcp":
- case "udp":
- $protocol = $rule['protocol'];
- $toadd_array = array();
- if(is_alias($loc_pt)) {
- $loc_pt_translated = alias_expand_value($loc_pt);
- if(stristr($loc_pt_translated, " ")) {
- /* XXX: we should deal with multiple ports */
- $loc_pt_translated_split = split(" ", $loc_pt_translated);
- foreach($loc_pt_translated_split as $lpts)
- $toadd_array[] = $lpts;
- } else {
- $toadd_array[] = $loc_pt_translated;
- }
- } else {
- $loc_pt_translated = $loc_pt;
- $toadd_array[] = $loc_pt_translated;
- }
- foreach($toadd_array as $tda){
- if($protocol == "udp")
- $dash_u = "-u ";
- else
- $dash_u = "";
- if($config['system']['reflectiontimeout'])
- $reflectiontimeout = $config['system']['reflectiontimeout'];
- else
- $reflectiontimeout = "2000";
- fwrite($inetd_fd, "{$starting_localhost_port}\tstream\t{$protocol}\tnowait/0\tnobody\t/usr/bin/nc nc {$dash_u}-w {$reflectiontimeout} {$target} {$tda}\n");
- if($ifname_real)
- $natrules .= "rdr on \${$ifname_real} proto {$protocol} from any to {$extaddr} port { {$xxx} } -> 127.0.0.1 port {$starting_localhost_port}\n";
- $xxx++;
- $starting_localhost_port++;
- }
- break;
- default:
- break;
- }
- $loc_pt++;
- if($starting_localhost_port > 19990) {
- log_error("Not installing nat reflection rules. Maximum 1,000 reached.");
- $x = $range_end+1;
- }
- }
- }
- }
-
- }
-
- }
-
- $natrules .= "\n";
- }
-
- if(!isset($config['system']['disablenatreflection'])) {
- fclose($inetd_fd);
- $helpers = trim(exec("/bin/ps ax | /usr/bin/grep inetd | /usr/bin/grep -v grep | /usr/bin/grep 127"));
- if(!$helpers)
- mwexec("/usr/sbin/inetd -wW -R 0 -a 127.0.0.1 /var/etc/inetd.conf");
- else
- mwexec("/usr/bin/killall -HUP inetd", true);
-
- }
- }
-
- if ($pptpdcfg['mode'] && $pptpdcfg['mode'] != "off") {
-
- if ($pptpdcfg['mode'] == "server")
- $pptpdtarget = "127.0.0.1";
- else if ($pptpdcfg['mode'] == "redir")
- $pptpdtarget = $pptpdcfg['redir'];
-
- if ($pptpdcfg['mode'] == "redir") {
-
- $natrules .= <<<EOD
-
-# PPTP
-rdr on \$wan proto gre from any to any -> $pptpdtarget
-rdr on \$wan proto tcp from any to any port 1723 -> $pptpdtarget
-
-EOD;
- }
- }
-
- if (is_package_installed('squid') && file_exists('/usr/local/pkg/squid.inc')) {
- require_once('squid.inc');
- $natrules .= squid_generate_rules('nat');
- }
-
- if (is_package_installed('clamav') && file_exists('/usr/local/pkg/clamav.inc')) {
- require_once('clamav.inc');
- $natrules .= clamav_generate_rules('nat');
- }
-
- if (is_package_installed('frickin') && file_exists('/usr/local/pkg/frickin.inc')) {
- require_once ('frickin.inc');
- $natrules .= frickin_generate_rules('nat');
- }
-
- if (is_package_installed('siproxd') && file_exists('/usr/local/pkg/sipproxd.inc')) {
- require_once('sipproxd.inc');
- $natrules .= siproxd_generate_rules('nat');
- }
-
- $natrules .= process_carp_nat_rules();
-
- $natrules .= "# IMSpector rdr anchor\n";
- $natrules .= "rdr-anchor \"imspector\"\n";
-
- $natrules .= "# UPnPd rdr anchor\n";
- $natrules .= "rdr-anchor \"miniupnpd\"\n";
-
- return $natrules;
-}
-
-function run_command_return_string($cmd) {
- global $config;
- if(isset($config['system']['developerspew'])) {
- $mt = microtime();
- echo "generate_user_filter_rule() being called $mt\n";
- }
-
- $fd = popen($cmd, "r");
- while(!feof($fd)) {
- $tmp .= fread($fd,49);
- }
- fclose($fd);
- return $tmp;
-}
-
-function generate_user_filter_rule_arr($rule, $ngcounter) {
- global $config;
- update_filter_reload_status("Creating filter rules {$rule['descr']} ...");
- if(isset($config['system']['developerspew'])) {
- $mt = microtime();
- echo "generate_user_filter_rule() being called $mt\n";
- }
- $ret = array();
- $line = generate_user_filter_rule($rule, $ngcounter);
- $ret['rule'] = $line;
- $ret['interface'] = $rule['interface'];
- if ($line[0] != '#') {
- if($rule['descr'] != "" and $line != "")
- $ret['descr'] = "label \"USER_RULE: " . str_replace('"', '', $rule['descr']) . "\"";
- else
- $ret['descr'] = "label \"USER_RULE\"";
- }
- $ret['ackq'] = get_ack_queue($rule['interface']);
-
- return $ret;
-}
-
-function generate_user_filter_rule($rule, $ngcounter) {
- global $config, $g;
- global $table_cache;
- global $schedule_enabled;
-
- if($config['schedules']) {
- foreach($config['schedules']['schedule'] as $sched) {
- $schedule_enabled = true;
- break;
- }
- }
-
- if(isset($config['system']['developerspew'])) {
- $mt = microtime();
- echo "generate_user_filter_rule() being called $mt\n";
- }
-
- /* Setup cache array if not already existing */
- if (!isset($table_cache)) {
- if ($g['debug'])
- echo "Creating table cache\n";
- $table_cache = array();
- }
-
- update_filter_reload_status("Creating filter rules {$rule['descr']} ...");
-
- $wancfg = $config['interfaces']['wan'];
- $lancfg = $config['interfaces']['lan'];
- $pptpdcfg = $config['pptpd'];
- $pppoecfg = $config['pppoe'];
-
- $lanif = $lancfg['if'];
- $wanif = get_real_wan_interface();
-
- $lanip = $lancfg['ipaddr'];
- $lansa = gen_subnet($lancfg['ipaddr'], $lancfg['subnet']);
- $lansn = $lancfg['subnet'];
-
- $int = "";
-
- $optcfg = array();
- generate_optcfg_array($optcfg);
-
- $curwanip = get_current_wan_address();
-
- /* don't include disabled rules */
- if (isset($rule['disabled'])) {
- return "# rule " . $rule['descr'] . " disabled ";
- }
-
- $pptpdcfg = $config['pptpd'];
- $pppoecfg = $config['pppoe'];
-
- if ($pptpdcfg['mode'] == "server") {
- $pptpip = $pptpdcfg['localip'];
- $pptpsa = $pptpdcfg['remoteip'];
- $pptpsn = $g['pptp_subnet'];
- if($config['pptp']['pptp_subnet'] <> "")
- $pptpsn = $config['pptp']['pptp_subnet'];
- }
-
- if ($pppoecfg['mode'] == "server") {
- $pppoeip = $pppoecfg['localip'];
- $pppoesa = $pppoecfg['remoteip'];
- $pppoesn = $g['pppoe_subnet'];
- if($config['pppoe']['pppoe_subnet'] <> "")
- $pppoesn = $config['pppoe']['pppoe_subnet'];
- }
-
- /* does the rule deal with a PPTP interface? */
- if ($rule['interface'] == "pptp") {
- if ($pptpdcfg['mode'] != "server")
- return "";
- $nif = $g['n_pptp_units'];
- if($config['pptp']['n_pptp_units'] <> "")
- $nif = $config['pptp']['n_pptp_units'];
- $ispptp = true;
- } else if($rule['interface'] == "pppoe") {
- if ($pppoecfg['mode'] != "server") {
- return " # Error creating pppoe rule";
- }
- $nif = $g['n_pppoe_units'];
- if($config['pppoe']['n_pppoe_units'] <> "")
- $nif = $config['pppoe']['n_pppoe_units'];
- $ispppoe = true;
- } else if(!isset($rule['interface'])) {
- return '# Interface empty for rule: '.$rule['descr'];
- } else {
-
- /* Check to see if the interface is opt and in our opt list */
- if (strstr($rule['interface'], "opt")) {
- if (!array_key_exists($rule['interface'], $optcfg)) {
- $item = "";
- foreach($optcfg as $oc) $item .= $oc['if'];
- return "# {$real_int} {$item} {$rule['interface']} array key does not exist for " . $rule['descr'];
- }
- }
-
- $nif = 1;
- $ispptp = false;
- $ispppoe = false;
- }
-
- if ($pptpdcfg['mode'] != "server") {
- if (($rule['source']['network'] == "pptp") ||
- ($rule['destination']['network'] == "pptp")) {
- return "# source network or destination network == pptp on " . $rule['descr'];
- }
- }
-
- if ($rule['source']['network'] && strstr($rule['source']['network'], "opt")) {
- if (!array_key_exists($rule['source']['network'], $optcfg)) {
- $optmatch = "";
- if(preg_match("/opt([0-999])/", $rule['source']['network'], $optmatch)) {
- $real_opt_int = convert_friendly_interface_to_real_interface_name("opt" . $optmatch[1]);
- $opt_ip = find_interface_ip($real_opt_int);
- if(!$opt_ip)
- return "# unresolvable optarray $real_opt_int - $optmatch[0] - $opt_ip";
- } else {
- return "# {$rule['source']['network']} !array_key_exists source network " . $rule['descr'];
- }
- }
- }
- if ($rule['destination']['network'] && strstr($rule['destination']['network'], "opt")) {
- if (!array_key_exists($rule['destination']['network'], $optcfg)) {
- if(preg_match("/opt([0-999])/", $rule['destination']['network'], $optmatch)) {
- $real_opt_int = convert_friendly_interface_to_real_interface_name("opt" . $optmatch[1]);
- $opt_ip = find_interface_ip($real_opt_int);
- if(!$opt_ip)
- return "# unresolvable oparray $real_opt_int - $optmatch[0] - $opt_ip";
- } else {
- return "# {$item} {$rule['destination']['network']} !array_key_exists dest network " . $rule['descr'];
- }
- }
- }
-
- /* check for unresolvable aliases */
- if ($rule['source']['address'] && !alias_expand($rule['source']['address'])) {
- file_notice("Filter_Reload", "# unresolvable source aliases {$rule['descr']}");
- return "# unresolvable source aliases {$rule['descr']}";
- }
- if ($rule['destination']['address'] && !alias_expand($rule['destination']['address'])) {
- file_notice("Filter_Reload", "# unresolvable dest aliases {$rule['descr']}");
- return "# unresolvable dest aliases {$rule['descr']}";
- }
-
- $ifdescrs = array();
- for ($i = 1; isset($config['interfaces']['opt' . $i]); $i++)
- $ifdescrs[] = "opt" . $i;
-
- update_filter_reload_status("Setting up pass/block rules");
-
- for ($iif = 0; $iif < $nif; $iif++) {
-
- $type = $rule['type'];
-
-
- if ($type != "pass" && $type != "block" && $type != "reject") {
- /* default (for older rules) is pass */
- $type = "pass";
- }
-
- if ($type == "reject") {
- /* special reject packet */
- $aline['type'] = "block return";
- } else {
- $aline['type'] = $type;
- }
-
- /* ensure the direction is in */
- $aline['direction'] = " in ";
-
- if (isset($rule['log']))
- $aline['log'] = "log ";
-
- $aline['quick'] = "quick ";
-
- if ($ispptp) {
- $aline['interface'] = "on \$pptp ";
- } else if ($ispppoe) {
- $aline['interface'] = "on \$pppoe ";
- } else {
- // translate wan, man, lan, opt to real interface.
- $interface = $rule['interface'];
- $temp = filter_get_opt_interface_descr($interface);
- if($temp <> "") $interface = $temp;
- if(isset($rule['destination']['address'])) {
- $canadd = 0; // XXX: billm - eh? this is a nice little noop
- /* because pf will not allow a interface for proxyARP
- type traffic lets check if its in use and if so leave
- off the interface */
- if(is_one_to_one_or_server_nat_rule($rule['destination']['address']))
- $canadd = 0;
- }
- if($canadd == 0)
- $aline['interface'] = "on \$" . convert_real_interface_to_friendly_descr($rule['interface']) . " ";
- }
-
-
- /* set the gateway interface */
- $ri = filter_translate_type_to_real_interface($rule['interface']);
-
- update_filter_reload_status("Setting up pass/block rules {$rule['descr']}");
-
- /*
- * check to see if /tmp/{${ri}_router exists. This file
- * is created by dhclient for 2nd wan interfaces, etc.
- * else get gateway from the interface config
- */
- if(file_exists("{$g['tmp_path']}/{$ri}_router")) {
- $rg = file_get_contents("{$g['tmp_path']}/{$ri}_router");
- $rg = rtrim($rg);
- } elseif ($config['interfaces'][$rule['interface']]['gateway'] <> "") {
- $rg = $config['interfaces'][$rule['interface']]['gateway'];
- }
-
- /* do not process reply-to for gateway'd rules */
- if(($rule['gateway'] == "") and ($ri != "") and ($rg != "")) {
- $aline['reply'] = "reply-to (" . $ri . " " . $rg . ") ";
- }
-
- /* if user has selected a custom gateway, lets work with it */
- if($rule['gateway'] <> "") {
- $foundlb = 0;
- $routeto = " route-to { ";
- if(is_array($config['load_balancer']['lbpool'])) {
- foreach($config['load_balancer']['lbpool'] as $lb) {
- update_filter_reload_status("Creating load balancing item...");
- if($lb['name'] == $rule['gateway']) {
- $gateway = $rule['gateway'];
- /*
- * is $gateway a interface name?
- * if so, lets find out the gateway address
- * from /tmp/router_bleh.router
- */
- if(in_array($gateway, $ifdescrs)==true) {
- if(is_file("{$g['tmp_path']}/{$gateway}_router")) {
- $return_gateway = file_get_contents("{$g['tmp_path']}/{$gateway}_router");
- } else {
- log_error("Could not find {$g['tmp_path']}/{$gateway}_router. Needed for dhcp gateway information");
- continue;
- }
- }
- /* if /tmp/$lbname.pool exists then read in our gateway hints from slbd */
- if(file_exists("{$g['tmp_path']}/{$lb['name']}.pool")) {
- $lbs_tmp = split("\n", file_get_contents("{$g['tmp_path']}/{$lb['name']}.pool"));
- $lbs = array();
- /* process the entire file to prevent empty lines */
- foreach($lbs_tmp as $lb_tmp) {
- if(is_ipaddr($lb_tmp)) {
- $lbs[] = $lb_tmp;
- }
- }
- $lbs_count = count($lbs);
- if($g['debug'])
- log_error("We found $lbs_count valid entries in status file {$g['tmp_path']}/{$lb['name']}.pool");
-
- if(count($lbs) == 0) {
- if($g['debug'])
- log_error("There are no servers found in the status file, using XML config settings!");
- foreach ($lb['servers'] as $lbsvr) {
- $lbsvr_split = split("\|", $lbsvr);
- $lbs[] = $lbsvr_split[1];
- }
- }
- } else {
- if($g['debug'])
- log_error("There is no server status file, using XML config settings!");
- $lbs = array();
- foreach ($lb['servers'] as $lbsvr) {
- $lbsvr_split = split("\|", $lbsvr);
- $lbs[] = $lbsvr_split[1];
- }
- }
- /* If we want failover we only return the first (top) server from the list
- * and work our way down from there. This way we order the failover order.
- */
- if($lb['behaviour'] == "failover") {
- $firstsrv = $lbs[0];
- $lbs = array("$firstsrv");
- }
-
- /* create server/gateway gateway/monitor array */
- $l = 0;
- $lbconfig = array();
- foreach ($lb['servers'] as $lbsvr) {
- $lbsvr_split=split("\|", $lbsvr);
- $lbconfig['gateway'][$l] = $lbsvr_split[0];
- $lbconfig['monitor'][$l] = $lbsvr_split[1];
- $l++;
- }
- $lbconfig_count = count($lbconfig['gateway']);
-
- $l = 0;
- while($l < $lbconfig_count) {
- /* iterate through $lbs and setup items accordingly */
- foreach($lbs as $server) {
- if ($server == "")
- continue;
- unset($gateway, $int);
- if ($lbconfig['monitor'][$l] == $server) {
- /* determine interface gateway */
- if(is_ipaddr($lbconfig['gateway'][$l])) {
- $int = guess_interface_from_ip($lbconfig['gateway'][$l]);
- $gateway = $lbconfig['gateway'][$l];
- log_error("SLBD pool {$lb['name']} is old style. Please recreate.");
- } else if(interface_has_gateway($lbconfig['gateway'][$l])) {
- $int = convert_friendly_interface_to_real_interface_name($lbconfig['gateway'][$l]);
- $gateway = get_interface_gateway($lbconfig['gateway'][$l]);
- }
- if(($int <> "") && ($gateway <> "")) {
- if($g['debug'])
- log_error("Setting up route with {$lbconfig['gateway'][$l]} om $int for monitor {$lbconfig['monitor'][$l]} on gateway $gateway");
- if($foundlb == 1)
- $routeto .= ", ";
- $routeto .= "( {$int} {$gateway} ) ";
- $foundlb = 1;
- }
- /* we have a match, go forth and try the next LB item so we don't setup multiples incorrectly */
- $l++;
- continue;
- }
- }
- $l++;
- }
- /* If we want failover just use route-to else round-robin */
- if($lb['behaviour'] == "failover") {
- $routeto .= "} ";
- } else {
- $routeto .= "} round-robin ";
- if(isset($config['system']['lb_use_sticky']))
- $routeto .= " sticky-address ";
- }
- }
- }
- /* Add the load balanced gateways */
- if ($foundlb == 1)
- $aline['route'] = $routeto;
- }
- /* we're not using load balancing, just setup gateway */
- if($foundlb == 0) {
- $gateway = $rule['gateway'];
- /*
- * is $gateway a interface name?
- * if so, lets find out the gateway address
- * from /tmp/router_bleh.router
- */
- if(in_array($gateway, $ifdescrs)==true) {
- $int=filter_opt_interface_to_real($gateway);
- if(is_file("{$g['tmp_path']}/{$int}_router")) {
- $gatewayip = file_get_contents("{$g['tmp_path']}/{$int}_router");
- $gatewayip = rtrim($gatewayip);
- if (is_ipaddr($gatewayip)) {
- if($int)
- $aline['route'] = " route-to ( {$int} {$gatewayip} ) ";
- log_error("An error occurred while trying to determine the real interface name for the gateway $gateway");
- }
- } else {
- log_error("Could not find {$g['tmp_path']}/{$int}_router. Needed for dhcp gateway information");
- continue;
- }
- } else {
- /* user picked a real gateway ip */
- if(is_ipaddr($rule['gateway'])) {
- $gatewayip = $rule['gateway'];
- $int = guess_interface_from_ip($gatewayip);
- $aline['route'] = " route-to ( " . guess_interface_from_ip($rule['gateway']) . " {$rule['gateway']} ) ";
- }
- }
- }
- }
-
- if (isset($rule['protocol'])) {
- if($rule['protocol'] == "tcp/udp")
- $aline['prot'] = "proto { tcp udp } ";
- elseif($rule['protocol'] == "icmp")
- $aline['prot'] = "inet proto icmp ";
- else
- $aline['prot'] = "proto {$rule['protocol']} ";
- } else {
- if($rule['source']['port'] <> "" || $rule['destination']['port'] <> "") {
- $aline['prot'] = "proto tcp ";
- }
- }
-
- update_filter_reload_status("Creating rule {$rule['descr']}");
-
- /* source address */
- if (isset($rule['source']['any'])) {
- $src = "any";
- } else if ($rule['source']['network']) {
-
- if (strstr($rule['source']['network'], "opt")) {
- $src = $optcfg[$rule['source']['network']]['sa'] . "/" .
- $optcfg[$rule['source']['network']]['sn'];
- if (isset($rule['source']['not'])) $src = " !{$src}";
- /* check for opt$NUMip here */
- $matches = "";
- if (preg_match("/opt([0-9999])ip/", $rule['source']['network'], $matches)) {
- $optnum = $matches[1];
- $real_int = convert_friendly_interface_to_real_interface_name("opt{$optnum}");
- $src = find_interface_ip($real_int);
- }
- } else {
- switch ($rule['source']['network']) {
- case 'wanip':
- $src = $curwanip;
- break;
- case 'lanip':
- $src = $lanip;
- break;
- case 'lan':
- $src = "{$lansa}/{$lansn}";
- break;
- case 'pptp':
- $src = "{$pptpsa}/{$pptpsn}";
- break;
- case 'pppoe':
- $src = "{$pppoesa}/{$pppoesn}";
- break;
- }
- if (isset($rule['source']['not'])) $src = "!{$src}";
- }
- } else if ($rule['source']['address']) {
- $expsrc = alias_expand($rule['source']['address']);
-
- if (isset($rule['source']['not']))
- $not = "!";
- else
- $not = "";
-
- if (stristr($expsrc, "$")) {
- if($not) {
- $src = "{";
- foreach(preg_split("/[\s]+/", alias_expand_value($rule['source']['address'])) as $item) {
- if($item != "") {
- $src .= " {$not}{$item}";
- }
- }
- /* added support for tables */
- $src .= " 0/0 }";
- $src_table = "<not" . $rule['source']['address'] . ">";
- }
- else {
- $src = "{ {$not} " . alias_expand_value($rule['source']['address']) . " } ";
- $src_table = "<" . $rule['source']['address'] . ">";
- }
-
- /* support for tables */
- $src_table_line = "table $src_table {$src}\n";
- $src = $src_table;
- }
- else
- $src = "{ {$not} {$expsrc} }";
- }
-
- if (!$src || ($src == "/")) {
- return "# at the break!";
- }
-
- $aline['src'] = "from $src ";
-
- if (in_array($rule['protocol'], array("tcp","udp","tcp/udp"))) {
-
- if ($rule['source']['port']) {
- $srcport = explode("-", $rule['source']['port']);
- if(alias_expand($srcport[0]))
- $srcporta = alias_expand($srcport[0]);
- else
- $srcporta = $srcport[0];
- if ((!$srcport[1]) || ($srcport[0] == $srcport[1])) {
- if(alias_expand($srcport[0]))
- $aline['srcport'] = "port {$srcporta} ";
- else
- $aline['srcport'] = "port = {$srcporta} ";
- } else if (($srcport[0] == 1) && ($srcport[1] == 65535)) {
- /* no need for a port statement here */
- } else if ($srcport[1] == 65535) {
- $aline['srcport'] = "port >= {$srcport[0]} ";
- } else if ($srcport[0] == 1) {
- $aline['srcport']= "port <= {$srcport[1]} ";
- } else {
- $srcport[0]--;
- $srcport[1]++;
- $aline['srcport'] = "port {$srcport[0]} >< {$srcport[1]} ";
- }
- }
- /* OS signatures */
- if (($rule['protocol'] == "tcp") && ($rule['os'] <> ""))
- $aline['os'] = "os {$rule['os']} ";
-
- }
-
- /* destination address */
- if (isset($rule['destination']['any'])) {
- $dst = "any";
- } else if ($rule['destination']['network']) {
-
- if (strstr($rule['destination']['network'], "opt")) {
- $dst = $optcfg[$rule['destination']['network']]['sa'] . "/" .
- $optcfg[$rule['destination']['network']]['sn'];
- /* check for opt$NUMip here */
- $matches = "";
- if (preg_match("/opt([0-9999])ip/", $rule['destination']['network'], $matches)) {
- $optnum = $matches[1];
- $real_int = convert_friendly_interface_to_real_interface_name("opt{$optnum}");
- $dst = find_interface_ip($real_int);
- }
- if (isset($rule['destination']['not'])) $dst = " !{$dst}";
- } else {
- switch ($rule['destination']['network']) {
- case 'wanip':
- $dst = $curwanip;
- break;
- case 'lanip':
- $dst = $lanip;
- break;
- case 'lan':
- $dst = "{$lansa}/{$lansn}";
- break;
- case 'pptp':
- $dst = "{$pptpsa}/{$pptpsn}";
- break;
- case 'pppoe':
- $dst = "{$ppoesa}/{$pppoesn}";
- break;
- }
- if (isset($rule['destination']['not'])) $dst = " !{$dst}";
- }
- } else if ($rule['destination']['address']) {
- $expdst = alias_expand($rule['destination']['address']);
-
- if (isset($rule['destination']['not']))
- $not = "!";
- else
- $not = "";
-
- if (stristr($expdst, "$")) {
- if($not) {
- $dst = "{";
- foreach(preg_split("/[\s]+/", alias_expand_value($rule['destination']['address'])) as $item) {
- if($item != "") {
- $dst .= " {$not}{$item}";
- }
- }
- /* added support for tables */
- $dst .= " 0/0 }";
- $dst_table = "<not" . $rule['destination']['address'] . ">";
- }
- else {
- $dst = "{ {$not} " . alias_expand_value($rule['destination']['address']) . " } ";
- $dst_table = "<" . $rule['destination']['address'] . ">";
- }
-
- /* support for tables */
- $dst_table_line = "table $dst_table {$dst}\n";
- $dst = $dst_table;
- }
- else
- $dst = "{ {$not} {$expdst} }";
- }
-
- if (!$dst || ($dst == "/")) {
- return "# returning at dst $dst == \"/\"";
- }
-
- $aline['dst'] = "to $dst ";
-
- if (in_array($rule['protocol'], array("tcp","udp","tcp/udp"))) {
-
- if ($rule['destination']['port']) {
- $dstport = explode("-", $rule['destination']['port']);
- if(alias_expand($dstport[0]))
- $dstporta = alias_expand($dstport[0]);
- else
- $dstporta = $dstport[0];
- if ((!$dstport[1]) || ($dstport[0] == $dstport[1])) {
- if(alias_expand($dstport[0]))
- $aline['dstport'] = "port {$dstporta} ";
- else
- $aline['dstport'] = "port = {$dstporta} ";
- } else if (($dstport[0] == 1) && ($dstport[1] == 65535)) {
- /* no need for a port statement here */
- } else if ($dstport[1] == 65535) {
- $aline['dstport'] = "port >= {$dstport[0]} ";
- } else if ($dstport[0] == 1) {
- $aline['dstport'] = "port <= {$dstport[1]} ";
- } else {
- $dstport[0]--;
- $dstport[1]++;
- $aline['dstport'] = "port {$dstport[0]} >< {$dstport[1]} ";
- }
- }
- }
-
- if (($rule['protocol'] == "icmp") && $rule['icmptype']) {
- $aline['icmp-type'] = "icmp-type {$rule['icmptype']} ";
- }
-
- if ($type == "pass") {
-
- if( isset($rule['source-track']) or isset($rule['max-src-nodes']) or isset($rule['max-src-states']) )
- if($rule['protocol'] == "tcp")
- $aline['flags'] = "flags S/SA ";
- /*
- # keep state
- works with TCP, UDP, and ICMP.
- # modulate state
- works only with TCP. pfSense will generate strong Initial Sequence Numbers (ISNs)
- for packets matching this rule.
- # synproxy state
- proxies incoming TCP connections to help protect servers from spoofed TCP SYN floods.
- This option includes the functionality of keep state and modulate state combined.
- # none
- do not use state mechanisms to keep track. this is only useful if your doing advanced
- queueing in certain situations. please check the faq.
- */
- $noadvoptions = false;
- if(isset($rule['statetype']) && $rule['statetype'] <> "") {
- switch($rule['statetype']) {
- case "none":
- $noadvoptions = true;
- $aline['flags'] = "no state ";
- break;
- case "modulate state":
- case "synproxy state":
- if($rule['protocol'] == "tcp")
- $aline['flags'] = "{$rule['statetype']} ";
- break;
- default:
- $aline['flags'] = "{$rule['statetype']} ";
- }
- } else {
- $aline['flags'] = "keep state ";
- }
- if($noadvoptions == false)
- if( isset($rule['source-track']) and $rule['source-track'] <> "" or
- isset($rule['max-src-nodes']) and $rule['max-src-nodes'] <> "" or
- isset($rule['max-src-conn-rate']) and $rule['max-src-conn-rate'] <> "" or
- isset($rule['max-src-conn-rates']) and $rule['max-src-conn-rates'] <> "" or
- isset($rule['max-src-states']) and $rule['max-src-states'] <> "" or
- isset($rule['statetimeout']) and $rule['statetimeout'] <> "") {
- $aline['flags'] .= "( ";
- if(isset($rule['source-track']) and $rule['source-track'] <> "")
- $aline['flags'] .= "source-track rule ";
- if(isset($rule['max-src-nodes']) and $rule['max-src-nodes'] <> "")
- $aline['flags'] .= "max-src-nodes " . $rule['max-src-nodes'] . " ";
- if(isset($rule['max-src-states']) and $rule['max-src-states'] <> "")
- $aline['flags'] .= "max-src-states " . $rule['max-src-states'] . " ";
- if(isset($rule['statetimeout']) and $rule['statetimeout'] <> "")
- $aline['flags'] .= "tcp.established " . $rule['statetimeout'] . " ";
- if(isset($rule['max-src-conn-rate']) and $rule['max-src-conn-rate'] <> ""
- and isset($rule['max-src-conn-rates']) and $rule['max-src-conn-rates'] <> "") {
- $aline['flags'] .= "max-src-conn-rate " . $rule['max-src-conn-rate'] . " ";
- $aline['flags'] .= "/" . $rule['max-src-conn-rates'] . ", overload <virusprot> flush global ";
- }
- $aline['flags'] .= " ) ";
- }
- }
- if ($type == "reject" && $rule['protocol'] == "tcp") {
- /* special reject packet */
- $aline['flags'] .= "flags S/SA ";
- }
- }
-
- /* cache entries */
- if (isset($src_table))
- if (isset($table_cache[$src_table])) {
- if ($g['debug'])
- echo "{$src_table} found in cache\n";
- } else {
- if ($g['debug'])
- echo "{$src_table} NOT found in cache...adding\n";
- $table_cache[$src_table] = $src_table_line;
- }
- if (isset($dst_table))
- if (isset($table_cache[$dst_table])) {
- if ($g['debug'])
- echo "{$dst_table} found in cache\n";
- } else {
- if ($g['debug'])
- echo "{$dst_table} NOT found in cache...adding\n";
- $table_cache[$dst_table] = $dst_table_line;
- }
-
- /* exception(s) to a user rules can go here. */
- /* rules with a gateway or pool should create another rule for routing to local networks or vpns */
- /* we only trigger this for a rule with the destination of any and without a gateway */
- if (($aline['route'] <> "") && ($aline['type'] == "pass") && ($dst == "any") && (! interface_has_gateway($aline['interface']))) {
- /* negate VPN/PPTP/PPPoE networks for load balancer rules */
- $vpns = " to <vpns> ";
- $line .= $aline['type'] . $aline['direction'] . $aline['log'] . $aline['quick'] . $aline['interface'] . $aline['prot'] .
- $aline['src'] . $aline['srcport'] . $aline['os'] . $vpns . $aline['dstport'].
- $aline['icmp-type'] . $aline['flags'] .
- " label \"NEGATE_ROUTE: Negate policy route for local network(s)\"\n";
- }
-
- /* piece together the actual user rule */
- $line .= $aline['type'] . $aline['direction'] . $aline['log'] . $aline['quick'] . $aline['interface'] . $aline['reply'] .
- $aline['route'] . $aline['prot'] . $aline['src'] . $aline['srcport'] . $aline['os'] . $aline['dst'] .
- $aline['dstport'] . $aline['icmp-type'] . $aline['flags'];
-
- /* is a time based rule schedule attached? */
- if($rule['sched']) {
- if($config['schedules']) {
- foreach($config['schedules']['schedule'] as $sched) {
- if($sched['name'] == $rule['sched'])
- $schedule_xml_block = $sched;
- $schedule_enabled = true;
- }
- }
- if($schedule_xml_block)
- $status = get_time_based_rule_status($schedule_xml_block);
- if($status) {
- if($g['debug'])
- log_error("[TDR DEBUG] status true -- rule type '$type'");
- if($type == "block") {
- // active deny rules should deny
- $ipfw_rule = tdr_create_ipfw_rule($rule, "deny");
- tdr_install_rule($ipfw_rule);
- } else {
- // active allow rules should allow
- $ipfw_rule = tdr_create_ipfw_rule($rule, "allow");
- tdr_install_rule($ipfw_rule);
- }
- return "$line";
- } else {
- /* rule is turned off, if type == pass, deny traffic until
- * active else allow traffic until active
- */
- if($type == "pass") {
- // inactive pass rules should deny
- $ipfw_rule = tdr_create_ipfw_rule($rule, "deny");
- tdr_install_rule($ipfw_rule);
- } else {
- // inactive block rules should skipto
- $ipfw_rule = tdr_create_ipfw_rule($rule, "skipto");
- tdr_install_rule($ipfw_rule);
- }
- return "# $line";
- }
- } else {
- if($schedule_enabled) {
- // no schedule allow rules should simply allow
- $ipfw_rule = tdr_create_ipfw_rule($rule, "allow");
- tdr_install_rule($ipfw_rule);
- }
- return $line;
- }
-}
-
-function filter_rules_generate() {
- global $config, $g, $table_cache;
-
- update_filter_reload_status("Creating default rules");
-
- if(isset($config['system']['developerspew'])) {
- $mt = microtime();
- echo "filter_rules_generate() being called $mt\n";
- }
-
- $wancfg = $config['interfaces']['wan'];
- $lancfg = $config['interfaces']['lan'];
- $pptpdcfg = $config['pptpd'];
- $pppoecfg = $config['pppoe'];
-
- $lanif = $lancfg['if'];
- $wanif = get_real_wan_interface();
-
- $lanip = $lancfg['ipaddr'];
- $lansa = gen_subnet($lancfg['ipaddr'], $lancfg['subnet']);
- $lansn = $lancfg['subnet'];
-
- $wanip = find_interface_ip(get_real_wan_interface());
-
- if($lansa)
- $lansa_sn_combo = "{$lansa}/{$lansn}";
- else
- $lansa_sn_combo = "192.168.1.1/32";
-
- /* optional interfaces */
- $optcfg = array();
- generate_optcfg_array($optcfg);
-
- if (is_package_installed('squid') && file_exists('/usr/local/pkg/squid.inc')) {
- require_once('squid.inc');
- $ipfrules .= squid_generate_rules('filter');
- }
-
- if (is_package_installed('clamav') && file_exists('/usr/local/pkg/clamav.inc')) {
- require_once('clamav.inc');
- $ipfrules .= clamav_generate_rules('filter');
- }
-
- if (is_package_installed('clamav') && file_exists('/usr/local/pkg/clamav.inc')) {
- require_once('clamav.inc');
- $ipfrules .= clamav_generate_rules('filter');
- }
-
- if (is_package_installed('frickin') && file_exists('/usr/local/pkg/frickin.inc')) {
- require_once ('frickin.inc');
- $ipfrules .= frickin_generate_rules('filter');
- }
-
- if (is_package_installed('siproxd') && file_exists('/usr/local/pkg/sipproxd.inc')) {
- require_once('sipproxd.inc');
- $ipfrules .= siproxd_generate_rules('filter');
- }
-
- /* if captive portal is enabled, ensure that access to this port
- * is allowed on a locked down interface
- */
- if (isset($config['captiveportal']['enable'])) {
- $cp_interface = $config['captiveportal']['interface'];
- $cp_interface_real = convert_friendly_interface_to_real_interface_name($cp_interface);
- $cp_interface_ip = find_interface_ip($cp_interface_real);
- if (isset($config['captiveportal']['peruserbw']))
- mwexec("kldload dummynet");
- if($cp_interface_ip and $cp_interface_real)
- $ipfrules .= "pass in quick on {$cp_interface_real} proto tcp from any to {$cp_interface_ip} port { 8000 8001 } keep state\n";
- }
-
- /* ftp-sesame */
- $ipfrules .= "anchor \"ftpsesame/*\" \n";
-
- # BEGIN OF firewall rules
- $ipfrules .= "anchor \"firewallrules\"\n";
-
- if ($pptpdcfg['mode'] == "server") {
- $pptpip = $pptpdcfg['localip'];
- $pptpsa = $pptpdcfg['remoteip'];
- $pptpsn = $g['pptp_subnet'];
- if($config['pptp']['pptp_subnet'] <> "")
- $pptpsn = $config['pptp']['pptp_subnet'];
- }
-
- if ($pppoecfg['mode'] == "server") {
- $pppoeip = $pppoecfg['localip'];
- $pppoesa = $pppoecfg['remoteip'];
- $pppoesn = $g['pppoe_subnet'];
- if($config['pppoe']['pppoe_subnet'] <> "")
- $pppoesn = $config['pppoe']['pppoe_subnet'];
- }
-
- /* default block logging? */
- if (!isset($config['syslog']['nologdefaultblock']))
- $log = "log";
- else
- $log = "";
-
- $ipfrules .= <<<EOD
-
-# We use the mighty pf, we cannot be fooled.
-block quick proto { tcp, udp } from any port = 0 to any
-block quick proto { tcp, udp } from any to any port = 0
-
-# snort2c
-table <snort2c> persist
-block quick from <snort2c> to any label "Block snort2c hosts"
-block quick from any to <snort2c> label "Block snort2c hosts"
-
-EOD;
-
- if(!isset($config['system']['ipv6allow'])) {
- $ipfrules .= "# Block all IPv6\n";
- $ipfrules .= "block in quick inet6 all\n";
- $ipfrules .= "block out quick inet6 all\n";
- }
-
- $ipfrules .= <<<EOD
-# loopback
-anchor "loopback"
-pass in quick on \$loopback all label "pass loopback"
-pass out quick on \$loopback all label "pass loopback"
-
-# package manager early specific hook
-anchor "packageearly"
-
-
-# carp
-anchor "carp"
-
-EOD;
-
-if($wanip)
- $ipfrules .= <<<EOD
-
-# permit wan interface to ping out (ping_hosts.sh)
-pass quick proto icmp from {$wanip} to any keep state
-
-EOD;
-
- $ipfrules .= <<<EOD
-
-# NAT Reflection rules
-
-EOD;
-
- if (isset($config['nat']['rule'])) {
- $natrules .= "# NAT Inbound Redirects\n";
-
- if(!isset($config['system']['disablenatreflection'])) {
- //$fd = fopen("/var/etc/inetd.conf","w");
- /* start redirects on port 19000 of localhost */
- $starting_localhost_port = 18999;
- }
-
- foreach ($config['nat']['rule'] as $rule) {
-
- update_filter_reload_status("Creating NAT rule {$rule['descr']}");
-
- /* if item is an alias, expand */
- if(alias_expand($rule['external-port']))
- $extport[0] = alias_expand_value($rule['external-port']);
- else
- $extport = explode("-", $rule['external-port']);
-
- /* if item is an alias, expand */
- if(alias_expand($rule['local-port']))
- $localport = "";
- else
- $localport = " port {$rule['local-port']}";
-
- $target = alias_expand_host($rule['target']);
-
- if (!$target)
- continue; /* unresolvable alias */
-
- if ($rule['external-address'])
- if($rule['external-address'] <> "any")
- $extaddr = $rule['external-address'] . "/32";
- else
- $extaddr = $rule['external-address'];
- else
- $extaddr = get_current_wan_address($rule['interface']);
-
- if (!$rule['interface'] || ($rule['interface'] == "wan"))
- $natif = $wanif;
- else if($rule['interface'] == "\$pptp")
- $natif = "pptp";
- else if($rule['interface'] == "\$pppoe")
- $natif = "pppoe";
- else
- $natif = $config['interfaces'][$rule['interface']]['if'];
-
- $lanif = $lancfg['if'];
-
- /*
- * Expand aliases
- * XXX: may want to integrate this into pf macros
- */
- if(alias_expand($target))
- $target = alias_expand($target);
- if(alias_expand($extaddr))
- $extaddr = alias_expand($extaddr);
-
- if(!isset($config['system']['disablenatreflection'])) {
-
- /* if list */
- $iflist = array("lan" => "LAN");
- for ($i = 1; isset($config['interfaces']['opt' . $i]); $i++)
- $iflist['opt' . $i] = "opt{$i}";
-
- foreach ($iflist as $ifent => $ifname) {
-
- /* do not process interfaces with gateways*/
- if($config['interfaces'][$ifname]['gateway'] <> "")
- continue;
-
- /* do not process interfaces that will end up with gateways */
- if($config['interfaces'][$ifname]['ipaddr'] == "dhcp" or
- $config['interfaces'][$ifname]['ipaddr'] == "bigpond" or
- $config['interfaces'][$ifname]['ipaddr'] == "pppoe" or
- $config['interfaces'][$ifname]['ipaddr'] == "pptp")
-
- continue;
-
- $ifname_real = convert_friendly_interface_to_real_interface_name($ifname);
-
- if($extport[1])
- $range_end = ($extport[1]);
- else
- $range_end = ($extport[0]);
-
- $range_end++;
-
- if($rule['local-port'])
- $lrange_start = $rule['local-port'];
-
- if($range_end - $extport[0] > 500) {
- $range_end = $extport[0]+1;
- log_error("Not installing nat reflection rules for a port range > 500");
- } else {
- /* only install reflection rules for < 19991 items */
- if($starting_localhost_port < 19991) {
- $loc_pt = $lrange_start;
- for($x=$extport[0]; $x<$range_end; $x++) {
-
- $starting_localhost_port++;
- $ifname_real = convert_friendly_interface_to_friendly_descr(strtolower($ifname));
-
- switch($rule['protocol']) {
- case "tcp/udp":
- $protocol = "{ tcp udp }";
- $ipfrules .= "pass in quick on \${$ifname_real} inet proto tcp from any to \$loopback port {$starting_localhost_port} keep state label \"NAT REFLECT: Allow traffic to localhost\"\n";
- $starting_localhost_port++;
- $ipfrules .= "pass in quick on \${$ifname_real} inet proto udp from any to \$loopback port {$starting_localhost_port} keep state label \"NAT REFLECT: Allow traffic to localhost\"\n";
- break;
- case "tcp":
- case "udp":
- $protocol = $rule['protocol'];
- $ipfrules .= "pass in quick on \${$ifname_real} inet proto {$rule['protocol']} from any to \$loopback port {$starting_localhost_port} keep state label \"NAT REFLECT: Allow traffic to localhost\"\n";
- break;
- default:
- break;
- }
- $loc_pt++;
- if($starting_localhost_port > 19990) {
- log_error("Not installing nat reflection rules. Maximum 1,000 reached.");
- $x = $range_end+1;
- }
- }
- }
- }
- }
-
- }
- }
- }
-
- $ipfrules .= <<<EOD
-
-# allow access to DHCP server on LAN
-anchor "dhcpserverlan"
-pass in quick on \$lan proto udp from any port = 68 to 255.255.255.255 port = 67 label "allow access to DHCP server on LAN"
-pass in quick on \$lan proto udp from any port = 68 to $lanip port = 67 label "allow access to DHCP server on LAN"
-pass out quick on \$lan proto udp from $lanip port = 67 to any port = 68 label "allow access to DHCP server on LAN"
-
-EOD;
-
- /* allow access to DHCP server on optional interfaces */
- foreach ($optcfg as $on => $oc) {
- if ($config[interfaces][$on][ipaddr] == "dhcp" ) {
- $friendly_on = filter_get_opt_interface_descr($on);
- $ipfrules .= <<<EOD
-
-# Not installing DHCP server firewall rules for $friendly_on which is configured for DHCP.
-
-EOD;
- } elseif (isset($config['dhcpd'][$on]['enable']) && (!$oc['bridge']) ||
- ($oc['bridge'] && isset($config['dhcpd'][$oc['bridge']]['enable']))) {
-
- $friendly_on = filter_get_opt_interface_descr($on);
-
- $ipfrules .= <<<EOD
-
-# allow access to DHCP server on {$on}
-anchor "dhcpserver{$friendly_on}"
-pass in quick on \${$friendly_on} proto udp from any port = 68 to 255.255.255.255 port = 67 label "allow access to DHCP server"
-pass in quick on \${$friendly_on} proto udp from any port = 68 to {$oc['ip']} port = 67 label "allow access to DHCP server"
-pass out quick on \${$friendly_on} proto udp from {$oc['ip']} port = 67 to any port = 68 label "allow access to DHCP server"
-
-EOD;
- }
- }
-
- /* pass traffic between statically routed subnets and the subnet on the
- interface in question to avoid problems with complicated routing
- topologies */
- $sa = "";
- if (isset($config['filter']['bypassstaticroutes']) && is_array($config['staticroutes']['route']) && count($config['staticroutes']['route'])) {
- $ipfrules .= <<<EOD
-anchor "staticroutes"
-
-EOD;
- foreach ($config['staticroutes']['route'] as $route) {
- unset($sa);
- $friendly_int = convert_friendly_interface_to_friendly_descr($route['interface']);
- if ($route['interface'] == "lan") {
- $sa = $lansa;
- $sn = $lansn;
- $if = $lanif;
- $friendly_int = "lan";
- } else if (strstr($route['interface'], "opt")) {
- $oc = $optcfg[$route['interface']];
- if ($oc['ip']) {
- $sa = $oc['sa'];
- $sn = $oc['sn'];
- $if = $oc['if'];
- }
- }
-
- if ($sa) {
- $ipfrules .= <<<EOD
-pass in quick on \${$friendly_int} from {$sa}/{$sn} to {$route['network']} no state label "pass traffic between statically routed subnets"
-pass in quick on \${$friendly_int} from {$route['network']} to {$sa}/{$sn} no state label "pass traffic between statically routed subnets"
-pass out quick on \${$friendly_int} from {$sa}/{$sn} to {$route['network']} no state label "pass traffic between statically routed subnets"
-pass out quick on \${$friendly_int} from {$route['network']} to {$sa}/{$sn} no state label "pass traffic between statically routed subnets"
-
-EOD;
- }
- }
- }
-
- /* install wan spoof check rule if lan address exists */
- if($lansa) {
- if(!isset($config['interfaces']['wan']['spoofmac'])) {
- $ipfrules .= <<<EOD
-
-# WAN spoof check
-anchor "wanspoof"
-block in $log quick on \$wan from $lansa/$lansn to any label "WAN spoof check"
-
-EOD;
-
- }
- }
-
- foreach ($optcfg as $oc) {
- if (!$oc['bridge'])
- if($oc['sa'] <> "")
- if(isset($oc['enable']))
- $ipfrules .= "block in $log quick on \$wan from {$oc['sa']}/{$oc['sn']} to any label \"interface spoof check\"\n";
- }
-
- /* allow PPTP traffic if PPTP client is enabled on WAN */
- if ($wancfg['ipaddr'] == "pptp") {
- $ipfrules .= <<<EOD
-
-# allow PPTP client
-anchor "pptpclient"
-pass in quick on \$wan proto gre from any to any modulate state label "allow PPTP client"
-pass in quick on \$wan proto gre from any to any modulate state label "allow PPTP client"
-pass in quick on \$wan proto tcp from any port = 1723 to any flags S/SA modulate state label "allow PPTP client"
-pass in quick on \$wan proto tcp from any to any port = 1723 flags S/SA modulate state label "allow PPTP client"
-
-EOD;
- }
-
- if ($wancfg['ipaddr'] == "dhcp") {
-
- $ipfrules .= <<<EOD
-
-# allow our DHCP client out to the WAN
-anchor "wandhcp"
-pass out quick on \$wan proto udp from any port = 68 to any port = 67 label "allow dhcp client out wan"
-
-EOD;
- }
-
-if($config['interfaces']['lan']['bridge'] <> "wan" and $config['interfaces']['wan']['bridge'] <> "lan")
- $ipfrules .= "block in $log quick on \$wan proto udp from any port = 67 to {$lansa_sn_combo} port = 68 label \"block dhcp client out wan\"\n";
-
- $ipfrules .= <<<EOD
-
-# LAN/OPT spoof check (needs to be after DHCP because of broadcast addresses)
-
-EOD;
-
- /* LAN spoof check */
- $lanbridge = false;
- foreach($config['interfaces'] as $int)
- if($int['bridge'] == "lan")
- $lanbridge = true;
- if(!$lanbridge)
- $ipfrules .= filter_rules_spoofcheck_generate('lan', $lanif, $lansa, $lansn, $log);
- $wanbridge = false;
- foreach($config['interfaces'] as $int)
- if($int['bridge'] == "wan")
- $lanbridge = true;
- if($config['interfaces']['lan']['bridge'] == "wan")
- $wanbridge = true;
-
- /* OPT spoof check */
- foreach ($optcfg as $on => $oc) {
- $isbridged = false;
- foreach ($optcfg as $on2 => $oc2) {
- if ($oc2['bridge'] && $oc2['bridge'] == $on) {
- $isbridged = true;
- break;
- }
- }
- if ($oc['ip'] && !(($oc['bridge'] || $isbridged) && isset($config['bridge']['filteringbridge'])))
- $ipfrules .= filter_rules_spoofcheck_generate($on, $oc['if'], $oc['sa'], $oc['sn'], $log);
- }
-
- $ipfrules .= "\nanchor \"spoofing\"\n";
-
- /* block private networks on WAN? */
- if (isset($config['interfaces']['wan']['blockpriv'])) {
- if($wanbridge == false) {
- $ipfrules .= <<<EOD
-
-# block anything from private networks on WAN interface
-anchor "spoofing"
-antispoof for \$wan
-block in $log quick on \$wan from 10.0.0.0/8 to any label "block private networks from wan block 10/8"
-block in $log quick on \$wan from 127.0.0.0/8 to any label "block private networks from wan block 127/8"
-block in $log quick on \$wan from 172.16.0.0/12 to any label "block private networks from wan block 172.16/12"
-block in $log quick on \$wan from 192.168.0.0/16 to any label "block private networks from wan block 192.168/16"
-
-EOD;
-
- }
- }
-
- /*
- * Support for allow limiting of TCP connections by establishment rate
- * Useful for protecting against sudden outburts, etc.
- */
- $ipfrules .= <<<EODF
-# Support for allow limiting of TCP connections by establishment rate
-anchor "limitingesr"
-table <virusprot>
-block in quick from <virusprot> to any label "virusprot overload table"
-
-EODF;
-
- /* block bogon networks on WAN */
- /* http://www.cymru.com/Documents/bogon-bn-nonagg.txt */
- /* file is automatically in cron every 3000 minutes */
- if (isset($config['interfaces']['wan']['blockbogons'])) {
- $ipfrules .= <<<EOD
-
-# block bogon networks
-# http://www.cymru.com/Documents/bogon-bn-nonagg.txt
-anchor "wanbogons"
-table <bogons> persist file "/etc/bogons"
-block in $log quick on \$wan from <bogons> to any label "block bogon networks from wan"
-
-EOD;
- }
-
-if (!isset($config['shaper']['enable']) && !is_array($config['shaper']['queue']) and $config['system']['shapertype'] <> "m0n0") {
-
- $ipfrules .= <<<EOD
-
-# let out anything from the firewall host itself and decrypted IPsec traffic
-pass out quick on \$lan proto icmp keep state label "let out anything from firewall host itself"
-pass out quick on \$wan proto icmp keep state label "let out anything from firewall host itself"
-
-# tcp.closed 5 is a workaround for load balancing, squid and a few other issues.
-# ticket (FEN-857512) in centipede tracker.
-pass out quick on $wanif all keep state ( tcp.closed 5 ) label "let out anything from firewall host itself"
-
-EOD;
-
-}
-
- $ipfrules .= create_firewall_outgoing_rules_to_itself();
-
- /* group heads for optional interfaces */
- foreach ($optcfg as $on => $oc) {
-
- $friendly_on = convert_friendly_interface_to_friendly_descr($on);
-
- if($oc['descr'])
- $friendly_on = $oc['descr'];
-
- $ipfrules .= <<<EOD
-
-
-# let out anything from the firewall host itself and decrypted IPsec traffic
-pass out quick on {$oc['if']} proto icmp keep state ( tcp.closed 5 ) label "let out anything from firewall host itself"
-pass out quick on \${$friendly_on} all keep state ( tcp.closed 5 ) label "let out anything from firewall host itself"
-
-EOD;
-
- }
-
- if($config['interfaces']['wan']['ipaddr'] == "pppoe")
- $ipfrules .= <<<EOD
-# permit wan interface to ping out (ping_hosts.sh)
-pass out quick on ng0 proto icmp keep state ( tcp.closed 5 ) label "let out anything from firewall host itself"
-
-EOD;
-
- if (!isset($config['system']['webgui']['noantilockout'])) {
-
- if($lansa and $lansn) {
-
- $ipfrules .= <<<EOD
-
-# make sure the user cannot lock himself out of the webGUI or SSH
-anchor "anti-lockout"
-pass in quick on $lanif from any to $lanip keep state label "anti-lockout web rule"
-
-EOD;
- }
- }
-
- /* PPTPd enabled? */
- if ($pptpdcfg['mode'] && ($pptpdcfg['mode'] != "off")) {
-
- if ($pptpdcfg['mode'] == "server")
- $pptpdtarget = get_current_wan_address();
- else
- $pptpdtarget = $pptpdcfg['redir'];
-
- if($pptpdtarget) {
- if(!isset($config['system']['disablevpnrules'])) {
- $ipfrules .= <<<EOD
-
-# PPTPd rules
-anchor "pptp"
-pass in quick on \$wan proto gre from any to $pptpdtarget keep state label "allow gre pptpd"
-pass in quick on \$wan proto tcp from any to $pptpdtarget port = 1723 modulate state label "allow pptpd {$pptpdtarget}"
-
-EOD;
- }
-
- } else {
- /* this shouldnt ever happen but instead of breaking the clients ruleset
- * log an error.
- */
- log_error("ERROR! PPTP enabled but could not resolve the \$pptpdtarget");
- }
- }
-
- /* BigPond client enabled? */
- if ($wancfg['ipaddr'] == "bigpond") {
-
- $ipfrules .= <<<EOD
-
-# BigPond heartbeat rules
-anchor "bigpond"
-pass in quick proto udp from any to any port = 5050 keep state label "BigPond heartbeat"
-
-# package manager late specific hook
-anchor "packagelate"
-
-
-
-EOD;
- }
-
- $ipfrules .= "\n# SSH lockout\n";
- $ipfrules .= "block in log quick proto tcp from <sshlockout> to any port 22 label \"sshlockout\"\n\n";
-
- $ipfrules .= "anchor \"ftpproxy\"\n";
- $ipfrules .= "anchor \"pftpx/*\"\n";
-
- $ipfrules .= process_carp_rules();
-
- if (isset($config['filter']['rule'])) {
- /* Pre-cache all our rules so we only have to generate them once */
- $rule_arr = array();
- foreach ($config['filter']['rule'] as $rule) {
- update_filter_reload_status("Pre-caching {$rule['descr']}...");
- $line = "";
- if (!isset($rule['disabled'])) {
- if ($rule['interface'] == "pptp") {
- /* we have a pptp rule but its turned off, ignore */
- if(!$config['pptpd']['mode'] == "server")
- continue;
- $n_pptp_units = $g['n_pptp_units'];
- if($config['pptp']['n_pptp_units'] <> "")
- $nif = $config['pptp']['n_pptp_units'];
- /*
- * now that PPTP server are user rules, detect
- * that user is setting the pptp server rule
- * and setup for all netgraph interfaces
- */
- $rule_arr[] = generate_user_filter_rule_arr($rule, 0);
- } else if($rule['interface'] == "pppoe") {
- if(!$config['pppoe']['mode'] == "server")
- continue;
- $n_pppoe_units = $g['n_pppoe_units'];
- if($config['pppoe']['n_pppoe_units'] <> "")
- $nif = $config['pppoe']['n_pppoe_units'];
- /*
- * now that pppoe server are user rules, detect
- * that user is setting the pppoe server rule
- * and setup for all netgraph interfaces
- */
- $rule_arr[] = generate_user_filter_rule_arr($rule, 0);
- } else {
- $rule_arr[] = generate_user_filter_rule_arr($rule, 0);
- }
- }
- }
-
- $ipfrules .= "\n# User-defined aliases follow\n";
- /* tables for aliases */
- foreach($table_cache as $table) {
- $ipfrules .= $table;
- }
-
- /* Shaper rules */
- if (isset($config['shaper']['enable']) && is_array($config['shaper']['queue']) && isset($config['filter']['rule']) and $config['system']['shapertype'] <> "m0n0") {
-
- $ipfrules .= "\n# Anchors for rules that might be matched by queues\n";
-
- /* This is ugly, but we generate one anchor per queue */
- foreach ($config['shaper']['queue'] as $queue) {
- update_filter_reload_status("Creating filter anchor for {$queue['name']} ...");
- /* Add anchor to rules */
- $ipfrules .= "anchor {$queue['name']} tagged {$queue['name']}\n";
- $ipfrules .= "load anchor {$queue['name']} from \"{$g['tmp_path']}/{$queue['name']}.rules\"\n";
- /* Create rules for anchors */
- $fd = fopen("{$g['tmp_path']}/{$queue['name']}.rules", "w");
- /* aliases don't recurse to anchors */
- $line = filter_generate_aliases();
- fwrite($fd, $line);
- foreach($rule_arr as $rule) {
- if($rule['ackq'] != "")
- $line = "{$rule['rule']} queue ({$queue['name']}, {$rule['ackq']}) {$rule['descr']}\n";
- else
- $line = "{$rule['rule']} queue {$queue['name']} {$rule['descr']}\n";
- fwrite($fd, $line);
- }
- fclose($fd);
- }
- }
-
- $ipfrules .= "\n# User-defined rules follow\n";
- /* Generate user rule lines */
- foreach($rule_arr as $rule) {
- $line = "";
- if (!isset($rule['disabled'])) {
- $line = $rule['rule'];
- if($line <> "") {
- /* Add default queue if we're using the shaper */
- if (isset($config['shaper']['enable']) && is_array($config['shaper']['queue']) and $config['system']['shapertype'] <> "m0n0") {
- $defq = find_default_queue($rule['interface']);
- $ackq = $rule['ackq'];
- if (($defq != "") and ($ackq != ""))
- $line .= " queue ({$defq}, {$ackq}) ";
- }
- /* label */
- $line .= " {$rule['descr']}";
- }
- }
- $line .= "\n";
- $ipfrules .= $line;
- }
- }
-
- update_filter_reload_status("Creating carp rules...");
-
- $ipfrules .= "\n# VPN Rules\n";
- $lan_ip = $config['interfaces']['lan']['ipaddr'];
- $lan_subnet = $config['interfaces']['lan']['subnet'];
- $wanif = get_real_wan_interface();
- $wan_ip = find_interface_ip($wanif);
- if($wan_ip) {
- $internal_subnet = gen_subnet($lan_ip, $lan_subnet) . "/" . $config['interfaces']['lan']['subnet'];
- /* Is IP Compression enabled? */
- if(isset($config['ipsec']['ipcomp']))
- exec("/sbin/sysctl net.inet.ipcomp.ipcomp_enable=1");
- else
- exec("/sbin/sysctl net.inet.ipcomp.ipcomp_enable=0");
-
- /* build an interface collection */
- $ifdescrs = array ("wan");
- for ($j = 1; isset ($config['interfaces']['opt' . $j]); $j++) {
- if(isset($config['interfaces']['opt' . $j]['enable']))
- $ifdescrs['opt' . $j] = filter_get_opt_interface_descr("opt" . $j);
- }
-
- if(is_array($config['ipsec']['tunnel']) && isset($config['ipsec']['enable'])) {
- foreach ($config['ipsec']['tunnel'] as $tunnel) {
- if(isset($tunnel['disabled']))
- continue;
- update_filter_reload_status("Creating IPSEC tunnel items {$tunnel['descr']}...");
- /* if tunnel is disabled, lets skip to next item */
- $ipsec_ips = array(get_current_wan_address($tunnel['interface']));
- /* is this a dynamic dns hostname? */
- if(!is_ipaddr($tunnel['remote-gateway'])) {
- $remote_gateway = resolve_retry($tunnel['remote-gateway']);
- } else {
- $remote_gateway = $tunnel['remote-gateway'];
- }
- /* do not add items with blank remote_gateway */
- if(!is_ipaddr($remote_gateway)) {
- $ipfrules .= "# ERROR! Remote gateway not found on {$tunnel['remote-gateway']}\n";
- continue;
- }
- $local_subnet = return_vpn_subnet($tunnel['local-subnet']);
- foreach($ifdescrs as $iface) {
- foreach($ipsec_ips as $interface_ip) {
- if($iface == "wan")
- $interface_ip = find_interface_ip(get_real_wan_interface());
- else
- $interface_ip = find_interface_ip(convert_friendly_interface_to_real_interface_name($iface));
- if(!$interface_ip)
- continue;
- if(!$remote_gateway)
- continue;
- if(isset($config['system']['disablevpnrules']))
- continue;
-
- $shorttunneldescr = substr($tunnel['descr'], 0, 26);
- $ipfrules .= "pass out quick on \${$iface} proto udp from any to {$remote_gateway} port = 500 keep state label \"IPSEC: {$shorttunneldescr} - outbound isakmp\"\n";
- $ipfrules .= "pass in quick on \${$iface} proto udp from {$remote_gateway} to any port = 500 keep state label \"IPSEC: {$shorttunneldescr} - inbound isakmp\"\n";
- if ($tunnel['p2']['protocol'] == 'esp') {
- $ipfrules .= "pass out quick on \${$iface} proto esp from any to {$remote_gateway} keep state label \"IPSEC: {$shorttunneldescr} - outbound esp proto\"\n";
- $ipfrules .= "pass in quick on \${$iface} proto esp from {$remote_gateway} to any keep state label \"IPSEC: {$shorttunneldescr} - inbound esp proto\"\n";
- }
- if ($tunnel['p2']['protocol'] == 'ah') {
- $ipfrules .= "pass out quick on \${$iface} proto ah from any to {$remote_gateway} keep state label \"IPSEC: {$shorttunneldescr} - outbound ah proto\"\n";
- $ipfrules .= "pass in quick on \${$iface} proto ah from {$remote_gateway} to any keep state label \"IPSEC: {$shorttunneldescr} - inbound ah proto\"\n";
- }
- }
- }
- }
- }
-
- /* is mobile ipsec enabled? if so lets allow some pretty
- * loose rules to allow mobile clients to phone in.
- */
- $ipseccfg = $config['ipsec'];
- if (isset($ipseccfg['mobileclients']['enable'])) {
- if(!isset($config['system']['disablevpnrules'])) {
- foreach($ifdescrs as $iface) {
- $ipfrules .= "pass in quick on \${$iface} proto udp from any to any port = 500 keep state label \"IPSEC: Mobile - inbound isakmp\"\n";
- $ipfrules .= "pass in quick on \${$iface} proto esp from any to any keep state label \"IPSEC: Mobile - inbound esp proto\"\n";
- $ipfrules .= "pass in quick on \${$iface} proto ah from any to any keep state label \"IPSEC: Mobile - inbound ah proto\"\n";
- }
- }
- }
- }
- $ipfrules .= <<<EOD
-
-pass in quick on $lanif inet proto tcp from any to \$loopback port 8021 keep state label "FTP PROXY: Allow traffic to localhost"
-pass in quick on $lanif inet proto tcp from any to \$loopback port 21 keep state label "FTP PROXY: Allow traffic to localhost"
-pass in quick on $wanif inet proto tcp from port 20 to ($wanif) port > 49000 flags S/SA keep state label "FTP PROXY: PASV mode data connection"
-
-EOD;
-
- if(!isset($config['system']['disableftpproxy'])) {
-
- $ipfrules .= "# enable ftp-proxy\n";
-
- $optcfg = array();
- generate_optcfg_array($optcfg);
- $ftp_counter = "8022";
- foreach($optcfg as $oc) {
- if(!isset($oc['gateway']) && $oc['if'] <> "") {
- $ipfrules .= "pass in quick on " . $oc['if'] . " inet proto tcp from any to \$loopback port {$ftp_counter} keep state label \"FTP PROXY: Allow traffic to localhost\"\n";
- $ipfrules .= "pass in quick on " . $oc['if'] . " inet proto tcp from any to \$loopback port 21 keep state label \"FTP PROXY: Allow traffic to localhost\"\n";
- }
- $ftp_counter++;
- }
-
- if(isset($config['system']['rfc959workaround'])) {
- $ipfrules .= <<<EODEOD
-
-# Fix sites that violate RFC 959 which specifies that the data connection
-# be sourced from the command port - 1 (typically port 20)
-# This workaround doesn't expose us to any extra risk as we'll still only allow
-# connections to the firewall on a port that ftp-proxy is listening on
-pass in quick on $wanif inet proto tcp from any to ($wanif) port > 49000 flags S/SA keep state label "FTP PROXY: RFC959 violation workaround"
-
-EODEOD;
-
- $optcfg = array();
- generate_optcfg_array($optcfg);
- foreach($optcfg as $oc) {
- if($oc['gateway'] <> "")
- $ipfrules .= "pass in quick on {$oc['if']} inet proto tcp from any to ({$oc['if']}) port > 49000 flags S/SA keep state label \"FTP PROXY: RFC959 violation workaround\" \n";
- }
- }
- }
-
- $ipfrules .= <<<EOD
-
-# IMSpector
-anchor "imspector"
-
-# uPnPd
-anchor "miniupnpd"
-
-#---------------------------------------------------------------------------
-# default deny rules
-#---------------------------------------------------------------------------
-block in $log quick all label "Default deny rule"
-block out $log quick all label "Default deny rule"
-
-EOD;
-
- return $ipfrules;
-}
-
-function filter_rules_spoofcheck_generate($ifname, $if, $sa, $sn, $log) {
-
- global $g, $config;
-
- if(isset($config['system']['developerspew'])) {
- $mt = microtime();
- echo "filter_rules_spoofcheck_generate() being called $mt\n";
- }
-
- $ipfrules = "antispoof for {$if}\n";
-
- return $ipfrules;
-
-}
-
-function setup_logging_interfaces() {
- global $config;
- if(isset($config['system']['developerspew'])) {
- $mt = microtime();
- echo "setup_logging_interfaces() being called $mt\n";
- }
- $rules = "";
- $i = 0;
- $ifdescrs = array('wan', 'lan');
- for ($j = 1; isset($config['interfaces']['opt' . $j]); $j++) {
- $ifdescrs['opt' . $j] = "opt" . $j;
- }
- foreach ($ifdescrs as $ifdescr => $ifname) {
- /* do not work with tun interfaces */
- if(stristr(filter_translate_type_to_real_interface($ifname), "tun") == true) continue;
- $int = filter_translate_type_to_real_interface($ifname);
- $rules .= "set loginterface {$int}\n";
- }
- return $rules;
-}
-
-function create_firewall_outgoing_rules_to_itself() {
- global $config, $g;
-
- if(isset($config['system']['developerspew'])) {
- $mt = microtime();
- echo "create_firewall_outgoing_rules_to_itself() being called $mt\n";
- }
-
- $i = 0;
- $rule .= "# pass traffic from firewall -> out\n";
- $rule .= "anchor \"firewallout\"\n";
- $ifdescrs = array('wan', 'lan');
- for ($j = 1; isset($config['interfaces']['opt' . $j]); $j++)
- $ifdescrs['opt' . $j] = "opt" . $j;
-
- /* go through primary and optional interfaces */
- foreach ($ifdescrs as $ifdescr => $ifname) {
- $return_gateway = $config['interfaces'][$ifname]['gateway'];
- $ints = array();
- $int = filter_translate_type_to_real_interface($ifname);
- /* if the interface is pppoe, set the ng0 interface */
- update_filter_reload_status("Creating IPSEC tunnel items {$tunnel['descr']}...");
- $ip = find_interface_ip($int);
- if ($config['interfaces'][$ifname]['ipaddr'] == "pppoe")
- $int = " { " . filter_translate_type_to_real_interface($ifname) . " ng0 } ";
- if (isset($config['shaper']['enable']) && is_array($config['shaper']['queue']) and $config['system']['shapertype'] <> "m0n0") {
- $ackq = get_ack_queue($ifname);
- $defq = find_default_queue($ifname);
- /* Handle all tagged packets */
- foreach ($config['shaper']['queue'] as $queue) {
- if(!filter_is_queue_being_used_on_interface($queue['name'], $ifname, 'out'))
- continue;
- if ($ackq == "" || $defq == "") {
- /* Shaper must not be enabled on this interface */
- $q = "";
- } else {
- $q = "queue ({$queue['name']}, {$ackq})";
- }
- $rule .="pass out quick on {$int} all keep state tagged {$queue['name']} {$q} label \"let out anything from firewall host itself\"\n";
- }
- /* Handle untagged packets */
- if ($ackq == "" || $defq == "") {
- /* Shaper must not be enabled on this interface */
- $q = "";
- } else {
- $q = "queue ({$defq}, {$ackq})";
- }
- $rule .="pass out quick on {$int} all keep state {$q} label \"let out anything from firewall host itself\"\n";
- } else {
- /* first add a rule for the real interface, then for ng0 */
- $rule .="pass out quick on {$int} all keep state label \"let out anything from firewall host itself\"\n";
- }
- }
-/*
- update_filter_reload_status("Setting up bridging items");
- // is bridging turned on?
- for($x=0; $x<10; $x++) {
- if(does_interface_exist("bridge{$x}") == true)
- $rule .="pass out quick on bridge{$x} all keep state label \"let out anything from firewall host itself\"\n";
- }
-*/
- update_filter_reload_status("Setting up pptp items");
- if($config['pptpd']['mode'] == "server")
- $rule .="pass out quick on \$pptp all keep state label \"let out anything from firewall host itself pptp\"\n";
-
- update_filter_reload_status("Setting up pppoe items");
- if($config['pppoe']['mode'] == "server")
- $rule .="pass out quick on \$pppoe all keep state label \"let out anything from firewall host itself pppoe\"\n";
-
- update_filter_reload_status("Setting up gif tunnels");
- /* setup outgoing gif tunnels */
- $number_of_gifs = find_last_gif_device();
- $number_of_gifs++;
- for($x=0; $x<$number_of_gifs; $x++) {
- if(does_interface_exist("gif{$x}") == true)
- $rule .="pass out quick on gif{$x} all keep state label \"let out anything from firewall host itself ipsec gif\"\n";
- }
-
- update_filter_reload_status("Setting up tun interfaces (openvpn)");
- /* openvpn tun interfaces. check for 100. */
- for($x=0; $x<100; $x++) {
- if(does_interface_exist("tun{$x}") == true) {
- $rule .="pass out quick on tun{$x} all keep state label \"let out anything from firewall host itself openvpn\"\n";
- $friendlytunif = convert_real_interface_to_friendly_interface_name("tun{$x}");
- /* If the interface has a gateway we do not add a pass in rule. */
- /* Some people use a TUN tunnel with public IP as a Multiwan interface */
- if(interface_has_gateway("tun{$x}")) {
- $rule .= "# Not adding default pass in rule for interface $friendlytunif - tun{$x} with a gateway!\n";
- } elseif (!isset($config['system']['disablevpnrules'])) {
- $rule .="pass in quick on tun{$x} all keep state label \"let out anything from firewall host itself openvpn\"\n";
- }
- }
- }
- for($x=0; $x<100; $x++) {
- if(does_interface_exist("tap{$x}") == true) {
- $rule .="pass out quick on tap{$x} all keep state label \"let out anything from firewall host itself openvpn\"\n";
- $friendlytapif = convert_real_interface_to_friendly_interface_name("tap{$x}");
- /* If the interface has a gateway we do not add a pass in rule. */
- /* Some people use a TAP tunnel with public IP as a Multiwan interface */
- if(interface_has_gateway("tap{$x}")) {
- $rule .= "# Not adding default pass in rule for interface $friendlytapif - tap{$x} with a gateway!\n";
- } elseif (!isset($config['system']['disablevpnrules'])) {
- $rule .="pass in quick on tap{$x} all keep state label \"let out anything from firewall host itself openvpn\"\n";
- }
- }
- }
-
- /* permit internal ipsec outbound traffic */
- $rule .="pass out quick on \$enc0 keep state label \"IPSEC internal host to host\"";
-
- return $rule;
-}
-
-function process_carp_nat_rules() {
- global $g, $config;
-
- update_filter_reload_status("Creating CARP NAT rules");
-
- $wan_interface = get_real_wan_interface();
-
- if(isset($config['system']['developerspew'])) {
- $mt = microtime();
- echo "process_carp_nat_rules() being called $mt\n";
- }
- $lines = "";
- if($config['installedpackages']['carp']['config'] != "")
- foreach($config['installedpackages']['carp']['config'] as $carp) {
- $ip = $carp['ipaddress'];
- if($ip <> "any") {
- $ipnet = "any";
- } else {
- $int = find_ip_interface($ip);
- $carp_int = find_carp_interface($ip);
- }
- if($int != false and $int != $wan_interface) {
- $ipnet = convert_ip_to_network_format($ip, $carp['netmask']);
- if($int)
- $lines .= "nat on {$int} inet from {$ipnet} to any -> ({$carp_int}) \n";
- }
- }
- return $lines;
-}
-
-function process_carp_rules() {
- global $g, $config;
- if(isset($config['system']['developerspew'])) {
- $mt = microtime();
- echo "process_carp_rules() being called $mt\n";
- }
- $lines = "";
- /* return if there are no carp configured items */
- if($config['installedpackages']['carpsettings']['config'] <> "" or
- $config['virtualip']['vip'] <> "") {
- $lines .= "pass quick proto carp\n";
- $lines .= "pass quick proto pfsync";
- }
- return $lines;
-}
-
-function remove_special_characters($string) {
- $match_array = "";
- preg_match_all("/[a-zA-Z0-9\_\-]+/",$string,$match_array);
- $string = "";
- foreach($match_array[0] as $ma) {
- if($string <> "")
- $string .= " ";
- $string .= $ma;
- }
- return $string;
-}
-
-function carp_sync_xml($url, $password, $sections, $port = 80, $method = 'pfsense.restore_config_section') {
- global $config, $g;
-
- if($g['booting'])
- return;
-
- update_filter_reload_status("Syncing CARP data to {$url}");
-
- /* make a copy of config */
- $config_copy = $config;
-
- /* strip out nosync items */
- for ($x = 0; $x < count($config_copy['nat']['advancedoutbound']['rule']); $x++) {
- if (isset ($config_copy['nat']['advancedoutbound']['rule'][$x]['nosync']))
- unset ($config_copy['nat']['advancedoutbound']['rule'][$x]);
- $config_copy['nat']['advancedoutbound']['rule'][$x]['descr'] = remove_special_characters($config_copy['nat']['advancedoutbound']['rule'][$x]['descr']);
- }
- for ($x = 0; $x < count($config_copy['nat']['rule']); $x++) {
- if (isset ($config_copy['nat']['rule'][$x]['nosync']))
- unset ($config_copy['nat']['rule'][$x]);
- $config_copy['nat']['rule'][$x]['descr'] = remove_special_characters($config_copy['nat']['rule'][$x]['descr']);
- }
- for ($x = 0; $x < count($config_copy['filter']['rule']); $x++) {
- if (isset ($config_copy['filter']['rule'][$x]['nosync']))
- unset ($config_copy['filter']['rule'][$x]);
- $config_copy['filter']['rule'][$x]['descr'] = remove_special_characters($config_copy['filter']['rule'][$x]['descr']);
- }
- for ($x = 0; $x < count($config_copy['aliases']['alias']); $x++) {
- if (isset ($config_copy['aliases']['alias'][$x]['nosync']))
- unset ($config_copy['aliases']['alias'][$x]);
- $config_copy['aliases']['alias'][$x]['descr'] = remove_special_characters($config_copy['aliases']['alias'][$x]['descr']);
- }
- for ($x = 0; $x < count($config_copy['dnsmasq']['hosts']); $x++) {
- if (isset ($config_copy['dnsmasq']['hosts'][$x]['nosync']))
- unset ($config_copy['dnsmasq']['hosts'][$x]);
- $config_copy['dnsmasq']['hosts'][$x]['descr'] = remove_special_characters($config_copy['dnsmasq']['hosts'][$x]['descr']);
- }
- for ($x = 0; $x < count($config_copy['virtualip']['vip']); $x++) {
- if (isset ($config_copy['virtualip']['vip'][$x]['nosync']) or $config_copy['virtualip']['vip'][$x]['mode'] == "proxyarp")
- unset ($config_copy['virtualip']['vip'][$x]);
- $config_copy['virtualip']['vip'][$x]['descr'] = remove_special_characters($config_copy['virtualip']['vip'][$x]['descr']);
- }
- for ($x = 0; $x < count($config_copy['ipsec']['tunnel']); $x++) {
- if (isset ($config_copy['ipsec']['tunnel'][$x]['nosync']))
- unset ($config_copy['ipsec']['tunnel'][$x]);
- $config_copy['ipsec']['tunnel'][$x]['descr'] = remove_special_characters($config_copy['ipsec']['tunnel'][$x]['descr']);
- }
-
- foreach($sections as $section) {
- /* we can't use array_intersect_key()
- due to the vip 'special case' */
- if($section != 'virtualip') {
- $xml[$section] = $config_copy[$section];
- } else {
- $xml[$section] = backup_vip_config_section();
- }
- }
-
- $params = array(
- XML_RPC_encode($password),
- XML_RPC_encode($xml)
- );
-
- $numberofruns = 0;
- while($numberofruns < 2) {
- log_error("Beginning XMLRPC sync to {$url}:{$port}.");
- $msg = new XML_RPC_Message($method, $params);
- $cli = new XML_RPC_Client('/xmlrpc.php', $url, $port);
- $username = $config['system']['username'];
- $cli->setCredentials($username, $password);
- if($numberofruns == 1)
- $cli->setDebug(1);
- /* send our XMLRPC message and timeout after 240 seconds */
- $resp = $cli->send($msg, "240");
- if(!$resp) {
- $error = "A communications error occured while attempting XMLRPC sync with username {$username} {$url}:{$port}.";
- log_error($error);
- file_notice("sync_settings", $error, "Settings Sync", "");
- } elseif($resp->faultCode()) {
- $error = "An error code was received while attempting XMLRPC sync with username {$username} {$url}:{$port} - Code " . $resp->faultCode() . ": " . $resp->faultString();
- log_error($error);
- file_notice("sync_settings", $error, "Settings Sync", "");
- } else {
- log_error("XMLRPC sync successfully completed with {$url}:{$port}.");
- $numberofruns = 3;
- }
- $numberofruns++;
- }
-}
-
-function carp_sync_client() {
-
- global $config, $g;
-
- update_filter_reload_status("Building CARP sync information");
-
- if($g['booting'])
- return;
-
- if(is_array($config['installedpackages']['carpsettings']['config'])) {
- foreach($config['installedpackages']['carpsettings']['config'] as $carp) {
- if($carp['synchronizetoip'] != "" ) {
- /*
- * XXX: The way we're finding the port right now is really suboptimal -
- * we can't assume that the other machine is setup identically.
- */
- if($config['system']['webgui']['protocol'] != "") {
- $synchronizetoip = $config['system']['webgui']['protocol'];
- $synchronizetoip .= "://";
- }
- $port = $config['system']['webgui']['port'];
- /* if port is empty lets rely on the protocol selection */
- if($port == "") {
- if($config['system']['webgui']['protocol'] == "http") {
- $port = "80";
- } else {
- $port = "443";
- }
- }
- $synchronizetoip .= $carp['synchronizetoip'];
- if($carp['synchronizerules'] != "" and is_array($config['filter'])) {
- $sections[] = 'filter';
- }
- if($carp['synchronizenat'] != "" and is_array($config['nat'])) {
- $sections[] = 'nat';
- }
- if($carp['synchronizealiases'] != "" and is_array($config['aliases'])) {
- $sections[] = 'aliases';
- }
- if($carp['synchronizedhcpd'] != "" and is_array($config['dhcpd'])) {
- $sections[] = 'dhcpd';
- }
- if($carp['synchronizewol'] != "" and is_array($config['wol'])) {
- $sections[] = 'wol';
- }
- if($carp['synchronizetrafficshaper'] != "" and is_array($config['shaper'])) {
- $sections[] = 'shaper';
- }
- if($carp['synchronizestaticroutes'] != "" and is_array($config['staticroutes'])) {
- $sections[] = 'staticroutes';
- }
- if($carp['synchronizevirtualip'] != "" and is_array($config['virtualip'])) {
- $sections[] = 'virtualip';
- }
- if($carp['synchronizelb'] != "" and is_array($config['load_balancer'])) {
- $sections[] = 'load_balancer';
- }
- if($carp['synchronizeipsec'] != "" and is_array($config['ipsec'])) {
- $sections[] = 'ipsec';
- }
- if($carp['synchronizednsforwarder'] != "" and is_array($config['dnsmasq'])) {
- $sections[] = 'dnsmasq';
- }
- if($carp['synchronizeschedules'] != "" and is_array($config['schedules'])) {
- $sections[] = 'schedules';
- }
- if(count($sections) > 0) {
- update_filter_reload_status("Signaling CARP reload signal...");
- carp_sync_xml($synchronizetoip, $carp['password'], $sections, $port);
- $cli = new XML_RPC_Client('/xmlrpc.php', $synchronizetoip, $port);
- $msg = new XML_RPC_Message('pfsense.filter_configure', array(new XML_RPC_Value($carp['password'], 'string')));
- $username = $config['system']['username'];
- $cli->setCredentials($username, $carp['password']);
- $cli->send($msg, "900");
- /* signal a carp reload */
- $msg = new XML_RPC_Message('pfsense.interfaces_carp_configure');
- $cli->send($msg, "900");
- }
- }
- }
- }
-
-}
-
-function return_vpn_subnet($adr) {
- global $config;
- if(isset($config['system']['developerspew'])) {
- $mt = microtime();
- echo "return_vpn_subnet() being called $mt\n";
- }
-
- if ($adr['address']) {
- list($padr, $pmask) = explode("/", $adr['address']);
- if (is_null($pmask))
- return "{$padr}/32";
- return "{$padr}/{$pmask}";
- }
-
- /* XXX: do not return wan, lan, etc */
- if(strstr($adr['network'], "wan") or strstr($adr['network'], "lan") or strstr($adr['network'], "opt"))
- return convert_ip_to_network_format($config['interfaces'][$adr['network']]['ipaddr'],
- $config['interfaces'][$adr['network']]['subnet']);
-
- /* fallback - error */
- return " # error - {$adr['network']} ";
-
-}
-
-?>