-
Notifications
You must be signed in to change notification settings - Fork 345
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
firewall: T4694: Adding rt ipsec exists/missing match to firewall con…
…figs Work in progress, containing several pieces so far: * Change ipsec match-ipsec/none to match-ipsec-in and match-none-in for fw rules * Updated commit now includes a migration script * Add ipsec match-ipsec-out and match-none-out * Change all the points where the match-ipsec.xml.i include was used before, making sure the new includes (match-ipsec-in/out.xml.i) are used appropriately. There were a handful of spots where match-ipsec.xml.i had snuck back in for output hooked chains already (the common-rule-* includes) * Add the -out generators to rendered templates * Heavy modification to firewall config validators: * I needed to check for ipsec-in matches no matter how deeply nested under an output-hook chain(via jump-target) - nftables will not tolerate this * Ended up retrofitting the jump-targets validator from root chains and for named custom chains. It checks for recursive loops and bad match-ipsec-*. However, it could be improved - it will not detect a cycle between 2 otherwise un-referenced named chains. * I still need to do a lot of manual testing for both fw config variations and the underlying issue with IPsec & DMVPN.
- Loading branch information
Showing
16 changed files
with
188 additions
and
29 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
21 changes: 21 additions & 0 deletions
21
interface-definitions/include/firewall/match-ipsec-in.xml.i
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
<!-- include start from firewall/match-ipsec-in.xml.i --> | ||
<node name="ipsec"> | ||
<properties> | ||
<help>Inbound IPsec packets</help> | ||
</properties> | ||
<children> | ||
<leafNode name="match-ipsec-in"> | ||
<properties> | ||
<help>Inbound traffic that was IPsec encapsulated</help> | ||
<valueless/> | ||
</properties> | ||
</leafNode> | ||
<leafNode name="match-none-in"> | ||
<properties> | ||
<help>Inbound traffic that was not IPsec encapsulated</help> | ||
<valueless/> | ||
</properties> | ||
</leafNode> | ||
</children> | ||
</node> | ||
<!-- include end --> |
21 changes: 21 additions & 0 deletions
21
interface-definitions/include/firewall/match-ipsec-out.xml.i
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
<!-- include start from firewall/match-ipsec-out.xml.i --> | ||
<node name="ipsec"> | ||
<properties> | ||
<help>Outbound IPsec packets</help> | ||
</properties> | ||
<children> | ||
<leafNode name="match-ipsec-out"> | ||
<properties> | ||
<help>Outbound traffic to be IPsec encapsulated</help> | ||
<valueless/> | ||
</properties> | ||
</leafNode> | ||
<leafNode name="match-none-out"> | ||
<properties> | ||
<help>Outbound traffic that will not be IPsec encapsulated</help> | ||
<valueless/> | ||
</properties> | ||
</leafNode> | ||
</children> | ||
</node> | ||
<!-- include end --> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,21 +1,33 @@ | ||
<!-- include start from firewall/match-ipsec.xml.i --> | ||
<node name="ipsec"> | ||
<properties> | ||
<help>Inbound IPsec packets</help> | ||
<help>IPsec encapsulated packets</help> | ||
</properties> | ||
<children> | ||
<leafNode name="match-ipsec"> | ||
<leafNode name="match-ipsec-in"> | ||
<properties> | ||
<help>Inbound IPsec packets</help> | ||
<help>Inbound traffic that was IPsec encapsulated</help> | ||
<valueless/> | ||
</properties> | ||
</leafNode> | ||
<leafNode name="match-none"> | ||
<leafNode name="match-none-in"> | ||
<properties> | ||
<help>Inbound non-IPsec packets</help> | ||
<help>Inbound traffic that was not IPsec encapsulated</help> | ||
<valueless/> | ||
</properties> | ||
</leafNode> | ||
<leafNode name="match-ipsec-out"> | ||
<properties> | ||
<help>Outbound traffic to be IPsec encapsulated</help> | ||
<valueless/> | ||
</properties> | ||
</leafNode> | ||
<leafNode name="match-none-out"> | ||
<properties> | ||
<help>Outbound traffic that will not be IPsec encapsulated</help> | ||
<valueless/> | ||
</properties> | ||
</leafNode> | ||
</children> | ||
</node> | ||
<!-- include end --> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,3 @@ | ||
<!-- include start from include/version/firewall-version.xml.i --> | ||
<syntaxVersion component='firewall' version='16'></syntaxVersion> | ||
<syntaxVersion component='firewall' version='17'></syntaxVersion> | ||
<!-- include end --> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,60 @@ | ||
# Copyright (C) 2024 VyOS maintainers and contributors | ||
# | ||
# This program is free software; you can redistribute it and/or modify | ||
# it under the terms of the GNU General Public License version 2 or later as | ||
# published by the Free Software Foundation. | ||
# | ||
# This program is distributed in the hope that it will be useful, | ||
# but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
# GNU General Public License for more details. | ||
# | ||
# You should have received a copy of the GNU General Public License | ||
# along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
|
||
# | ||
# T4694: Adding rt ipsec exists/missing match to firewall configs. | ||
# This involves a syntax change for IPsec matches, reflecting that different | ||
# nftables expressions are required depending on whether we're matching a | ||
# decrypted packet or a packet that will be encrypted - it's directional. | ||
# The old rules only matched decrypted packets, those matches are now *-in: | ||
# from: set firewall <family> <chainspec> rule <rule#> ipsec match-ipsec|match-none | ||
# to: set firewall <family> <chainspec> rule <rule#> ipsec match-ipsec-in|match-none-in | ||
# | ||
# The <chainspec> positions this match allowed were: | ||
# name (any custom chains), forward filter, input filter, prerouting raw. | ||
# There are positions where it was possible to set, but it would never commit | ||
# (nftables rejects 'meta ipsec' in output hooks), they are not considered here. | ||
# | ||
|
||
import sys | ||
|
||
from vyos.configtree import ConfigTree | ||
|
||
firewall_base = ['firewall'] | ||
|
||
def migrate_chain(config: ConfigTree, path: list[str]) -> None: | ||
for rule_num in config.list_nodes(path + ['rule']): | ||
tmp_path = path + ['rule', rule_num, 'ipsec'] | ||
if config.exists(tmp_path + ['match-ipsec']): | ||
config.delete(tmp_path + ['match-ipsec']) | ||
config.set(tmp_path + ['match-ipsec-in']) | ||
elif config.exists(tmp_path + ['match-none']): | ||
config.delete(tmp_path + ['match-none']) | ||
config.set(tmp_path + ['match-none-in']) | ||
|
||
def migrate(config: ConfigTree) -> None: | ||
if not config.exists(firewall_base): | ||
# Nothing to do | ||
return | ||
|
||
for family in ['ipv4', 'ipv6']: | ||
tmp_path = firewall_base + [family, 'name'] | ||
if config.exists(tmp_path): | ||
for custom_fwname in config.list_nodes(tmp_path): | ||
migrate_chain(config, tmp_path + [custom_fwname]) | ||
|
||
for base_hook in [['forward', 'filter'], ['input', 'filter'], ['prerouting', 'raw']]: | ||
tmp_path = firewall_base + [family] + base_hook | ||
if config.exists(tmp_path): | ||
migrate_chain(config, tmp_path) |