modules: shorewall: Add an mgmt module for managing shorewall
This is not perfect, but it's a good start, and it shows how a module might be structured.
This commit is contained in:
11
modules/shorewall/files/interfaces
Normal file
11
modules/shorewall/files/interfaces
Normal file
@@ -0,0 +1,11 @@
|
||||
#
|
||||
# Shorewall -- /etc/shorewall/interfaces
|
||||
#
|
||||
# For information about entries in this file, type "man shorewall-interfaces"
|
||||
#
|
||||
# The manpage is also online at
|
||||
# https://shorewall.org/manpages/shorewall-interfaces.html
|
||||
#
|
||||
?FORMAT 2
|
||||
###############################################################################
|
||||
#ZONE INTERFACE OPTIONS
|
||||
10
modules/shorewall/files/interfaces.frag.tmpl
Normal file
10
modules/shorewall/files/interfaces.frag.tmpl
Normal file
@@ -0,0 +1,10 @@
|
||||
{{/*
|
||||
###############################################################################
|
||||
#ZONE INTERFACE OPTIONS
|
||||
*/ -}}
|
||||
{{ if .comment -}}
|
||||
#
|
||||
# {{ .comment }}
|
||||
#
|
||||
{{ end -}}
|
||||
{{ .zone }} {{ .interface }} physical={{ .physical }}{{ if .options }},{{ golang_strings_join .options "," }}{{ end }}
|
||||
10
modules/shorewall/files/policy
Normal file
10
modules/shorewall/files/policy
Normal file
@@ -0,0 +1,10 @@
|
||||
#
|
||||
# Shorewall -- /etc/shorewall/policy
|
||||
#
|
||||
# For information about entries in this file, type "man shorewall-policy"
|
||||
#
|
||||
# The manpage is also online at
|
||||
# https://shorewall.org/manpages/shorewall-policy.html
|
||||
#
|
||||
###############################################################################
|
||||
#SOURCE DEST POLICY LOGLEVEL RATE CONNLIMIT
|
||||
10
modules/shorewall/files/policy.frag.tmpl
Normal file
10
modules/shorewall/files/policy.frag.tmpl
Normal file
@@ -0,0 +1,10 @@
|
||||
{{/*
|
||||
###############################################################################
|
||||
#SOURCE DEST POLICY LOGLEVEL RATE CONNLIMIT
|
||||
*/ -}}
|
||||
{{ if .comment -}}
|
||||
#
|
||||
# {{ .comment }}
|
||||
#
|
||||
{{ end -}}
|
||||
{{ .source }} {{ .dest }} {{ .policy }}{{ if .log_level }} $LOG_LEVEL{{ end }}
|
||||
17
modules/shorewall/files/rules
Normal file
17
modules/shorewall/files/rules
Normal file
@@ -0,0 +1,17 @@
|
||||
#
|
||||
# Shorewall -- /etc/shorewall/rules
|
||||
#
|
||||
# For information on the settings in this file, type "man shorewall-rules"
|
||||
#
|
||||
# The manpage is also online at
|
||||
# https://shorewall.org/manpages/shorewall-rules.html
|
||||
#
|
||||
##############################################################################################################################################################
|
||||
#ACTION SOURCE DEST PROTO DPORT SPORT ORIGDEST RATE USER MARK CONNLIMIT TIME HEADERS SWITCH HELPER
|
||||
|
||||
?SECTION ALL
|
||||
?SECTION ESTABLISHED
|
||||
?SECTION RELATED
|
||||
?SECTION INVALID
|
||||
?SECTION UNTRACKED
|
||||
?SECTION NEW
|
||||
12
modules/shorewall/files/rules.frag.tmpl
Normal file
12
modules/shorewall/files/rules.frag.tmpl
Normal file
@@ -0,0 +1,12 @@
|
||||
{{/*
|
||||
##############################################################################################################################################################
|
||||
#ACTION SOURCE DEST PROTO DPORT SPORT ORIGDEST RATE USER MARK CONNLIMIT TIME HEADERS SWITCH HELPER
|
||||
*/ -}}
|
||||
{{ if .comment -}}
|
||||
#
|
||||
# {{ .comment }}
|
||||
#
|
||||
{{ end -}}
|
||||
{{ if .rule -}}
|
||||
{{ .rule }}
|
||||
{{ end -}}
|
||||
300
modules/shorewall/files/shorewall.conf.tmpl
Normal file
300
modules/shorewall/files/shorewall.conf.tmpl
Normal file
@@ -0,0 +1,300 @@
|
||||
###############################################################################
|
||||
#
|
||||
# Shorewall Version 5 -- /etc/shorewall/shorewall.conf
|
||||
#
|
||||
# For information about the settings in this file, type "man shorewall.conf"
|
||||
#
|
||||
# Manpage also online at https://shorewall.org/manpages/shorewall.conf.html
|
||||
###############################################################################
|
||||
# S T A R T U P E N A B L E D
|
||||
###############################################################################
|
||||
|
||||
STARTUP_ENABLED=Yes
|
||||
|
||||
###############################################################################
|
||||
# V E R B O S I T Y
|
||||
###############################################################################
|
||||
|
||||
VERBOSITY=1
|
||||
|
||||
###############################################################################
|
||||
# P A G E R
|
||||
###############################################################################
|
||||
|
||||
PAGER=
|
||||
|
||||
###############################################################################
|
||||
# F I R E W A L L
|
||||
###############################################################################
|
||||
|
||||
FIREWALL=
|
||||
|
||||
###############################################################################
|
||||
# L O G G I N G
|
||||
###############################################################################
|
||||
|
||||
LOG_LEVEL="info"
|
||||
|
||||
BLACKLIST_LOG_LEVEL=
|
||||
|
||||
INVALID_LOG_LEVEL=
|
||||
|
||||
LOG_BACKEND=
|
||||
|
||||
LOG_MARTIANS=Yes
|
||||
|
||||
LOG_VERBOSITY=2
|
||||
|
||||
LOG_ZONE=Both
|
||||
|
||||
LOGALLNEW=
|
||||
|
||||
LOGFILE=/var/log/messages
|
||||
|
||||
LOGFORMAT="%s %s "
|
||||
|
||||
LOGTAGONLY=No
|
||||
|
||||
LOGLIMIT="s:1/sec:10"
|
||||
|
||||
MACLIST_LOG_LEVEL="$LOG_LEVEL"
|
||||
|
||||
RELATED_LOG_LEVEL=
|
||||
|
||||
RPFILTER_LOG_LEVEL="$LOG_LEVEL"
|
||||
|
||||
SFILTER_LOG_LEVEL="$LOG_LEVEL"
|
||||
|
||||
SMURF_LOG_LEVEL="$LOG_LEVEL"
|
||||
|
||||
STARTUP_LOG=/var/log/shorewall-init.log
|
||||
|
||||
TCP_FLAGS_LOG_LEVEL="$LOG_LEVEL"
|
||||
|
||||
UNTRACKED_LOG_LEVEL=
|
||||
|
||||
###############################################################################
|
||||
# L O C A T I O N O F F I L E S A N D D I R E C T O R I E S
|
||||
###############################################################################
|
||||
|
||||
ARPTABLES=
|
||||
|
||||
CONFIG_PATH=":${CONFDIR}/shorewall:${SHAREDIR}/shorewall"
|
||||
|
||||
GEOIPDIR=/usr/share/xt_geoip/LE
|
||||
|
||||
IPTABLES=
|
||||
|
||||
IP=
|
||||
|
||||
IPSET=
|
||||
|
||||
LOCKFILE=
|
||||
|
||||
MODULESDIR=
|
||||
|
||||
NFACCT=
|
||||
|
||||
PATH="/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/usr/local/sbin"
|
||||
|
||||
PERL=/usr/bin/perl
|
||||
|
||||
RESTOREFILE=restore
|
||||
|
||||
SHOREWALL_SHELL=/bin/sh
|
||||
|
||||
SUBSYSLOCK=/var/lock/subsys/shorewall
|
||||
|
||||
TC=
|
||||
|
||||
###############################################################################
|
||||
# D E F A U L T A C T I O N S / M A C R O S
|
||||
###############################################################################
|
||||
|
||||
ACCEPT_DEFAULT="none"
|
||||
BLACKLIST_DEFAULT="Broadcast(DROP),Multicast(DROP),dropNotSyn:$LOG_LEVEL,dropInvalid:$LOG_LEVEL,DropDNSrep:$LOG_LEVEL"
|
||||
DROP_DEFAULT="Broadcast(DROP),Multicast(DROP)"
|
||||
NFQUEUE_DEFAULT="none"
|
||||
QUEUE_DEFAULT="none"
|
||||
REJECT_DEFAULT="Broadcast(DROP),Multicast(DROP)"
|
||||
|
||||
###############################################################################
|
||||
# R S H / R C P C O M M A N D S
|
||||
###############################################################################
|
||||
|
||||
RCP_COMMAND='scp ${files} ${root}@${system}:${destination}'
|
||||
RSH_COMMAND='ssh ${root}@${system} ${command}'
|
||||
|
||||
###############################################################################
|
||||
# F I R E W A L L O P T I O N S
|
||||
###############################################################################
|
||||
|
||||
ACCOUNTING=Yes
|
||||
|
||||
ACCOUNTING_TABLE=filter
|
||||
|
||||
ADD_IP_ALIASES=No
|
||||
|
||||
ADD_SNAT_ALIASES=No
|
||||
|
||||
ADMINISABSENTMINDED=Yes
|
||||
|
||||
AUTOCOMMENT=Yes
|
||||
|
||||
AUTOHELPERS=Yes
|
||||
|
||||
AUTOMAKE=Yes
|
||||
|
||||
BALANCE_PROVIDERS=No
|
||||
|
||||
BASIC_FILTERS=No
|
||||
|
||||
BLACKLIST="NEW,INVALID,UNTRACKED"
|
||||
|
||||
CLAMPMSS=No
|
||||
|
||||
CLEAR_TC=Yes
|
||||
|
||||
COMPLETE=No
|
||||
|
||||
DEFER_DNS_RESOLUTION=Yes
|
||||
|
||||
DELETE_THEN_ADD=Yes
|
||||
|
||||
DETECT_DNAT_IPADDRS=No
|
||||
|
||||
DISABLE_IPV6=No
|
||||
|
||||
DOCKER=No
|
||||
|
||||
DOCKER_BRIDGE=docker0
|
||||
|
||||
DONT_LOAD=
|
||||
|
||||
DYNAMIC_BLACKLIST=Yes
|
||||
|
||||
EXPAND_POLICIES=Yes
|
||||
|
||||
EXPORTMODULES=Yes
|
||||
|
||||
FASTACCEPT=No
|
||||
|
||||
FORWARD_CLEAR_MARK=
|
||||
|
||||
HELPERS=
|
||||
|
||||
IGNOREUNKNOWNVARIABLES=No
|
||||
|
||||
IMPLICIT_CONTINUE=No
|
||||
|
||||
IPSET_WARNINGS=Yes
|
||||
|
||||
IP_FORWARDING=Keep
|
||||
|
||||
KEEP_RT_TABLES=No
|
||||
|
||||
MACLIST_TABLE=filter
|
||||
|
||||
MACLIST_TTL=
|
||||
|
||||
MANGLE_ENABLED=Yes
|
||||
|
||||
MARK_IN_FORWARD_CHAIN=No
|
||||
|
||||
MINIUPNPD=No
|
||||
|
||||
MULTICAST=No
|
||||
|
||||
MUTEX_TIMEOUT=60
|
||||
|
||||
NULL_ROUTE_RFC1918=No
|
||||
|
||||
OPTIMIZE=All
|
||||
|
||||
OPTIMIZE_ACCOUNTING=No
|
||||
|
||||
PERL_HASH_SEED=0
|
||||
|
||||
REJECT_ACTION=
|
||||
|
||||
RENAME_COMBINED=Yes
|
||||
|
||||
REQUIRE_INTERFACE=No
|
||||
|
||||
RESTART=restart
|
||||
|
||||
RESTORE_DEFAULT_ROUTE=Yes
|
||||
|
||||
RESTORE_ROUTEMARKS=Yes
|
||||
|
||||
RETAIN_ALIASES=No
|
||||
|
||||
ROUTE_FILTER=No
|
||||
|
||||
SAVE_ARPTABLES=No
|
||||
|
||||
SAVE_IPSETS=No
|
||||
|
||||
TC_ENABLED=Internal
|
||||
|
||||
TC_EXPERT=No
|
||||
|
||||
TC_PRIOMAP="2 3 3 3 2 3 1 1 2 2 2 2 2 2 2 2"
|
||||
|
||||
TRACK_PROVIDERS=Yes
|
||||
|
||||
TRACK_RULES=No
|
||||
|
||||
USE_DEFAULT_RT=Yes
|
||||
|
||||
USE_NFLOG_SIZE=No
|
||||
|
||||
USE_PHYSICAL_NAMES=No
|
||||
|
||||
USE_RT_NAMES=No
|
||||
|
||||
VERBOSE_MESSAGES=Yes
|
||||
|
||||
WARNOLDCAPVERSION=Yes
|
||||
|
||||
WORKAROUNDS=No
|
||||
|
||||
ZERO_MARKS=No
|
||||
|
||||
ZONE2ZONE=-
|
||||
|
||||
###############################################################################
|
||||
# P A C K E T D I S P O S I T I O N
|
||||
###############################################################################
|
||||
|
||||
BLACKLIST_DISPOSITION=DROP
|
||||
|
||||
INVALID_DISPOSITION=CONTINUE
|
||||
|
||||
MACLIST_DISPOSITION=REJECT
|
||||
|
||||
RELATED_DISPOSITION=ACCEPT
|
||||
|
||||
RPFILTER_DISPOSITION=DROP
|
||||
|
||||
SMURF_DISPOSITION=DROP
|
||||
|
||||
SFILTER_DISPOSITION=DROP
|
||||
|
||||
TCP_FLAGS_DISPOSITION=DROP
|
||||
|
||||
UNTRACKED_DISPOSITION=CONTINUE
|
||||
|
||||
################################################################################
|
||||
# P A C K E T M A R K L A Y O U T
|
||||
################################################################################
|
||||
|
||||
TC_BITS=
|
||||
|
||||
PROVIDER_BITS=
|
||||
|
||||
PROVIDER_OFFSET=
|
||||
|
||||
MASK_BITS=
|
||||
|
||||
ZONE_BITS=0
|
||||
10
modules/shorewall/files/snat
Normal file
10
modules/shorewall/files/snat
Normal file
@@ -0,0 +1,10 @@
|
||||
#
|
||||
# Shorewall -- /etc/shorewall/snat
|
||||
#
|
||||
# For information about entries in this file, type "man shorewall-snat"
|
||||
#
|
||||
# See https://shorewall.org/manpages/shorewall-snat.html for more information
|
||||
#
|
||||
?FORMAT 2
|
||||
###################################################################################################################################################
|
||||
#ACTION SOURCE DEST PROTO DPORT SPORT IPSEC MARK USER SWITCH ORIGDEST PROBABILITY
|
||||
10
modules/shorewall/files/snat.frag.tmpl
Normal file
10
modules/shorewall/files/snat.frag.tmpl
Normal file
@@ -0,0 +1,10 @@
|
||||
{{/*
|
||||
###################################################################################################################################################
|
||||
#ACTION SOURCE DEST PROTO DPORT SPORT IPSEC MARK USER SWITCH ORIGDEST PROBABILITY
|
||||
*/ -}}
|
||||
{{ if .comment -}}
|
||||
#
|
||||
# {{ .comment }}
|
||||
#
|
||||
{{ end -}}
|
||||
{{ .action }} {{ .source }} {{ .dest }}
|
||||
12
modules/shorewall/files/stoppedrule.frag.tmpl
Normal file
12
modules/shorewall/files/stoppedrule.frag.tmpl
Normal file
@@ -0,0 +1,12 @@
|
||||
{{/*
|
||||
###############################################################################
|
||||
#ACTION SOURCE DEST PROTO DPORT SPORT
|
||||
*/ -}}
|
||||
{{ if .comment -}}
|
||||
#
|
||||
# {{ .comment }}
|
||||
#
|
||||
{{ end -}}
|
||||
{{ if .rule -}}
|
||||
{{ .rule }}
|
||||
{{ end -}}
|
||||
13
modules/shorewall/files/stoppedrules
Normal file
13
modules/shorewall/files/stoppedrules
Normal file
@@ -0,0 +1,13 @@
|
||||
#
|
||||
# Shorewall -- /etc/shorewall/stoppedrules
|
||||
#
|
||||
# For information about entries in this file, type "man shorewall-stoppedrules"
|
||||
#
|
||||
# The manpage is also online at
|
||||
# https://shorewall.org/manpages/shorewall-stoppedrules.html
|
||||
#
|
||||
# See https://shorewall.org/starting_and_stopping_shorewall.htm for additional
|
||||
# information.
|
||||
#
|
||||
###############################################################################
|
||||
#ACTION SOURCE DEST PROTO DPORT SPORT
|
||||
10
modules/shorewall/files/zones
Normal file
10
modules/shorewall/files/zones
Normal file
@@ -0,0 +1,10 @@
|
||||
#
|
||||
# Shorewall -- /etc/shorewall/zones
|
||||
#
|
||||
# For information about this file, type "man shorewall-zones"
|
||||
#
|
||||
# The manpage is also online at
|
||||
# https://shorewall.org/manpages/shorewall-zones.html
|
||||
#
|
||||
###############################################################################
|
||||
#ZONE TYPE OPTIONS IN_OPTIONS OUT_OPTIONS
|
||||
10
modules/shorewall/files/zones.frag.tmpl
Normal file
10
modules/shorewall/files/zones.frag.tmpl
Normal file
@@ -0,0 +1,10 @@
|
||||
{{/*
|
||||
###############################################################################
|
||||
#ZONE TYPE OPTIONS IN_OPTIONS OUT_OPTIONS
|
||||
*/ -}}
|
||||
{{ if .comment -}}
|
||||
#
|
||||
# {{ .comment }}
|
||||
#
|
||||
{{ end -}}
|
||||
{{ .name }} {{ .type }}
|
||||
529
modules/shorewall/main.mcl
Normal file
529
modules/shorewall/main.mcl
Normal file
@@ -0,0 +1,529 @@
|
||||
# Mgmt
|
||||
# Copyright (C) 2013-2024+ James Shubin and the project contributors
|
||||
# Written by James Shubin <james@shubin.ca> and the project contributors
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# 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 <https://www.gnu.org/licenses/>.
|
||||
#
|
||||
# Additional permission under GNU GPL version 3 section 7
|
||||
#
|
||||
# If you modify this program, or any covered work, by linking or combining it
|
||||
# with embedded mcl code and modules (and that the embedded mcl code and
|
||||
# modules which link with this program, contain a copy of their source code in
|
||||
# the authoritative form) containing parts covered by the terms of any other
|
||||
# license, the licensors of this program grant you additional permission to
|
||||
# convey the resulting work. Furthermore, the licensors of this program grant
|
||||
# the original author, James Shubin, additional permission to update this
|
||||
# additional permission if he deems it necessary to achieve the goals of this
|
||||
# additional permission.
|
||||
|
||||
import "deploy"
|
||||
import "fmt"
|
||||
import "golang"
|
||||
import "local"
|
||||
import "golang/strings"
|
||||
|
||||
# XXX: The templates need a padding function to line up columns.
|
||||
class firewall() {
|
||||
pkg "shorewall" {
|
||||
state => "installed",
|
||||
|
||||
Before => File["/etc/shorewall/"],
|
||||
}
|
||||
|
||||
file "/etc/shorewall/" {
|
||||
state => $const.res.file.state.exists,
|
||||
recurse => true,
|
||||
purge => true,
|
||||
owner => "root",
|
||||
group => "root",
|
||||
mode => "u=rwx,go=", # dir
|
||||
}
|
||||
|
||||
file "/etc/shorewall/shorewall.conf" {
|
||||
state => $const.res.file.state.exists,
|
||||
content => golang.template(deploy.readfile("/files/shorewall.conf.tmpl")),
|
||||
owner => "root",
|
||||
group => "root",
|
||||
mode => "u=rw,go=",
|
||||
|
||||
Notify => Svc["shorewall"],
|
||||
}
|
||||
|
||||
svc "shorewall" {
|
||||
state => "running",
|
||||
startup => "enabled",
|
||||
}
|
||||
|
||||
$vardir = local.vardir("shorewall/")
|
||||
|
||||
# Add the default fw zone.
|
||||
include zone("fw", struct{
|
||||
type => "firewall",
|
||||
})
|
||||
|
||||
include params_base # TODO: Do we need the base file present?
|
||||
}
|
||||
|
||||
class firewall:zone_base() {
|
||||
file "${vardir}zones.d/" {
|
||||
state => $const.res.file.state.exists,
|
||||
recurse => true,
|
||||
purge => true,
|
||||
owner => "root",
|
||||
group => "root",
|
||||
mode => "u=rwx,go=", # dir
|
||||
}
|
||||
|
||||
file "${vardir}zones.header" {
|
||||
state => $const.res.file.state.exists,
|
||||
content => deploy.readfile("/files/zones"), # static, no template!
|
||||
owner => "root",
|
||||
group => "root",
|
||||
mode => "u=rw,go=",
|
||||
}
|
||||
|
||||
file "/etc/shorewall/zones" {
|
||||
state => $const.res.file.state.exists,
|
||||
fragments => [
|
||||
"${vardir}zones.header", # also pull this one file
|
||||
"${vardir}zones.d/", # pull from this dir
|
||||
],
|
||||
owner => "root",
|
||||
group => "root",
|
||||
mode => "u=rw,go=",
|
||||
|
||||
Notify => Svc["shorewall"],
|
||||
}
|
||||
}
|
||||
|
||||
# NOTE: the firewall type is added automatically by this module
|
||||
class firewall:zone($name, $st) {
|
||||
print "zone: ${name}" {}
|
||||
# XXX: document why this is named zone_base instead of base:zone_base or
|
||||
# change the compiler to use the second version?
|
||||
include zone_base
|
||||
|
||||
$type = $st->type || "ipv4"
|
||||
#$options = [] # TODO: add option validation?
|
||||
$comment = $st->comment || ""
|
||||
|
||||
# TODO: Test type is valid from:
|
||||
#$valid_types = [
|
||||
# "bport",
|
||||
# "bport4",
|
||||
# "bport6",
|
||||
# "firewall",
|
||||
# "ip",
|
||||
# "ipsec",
|
||||
# "ipsec4",
|
||||
# "ipsec6",
|
||||
# "ipv4",
|
||||
# "ipv6",
|
||||
# "local"
|
||||
# "loopback"
|
||||
# "vserver",
|
||||
#]
|
||||
|
||||
$tmpl = struct{
|
||||
name => "${name}",
|
||||
type => "${type}",
|
||||
comment => "${comment}",
|
||||
}
|
||||
file "${vardir}zones.d/${name}.zone" {
|
||||
state => $const.res.file.state.exists,
|
||||
content => golang.template(deploy.readfile("/files/zones.frag.tmpl"), $tmpl),
|
||||
owner => "root",
|
||||
group => "root",
|
||||
mode => "u=rw,go=",
|
||||
}
|
||||
}
|
||||
|
||||
class firewall:interface_base() {
|
||||
file "${vardir}interfaces.d/" {
|
||||
state => $const.res.file.state.exists,
|
||||
recurse => true,
|
||||
purge => true,
|
||||
owner => "root",
|
||||
group => "root",
|
||||
mode => "u=rwx,go=", # dir
|
||||
}
|
||||
|
||||
file "${vardir}interfaces.header" {
|
||||
state => $const.res.file.state.exists,
|
||||
content => deploy.readfile("/files/interfaces"), # static, no template!
|
||||
owner => "root",
|
||||
group => "root",
|
||||
mode => "u=rw,go=",
|
||||
}
|
||||
|
||||
file "/etc/shorewall/interfaces" {
|
||||
state => $const.res.file.state.exists,
|
||||
fragments => [
|
||||
"${vardir}interfaces.header", # also pull this one file
|
||||
"${vardir}interfaces.d/", # pull from this dir
|
||||
],
|
||||
owner => "root",
|
||||
group => "root",
|
||||
mode => "u=rw,go=",
|
||||
|
||||
Notify => Svc["shorewall"],
|
||||
}
|
||||
}
|
||||
|
||||
class firewall:interface($name, $zone, $st) {
|
||||
print "interface: ${name}" {}
|
||||
include interface_base
|
||||
|
||||
$interface = $st->interface || (strings.to_upper($zone) + "_IF") # eg: NET_IF
|
||||
$physical = $st->physical || $name
|
||||
$options []str = $st->options || [] # TODO: add option validation?
|
||||
$comment = $st->comment || ""
|
||||
|
||||
$tmpl = struct{
|
||||
zone => "${zone}",
|
||||
interface => "${interface}",
|
||||
physical => "${physical}",
|
||||
options => $options,
|
||||
comment => "${comment}",
|
||||
}
|
||||
file "${vardir}interfaces.d/${name}.interface" {
|
||||
state => $const.res.file.state.exists,
|
||||
content => golang.template(deploy.readfile("/files/interfaces.frag.tmpl"), $tmpl),
|
||||
owner => "root",
|
||||
group => "root",
|
||||
mode => "u=rw,go=",
|
||||
}
|
||||
}
|
||||
|
||||
class firewall:policy_base() {
|
||||
file "${vardir}policy.d/" {
|
||||
state => $const.res.file.state.exists,
|
||||
recurse => true,
|
||||
purge => true,
|
||||
owner => "root",
|
||||
group => "root",
|
||||
mode => "u=rwx,go=", # dir
|
||||
}
|
||||
|
||||
file "${vardir}policy.header" {
|
||||
state => $const.res.file.state.exists,
|
||||
content => deploy.readfile("/files/policy"), # static, no template!
|
||||
owner => "root",
|
||||
group => "root",
|
||||
mode => "u=rw,go=",
|
||||
}
|
||||
|
||||
file "/etc/shorewall/policy" {
|
||||
state => $const.res.file.state.exists,
|
||||
fragments => [
|
||||
"${vardir}policy.header", # also pull this one file
|
||||
"${vardir}policy.d/", # pull from this dir
|
||||
],
|
||||
owner => "root",
|
||||
group => "root",
|
||||
mode => "u=rw,go=",
|
||||
|
||||
Notify => Svc["shorewall"],
|
||||
}
|
||||
}
|
||||
|
||||
class firewall:policy($name, $st) {
|
||||
print "policy: ${name}" {}
|
||||
include policy_base
|
||||
|
||||
$source = $st->source
|
||||
$dest = $st->dest
|
||||
$policy = $st->policy
|
||||
$log = $st->log || false
|
||||
$comment = $st->comment || ""
|
||||
|
||||
$tmpl = struct{
|
||||
source => "${source}",
|
||||
dest => "${dest}",
|
||||
policy => "${policy}",
|
||||
log_level => $log,
|
||||
comment => "${comment}",
|
||||
}
|
||||
file "${vardir}policy.d/${name}.policy" {
|
||||
state => $const.res.file.state.exists,
|
||||
content => golang.template(deploy.readfile("/files/policy.frag.tmpl"), $tmpl),
|
||||
owner => "root",
|
||||
group => "root",
|
||||
mode => "u=rw,go=",
|
||||
}
|
||||
}
|
||||
|
||||
class firewall:rule_base() {
|
||||
file "${vardir}rules.d/" {
|
||||
state => $const.res.file.state.exists,
|
||||
recurse => true,
|
||||
purge => true,
|
||||
owner => "root",
|
||||
group => "root",
|
||||
mode => "u=rwx,go=", # dir
|
||||
}
|
||||
|
||||
file "${vardir}rules.header" {
|
||||
state => $const.res.file.state.exists,
|
||||
content => deploy.readfile("/files/rules"), # static, no template!
|
||||
owner => "root",
|
||||
group => "root",
|
||||
mode => "u=rw,go=",
|
||||
}
|
||||
|
||||
file "/etc/shorewall/rules" {
|
||||
state => $const.res.file.state.exists,
|
||||
fragments => [
|
||||
"${vardir}rules.header", # also pull this one file
|
||||
"${vardir}rules.d/", # pull from this dir
|
||||
],
|
||||
owner => "root",
|
||||
group => "root",
|
||||
mode => "u=rw,go=",
|
||||
|
||||
Notify => Svc["shorewall"],
|
||||
}
|
||||
}
|
||||
|
||||
class firewall:rule($name, $st) {
|
||||
print "rule: ${name}" {}
|
||||
include rule_base
|
||||
|
||||
$rule = $st->rule || "" # entire rule contents OR use the below values
|
||||
|
||||
$action = $st->action # REJECT or SSH(ACCEPT) or Ping(DROP)
|
||||
$source = $st->source # source zone
|
||||
$source_ips []str = $st->source_ips || []
|
||||
$dest = $st->dest || "" # dest zone
|
||||
$dest_ips []str = $st->dest_ips || []
|
||||
$proto = $st->proto || "" # protocol
|
||||
# TODO: port doesn't support ranges atm
|
||||
$port = $st->port || 0
|
||||
#$sport = $st->sport || 0 # TODO
|
||||
#$original = $st->original || [] # TODO
|
||||
$comment = $st->comment || ""
|
||||
|
||||
$source_ips_joined = strings.join($source_ips, ",")
|
||||
$valid_source = if $source_ips_joined == "" {
|
||||
"${source}"
|
||||
} else {
|
||||
"${source}:${source_ips_joined}"
|
||||
}
|
||||
|
||||
$dest_ips_joined = strings.join($dest_ips, ",")
|
||||
$valid_dest = if $dest_ips_joined == "" {
|
||||
"${dest}"
|
||||
} else {
|
||||
"${dest}:${dest_ips_joined}"
|
||||
}
|
||||
|
||||
$valid_proto = if $proto == "" {
|
||||
"-"
|
||||
} else {
|
||||
"${proto}"
|
||||
}
|
||||
|
||||
# TODO: type switch here if we ever support doing that
|
||||
$valid_port = if $port == 0 {
|
||||
"-"
|
||||
} else {
|
||||
fmt.printf("%d", $port)
|
||||
}
|
||||
|
||||
# TODO: tabs for beautifying, replace with a padding function eventually.
|
||||
$full_rule = if $proto == "" and $port == 0 {
|
||||
"${action}\t${valid_source}\t\t${valid_dest}"
|
||||
} else {
|
||||
"${action}\t${valid_source}\t\t${valid_dest}\t\t${valid_proto}\t${valid_port}"
|
||||
}
|
||||
|
||||
$valid_rule = if $rule == "" {
|
||||
$full_rule
|
||||
} else {
|
||||
$rule
|
||||
}
|
||||
|
||||
$tmpl = struct{
|
||||
rule => "${valid_rule}",
|
||||
comment => "${comment}",
|
||||
}
|
||||
file "${vardir}rules.d/${name}.rule" {
|
||||
state => $const.res.file.state.exists,
|
||||
content => golang.template(deploy.readfile("/files/rules.frag.tmpl"), $tmpl),
|
||||
owner => "root",
|
||||
group => "root",
|
||||
mode => "u=rw,go=",
|
||||
}
|
||||
}
|
||||
|
||||
class firewall:stoppedrule_base() {
|
||||
file "${vardir}stoppedrules.d/" {
|
||||
state => $const.res.file.state.exists,
|
||||
recurse => true,
|
||||
purge => true,
|
||||
owner => "root",
|
||||
group => "root",
|
||||
mode => "u=rwx,go=", # dir
|
||||
}
|
||||
|
||||
file "${vardir}stoppedrules.header" {
|
||||
state => $const.res.file.state.exists,
|
||||
content => deploy.readfile("/files/stoppedrules"), # static, no template!
|
||||
owner => "root",
|
||||
group => "root",
|
||||
mode => "u=rw,go=",
|
||||
}
|
||||
|
||||
file "/etc/shorewall/stoppedrules" {
|
||||
state => $const.res.file.state.exists,
|
||||
fragments => [
|
||||
"${vardir}stoppedrules.header", # also pull this one file
|
||||
"${vardir}stoppedrules.d/", # pull from this dir
|
||||
],
|
||||
owner => "root",
|
||||
group => "root",
|
||||
mode => "u=rw,go=",
|
||||
|
||||
Notify => Svc["shorewall"],
|
||||
}
|
||||
}
|
||||
|
||||
class firewall:stoppedrule($name, $st) {
|
||||
print "stoppedrule: ${name}" {}
|
||||
include stoppedrule_base
|
||||
|
||||
$rule = $st->rule || "" # entire rule contents OR use the below values
|
||||
|
||||
$action = $st->action # REJECT or SSH(ACCEPT) or Ping(DROP)
|
||||
$source = $st->source # source zone
|
||||
$dest = $st->dest # dest zone
|
||||
|
||||
$comment = $st->comment || ""
|
||||
|
||||
# TODO: tabs for beautifying, replace with a padding function eventually.
|
||||
$valid_rule = if $rule == "" {
|
||||
"${action}\t${source}\t\t${dest}"
|
||||
} else {
|
||||
$rule
|
||||
}
|
||||
|
||||
$tmpl = struct{
|
||||
rule => "${valid_rule}",
|
||||
comment => "${comment}",
|
||||
}
|
||||
file "${vardir}stoppedrules.d/${name}.stoppedrule" {
|
||||
state => $const.res.file.state.exists,
|
||||
content => golang.template(deploy.readfile("/files/stoppedrules.frag.tmpl"), $tmpl),
|
||||
owner => "root",
|
||||
group => "root",
|
||||
mode => "u=rw,go=",
|
||||
}
|
||||
}
|
||||
|
||||
class firewall:snat_base() {
|
||||
file "${vardir}snat.d/" {
|
||||
state => $const.res.file.state.exists,
|
||||
recurse => true,
|
||||
purge => true,
|
||||
owner => "root",
|
||||
group => "root",
|
||||
mode => "u=rwx,go=", # dir
|
||||
}
|
||||
|
||||
file "${vardir}snat.header" {
|
||||
state => $const.res.file.state.exists,
|
||||
content => deploy.readfile("/files/snat"), # static, no template!
|
||||
owner => "root",
|
||||
group => "root",
|
||||
mode => "u=rw,go=",
|
||||
}
|
||||
|
||||
file "/etc/shorewall/snat" {
|
||||
state => $const.res.file.state.exists,
|
||||
fragments => [
|
||||
"${vardir}snat.header", # also pull this one file
|
||||
"${vardir}snat.d/", # pull from this dir
|
||||
],
|
||||
owner => "root",
|
||||
group => "root",
|
||||
mode => "u=rw,go=",
|
||||
|
||||
Notify => Svc["shorewall"],
|
||||
}
|
||||
}
|
||||
|
||||
class firewall:snat($name, $st) {
|
||||
print "snat: ${name}" {}
|
||||
include snat_base
|
||||
|
||||
$action = $st->action # "MASQUERADE" usually
|
||||
$source = $st->source # list of ip/cidr
|
||||
$dest = $st->dest
|
||||
$comment = $st->comment || ""
|
||||
|
||||
$valid_source = strings.join($source, ",")
|
||||
|
||||
$tmpl = struct{
|
||||
action => "${action}",
|
||||
source => "${valid_source}",
|
||||
dest => "${dest}",
|
||||
comment => "${comment}",
|
||||
}
|
||||
file "${vardir}snat.d/${name}.snat" {
|
||||
state => $const.res.file.state.exists,
|
||||
content => golang.template(deploy.readfile("/files/snat.frag.tmpl"), $tmpl),
|
||||
owner => "root",
|
||||
group => "root",
|
||||
mode => "u=rw,go=",
|
||||
}
|
||||
}
|
||||
|
||||
class firewall:params_base() {
|
||||
file "${vardir}params.d/" {
|
||||
state => $const.res.file.state.exists,
|
||||
recurse => true,
|
||||
purge => true,
|
||||
owner => "root",
|
||||
group => "root",
|
||||
mode => "u=rwx,go=", # dir
|
||||
}
|
||||
|
||||
file "${vardir}params.header" {
|
||||
state => $const.res.file.state.exists,
|
||||
content => deploy.readfile("/files/params"), # static, no template!
|
||||
owner => "root",
|
||||
group => "root",
|
||||
mode => "u=rw,go=",
|
||||
}
|
||||
|
||||
file "/etc/shorewall/params" {
|
||||
state => $const.res.file.state.exists,
|
||||
fragments => [
|
||||
"${vardir}params.header", # also pull this one file
|
||||
"${vardir}params.d/", # pull from this dir
|
||||
],
|
||||
owner => "root",
|
||||
group => "root",
|
||||
mode => "u=rw,go=",
|
||||
|
||||
Notify => Svc["shorewall"],
|
||||
}
|
||||
}
|
||||
|
||||
class firewall:params($name, $st) {
|
||||
print "params: ${name}" {}
|
||||
include params_base
|
||||
|
||||
# TODO: add params
|
||||
}
|
||||
0
modules/shorewall/metadata.yaml
Normal file
0
modules/shorewall/metadata.yaml
Normal file
Reference in New Issue
Block a user