Projet

Général

Profil

Télécharger (20,3 ko) Statistiques
| Branche: | Tag: | Révision:

univnautes / usr / local / www / firewall_virtual_ip_edit.php @ ffcfd9fb

1
<?php
2
/* $Id$ */
3
/*
4

    
5
    firewall_virtual_ip_edit.php
6
    part of pfSense (https://www.pfsense.org/)
7

    
8
    Copyright (C) 2005 Bill Marquette <bill.marquette@gmail.com>.
9
    All rights reserved.
10

    
11
    Includes code from m0n0wall which is:
12
    Copyright (C) 2003-2005 Manuel Kasper <mk@neon1.net>.
13
    All rights reserved.
14

    
15
    Includes code from pfSense which is:
16
    Copyright (C) 2004-2005 Scott Ullrich <geekgod@pfsense.com>.
17
    All rights reserved.
18

    
19
    Redistribution and use in source and binary forms, with or without
20
    modification, are permitted provided that the following conditions are met:
21

    
22
    1. Redistributions of source code must retain the above copyright notice,
23
       this list of conditions and the following disclaimer.
24

    
25
    2. Redistributions in binary form must reproduce the above copyright
26
       notice, this list of conditions and the following disclaimer in the
27
       documentation and/or other materials provided with the distribution.
28

    
29
    THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
30
    INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
31
    AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
32
    AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
33
    OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
34
    SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
35
    INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
36
    CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
37
    ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
38
    POSSIBILITY OF SUCH DAMAGE.
39
*/
40
/*
41
	pfSense_BUILDER_BINARIES:	/sbin/ifconfig
42
	pfSense_MODULE:	interfaces
43
*/
44

    
45
##|+PRIV
46
##|*IDENT=page-firewall-virtualipaddress-edit
47
##|*NAME=Firewall: Virtual IP Address: Edit page
48
##|*DESCR=Allow access to the 'Firewall: Virtual IP Address: Edit' page.
49
##|*MATCH=firewall_virtual_ip_edit.php*
50
##|-PRIV
51

    
52
require("guiconfig.inc");
53
require_once("filter.inc");
54
require("shaper.inc");
55

    
56
if (!is_array($config['virtualip']['vip'])) {
57
        $config['virtualip']['vip'] = array();
58
}
59
$a_vip = &$config['virtualip']['vip'];
60

    
61
if (is_numericint($_GET['id']))
62
	$id = $_GET['id'];
63
if (isset($_POST['id']) && is_numericint($_POST['id']))
64
	$id = $_POST['id'];
