Projet

Général

Profil

Télécharger (21 ko) Statistiques
| Branche: | Tag: | Révision:

univnautes / usr / local / www / firewall_virtual_ip_edit.php @ 4665dbdd

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
				if (isset($a_vip[$id]['vhid']))
123
					$ignore_vhid = $a_vip[$id]['vhid'];
124
			} else {
125
				$ignore_if = $_POST['interface'];
126
				$ignore_mode = $_POST['mode'];
127
			}
128

    
129
			if (!isset($ignore_vhid))
130
				$ignore_vhid = $_POST['vhid'];
131

    
132
			if ($ignore_mode == 'carp')
133
				$ignore_if .= "_vip{$ignore_vhid}";
134
			else
135
				$ignore_if .= "_virtualip{$id}";
136

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

    
140
			unset($ignore_if, $ignore_mode);
141
		}
142
	}
143

    
144
	$natiflist = get_configured_interface_with_descr();
145
	foreach ($natiflist as $natif => $natdescr) {
146
		if ($_POST['interface'] == $natif && (empty($config['interfaces'][$natif]['ipaddr']) && empty($config['interfaces'][$natif]['ipaddrv6'])))
147
			$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.");
148
	}
149

    
150
	/* ipalias and carp should not use network or broadcast address */
151
	if ($_POST['mode'] == "ipalias" || $_POST['mode'] == "carp") {
152
		if (is_ipaddrv4($_POST['subnet']) && $_POST['subnet_bits'] != "32") {
153
			$network_addr = gen_subnet($_POST['subnet'], $_POST['subnet_bits']);
154
			$broadcast_addr = gen_subnet_max($_POST['subnet'], $_POST['subnet_bits']);
155
		} else if (is_ipaddrv6($_POST['subnet']) && $_POST['subnet_bits'] != "128" ) {
156
			$network_addr = gen_subnetv6($_POST['subnet'], $_POST['subnet_bits']);
157
			$broadcast_addr = gen_subnetv6_max($_POST['subnet'], $_POST['subnet_bits']);
158
		}
159

    
160
		if (isset($network_addr) && $_POST['subnet'] == $network_addr)
161
			$input_errors[] = gettext("You cannot use the network address for this VIP");
162
		else if (isset($broadcast_addr) && $_POST['subnet'] == $broadcast_addr)
163
			$input_errors[] = gettext("You cannot use the broadcast address for this VIP");
164
	}
165

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

    
180
		if (is_ipaddrv4($_POST['subnet'])) {
181
			$parent_ip = get_interface_ip($_POST['interface']);
182
			$parent_sn = get_interface_subnet($_POST['interface']);
183
			$subnet = gen_subnet($parent_ip, $parent_sn);
184
		} else if (is_ipaddrv6($_POST['subnet'])) {
185
			$parent_ip = get_interface_ipv6($_POST['interface']);
186
			$parent_sn = get_interface_subnetv6($_POST['interface']);
187
			$subnet = gen_subnetv6($parent_ip, $parent_sn);
188
		}
189

    
190
		if (isset($parent_ip) && !ip_in_subnet($_POST['subnet'], "{$subnet}/{$parent_sn}") && !ip_in_interface_alias_subnet($_POST['interface'], $_POST['subnet'])) {
191
			$cannot_find = $_POST['subnet'] . "/" . $_POST['subnet_bits'] ;
192
			$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);
193
		}
194

    
195
		if ($_POST['interface'] == "lo0")
196
			$input_errors[] = gettext("For this type of vip localhost is not allowed.");
197
	} else if ($_POST['mode'] != 'ipalias' && $_POST['interface'] == "lo0")
198
		$input_errors[] = gettext("For this type of vip localhost is not allowed.");
199

    
200
	if (!$input_errors) {
201
		$vipent = array();
202

    
203
		$vipent['mode'] = $_POST['mode'];
204
		$vipent['interface'] = $_POST['interface'];
205

    
206
		/* ProxyARP specific fields */
207
		if ($_POST['mode'] === "proxyarp") {
208
			if ($_POST['type'] == "range") {
209
				$vipent['range']['from'] = $_POST['range_from'];
210
				$vipent['range']['to'] = $_POST['range_to'];
211

    
212
			}
213
			$vipent['noexpand'] = isset($_POST['noexpand']);
214
		}
215

    
216
		/* CARP specific fields */
217
		if ($_POST['mode'] === "carp") {
218
			$vipent['vhid'] = $_POST['vhid'];
219
			$vipent['advskew'] = $_POST['advskew'];
220
			$vipent['advbase'] = $_POST['advbase'];
221
			$vipent['password'] = $_POST['password'];
222
		}
223

    
224
		/* Common fields */
225
		$vipent['descr'] = $_POST['descr'];
226
		if (isset($_POST['type']))
227
			$vipent['type'] = $_POST['type'];
228
		else
229
			$vipent['type'] = "single";
230

    
231
		if ($vipent['type'] == "single" || $vipent['type'] == "network") {
232
			if (!isset($_POST['subnet_bits'])) {
233
				$vipent['subnet_bits'] = "32";
234
			} else {
235
				$vipent['subnet_bits'] = $_POST['subnet_bits'];
236
			}
237
			$vipent['subnet'] = $_POST['subnet'];
238
		}
239

    
240
		if (!isset($id))
241
			$id = count($a_vip);
242
		if (file_exists("{$g['tmp_path']}/.firewall_virtual_ip.apply"))
243
			$toapplylist = unserialize(file_get_contents("{$g['tmp_path']}/.firewall_virtual_ip.apply"));
244
		else
245
			$toapplylist = array();
246

    
247
		$toapplylist[$id] = $a_vip[$id];
248
		if (!empty($a_vip[$id])) {
249
			/* modify all virtual IP rules with this address */
250
			for ($i = 0; isset($config['nat']['rule'][$i]); $i++) {
251
				if ($config['nat']['rule'][$i]['destination']['address'] == $a_vip[$id]['subnet'])
252
					$config['nat']['rule'][$i]['destination']['address'] = $vipent['subnet'];
253
			}
254
		}
255
		$a_vip[$id] = $vipent;
256

    
257
		if (write_config()) {
258
			mark_subsystem_dirty('vip');
259
			file_put_contents("{$g['tmp_path']}/.firewall_virtual_ip.apply", serialize($toapplylist));
260
		}
261
		header("Location: firewall_virtual_ip.php");
262
		exit;
263
	}
264
}
265

    
266
$pgtitle = array(gettext("Firewall"),gettext("Virtual IP Address"),gettext("Edit"));
267
include("head.inc");
268

    
269
?>
270

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

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

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

    
501
              </table>
502
</form>
503
<script type="text/javascript">
504
//<![CDATA[
505
enable_change();
506
//]]>
507
</script>
508
<?php include("fend.inc"); ?>
509
</body>
510
</html>
(81-81/256)