%PDF- %PDF-
Direktori : /backups/router/usr/local/etc/inc/plugins.inc.d/ |
Current File : //backups/router/usr/local/etc/inc/plugins.inc.d/pf.inc |
<?php /* * Copyright (C) 2016-2020 Deciso B.V. * Copyright (C) 2016-2018 Franco Fichtner <franco@opnsense.org> * 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. */ function pf_services() { global $config; $services = array(); if (!isset($config['system']['disablefilter'])) { $services[] = array( 'description' => gettext('Packet Filter'), 'configd' => array( 'restart' => array('filter reload'), ), 'nocheck' => true, 'name' => 'pf', ); } return $services; } function pf_configure() { return [ 'pfsync' => ['interfaces_pfsync_configure'], ]; } function pf_cron() { global $config; $jobs = array(); if (isset($config['filter']['rule'])) { foreach ($config['filter']['rule'] as $rule) { if (empty($rule['disabled']) && !empty($rule['sched'])) { $jobs[]['autocron'] = array('/usr/bin/logger "reload filter for configured schedules" ; /usr/local/etc/rc.filter_configure', '1,16,31,46'); break; } } } /* bogons fetch always set in default config.xml */ switch ($config['system']['bogons']['interval']) { case 'daily': $jobs[]['autocron'] = array('/usr/local/sbin/configctl -d filter schedule bogons', '1', '3', '*', '*', '*'); break; case 'weekly': $jobs[]['autocron'] = array('/usr/local/sbin/configctl -d filter schedule bogons', '1', '3', '*', '*', '0'); break; case 'monthly': default: $jobs[]['autocron'] = array('/usr/local/sbin/configctl -d filter schedule bogons', '1', '3', '1', '*', '*'); break; } $jobs[]['autocron'] = array( '/usr/local/bin/flock -n -E 0 -o /tmp/filter_update_tables.lock ' . '/usr/local/opnsense/scripts/filter/update_tables.py', '*' ); return $jobs; } function pf_interfaces() { global $config; $interfaces = array(); /* add interface groups */ if (isset($config['ifgroups']['ifgroupentry'])) { foreach ($config['ifgroups']['ifgroupentry'] as $ifgen) { $oc = array("enable" => true); $oc['networks'] = array(); $oc['if'] = $ifgen['ifname']; $oc['descr'] = $ifgen['ifname']; $oc['virtual'] = true; $oc['type'] = 'group'; $interfaces[$ifgen['ifname']] = $oc; } } return $interfaces; } /** * options we should probably remove from the system at some point, lets make them plugabble before removal * @param $fw */ function pf_firewall($fw) { global $config; $defaults = array(); $defaults['pass'] = array("type" => "pass", "log" => !isset($config['syslog']['nologdefaultpass'])); /* * pass traffic between statically routed subnets and the subnet on the * interface in question to avoid problems with complicated routing * topologies */ if ( isset($config['filter']['bypassstaticroutes']) && isset($config['staticroutes']['route']) && count($config['staticroutes']['route']) ) { $ifdetails = $fw->getIfconfigDetails(); $GatewaysList = $fw->getGateways()->gatewaysIndexedByName(false, true); foreach (get_staticroutes() as $route) { if (!empty($GatewaysList[$route['gateway']]['interface']) && empty($route['disabled'])) { $gw = $GatewaysList[$route['gateway']]; $routeent = explode("/", $route['network']); if (is_ipaddrv4($routeent[0]) && empty($ifdetails[$gw['if']]['ipv4'])) { continue; } elseif (is_ipaddrv6($routeent[0]) && empty($ifdetails[$gw['if']]['ipv6'])) { continue; } elseif (!is_ipaddrv4($routeent[0]) && !is_ipaddrv6($routeent[0])) { continue; } $networks = array(); $networks[] = array('from' => "({$gw['if']}:network)", 'to' => $route['network']); $networks[] = array('to' => "({$gw['if']}:network)", 'from' => $route['network']); $proto = strpos($route['network'], ":") !== false ? "inet6" : "inet"; foreach ($networks as $network) { $fw->registerFilterRule( 10, array('interface' => $gw['interface'], 'statetype' => 'sloppy', 'ipprotocol' => $proto, 'protocol' => 'tcp','flags' => 'any', 'from' => $network['from'], 'to' => $network['to'], 'quick' => false, 'descr' => "pass traffic between statically routed subnets", '#ref' => 'system_advanced_firewall.php#bypassstaticroutes'), $defaults['pass'] ); $fw->registerFilterRule( 10, array('interface' => $gw['interface'], 'statetype' => 'sloppy', 'ipprotocol' => $proto, 'from' => $network['from'],'to' => $network['to'], 'quick' => false, 'descr' => "pass traffic between statically routed subnets", '#ref' => 'system_advanced_firewall.php#bypassstaticroutes'), $defaults['pass'] ); } } } } $mdlFilter = new OPNsense\Firewall\Filter(); foreach ($mdlFilter->rules->rule->sortedBy(['sequence']) as $key => $rule) { $content = $rule->serialize(); $content['#ref'] = 'ui/firewall/filter#' . (string)$rule->getAttributes()['uuid']; $fw->registerFilterRule($rule->getPriority(), $content); } foreach ($mdlFilter->snatrules->rule->sortedBy(['sequence']) as $key => $rule) { $fw->registerSNatRule(50, $rule->serialize()); } foreach ($mdlFilter->onetoone->rule->sortedBy(['sequence']) as $key => $rule) { $fw->registerDNatRule(500, $rule->serialize()); } foreach ($mdlFilter->npt->rule->sortedBy(['sequence']) as $key => $rule) { $fw->registerNptRule(50, $rule->serialize()); } } function pf_syslog() { $logfacilities = []; $logfacilities['firewall'] = ['facility' => ['firewall']]; $logfacilities['filter'] = ['facility' => ['filterlog']]; return $logfacilities; } function pf_xmlrpc_sync() { $result = array(); $result[] = array( 'description' => gettext('Firewall Groups'), 'section' => 'ifgroups.ifgroupentry', 'id' => 'ifgroups', 'services' => ['pf'], ); $result[] = array( 'description' => gettext('Firewall Rules'), 'help' => gettext('Synchronize the firewall rules to the other HA host.'), 'section' => 'filter,OPNsense.Firewall.Filter.rules', 'id' => 'rules', 'services' => ['pf'], ); $result[] = array( 'description' => gettext('Firewall Schedules'), 'help' => gettext('Synchronize the firewall schedules to the other HA host.'), 'section' => 'schedules', 'id' => 'schedules', 'services' => ['pf'], ); $result[] = array( 'description' => gettext('Firewall Categories'), 'section' => 'OPNsense.Firewall.Category', 'id' => 'categories', ); $result[] = array( 'description' => gettext('Firewall Log Templates'), 'section' => 'OPNsense.Firewall.Lvtemplate', 'id' => 'lvtemplate', ); $result[] = array( 'description' => gettext('Aliases'), 'help' => gettext('Synchronize the aliases over to the other HA host.'), 'section' => 'aliases,OPNsense.Firewall.Alias', 'id' => 'aliases', 'services' => ['pf'], ); $result[] = array( 'description' => gettext('NAT'), 'help' => gettext('Synchronize the NAT rules over to the other HA host.'), 'section' => 'nat,OPNsense.Firewall.Filter.snatrules,OPNsense.Firewall.Filter.npt,OPNsense.Firewall.Filter.onetoone', 'id' => 'nat', 'services' => ['pf'], ); return $result; }