65

    
66
function return_first_two_octets($ip) {
67
	$ip_split = explode(".", $ip);
68
	return $ip_split[0] . "." . $ip_split[1];
69
}
70

    
71
function find_last_used_vhid() {
72
	global $config, $g;
73
	$vhid = 0;
74
	foreach($config['virtualip']['vip'] as $vip) {
75
		if($vip['vhid'] > $vhid) 
76
			$vhid = $vip['vhid'];
77
	}
78
	return $vhid;
79
}
80

    
81
if (isset($id) && $a_vip[$id]) {
82
	$pconfig['mode'] = $a_vip[$id]['mode'];
83
	$pconfig['vhid'] = $a_vip[$id]['vhid'];
84
	$pconfig['advskew'] = $a_vip[$id]['advskew'];
85
	$pconfig['advbase'] = $a_vip[$id]['advbase'];
86
	$pconfig['password'] = $a_vip[$id]['password'];
87
	$pconfig['range'] = $a_vip[$id]['range'];
88
	$pconfig['subnet'] = $a_vip[$id]['subnet'];
89
	$pconfig['subnet_bits'] = $a_vip[$id]['subnet_bits'];
90
	$pconfig['noexpand'] = $a_vip[$id]['noexpand'];
91
	$pconfig['descr'] = $a_vip[$id]['descr'];
92
	$pconfig['type'] = $a_vip[$id]['type'];
93
	$pconfig['interface'] = $a_vip[$id]['interface'];
94
} else {
95
	$lastvhid = find_last_used_vhid();
96
	$lastvhid++;
97
	$pconfig['vhid'] = $lastvhid;
98
}
99

    
100
if ($_POST) {
101
	unset($input_errors);
102
	$pconfig = $_POST;
103

    
104
	/* input validation */
105
	$reqdfields = explode(" ", "mode");
106
	$reqdfieldsn = array(gettext("Type"));
107

    
108
	do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
109

    
110
	if ($_POST['subnet'])
111
		$_POST['subnet'] = trim($_POST['subnet']);
112

    
113
	if ($_POST['subnet']) {
114
		if (!is_ipaddr($_POST['subnet']))
115
			$input_errors[] = gettext("A valid IP address must be specified.");
116
		else if (is_ipaddr_configured($_POST['subnet'], "{$_POST['interface']}_vip{$id}"))
117
			$input_errors[] = gettext("This IP address is being used by another interface or VIP.");
118
	}
119

    
120
	$natiflist = get_configured_interface_with_descr();
121
	foreach ($natiflist as $natif => $natdescr) {
122
		if ($_POST['interface'] == $natif && (empty($config['interfaces'][$natif]['ipaddr']) && empty($config['interfaces'][$natif]['ipaddrv6'])))
123
			$input_errors[] = gettext("The interface chosen for the VIP has no IPv4 or IPv6 address configured so it cannot be used as a parent for the VIP.");
124
	}
125

    
126
	/* ipalias and carp should not use network or broadcast address */
127
	if ($_POST['mode'] == "ipalias" || $_POST['mode'] == "carp") {
128
		if (is_ipaddrv4($_POST['subnet']) && $_POST['subnet_bits'] != "32") {
129
			$network_addr = gen_subnet($_POST['subnet'], $_POST['subnet_bits']);
130
			$broadcast_addr = gen_subnet_max($_POST['subnet'], $_POST['subnet_bits']);
131
		} else if (is_ipaddrv6($_POST['subnet']) && $_POST['subnet_bits'] != "128" ) {
132
			$network_addr = gen_subnetv6($_POST['subnet'], $_POST['subnet_bits']);
133
			$broadcast_addr = gen_subnetv6_max($_POST['subnet'], $_POST['subnet_bits']);
134
		}
135

    
136
		if (isset($network_addr) && $_POST['subnet'] == $network_addr)
137
			$input_errors[] = gettext("You cannot use the network address for this VIP");
138
		else if (isset($broadcast_addr) && $_POST['subnet'] == $broadcast_addr)
139
			$input_errors[] = gettext("You cannot use the broadcast address for this VIP");
140
	}
141

    
142
	/* make sure new ip is within the subnet of a valid ip
143
	 * on one of our interfaces (wan, lan optX)
144
	 */
145
	switch ($_POST['mode']) {
146
	case "carp":
147
		/* verify against reusage of vhids */
148
		$idtracker = 0;
149
		foreach($config['virtualip']['vip'] as $vip) {
150
			if($vip['vhid'] == $_POST['vhid'] && $vip['interface'] == $_POST['interface'] && $idtracker <> $id)
151
				$input_errors[] = sprintf(gettext("VHID %s is already in use on interface %s. Pick a unique number on this interface."),$_POST['vhid'], convert_friendly_interface_to_friendly_descr($_POST['interface']));
152
			$idtracker++;
153
		}
154
		if (empty($_POST['password']))
155
			$input_errors[] = gettext("You must specify a CARP password that is shared between the two VHID members.");
156

    
157
		if (is_ipaddrv4($_POST['subnet'])) {
158
			$parent_ip = get_interface_ip($_POST['interface']);
159
			$parent_sn = get_interface_subnet($_POST['interface']);
160
			$subnet = gen_subnet($parent_ip, $parent_sn);
161
		} else if (is_ipaddrv6($_POST['subnet'])) {
162
			$parent_ip = get_interface_ipv6($_POST['interface']);
163
			$parent_sn = get_interface_subnetv6($_POST['interface']);
164
			$subnet = gen_subnetv6($parent_ip, $parent_sn);
165
		}
166

    
167
		if (isset($parent_ip) && !ip_in_subnet($_POST['subnet'], "{$subnet}/{$parent_sn}") && !ip_in_interface_alias_subnet($_POST['interface'], $_POST['subnet'])) {
168
			$cannot_find = $_POST['subnet'] . "/" . $_POST['subnet_bits'] ;
169
			$input_errors[] = sprintf(gettext("Sorry, we could not locate an interface with a matching subnet for %s.  Please add an IP alias in this subnet on this interface."),$cannot_find);
170
		}
171

    
172
		if ($_POST['interface'] == "lo0")
173
			$input_errors[] = gettext("For this type of vip localhost is not allowed.");
174
		break;
175
	default:
176
		if ($_POST['interface'] == "lo0")
177
			$input_errors[] = gettext("For this type of vip localhost is not allowed.");
178
		break;
179
	}
180

    
181
	if (!$input_errors) {
182
		$vipent = array();
183

    
184
		$vipent['mode'] = $_POST['mode'];
185
		$vipent['interface'] = $_POST['interface'];
186

    
187
		/* ProxyARP specific fields */
188
		if ($_POST['mode'] === "proxyarp") {
189
			if ($_POST['type'] == "range") {
190
				$vipent['range']['from'] = $_POST['range_from'];
191
				$vipent['range']['to'] = $_POST['range_to'];
192

    
193
			}
194
			$vipent['noexpand'] = isset($_POST['noexpand']);
195
		}
196

    
197
		/* CARP specific fields */
198
		if ($_POST['mode'] === "carp") {
199
			$vipent['vhid'] = $_POST['vhid'];
200
			$vipent['advskew'] = $_POST['advskew'];
201
			$vipent['advbase'] = $_POST['advbase'];
202
			$vipent['password'] = $_POST['password'];
203
		}
204

    
205
		/* Common fields */
206
		$vipent['descr'] = $_POST['descr'];
207
		if (isset($_POST['type']))
208
			$vipent['type'] = $_POST['type'];
209
		else
210
			$vipent['type'] = "single";
211

    
212
		if ($vipent['type'] == "single" || $vipent['type'] == "network") {
213
			if (!isset($_POST['subnet_bits'])) {
214
				$vipent['subnet_bits'] = "32";
215
			} else {
216
				$vipent['subnet_bits'] = $_POST['subnet_bits'];
217
			}
218
			$vipent['subnet'] = $_POST['subnet'];
219
		}
220

    
221
		if (!isset($id))
222
			$id = count($a_vip);
223
		if (file_exists("{$g['tmp_path']}/.firewall_virtual_ip.apply"))
224
			$toapplylist = unserialize(file_get_contents("{$g['tmp_path']}/.firewall_virtual_ip.apply"));
225
		else
226
			$toapplylist = array();
227

    
228
		$toapplylist[$id] = $a_vip[$id];
229
		if (!empty($a_vip[$id])) {
230
			/* modify all virtual IP rules with this address */
231
			for ($i = 0; isset($config['nat']['rule'][$i]); $i++) {
232
				if ($config['nat']['rule'][$i]['destination']['address'] == $a_vip[$id]['subnet'])
233
					$config['nat']['rule'][$i]['destination']['address'] = $vipent['subnet'];
234
			}
235
		}
236
		$a_vip[$id] = $vipent;
237

    
238
		if (write_config()) {
239
			mark_subsystem_dirty('vip');
240
			file_put_contents("{$g['tmp_path']}/.firewall_virtual_ip.apply", serialize($toapplylist));
241
		}
242
		header("Location: firewall_virtual_ip.php");
243
		exit;
244
	}
245
}
246

    
247
$pgtitle = array(gettext("Firewall"),gettext("Virtual IP Address"),gettext("Edit"));
248
include("head.inc");
249

    
250
?>
251

    
252
<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
253
<script type="text/javascript" src="/javascript/jquery.ipv4v6ify.js"></script>
254
<?php include("fbegin.inc"); ?>
255
<script type="text/javascript">
256
//<![CDATA[
257
function get_radio_value(obj)
258
{
259
        for (i = 0; i < obj.length; i++) {
260
                if (obj[i].checked)
261
                        return obj[i].value;
262
        }
263
        return null;
264
}
265
function set_note(noteMessage){
266
	var note = document.getElementById("typenote");
267
	if (note.firstChild != null)
268
		note.removeChild(note.firstChild);
269
	if (noteMessage)
270
		note.appendChild(noteMessage);
271
}
272
function enable_change() {
273
	var carpnote     = document.createTextNode("<?=gettext("This must be the network's subnet mask. It does not specify a CIDR range.");?>");
274
	var proxyarpnote = document.createTextNode("<?=gettext("This is a CIDR block of proxy ARP addresses.");?>");
275
	var ipaliasnote  = document.createTextNode("<?=gettext("This must be the network's subnet mask. It does not specify a CIDR range.");?>");
276
	
277
	$mode = get_radio_value(document.iform.mode);
278
	
279
	document.iform.password.disabled = $mode != "carp";
280
	document.iform.vhid.disabled     = $mode != "carp";
281
	document.iform.advskew.disabled  = $mode != "carp";
282
	document.iform.advbase.disabled  = $mode != "carp";
283
	document.iform.type.disabled     = $mode in {"carp":1,"ipalias":1};
284
	
285
	if ($mode in {"carp":1,"ipalias":1})
286
		document.iform.type.selectedIndex = 0;// single-adress
287
	switch($mode)
288
	{
289
		case "carp"    : set_note(carpnote);		break;
290
		case "ipalias" : set_note(ipaliasnote);		break;
291
		case "proxyarp": set_note(proxyarpnote);	break;
292
		default: set_note(undefined);
293
	}
294
	typesel_change();
295
}
296

    
297
function typesel_change() {
298
	switch (document.iform.type.selectedIndex) {
299
	case 0: // single
300
		document.iform.subnet.disabled = 0;
301
		document.iform.subnet_bits.disabled = (get_radio_value(document.iform.mode) == "proxyarp") || (get_radio_value(document.iform.mode) == "other");
302
		document.iform.noexpand.disabled = 1;
303
		jQuery('#noexpandrow').css('display','none');
304
		break;
305
	case 1: // network
306
		document.iform.subnet.disabled = 0;
307
		document.iform.subnet_bits.disabled = 0;
308
		document.iform.noexpand.disabled = 0;
309
		jQuery('#noexpandrow').css('display','');
310
		//document.iform.range_from.disabled = 1;
311
		//document.iform.range_to.disabled = 1;
312
		break;
313
	case 2: // range
314
		document.iform.subnet.disabled = 1;
315
		document.iform.subnet_bits.disabled = 1;
316
		document.iform.noexpand.disabled = 1;
317
		jQuery('#noexpandrow').css('display','none');
318
		//document.iform.range_from.disabled = 0;
319
		//document.iform.range_to.disabled = 0;
320
		break;
321
	case 3: // IP alias
322
		document.iform.subnet.disabled = 1;
323
		document.iform.subnet_bits.disabled = 0;
324
		document.iform.noexpand.disabled = 1;
325
		jQuery('#noexpandrow').css('display','none');
326
		//document.iform.range_from.disabled = 0;
327
		//document.iform.range_to.disabled = 0;
328
		break;
329
	}
330
}
331
//]]>
332
</script>
333

    
334
<?php if ($input_errors) print_input_errors($input_errors); ?>
335
            <form action="firewall_virtual_ip_edit.php" method="post" name="iform" id="iform">
336
              <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="virtual IP edit">
337
				<tr>
338
					<td colspan="2" valign="top" class="listtopic"><?=gettext("Edit Virtual IP");?></td>
339
				</tr>	
340
                <tr>
341
		  		  <td width="22%" valign="top" class="vncellreq"><?=gettext("Type");?></td>
342
                  <td width="78%" class="vtable">
343
					<input name="mode" type="radio" onclick="enable_change()" value="ipalias"
344
					<?php if ($pconfig['mode'] == "ipalias") echo "checked=\"checked\"";?> /> <?=gettext("IP Alias");?>
345
					<input name="mode" type="radio" onclick="enable_change()" value="carp"
346
					<?php if ($pconfig['mode'] == "carp") echo "checked=\"checked\"";?> /> <?=gettext("CARP"); ?>
347
                    <input name="mode" type="radio" onclick="enable_change()" value="proxyarp"
348
					<?php if ($pconfig['mode'] == "proxyarp") echo "checked=\"checked\"";?> /> <?=gettext("Proxy ARP"); ?>
349
					<input name="mode" type="radio" onclick="enable_change()" value="other"
350
					<?php if ($pconfig['mode'] == "other") echo "checked=\"checked\"";?> /> <?=gettext("Other");?>
351
				  </td>
352
				</tr>
353
				<tr>
354
				  <td width="22%" valign="top" class="vncellreq"><?=gettext("Interface");?></td>
355
				  <td width="78%" class="vtable">
356
					<select name="interface" class="formselect">
357
					<?php 
358
					$interfaces = get_configured_interface_with_descr(false, true);
359
					$interfaces['lo0'] = "Localhost";
360
					foreach ($interfaces as $iface => $ifacename): ?>
361
						<option value="<?=$iface;?>" <?php if ($iface == $pconfig['interface']) echo "selected=\"selected\""; ?>>
362
						<?=htmlspecialchars($ifacename);?>
363
						</option>
364
					  <?php endforeach; ?>
365
					</select>
366
				  </td>
367
                </tr>
368
                <tr>
369
                  <td valign="top" class="vncellreq"><?=gettext("IP Address(es)");?></td>
370
                  <td class="vtable">
371
                    <table border="0" cellspacing="0" cellpadding="0" summary="ip addresses">
372
                      <tr>
373
                        <td><?=gettext("Type:");?>&nbsp;&nbsp;</td>
374
                        <td><select name="type" class="formselect" onchange="typesel_change()">
375
                            <option value="single" <?php if ((!$pconfig['range'] && $pconfig['subnet_bits'] == 32) || (!isset($pconfig['subnet']))) echo "selected=\"selected\""; ?>>
376
                            <?=gettext("Single address");?></option>
377
                            <option value="network" <?php if (!$pconfig['range'] && $pconfig['subnet_bits'] != 32 && isset($pconfig['subnet'])) echo "selected=\"selected\""; ?>>
378
                            <?=gettext("Network");?></option>
379
                            <!-- XXX: Billm, don't let anyone choose this until NAT configuration screens are ready for it <option value="range" <?php if ($pconfig['range']) echo "selected=\"selected\""; ?>>
380
                            Range</option> -->
381
                          </select></td>
382
                      </tr>
383
                      <tr>
384
                        <td><?=gettext("Address:");?>&nbsp;&nbsp;</td>
385
                        <td><input name="subnet" type="text" class="formfld unknown ipv4v6" id="subnet" size="28" value="<?=htmlspecialchars($pconfig['subnet']);?>" />
386
                          /<select name="subnet_bits" class="formselect ipv4v6" id="select">
387
                            <?php for ($i = 128; $i >= 1; $i--): ?>
388
                            <option value="<?=$i;?>" <?php if ($i == $pconfig['subnet_bits']) echo "selected=\"selected\""; ?>>
389
                            <?=$i;?>
390
                      </option>
391
                            <?php endfor; ?>
392
                      </select> <i id="typenote"></i>
393
 						</td>
394
                      </tr>
395
                      <tr id="noexpandrow">
396
                        <td><?=gettext("Expansion:");?>&nbsp;&nbsp;</td>
397
                        <td><input name="noexpand" type="checkbox" class="formfld unknown" id="noexpand" <?php echo (isset($pconfig['noexpand'])) ? "checked=\"checked\"" : "" ; ?> />
398
                        	Disable expansion of this entry into IPs on NAT lists (e.g. 192.168.1.0/24 expands to 256 entries.)
399
                        	</td>
400
                      </tr>
401
		      <?php
402
		      /*
403
                        <tr>
404
                         <td>Range:&nbsp;&nbsp;</td>
405
                          <td><input name="range_from" type="text" class="formfld unknown" id="range_from" size="28" value="<?=htmlspecialchars($pconfig['range']['from']);?>" />
406
-
407
                          <input name="range_to" type="text" class="formfld unknown" id="range_to" size="28" value="<?=htmlspecialchars($pconfig['range']['to']);?>" />
408
                          </td>
409
			 </tr>
410
  		       */
411
			?>
412
                    </table>
413
                  </td>
414
                </tr>
415
				<tr valign="top">
416
				  <td width="22%" class="vncellreq"><?=gettext("Virtual IP Password");?></td>
417
				  <td class="vtable"><input type='password'  name='password' value="<?=htmlspecialchars($pconfig['password']);?>" />
418
					<br /><?=gettext("Enter the VHID group password.");?>
419
				  </td>
420
				</tr>
421
				<tr valign="top">
422
				  <td width="22%" class="vncellreq"><?=gettext("VHID Group");?></td>
423
				  <td class="vtable"><select id='vhid' name='vhid'>
424
                            <?php for ($i = 1; $i <= 255; $i++): ?>
425
                            <option value="<?=$i;?>" <?php if ($i == $pconfig['vhid']) echo "selected=\"selected\""; ?>>
426
                            <?=$i;?>
427
                      </option>
428
                            <?php endfor; ?>
429
                      </select>
430
					<br /><?=gettext("Enter the VHID group that the machines will share");?>
431
				  </td>
432
				</tr>
433
				<tr valign="top">
434
				  <td width="22%" class="vncellreq"><?=gettext("Advertising Frequency");?></td>
435
				  <td class="vtable">
436
					 Base: <select id='advbase' name='advbase'>
437
                            <?php for ($i = 1; $i <= 254; $i++): ?>
438
                            	<option value="<?=$i;?>" <?php if ($i == $pconfig['advbase']) echo "selected=\"selected\""; ?>>
439
                            <?=$i;?>
440
                      			</option>
441
                            <?php endfor; ?>
442
                      		</select>
443
					Skew: <select id='advskew' name='advskew'>
444
                            <?php for ($i = 0; $i <= 254; $i++): ?>
445
                            	<option value="<?=$i;?>" <?php if ($i == $pconfig['advskew']) echo "selected=\"selected\""; ?>>
446
                            <?=$i;?>
447
                      			</option>
448
                            <?php endfor; ?>
449
                      		</select>
450
				<br /><br />
451
				<?=gettext("The frequency that this machine will advertise.  0 means usually master. Otherwise the lowest combination of both values in the cluster determines the master.");?>
452
				  </td>
453
				</tr>
454
                <tr>
455
                  <td width="22%" valign="top" class="vncell"><?=gettext("Description");?></td>
456
                  <td width="78%" class="vtable">
457
                    <input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" />
458
                    <br /> <span class="vexpl"><?=gettext("You may enter a description here for your reference (not parsed).");?></span></td>
459
                </tr>
460
                <tr>
461
                  <td width="22%" valign="top">&nbsp;</td>
462
                  <td width="78%">
463
                    <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" /> <input type="button" class="formbtn" value="<?=gettext("Cancel"); ?>" onclick="history.back()" />
464
                    <?php if (isset($id) && $a_vip[$id]): ?>
465
                    <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
466
                    <?php endif; ?>
467
                  </td>
468
                </tr>
469
				<tr>
470
				  <td colspan="4">
471
				      	<span class="vexpl">
472
				      		<span class="red">
473
							<b><?=gettext("Note:");?><br /></b>
474
				      		</span>&nbsp;&nbsp;
475
				      		<?=gettext("Proxy ARP and Other type Virtual IPs cannot be bound to by anything running on the firewall, such as IPsec, OpenVPN, etc.  Use a CARP or IP Alias type address for these cases.");?>
476
				      		<br /><br />&nbsp;&nbsp;&nbsp;<?=gettext("For more information on CARP and the above values, visit the OpenBSD ");?><a href='http://www.openbsd.org/faq/pf/carp.html'> <?=gettext("CARP FAQ"); ?></a>.
477
						</span>
478
				  </td>
479
				</tr>
480

    
481
              </table>
482
</form>
483
<script type="text/javascript">
484
//<![CDATA[
485
enable_change();
486
//]]>
487
</script>
488
<?php include("fend.inc"); ?>
489
</body>
490
</html>
(79-79/254)