Projet

Général

Profil

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

univnautes / usr / local / www / firewall_virtual_ip_edit.php @ 80a261a2

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
$referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/firewall_virtual_ip.php');
57

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

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

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

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

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

    
102
if ($_POST) {
103
	unset($input_errors);
104
	$pconfig = $_POST;
105

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

    
110
	do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
111

    
112
	if ($_POST['subnet'])
113
		$_POST['subnet'] = trim($_POST['subnet']);
114

    
115
	if ($_POST['subnet']) {
116
		if (!is_ipaddr($_POST['subnet']))
117
			$input_errors[] = gettext("A valid IP address must be specified.");
118
		else {
119
			if (isset($id) && isset($a_vip[$id])) {
120
				$ignore_if = $a_vip[$id]['interface'];
121
				$ignore_mode = $a_vip[$id]['mode'];
122
			} else {
123
				$ignore_if = $_POST['interface'];
124
				$ignore_mode = $_POST['mode'];
125
			}
126

    
127
			if ($ignore_mode == 'carp')
128
				$ignore_if .= "_vip{$id}";
129

    
130
			if (is_ipaddr_configured($_POST['subnet'], $ignore_if))
131
				$input_errors[] = gettext("This IP address is being used by another interface or VIP.");
132

    
133
			unset($ignore_if, $ignore_mode);
134
		}
135
	}
136

    
137
	$natiflist = get_configured_interface_with_descr();
138
	foreach ($natiflist as $natif => $natdescr) {
139
		if ($_POST['interface'] == $natif && (empty($config['interfaces'][$natif]['ipaddr']) && empty($config['interfaces'][$natif]['ipaddrv6'])))
140
			$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.");
141
	}
142

    
143
	/* ipalias and carp should not use network or broadcast address */
144
	if ($_POST['mode'] == "ipalias" || $_POST['mode'] == "carp") {
145
		if (is_ipaddrv4($_POST['subnet']) && $_POST['subnet_bits'] != "32") {
146
			$network_addr = gen_subnet($_POST['subnet'], $_POST['subnet_bits']);
147
			$broadcast_addr = gen_subnet_max($_POST['subnet'], $_POST['subnet_bits']);
148
		} else if (is_ipaddrv6($_POST['subnet']) && $_POST['subnet_bits'] != "128" ) {
149
			$network_addr = gen_subnetv6($_POST['subnet'], $_POST['subnet_bits']);
150
			$broadcast_addr = gen_subnetv6_max($_POST['subnet'], $_POST['subnet_bits']);
151
		}
152

    
153
		if (isset($network_addr) && $_POST['subnet'] == $network_addr)
154
			$input_errors[] = gettext("You cannot use the network address for this VIP");
155
		else if (isset($broadcast_addr) && $_POST['subnet'] == $broadcast_addr)
156
			$input_errors[] = gettext("You cannot use the broadcast address for this VIP");
157
	}
158

    
159
	/* make sure new ip is within the subnet of a valid ip
160
	 * on one of our interfaces (wan, lan optX)
161
	 */
162
	if ($_POST['mode'] == 'carp') {
163
		/* verify against reusage of vhids */
164
		$idtracker = 0;
165
		foreach($config['virtualip']['vip'] as $vip) {
166
			if($vip['vhid'] == $_POST['vhid'] && $vip['interface'] == $_POST['interface'] && $idtracker <> $id)
167
				$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']));
168
			$idtracker++;
169
		}
170
		if (empty($_POST['password']))
171
			$input_errors[] = gettext("You must specify a CARP password that is shared between the two VHID members.");
172

    
173
		if (is_ipaddrv4($_POST['subnet'])) {
174
			$parent_ip = get_interface_ip($_POST['interface']);
175
			$parent_sn = get_interface_subnet($_POST['interface']);
176
			$subnet = gen_subnet($parent_ip, $parent_sn);
177
		} else if (is_ipaddrv6($_POST['subnet'])) {
178
			$parent_ip = get_interface_ipv6($_POST['interface']);
179
			$parent_sn = get_interface_subnetv6($_POST['interface']);
180
			$subnet = gen_subnetv6($parent_ip, $parent_sn);
181
		}
182

    
183
		if ($_POST['interface'] == "lo0")
184
			$input_errors[] = gettext("For this type of vip localhost is not allowed.");
185
	} else if ($_POST['mode'] != 'ipalias' && $_POST['interface'] == "lo0")
186
		$input_errors[] = gettext("For this type of vip localhost is not allowed.");
187

    
188
	if (!$input_errors) {
189
		$vipent = array();
190

    
191
		$vipent['mode'] = $_POST['mode'];
192
		$vipent['interface'] = $_POST['interface'];
193

    
194
		/* ProxyARP specific fields */
195
		if ($_POST['mode'] === "proxyarp") {
196
			if ($_POST['type'] == "range") {
197
				$vipent['range']['from'] = $_POST['range_from'];
198
				$vipent['range']['to'] = $_POST['range_to'];
199

    
200
			}
201
			$vipent['noexpand'] = isset($_POST['noexpand']);
202
		}
203

    
204
		/* CARP specific fields */
205
		if ($_POST['mode'] === "carp") {
206
			$vipent['vhid'] = $_POST['vhid'];
207
			$vipent['advskew'] = $_POST['advskew'];
208
			$vipent['advbase'] = $_POST['advbase'];
209
			$vipent['password'] = $_POST['password'];
210
		}
211

    
212
		/* Common fields */
213
		$vipent['descr'] = $_POST['descr'];
214
		if (isset($_POST['type']))
215
			$vipent['type'] = $_POST['type'];
216
		else
217
			$vipent['type'] = "single";
218

    
219
		if ($vipent['type'] == "single" || $vipent['type'] == "network") {
220
			if (!isset($_POST['subnet_bits'])) {
221
				$vipent['subnet_bits'] = "32";
222
			} else {
223
				$vipent['subnet_bits'] = $_POST['subnet_bits'];
224
			}
225
			$vipent['subnet'] = $_POST['subnet'];
226
		}
227

    
228
		if (!isset($id))
229
			$id = count($a_vip);
230
		if (file_exists("{$g['tmp_path']}/.firewall_virtual_ip.apply"))
231
			$toapplylist = unserialize(file_get_contents("{$g['tmp_path']}/.firewall_virtual_ip.apply"));
232
		else
233
			$toapplylist = array();
234

    
235
		$toapplylist[$id] = $a_vip[$id];
236
		if (!empty($a_vip[$id])) {
237
			/* modify all virtual IP rules with this address */
238
			for ($i = 0; isset($config['nat']['rule'][$i]); $i++) {
239
				if ($config['nat']['rule'][$i]['destination']['address'] == $a_vip[$id]['subnet'])
240
					$config['nat']['rule'][$i]['destination']['address'] = $vipent['subnet'];
241
			}
242
		}
243
		$a_vip[$id] = $vipent;
244

    
245
		if (write_config()) {
246
			mark_subsystem_dirty('vip');
247
			file_put_contents("{$g['tmp_path']}/.firewall_virtual_ip.apply", serialize($toapplylist));
248
		}
249
		header("Location: firewall_virtual_ip.php");
250
		exit;
251
	}
252
}
253

    
254
$pgtitle = array(gettext("Firewall"),gettext("Virtual IP Address"),gettext("Edit"));
255
include("head.inc");
256

    
257
?>
258

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

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

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

    
489
              </table>
490
</form>
491
<script type="text/javascript">
492
//<![CDATA[
493
enable_change();
494
//]]>
495
</script>
496
<?php include("fend.inc"); ?>
497
</body>
498
</html>
(81-81/256)