mirror of
https://gitlab.com/shorewall/code.git
synced 2024-12-17 20:01:09 +01:00
Restructure chain table for IPv6
git-svn-id: https://shorewall.svn.sourceforge.net/svnroot/shorewall/trunk@8938 fbd18981-670d-0410-9b5c-8dc0c1a9a2bb
This commit is contained in:
parent
038a4c0756
commit
cfa3212b30
@ -44,6 +44,9 @@ our @EXPORT = qw(
|
|||||||
log_rule_limit
|
log_rule_limit
|
||||||
|
|
||||||
%chain_table
|
%chain_table
|
||||||
|
%xlatetable
|
||||||
|
%ipv4tables
|
||||||
|
%ipv6tables
|
||||||
$nat_table
|
$nat_table
|
||||||
$mangle_table
|
$mangle_table
|
||||||
$filter_table
|
$filter_table
|
||||||
@ -191,6 +194,16 @@ our %chain_table;
|
|||||||
our $nat_table;
|
our $nat_table;
|
||||||
our $mangle_table;
|
our $mangle_table;
|
||||||
our $filter_table;
|
our $filter_table;
|
||||||
|
our %xlatetable = ( raw => 'raw' ,
|
||||||
|
nat => 'nat' ,
|
||||||
|
mangle => 'mangle' ,
|
||||||
|
filter => 'filter' ,
|
||||||
|
raw6 => 'raw' ,
|
||||||
|
mangle6 => 'mangle' ,
|
||||||
|
filter6 => 'filter' );
|
||||||
|
|
||||||
|
our @ipv4tables = qw( raw mangle nat filter );
|
||||||
|
our @ipv6tables = qw( raw6 mangle6 filter6 );
|
||||||
#
|
#
|
||||||
# It is a layer violation to keep information about the rules file sections in this module but in Shorewall, the rules file
|
# It is a layer violation to keep information about the rules file sections in this module but in Shorewall, the rules file
|
||||||
# and the filter table are very closely tied. By keeping the information here, we avoid making several other modules dependent
|
# and the filter table are very closely tied. By keeping the information here, we avoid making several other modules dependent
|
||||||
@ -212,6 +225,7 @@ use constant { STANDARD => 1, #defined by Netfilter
|
|||||||
LOGRULE => 256, #'LOG'
|
LOGRULE => 256, #'LOG'
|
||||||
NFQ => 512, #'NFQUEUE'
|
NFQ => 512, #'NFQUEUE'
|
||||||
CHAIN => 1024, #Manual Chain
|
CHAIN => 1024, #Manual Chain
|
||||||
|
IPV4ONLY => 2048, #Not Available with IPV6
|
||||||
};
|
};
|
||||||
|
|
||||||
our %targets;
|
our %targets;
|
||||||
@ -247,6 +261,18 @@ use constant { NULL_MODE => 0 , # Generating neither shell commands nor iptabl
|
|||||||
|
|
||||||
our $mode;
|
our $mode;
|
||||||
|
|
||||||
|
sub use_ipv4() {
|
||||||
|
$nat_table = $chain_table{nat};
|
||||||
|
$mangle_table = $chain_table{mangle};
|
||||||
|
$filter_table = $chain_table{filter};
|
||||||
|
}
|
||||||
|
|
||||||
|
sub use_ipv6() {
|
||||||
|
$nat_table = undef;
|
||||||
|
$mangle_table = $chain_table{mangle6};
|
||||||
|
$filter_table = $chain_table{filter6};
|
||||||
|
}
|
||||||
|
|
||||||
#
|
#
|
||||||
# Initialize globals -- we take this novel approach to globals initialization to allow
|
# Initialize globals -- we take this novel approach to globals initialization to allow
|
||||||
# the compiler to run multiple times in the same process. The
|
# the compiler to run multiple times in the same process. The
|
||||||
@ -257,15 +283,22 @@ our $mode;
|
|||||||
#
|
#
|
||||||
|
|
||||||
sub initialize() {
|
sub initialize() {
|
||||||
%chain_table = ( raw => {} ,
|
%chain_table = ( raw => {} ,
|
||||||
mangle => {},
|
mangle => {} ,
|
||||||
nat => {},
|
nat => {} ,
|
||||||
filter => {} );
|
filter => {} ,
|
||||||
|
raw6 => {} ,
|
||||||
|
filter6 => {} );
|
||||||
|
|
||||||
$nat_table = $chain_table{nat};
|
$chain_table{raw}{__NAME__} = 'raw';
|
||||||
$mangle_table = $chain_table{mangle};
|
$chain_table{mangle}{__NAME__} = 'mangle';
|
||||||
$filter_table = $chain_table{filter};
|
$chain_table{nat}{__NAME__} = 'nat';
|
||||||
|
$chain_table{filter}{__NAME__} = 'filter';
|
||||||
|
$chain_table{raw6}{__NAME__} = 'raw';
|
||||||
|
$chain_table{mangle6}{__NAME__} = 'mangle';
|
||||||
|
$chain_table{filter6}{__NAME__} = 'filter';
|
||||||
|
|
||||||
|
use_ipv4;
|
||||||
#
|
#
|
||||||
# These get set to 1 as sections are encountered.
|
# These get set to 1 as sections are encountered.
|
||||||
#
|
#
|
||||||
@ -285,35 +318,35 @@ sub initialize() {
|
|||||||
# As new targets (Actions, Macros and Manual Chains) are discovered, they are added to the table
|
# As new targets (Actions, Macros and Manual Chains) are discovered, they are added to the table
|
||||||
#
|
#
|
||||||
%targets = ('ACCEPT' => STANDARD,
|
%targets = ('ACCEPT' => STANDARD,
|
||||||
'ACCEPT+' => STANDARD + NONAT,
|
'ACCEPT+' => STANDARD + NONAT + IPV4ONLY,
|
||||||
'ACCEPT!' => STANDARD,
|
'ACCEPT!' => STANDARD,
|
||||||
'NONAT' => STANDARD + NONAT + NATONLY,
|
'NONAT' => STANDARD + NONAT + NATONLY + IPV4ONLY,
|
||||||
'DROP' => STANDARD,
|
'DROP' => STANDARD,
|
||||||
'DROP!' => STANDARD,
|
'DROP!' => STANDARD,
|
||||||
'REJECT' => STANDARD,
|
'REJECT' => STANDARD,
|
||||||
'REJECT!' => STANDARD,
|
'REJECT!' => STANDARD,
|
||||||
'DNAT' => NATRULE,
|
'DNAT' => NATRULE + IPV4ONLY,
|
||||||
'DNAT-' => NATRULE + NATONLY,
|
'DNAT-' => NATRULE + NATONLY + IPV4ONLY,
|
||||||
'REDIRECT' => NATRULE + REDIRECT,
|
'REDIRECT' => NATRULE + REDIRECT + IPV4ONLY,
|
||||||
'REDIRECT-' => NATRULE + REDIRECT + NATONLY,
|
'REDIRECT-' => NATRULE + REDIRECT + NATONLY + IPV4ONLY,
|
||||||
'LOG' => STANDARD + LOGRULE,
|
'LOG' => STANDARD + LOGRULE,
|
||||||
'CONTINUE' => STANDARD,
|
'CONTINUE' => STANDARD,
|
||||||
'CONTINUE!' => STANDARD,
|
'CONTINUE!' => STANDARD,
|
||||||
'QUEUE' => STANDARD,
|
'QUEUE' => STANDARD,
|
||||||
'QUEUE!' => STANDARD,
|
'QUEUE!' => STANDARD,
|
||||||
'NFQUEUE' => STANDARD + NFQ,
|
'NFQUEUE' => STANDARD + NFQ,
|
||||||
'NFQUEUE!' => STANDARD + NFQ,
|
'NFQUEUE!' => STANDARD + NFQ,
|
||||||
'SAME' => NATRULE,
|
'SAME' => NATRULE + IPV4ONLY,
|
||||||
'SAME-' => NATRULE + NATONLY,
|
'SAME-' => NATRULE + NATONLY + IPV4ONLY,
|
||||||
'dropBcast' => BUILTIN + ACTION,
|
'dropBcast' => BUILTIN + ACTION,
|
||||||
'allowBcast' => BUILTIN + ACTION,
|
'allowBcast' => BUILTIN + ACTION,
|
||||||
'dropNotSyn' => BUILTIN + ACTION,
|
'dropNotSyn' => BUILTIN + ACTION,
|
||||||
'rejNotSyn' => BUILTIN + ACTION,
|
'rejNotSyn' => BUILTIN + ACTION,
|
||||||
'dropInvalid' => BUILTIN + ACTION,
|
'dropInvalid' => BUILTIN + ACTION,
|
||||||
'allowInvalid' => BUILTIN + ACTION,
|
'allowInvalid' => BUILTIN + ACTION,
|
||||||
'allowinUPnP' => BUILTIN + ACTION,
|
'allowinUPnP' => BUILTIN + ACTION,
|
||||||
'forwardUPnP' => BUILTIN + ACTION,
|
'forwardUPnP' => BUILTIN + ACTION,
|
||||||
'Limit' => BUILTIN + ACTION,
|
'Limit' => BUILTIN + ACTION,
|
||||||
);
|
);
|
||||||
#
|
#
|
||||||
# Used to sequence 'exclusion' chains with names 'excl0', 'excl1', ...
|
# Used to sequence 'exclusion' chains with names 'excl0', 'excl1', ...
|
||||||
@ -336,6 +369,8 @@ sub initialize() {
|
|||||||
%interfacemacs = ();
|
%interfacemacs = ();
|
||||||
%interfacebcasts = ();
|
%interfacebcasts = ();
|
||||||
%interfacegateways = ();
|
%interfacegateways = ();
|
||||||
|
|
||||||
|
@ipv4tables = ( qw/ filter / );
|
||||||
}
|
}
|
||||||
|
|
||||||
INIT {
|
INIT {
|
||||||
@ -813,7 +848,7 @@ sub ensure_filter_chain( $$ )
|
|||||||
|
|
||||||
my $chainref = $filter_table->{$chain};
|
my $chainref = $filter_table->{$chain};
|
||||||
|
|
||||||
$chainref = new_chain 'filter' , $chain unless $chainref;
|
$chainref = new_chain $filter_table->{__NAME__} , $chain unless $chainref;
|
||||||
|
|
||||||
if ( $populate and ! $chainref->{referenced} ) {
|
if ( $populate and ! $chainref->{referenced} ) {
|
||||||
if ( $section eq 'NEW' or $section eq 'DONE' ) {
|
if ( $section eq 'NEW' or $section eq 'DONE' ) {
|
||||||
@ -840,7 +875,7 @@ sub ensure_accounting_chain( $ )
|
|||||||
if ( $chainref ) {
|
if ( $chainref ) {
|
||||||
fatal_error "Non-accounting chain ($chain) used in accounting rule" if ! $chainref->{accounting};
|
fatal_error "Non-accounting chain ($chain) used in accounting rule" if ! $chainref->{accounting};
|
||||||
} else {
|
} else {
|
||||||
$chainref = new_chain 'filter' , $chain unless $chainref;
|
$chainref = new_chain $filter_table->{__NAME__} , $chain unless $chainref;
|
||||||
$chainref->{accounting} = 1;
|
$chainref->{accounting} = 1;
|
||||||
$chainref->{referenced} = 1;
|
$chainref->{referenced} = 1;
|
||||||
}
|
}
|
||||||
@ -851,7 +886,7 @@ sub ensure_accounting_chain( $ )
|
|||||||
sub ensure_mangle_chain($) {
|
sub ensure_mangle_chain($) {
|
||||||
my $chain = $_[0];
|
my $chain = $_[0];
|
||||||
|
|
||||||
my $chainref = ensure_chain 'mangle', $chain;
|
my $chainref = ensure_chain $mangle_table->{__NAME__}, $chain;
|
||||||
|
|
||||||
$chainref->{referenced} = 1;
|
$chainref->{referenced} = 1;
|
||||||
|
|
||||||
@ -882,7 +917,7 @@ sub new_builtin_chain($$$)
|
|||||||
}
|
}
|
||||||
|
|
||||||
sub new_standard_chain($) {
|
sub new_standard_chain($) {
|
||||||
my $chainref = new_chain 'filter' ,$_[0];
|
my $chainref = new_chain $filter_table->{__NAME__} ,$_[0];
|
||||||
$chainref->{referenced} = 1;
|
$chainref->{referenced} = 1;
|
||||||
$chainref;
|
$chainref;
|
||||||
}
|
}
|
||||||
@ -916,11 +951,13 @@ sub ensure_manual_chain($) {
|
|||||||
sub initialize_chain_table()
|
sub initialize_chain_table()
|
||||||
{
|
{
|
||||||
for my $chain qw(OUTPUT PREROUTING) {
|
for my $chain qw(OUTPUT PREROUTING) {
|
||||||
new_builtin_chain 'raw', $chain, 'ACCEPT';
|
new_builtin_chain 'raw' , $chain, 'ACCEPT';
|
||||||
|
new_builtin_chain 'raw6', $chain, 'ACCEPT';
|
||||||
}
|
}
|
||||||
|
|
||||||
for my $chain qw(INPUT OUTPUT FORWARD) {
|
for my $chain qw(INPUT OUTPUT FORWARD) {
|
||||||
new_builtin_chain 'filter', $chain, 'DROP';
|
new_builtin_chain 'filter', $chain, 'DROP';
|
||||||
|
new_builtin_chain 'filter6', $chain, 'DROP';
|
||||||
}
|
}
|
||||||
|
|
||||||
for my $chain qw(PREROUTING POSTROUTING OUTPUT) {
|
for my $chain qw(PREROUTING POSTROUTING OUTPUT) {
|
||||||
@ -929,6 +966,7 @@ sub initialize_chain_table()
|
|||||||
|
|
||||||
for my $chain qw(PREROUTING INPUT OUTPUT ) {
|
for my $chain qw(PREROUTING INPUT OUTPUT ) {
|
||||||
new_builtin_chain 'mangle', $chain, 'ACCEPT';
|
new_builtin_chain 'mangle', $chain, 'ACCEPT';
|
||||||
|
new_builtin_chain 'mangle6', $chain, 'ACCEPT';
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( $capabilities{MANGLE_FORWARD} ) {
|
if ( $capabilities{MANGLE_FORWARD} ) {
|
||||||
@ -936,6 +974,10 @@ sub initialize_chain_table()
|
|||||||
new_builtin_chain 'mangle', $chain, 'ACCEPT';
|
new_builtin_chain 'mangle', $chain, 'ACCEPT';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for my $chain qw( FORWARD POSTROUTING ) {
|
||||||
|
new_builtin_chain 'mangle6', $chain, 'ACCEPT';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#
|
#
|
||||||
@ -986,7 +1028,7 @@ sub finish_section ( $ ) {
|
|||||||
|
|
||||||
for my $zone ( all_zones ) {
|
for my $zone ( all_zones ) {
|
||||||
for my $zone1 ( all_zones ) {
|
for my $zone1 ( all_zones ) {
|
||||||
my $chainref = $chain_table{'filter'}{"${zone}2${zone1}"};
|
my $chainref = $filter_table->{"${zone}2${zone1}"};
|
||||||
if ( $chainref->{referenced} ) {
|
if ( $chainref->{referenced} ) {
|
||||||
finish_chain_section $chainref, $sections;
|
finish_chain_section $chainref, $sections;
|
||||||
}
|
}
|
||||||
@ -2402,7 +2444,7 @@ sub create_netfilter_load() {
|
|||||||
#
|
#
|
||||||
# First create the chains in the current table
|
# First create the chains in the current table
|
||||||
#
|
#
|
||||||
for my $chain ( grep $chain_table{$table}{$_}->{referenced} , ( sort keys %{$chain_table{$table}} ) ) {
|
for my $chain ( grep reftype $chain_table{$table}{$_} && $chain_table{$table}{$_}->{referenced} , ( sort keys %{$chain_table{$table}} ) ) {
|
||||||
my $chainref = $chain_table{$table}{$chain};
|
my $chainref = $chain_table{$table}{$chain};
|
||||||
unless ( $chainref->{builtin} ) {
|
unless ( $chainref->{builtin} ) {
|
||||||
fatal_error "Internal error in create_netfilter_load()" if $chainref->{cmdlevel};
|
fatal_error "Internal error in create_netfilter_load()" if $chainref->{cmdlevel};
|
||||||
@ -2495,6 +2537,7 @@ sub create_chainlist_reload($) {
|
|||||||
push @{$chains{$table}}, $chain;
|
push @{$chains{$table}}, $chain;
|
||||||
} else {
|
} else {
|
||||||
while ( my ( $chain, $chainref ) = each %{$chain_table{$table}} ) {
|
while ( my ( $chain, $chainref ) = each %{$chain_table{$table}} ) {
|
||||||
|
next unless reftype $chainref;
|
||||||
push @{$chains{$table}}, $chain if $chainref->{referenced} && ! $chainref->{builtin};
|
push @{$chains{$table}}, $chain if $chainref->{referenced} && ! $chainref->{builtin};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user