Projet

Général

Profil

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

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

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 {
117
			if (isset($id) && isset($a_vip[$id])) {
118
				$ignore_if = $a_vip[$id]['interface'];
119
				$ignore_mode = $a_vip[$id]['mode'];
120
			} else {
121
				$ignore_if = $_POST['interface'];
122
				$ignore_mode = $_POST['mode'];
123
			}
124

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

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

    
131
			unset($ignore_if, $ignore_mode);
132
		}
133
	}
134

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

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

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

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

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

    
181
		if (isset($parent_ip) && !ip_in_subnet($_POST['subnet'], "{$subnet}/{$parent_sn}") && !ip_in_interface_alias_subnet($_POST['interface'], $_POST['subnet'])) {
182
			$cannot_find = $_POST['subnet'] . "/" . $_POST['subnet_bits'] ;
183
			$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);
184
		}
185

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

    
191
	if (!$input_errors) {
192
		$vipent = array();
193

    
194
		$vipent['mode'] = $_POST['mode'];
195
		$vipent['interface'] = $_POST['interface'];
196

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

    
203
			}
204
			$vipent['noexpand'] = isset($_POST['noexpand']);
205
		}
206

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

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

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

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

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

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

    
257
$pgtitle = array(gettext("Firewall"),gettext("Virtual IP Address"),gettext("Edit"));
258
include("head.inc");
259

    
260
?>
261

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

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

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

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