mirror of
https://gitlab.com/shorewall/code.git
synced 2024-12-15 19:01:19 +01:00
Fix tos file handling of zones defined via /etc/shorewall/hosts
git-svn-id: https://shorewall.svn.sourceforge.net/svnroot/shorewall/trunk@4560 fbd18981-670d-0410-9b5c-8dc0c1a9a2bb
This commit is contained in:
parent
0ef6822247
commit
375b2007fd
@ -2300,18 +2300,14 @@ process_rule() # $1 = target
|
|||||||
|
|
||||||
validate_zone $clientzone || fatal_error "Undefined Client Zone in rule \"$rule\""
|
validate_zone $clientzone || fatal_error "Undefined Client Zone in rule \"$rule\""
|
||||||
|
|
||||||
# Parse and validate destination
|
|
||||||
|
|
||||||
source=$clientzone
|
source=$clientzone
|
||||||
|
|
||||||
if [ $source = $FW ]; then
|
if [ $source != $FW -a -n "$userspec" ]; then
|
||||||
source_hosts=
|
|
||||||
elif [ -n "$userspec" ]; then
|
|
||||||
fatal_error "Invalid use of a user-qualification: rule \"$rule\""
|
fatal_error "Invalid use of a user-qualification: rule \"$rule\""
|
||||||
else
|
|
||||||
eval source_hosts=\"\$${source}_hosts\"
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Parse and validate destination
|
||||||
|
|
||||||
if [ "$servers" = "${servers%:*}" ] ; then
|
if [ "$servers" = "${servers%:*}" ] ; then
|
||||||
serverzone="$servers"
|
serverzone="$servers"
|
||||||
servers=
|
servers=
|
||||||
@ -3021,7 +3017,7 @@ process_tos_rule() {
|
|||||||
esac
|
esac
|
||||||
|
|
||||||
for dest in $dst; do
|
for dest in $dst; do
|
||||||
dest="$(dest_ip_range $dest)"
|
dest=$(match_dest $dest)
|
||||||
|
|
||||||
case $srczone in
|
case $srczone in
|
||||||
$FW)
|
$FW)
|
||||||
@ -3039,10 +3035,10 @@ process_tos_rule() {
|
|||||||
run_iptables2 -t mangle -A pretos $src \
|
run_iptables2 -t mangle -A pretos $src \
|
||||||
$protocol $dest $dports $sports $tos
|
$protocol $dest $dports $sports $tos
|
||||||
else
|
else
|
||||||
eval interfaces=\$${srczone}_interfaces
|
eval hosts=\$${srczone}_hosts
|
||||||
|
|
||||||
for interface in $interfaces; do
|
for host in $hosts; do
|
||||||
run_iptables2 -t mangle -A pretos -i $interface \
|
run_iptables2 -t mangle -A pretos $(match_source $host) \
|
||||||
$protocol $dest $dports $sports $tos
|
$protocol $dest $dports $sports $tos
|
||||||
done
|
done
|
||||||
fi
|
fi
|
||||||
|
@ -591,7 +591,7 @@ validate_hosts_file() {
|
|||||||
;;
|
;;
|
||||||
*.*.*)
|
*.*.*)
|
||||||
;;
|
;;
|
||||||
*+|+*)
|
*+|+*|*!*)
|
||||||
eval ${z}_is_complex=Yes
|
eval ${z}_is_complex=Yes
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
@ -604,7 +604,7 @@ validate_hosts_file() {
|
|||||||
case $host in
|
case $host in
|
||||||
*.*.*)
|
*.*.*)
|
||||||
;;
|
;;
|
||||||
*+)
|
*+|*!*)
|
||||||
eval ${z}_is_complex=Yes
|
eval ${z}_is_complex=Yes
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
@ -827,6 +827,105 @@ physdev_echo()
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# Source IP range
|
||||||
|
#
|
||||||
|
source_ip_range() # $1 = Address or Address Range
|
||||||
|
{
|
||||||
|
[ $# -gt 0 ] && case $1 in
|
||||||
|
*.*.*.*-*.*.*.*)
|
||||||
|
case $1 in
|
||||||
|
!*)
|
||||||
|
iprange_echo "! --src-range ${1#!}"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
iprange_echo "--src-range $1"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
!+*)
|
||||||
|
echo "-m set ! $(get_set_flags ${1#!} src)"
|
||||||
|
;;
|
||||||
|
+*)
|
||||||
|
echo "-m set $(get_set_flags $1 src)"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "-s $1"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# Destination IP range
|
||||||
|
#
|
||||||
|
dest_ip_range() # $1 = Address or Address Range
|
||||||
|
{
|
||||||
|
[ $# -gt 0 ] && case $1 in
|
||||||
|
*.*.*.*-*.*.*.*)
|
||||||
|
case $1 in
|
||||||
|
!*)
|
||||||
|
iprange_echo "! --dst-range ${1#!}"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
iprange_echo "--dst-range $1"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
!+*)
|
||||||
|
echo "-m set ! $(get_set_flags ${1#!} dst)"
|
||||||
|
;;
|
||||||
|
+*)
|
||||||
|
echo "-m set $(get_set_flags $1 dst)"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "-d $1"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
both_ip_ranges() # $1 = Source address or range, $2 = dest address or range
|
||||||
|
{
|
||||||
|
local rangeprefix= setprefix= rangematch= setmatch=
|
||||||
|
|
||||||
|
case $1 in
|
||||||
|
*.*.*.*-*.*.*.*)
|
||||||
|
rangeprefix="-m iprange"
|
||||||
|
rangematch="--src-range $1"
|
||||||
|
;;
|
||||||
|
!+*)
|
||||||
|
setprefix="-m set"
|
||||||
|
setmatch="! $(get_set_flags ${1#!} src)"
|
||||||
|
;;
|
||||||
|
+*)
|
||||||
|
setprefix="-m set"
|
||||||
|
setmatch="$(get_set_flags $1 src)"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
rangematch="-s $1"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
case $2 in
|
||||||
|
*.*.*.*-*.*.*.*)
|
||||||
|
rangeprefix="-m iprange"
|
||||||
|
rangematch="$rangematch --dst-range $2"
|
||||||
|
;;
|
||||||
|
!+*)
|
||||||
|
setprefix="-m set"
|
||||||
|
match="$setmatch ! $(get_set_flags ${2#!} dst)"
|
||||||
|
;;
|
||||||
|
+*)
|
||||||
|
setprefix="-m set"
|
||||||
|
setmatch="$setmatch $(get_set_flags $2 dst)"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
rangematch="$rangematch -d $2"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
echo "$rangeprefix $rangematch $setprefix $setmatch"
|
||||||
|
}
|
||||||
|
|
||||||
#
|
#
|
||||||
# We allow hosts to be specified by IP address or by physdev. These two functions
|
# We allow hosts to be specified by IP address or by physdev. These two functions
|
||||||
# are used to produce the proper match in a netfilter rule.
|
# are used to produce the proper match in a netfilter rule.
|
||||||
@ -868,6 +967,32 @@ match_dest_hosts()
|
|||||||
echo $(dest_ip_range $1)
|
echo $(dest_ip_range $1)
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
#
|
||||||
|
# Matches for either <address-range> or <interface>:<address range>
|
||||||
|
#
|
||||||
|
match_source()
|
||||||
|
{
|
||||||
|
case "$1" in
|
||||||
|
*:*)
|
||||||
|
echo "-i ${1%%:*} $(match_source_hosts ${1#*:})"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo $(dest_ip_range $1)
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
match_dest()
|
||||||
|
{
|
||||||
|
case "$1" in
|
||||||
|
*:*)
|
||||||
|
echo "-o ${1%%:*} $(match_dest_hosts ${1#*:})"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo $(dest_ip_range $1)
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
#
|
#
|
||||||
# Similarly, the source or destination in a rule can be qualified by a device name. If
|
# Similarly, the source or destination in a rule can be qualified by a device name. If
|
||||||
@ -1447,105 +1572,6 @@ strip_file_and_lib_load() # $1 = logical file name, $2 = library to load if the
|
|||||||
eval test -n \"\$LIB_${2}_LOADED\"
|
eval test -n \"\$LIB_${2}_LOADED\"
|
||||||
}
|
}
|
||||||
|
|
||||||
#
|
|
||||||
# Source IP range
|
|
||||||
#
|
|
||||||
source_ip_range() # $1 = Address or Address Range
|
|
||||||
{
|
|
||||||
[ $# -gt 0 ] && case $1 in
|
|
||||||
*.*.*.*-*.*.*.*)
|
|
||||||
case $1 in
|
|
||||||
!*)
|
|
||||||
iprange_echo "! --src-range ${1#!}"
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
iprange_echo "--src-range $1"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
;;
|
|
||||||
!+*)
|
|
||||||
echo "-m set ! $(get_set_flags ${1#!} src)"
|
|
||||||
;;
|
|
||||||
+*)
|
|
||||||
echo "-m set $(get_set_flags $1 src)"
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo "-s $1"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
}
|
|
||||||
|
|
||||||
#
|
|
||||||
# Destination IP range
|
|
||||||
#
|
|
||||||
dest_ip_range() # $1 = Address or Address Range
|
|
||||||
{
|
|
||||||
[ $# -gt 0 ] && case $1 in
|
|
||||||
*.*.*.*-*.*.*.*)
|
|
||||||
case $1 in
|
|
||||||
!*)
|
|
||||||
iprange_echo "! --dst-range ${1#!}"
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
iprange_echo "--dst-range $1"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
;;
|
|
||||||
!+*)
|
|
||||||
echo "-m set ! $(get_set_flags ${1#!} dst)"
|
|
||||||
;;
|
|
||||||
+*)
|
|
||||||
echo "-m set $(get_set_flags $1 dst)"
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo "-d $1"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
}
|
|
||||||
|
|
||||||
both_ip_ranges() # $1 = Source address or range, $2 = dest address or range
|
|
||||||
{
|
|
||||||
local rangeprefix= setprefix= rangematch= setmatch=
|
|
||||||
|
|
||||||
case $1 in
|
|
||||||
*.*.*.*-*.*.*.*)
|
|
||||||
rangeprefix="-m iprange"
|
|
||||||
rangematch="--src-range $1"
|
|
||||||
;;
|
|
||||||
!+*)
|
|
||||||
setprefix="-m set"
|
|
||||||
setmatch="! $(get_set_flags ${1#!} src)"
|
|
||||||
;;
|
|
||||||
+*)
|
|
||||||
setprefix="-m set"
|
|
||||||
setmatch="$(get_set_flags $1 src)"
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
rangematch="-s $1"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
case $2 in
|
|
||||||
*.*.*.*-*.*.*.*)
|
|
||||||
rangeprefix="-m iprange"
|
|
||||||
rangematch="$rangematch --dst-range $2"
|
|
||||||
;;
|
|
||||||
!+*)
|
|
||||||
setprefix="-m set"
|
|
||||||
match="$setmatch ! $(get_set_flags ${2#!} dst)"
|
|
||||||
;;
|
|
||||||
+*)
|
|
||||||
setprefix="-m set"
|
|
||||||
setmatch="$setmatch $(get_set_flags $2 dst)"
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
rangematch="$rangematch -d $2"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
echo "$rangeprefix $rangematch $setprefix $setmatch"
|
|
||||||
}
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Check that a mark value or mask is less that 256 or that it is less than 65536 and
|
# Check that a mark value or mask is less that 256 or that it is less than 65536 and
|
||||||
# that it's lower 8 bits are zero.
|
# that it's lower 8 bits are zero.
|
||||||
|
Loading…
Reference in New Issue
Block a user