Bug #8686 ยป ipsec_filtermode.diff
| src/etc/inc/filter.inc | ||
|---|---|---|
| 97 | 97 |
* Specify the driver prefix to match (from the left) |
| 98 | 98 |
* https://redmine.pfsense.org/issues/8685 |
| 99 | 99 |
*/ |
| 100 |
global $filter_interface_blacklist; |
|
| 101 |
$filter_interface_blacklist = array("ipsec");
|
|
| 100 |
global $filter_interface_remove; |
|
| 101 |
$filter_interface_remove = array(); |
|
| 102 | ||
| 103 |
if ($config['ipsec']['filtermode'] == 'if_ipsec') {
|
|
| 104 |
$filter_interface_remove[] = 'enc'; |
|
| 105 |
} else {
|
|
| 106 |
$filter_interface_remove[] = 'ipsec'; |
|
| 107 |
} |
|
| 102 | 108 | |
| 103 | 109 |
/* |
| 104 | 110 |
* Fixed tracker values (used to group and track usage in GUI): |
| ... | ... | |
| 4700 | 4706 |
} |
| 4701 | 4707 | |
| 4702 | 4708 |
function filter_get_interface_list() {
|
| 4703 |
global $filter_interface_blacklist;
|
|
| 4709 |
global $filter_interface_remove;
|
|
| 4704 | 4710 |
$iflist = create_interface_list(); |
| 4705 | 4711 |
$filter_ifs = array(); |
| 4706 | 4712 |
foreach ($iflist as $ifent => $ifname) {
|
| 4707 | 4713 |
$realifname = get_real_interface($ifent); |
| 4708 |
foreach ($filter_interface_blacklist as $ifbl) {
|
|
| 4709 |
if (substr($realifname, 0, strlen($ifbl)) == $ifbl) {
|
|
| 4714 |
foreach ($filter_interface_remove as $ifr) {
|
|
| 4715 |
if (substr($realifname, 0, strlen($ifr)) == $ifr) {
|
|
| 4710 | 4716 |
continue 2; |
| 4711 | 4717 |
} |
| 4712 | 4718 |
} |
| src/etc/inc/globals.inc | ||
|---|---|---|
| 160 | 160 |
"net.inet.udp.checksum" => 1, |
| 161 | 161 |
"net.inet.icmp.reply_from_interface" => 1, |
| 162 | 162 |
"net.inet6.ip6.rfc6204w3" => 1, |
| 163 |
"net.enc.out.ipsec_bpf_mask" => "0x0001", |
|
| 164 |
"net.enc.out.ipsec_filter_mask" => "0x0001", |
|
| 165 |
"net.enc.in.ipsec_bpf_mask" => "0x0002", |
|
| 166 |
"net.enc.in.ipsec_filter_mask" => "0x0002", |
|
| 167 | 163 |
"net.key.preferred_oldsa" => "0", |
| 168 | 164 |
"net.inet.carp.senderr_demotion_factor" => 0, /* Do not demote CARP for interface send errors */ |
| 169 | 165 |
"net.pfsync.carp_demotion_factor" => 0, /* Do not demote CARP for pfsync errors */ |
| ... | ... | |
| 322 | 318 |
'hmac-sha384' => 'HMAC-SHA384', |
| 323 | 319 |
'hmac-sha512' => 'HMAC-SHA512 (most secure)'); |
| 324 | 320 | |
| 321 |
global $ipsec_filtermodes; |
|
| 322 |
$ipsec_filtermodes = array( |
|
| 323 |
'enc' => 'Filter IPsec Tunnel and VTI on IPsec tab (enc0)', |
|
| 324 |
'if_ipsec' => 'Filter IPsec VTI on assigned interfaces, block all tunnel mode traffic' |
|
| 325 |
); |
|
| 326 | ||
| 327 |
global $ipsec_filter_sysctl; |
|
| 328 |
$ipsec_filter_sysctl = array( |
|
| 329 |
'enc' => array( |
|
| 330 |
"net.inet.ipsec.filtertunnel" => "0x0000", |
|
| 331 |
"net.inet6.ipsec6.filtertunnel" => "0x0000", |
|
| 332 |
"net.enc.out.ipsec_bpf_mask" => "0x0001", |
|
| 333 |
"net.enc.out.ipsec_filter_mask" => "0x0001", |
|
| 334 |
"net.enc.in.ipsec_bpf_mask" => "0x0002", |
|
| 335 |
"net.enc.in.ipsec_filter_mask" => "0x0002" |
|
| 336 |
), |
|
| 337 |
'if_ipsec' => array( |
|
| 338 |
"net.inet.ipsec.filtertunnel" => "0x0001", |
|
| 339 |
"net.inet6.ipsec6.filtertunnel" => "0x0001", |
|
| 340 |
"net.enc.out.ipsec_bpf_mask" => "0x0000", |
|
| 341 |
"net.enc.out.ipsec_filter_mask" => "0x0000", |
|
| 342 |
"net.enc.in.ipsec_bpf_mask" => "0x0000", |
|
| 343 |
"net.enc.in.ipsec_filter_mask" => "0x0000" |
|
| 344 |
), |
|
| 345 |
); |
|
| 346 | ||
| 325 | 347 |
?> |
| src/etc/inc/system.inc | ||
|---|---|---|
| 102 | 102 |
} |
| 103 | 103 | |
| 104 | 104 |
function activate_sysctls() {
|
| 105 |
global $config, $g, $sysctls; |
|
| 105 |
global $config, $g, $sysctls, $ipsec_filter_sysctl; |
|
| 106 | ||
| 107 |
if (!is_array($sysctls)) {
|
|
| 108 |
$sysctls = array(); |
|
| 109 |
} |
|
| 110 | ||
| 111 |
$ipsec_filtermode = empty($config['ipsec']['filtermode']) ? 'enc' : $config['ipsec']['filtermode']; |
|
| 112 |
$sysctls = array_merge($sysctls, $ipsec_filter_sysctl[$ipsec_filtermode]); |
|
| 106 | 113 | |
| 107 | 114 |
if (is_array($config['sysctl']) && is_array($config['sysctl']['item'])) {
|
| 108 | 115 |
foreach ($config['sysctl']['item'] as $tunable) {
|
| src/usr/local/www/vpn_ipsec_settings.php | ||
|---|---|---|
| 35 | 35 |
require_once("ipsec.inc");
|
| 36 | 36 |
require_once("vpn.inc");
|
| 37 | 37 | |
| 38 |
global $ipsec_filtermodes; |
|
| 39 | ||
| 38 | 40 |
$pconfig['logging'] = ipsec_get_loglevels(); |
| 39 | 41 |
$pconfig['unityplugin'] = isset($config['ipsec']['unityplugin']); |
| 40 | 42 |
$pconfig['strictcrlpolicy'] = isset($config['ipsec']['strictcrlpolicy']); |
| ... | ... | |
| 47 | 49 |
$pconfig['maxmss_enable'] = isset($config['system']['maxmss_enable']); |
| 48 | 50 |
$pconfig['maxmss'] = $config['system']['maxmss']; |
| 49 | 51 |
$pconfig['uniqueids'] = $config['ipsec']['uniqueids']; |
| 52 |
$pconfig['filtermode'] = $config['ipsec']['filtermode']; |
|
| 50 | 53 |
$pconfig['ipsecbypass'] = isset($config['ipsec']['ipsecbypass']); |
| 51 | 54 |
$pconfig['bypassrules'] = $config['ipsec']['bypassrules']; |
| 52 | 55 |
$pconfig['port'] = $config['ipsec']['port']; |
| ... | ... | |
| 238 | 241 |
unset($config['ipsec']['uniqueids']); |
| 239 | 242 |
} |
| 240 | 243 | |
| 244 |
if (!empty($_POST['filtermode'])) {
|
|
| 245 |
$config['ipsec']['filtermode'] = $_POST['filtermode']; |
|
| 246 |
} else if (isset($config['ipsec']['filtermode'])) {
|
|
| 247 |
unset($config['ipsec']['filtermode']); |
|
| 248 |
} |
|
| 249 | ||
| 241 | 250 |
if ($_POST['maxmss_enable'] == "yes") {
|
| 242 | 251 |
$config['system']['maxmss_enable'] = true; |
| 243 | 252 |
$config['system']['maxmss'] = $_POST['maxmss']; |
| ... | ... | |
| 277 | 286 |
$retval |= filter_configure(); |
| 278 | 287 | |
| 279 | 288 |
ipsec_configure($needsrestart); |
| 289 |
system_setup_sysctl(); |
|
| 290 |
clear_subsystem_dirty('sysctl');
|
|
| 280 | 291 |
} |
| 281 | 292 | |
| 282 | 293 |
// The logic value sent by $_POST for autoexcludelanaddress is opposite to |
| ... | ... | |
| 370 | 381 |
'<b>', '</b>' |
| 371 | 382 |
); |
| 372 | 383 | |
| 384 |
$section->addInput(new Form_Select( |
|
| 385 |
'filtermode', |
|
| 386 |
'IPsec Filter Mode', |
|
| 387 |
$pconfig['filtermode'], |
|
| 388 |
$ipsec_filtermodes |
|
| 389 |
))->setHelp( |
|
| 390 |
'Experimental. Controls how the firewall will filter IPsec traffic. By default, rules on ' . |
|
| 391 |
'the IPsec tab filter all IPsec traffic, including both tunnel mode and VTI mode. %3$s' . |
|
| 392 |
'This is limited in that it does not allow for filtering on assigned VTI interfaces, and it does not ' . |
|
| 393 |
'support features such as NAT rules and reply-to for return routing. ' . |
|
| 394 |
'When set to filter on assigned VTI interfaces, %1$sall tunnel mode traffic is blocked%2$s. ' . |
|
| 395 |
'Do not set this option unless %1$sall%2$s IPsec tunnels are using VTI.', |
|
| 396 |
'<b>', '</b>', '<br />' |
|
| 397 |
); |
|
| 398 | ||
| 373 | 399 |
$section->addInput(new Form_Checkbox( |
| 374 | 400 |
'compression', |
| 375 | 401 |
'IP Compression', |