source: trunk/system/generators/firewall_mangle.php@ 267

Last change on this file since 267 was 267, checked in by george, 16 years ago
  • Upraveno: Nově přepracován systém generování značkovacích pravidel mangle firewallu. Pro snížení počtu pravidel procházených při značkování packetu, jsou adresy rozdělovány do podskupin. Díky tomu je snížen rozptyl mezi nejmenším a nejvyšším početem procházených pravidel.
  • Upraveno: Přepracovány funkce pro práci s IP adresami typu IPv4. Přehledněji zpracováno jako třída.
  • Přidáno: Tabulka v databázi pro persistentní přiřazení Id čísla podsítě pro generování pravidel mangle firewallu.
File size: 5.6 KB
Line 
1<?php
2if(isset($_SERVER['REMOTE_ADDR'])) die();
3
4$Enabled = 1;
5$ClassesEnabled = 1;
6$SessionDisable = true;
7include_once('../../global.php');
8include('../routerboard.php');
9include('common.php');
10$PathFirewall = array('ip', 'firewall', 'mangle');
11
12$Routerboard = new Routerboard();
13$Routerboard->UserName = $Config['MainRouter']['UserName'];
14$Routerboard->Timeout = $Config['MainRouter']['ConnectTimeout'];
15$Routerboard->HostName = $Config['MainRouter']['HostName'];
16$Routerboard->Debug = true;
17
18$InetInterface = $Config['MainRouter']['InetInterface'];
19
20
21// Generate address tree
22$AddressTree = array('Address' => new NetworkAddressIPv4(), 'Name' => 'main', 'Items' => array());
23
24// Divide rules by subnet number
25$DbResult = $Database->query('SELECT `Id`, `Name`, `AddressRange`, `Mask` FROM `NetworkSubnet` WHERE Member=0');
26while($Subnet = $DbResult->fetch_assoc())
27{
28 $NewAddress = new NetworkAddressIPv4();
29 $NewAddress->AddressFromString($Subnet['AddressRange']);
30 $NewAddress->Prefix = $Subnet['Mask'];
31 InsertToAddressTree($AddressTree, $NewAddress, 'subnet-'.RouterOSIdent($Subnet['Name']));
32}
33
34// Process users
35$DbResult = $Database->query('SELECT `Member`.*, `Subject`.`Name` FROM `Member` LEFT JOIN `Subject` ON `Subject`.`Id` = `Member`.`Subject`');
36while($Member = $DbResult->fetch_assoc())
37{
38 $Member['Name'] = RouterOSIdent($Member['Name'].'-'.$Member['Id'] );
39 echo('Uživatel '.$Member['Name'].': ');
40
41 $DbResult2 = $Database->select('NetworkDevice', '*', '`Used` = 1 AND `Member` = '.$Member['Id']);
42 while($Device = $DbResult2->fetch_assoc())
43 {
44 $DbResult3 = $Database->select('NetworkInterface', '*', '`Device` = '.$Device['Id'].' AND `LocalIP` != ""');
45 while($Interface = $DbResult3->fetch_assoc())
46 {
47 $Name = $Device['Name'];
48 if($Interface['Name'] != '') $Name .= '-'.$Interface['Name'];
49 $Name = RouterOSIdent($Name);
50 echo($Name.', ');
51 $NewAddress = new NetworkAddressIPv4();
52 $NewAddress->AddressFromString($Interface['LocalIP']);
53 $NewAddress->Prefix = 32;
54 InsertToAddressTree($AddressTree, $NewAddress, $Name);
55 }
56 }
57
58 $DbResult2 = $Database->select('NetworkSubnet', '*', '`Member`='.$Member['Id']);
59 while($Subnet = $DbResult2->fetch_assoc())
60 {
61 $Subnet['Name'] = RouterOSIdent('subnet-'.$Subnet['Name']);
62 echo($Subnet['Name'].', ');
63 $NewAddress = new NetworkAddressIPv4();
64 $NewAddress->AddressFromString($Subnet['AddressRange']);
65 $NewAddress->Prefix = $Subnet['Mask'];
66 InsertToAddressTree($AddressTree, $NewAddress, $Subnet['Name']);
67 }
68 echo("\n");
69}
70
71ShowSubnetNode($AddressTree);
72
73function ProcessNode($Node)
74{
75 global $InetInterface, $ItemsFirewall;
76
77 foreach($Node['Items'] as $Index => $Item)
78 {
79 if(count($Item['Items']) == 0)
80 {
81 // Hosts
82 $ParentSubnetId = GetSubgroupByRange($Node['Address']->AddressToString().'/'.$Node['Address']->Prefix);
83 $PacketMark = GetMarkByComment($Item['Name'].'-out');
84 $ItemsFirewall[] = array('chain' => 'inet-'.$ParentSubnetId.'-out', 'src-address' => $Item['Address']->AddressToString().'/'.$Item['Address']->Prefix, 'out-interface' => $InetInterface, 'action' => 'mark-packet', 'new-packet-mark' => $PacketMark, 'passthrough' => 'no', 'comment' => $Item['Name'].'-out');
85 $PacketMark = GetMarkByComment($Item['Name'].'-in');
86 $ItemsFirewall[] = array('chain' => 'inet-'.$ParentSubnetId.'-in', 'dst-address' => $Item['Address']->AddressToString().'/'.$Item['Address']->Prefix, 'in-interface' => $InetInterface, 'action' => 'mark-packet', 'new-packet-mark' => $PacketMark, 'passthrough' => 'no', 'comment' => $Item['Name'].'-in');
87 } else
88 {
89 // Subnets
90 $ParentSubnetId = GetSubgroupByRange($Node['Address']->AddressToString().'/'.$Node['Address']->Prefix);
91 $SubnetId = GetSubgroupByRange($Item['Address']->AddressToString().'/'.$Item['Address']->Prefix);
92 $PacketMark = GetMarkByComment($Item['Name'].'-out');
93
94 $ItemsFirewall[] = array('chain' => 'inet-'.$ParentSubnetId.'-out', 'src-address' => $Item['Address']->AddressToString().'/'.$Item['Address']->Prefix, 'out-interface' => $InetInterface, 'action' => 'jump', 'jump-target' => 'inet-'.$SubnetId.'-out', 'comment' => $Item['Name'].'-out');
95 $ItemsFirewall[] = array('chain' => 'inet-'.$ParentSubnetId.'-in', 'dst-address' => $Item['Address']->AddressToString().'/'.$Item['Address']->Prefix, 'in-interface' => $InetInterface, 'action' => 'jump', 'jump-target' => 'inet-'.$SubnetId.'-in', 'comment' => $Item['Name'].'-in');
96
97 ProcessNode($Item);
98 }
99 }
100}
101
102// Generate firewall rules
103$ItemsFirewall = array();
104
105// Root of tree and main limit
106$ItemsFirewall[] = array('chain' => 'forward', 'out-interface' => $InetInterface, 'action' => 'jump', 'jump-target' => 'inet-1-out', 'comment' => 'main-out');
107$ItemsFirewall[] = array('chain' => 'forward', 'in-interface' => $InetInterface, 'action' => 'jump', 'jump-target' => 'inet-1-in', 'comment' => 'main-in');
108
109ProcessNode($AddressTree);
110
111// Slow free internet
112$PacketMark = GetMarkByComment('free-out');
113$ItemsFirewall[] = array('chain' => 'inet-1-out', 'out-interface' => $InetInterface, 'action' => 'mark-packet', 'new-packet-mark' => $PacketMark, 'comment' => 'free-out', 'passthrough' => 'no');
114$PacketMark = GetMarkByComment('free-in');
115$ItemsFirewall[] = array('chain' => 'inet-1-in', 'in-interface' => $InetInterface, 'action' => 'mark-packet', 'new-packet-mark' => $PacketMark, 'comment' => 'free-in', 'passthrough' => 'no');
116
117
118print_r($ItemsFirewall);
119//$Routerboard->ListUpdate($PathFirewall, array('chain', 'dst-address', 'in-interface', 'action', 'new-packet-mark', 'passthrough', 'comment', 'out-interface', 'src-address', 'jump-target'), $ItemsFirewall, array(), true);
120
121?>
Note: See TracBrowser for help on using the repository browser.