Fix route filtering

git-svn-id: https://shorewall.svn.sourceforge.net/svnroot/shorewall/trunk@782 fbd18981-670d-0410-9b5c-8dc0c1a9a2bb
This commit is contained in:
teastep 2003-10-30 15:42:45 +00:00
parent ee51d49233
commit f046ea3ab1
5 changed files with 52 additions and 35 deletions

View File

@ -24,3 +24,9 @@ Changes since 1.4.7
11) Remove incorrect comment from shorewall.conf regarding Debian
lockfiles.
12) Change "_exists" suffix (including _nat_exists) to an "exists_"
prefix to allow chain names beginning with a digit without
lengthening the variable name.
13) Applied and improved Eric Bowles's fix for route filtering.

View File

@ -229,7 +229,7 @@ run_tc() {
#
# If the chain isn't one of the common chains then add a rule to the chain
# allowing packets that are part of an established connection. Create a
# variable ${1}_exists and set its value to Yes to indicate that the chain now
# variable exists_${1} and set its value to Yes to indicate that the chain now
# exists.
#
createchain() # $1 = chain name, $2 = If "yes", create default rules
@ -244,7 +244,7 @@ createchain() # $1 = chain name, $2 = If "yes", create default rules
run_iptables -A $1 -m state --state NEW -p tcp ! --syn -j newnotsyn
fi
eval ${c}_exists=Yes
eval exists_${c}=Yes
}
createchain2() # $1 = chain name, $2 = If "yes", create default rules
@ -259,22 +259,22 @@ createchain2() # $1 = chain name, $2 = If "yes", create default rules
run_iptables -A $1 -m state --state NEW -p tcp ! --syn -j newnotsyn
fi
eval ${c}_exists=Yes
eval exists_${c}=Yes
fi
}
#
# Determine if a chain exists
#
# When we create a chain "chain", we create a variable named chain_exists and
# set its value to Yes. This function tests for the "_exists" variable
# When we create a chain "chain", we create a variable named exists_chain and
# set its value to Yes. This function tests for the "exists_" variable
# corresponding to the passed chain having the value of "Yes".
#
havechain() # $1 = name of chain
{
local c=`chain_base $1`
eval test \"\$${c}_exists\" = Yes
eval test \"\$exists_${c}\" = Yes
}
#
@ -313,26 +313,26 @@ addrule() # $1 = chain name, remainder of arguments specify the rule
#
# Create a nat chain
#
# Create a variable ${1}_nat_exists and set its value to Yes to indicate that
# Create a variable exists_nat_${1} and set its value to Yes to indicate that
# the chain now exists.
#
createnatchain() # $1 = chain name
{
run_iptables -t nat -N $1
eval ${1}_nat_exists=Yes
eval exists_nat_${1}=Yes
}
#
# Determine if a nat chain exists
#
# When we create a chain "chain", we create a variable named chain_nat_exists
# and set its value to Yes. This function tests for the "_exists" variable
# When we create a chain "chain", we create a variable named exists_nat_chain
# and set its value to Yes. This function tests for the "exists_" variable
# corresponding to the passed chain having the value of "Yes".
#
havenatchain() # $1 = name of chain
{
eval test \"\$${1}_nat_exists\" = Yes
eval test \"\$exists_nat_${1}\" = Yes
}
#
@ -4202,6 +4202,7 @@ add_common_rules() {
if [ -n "$interfaces" ]; then
echo "Setting up ARP Filtering..."
for interface in $interfaces; do
file=/proc/sys/net/ipv4/conf/$interface/arp_filter
if [ -f $file ]; then
@ -4215,28 +4216,28 @@ add_common_rules() {
#
# Route Filtering
#
for f in /proc/sys/net/ipv4/conf/*/rp_filter; do
echo 0 > $f
done
interfaces="`find_interfaces_by_option routefilter`"
if [ -n "$interfaces" -o -n "$ROUTE_FILTER" ]; then
echo "Setting up Kernel Route Filtering..."
if [ -n "$ROUTE_FILTER" ]; then
echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter
else
for interface in $interfaces; do
file=/proc/sys/net/ipv4/conf/$interface/rp_filter
if [ -f $file ]; then
echo 1 > $file
else
error_message \
"Warning: Cannot set route filtering on $interface"
fi
done
fi
for f in /proc/sys/net/ipv4/conf/*/rp_filter; do
echo 0 > $f
done
for interface in $interfaces; do
file=/proc/sys/net/ipv4/conf/$interface/rp_filter
if [ -f $file ]; then
echo 1 > $file
else
error_message \
"Warning: Cannot set route filtering on $interface"
fi
done
echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter
[ -n "$ROUTE_FILTER" ] && echo 1 > /proc/sys/net/ipv4/conf/default/rp_filter
run_ip route flush cache
fi
#
# IP Forwarding

View File

@ -422,9 +422,6 @@ chain_base() #$1 = interface
while true; do
case $c in
[0-9]*)
c=C${c}
;;
*.*)
c="${c%.*}_${c##*.}"
;;

View File

@ -44,9 +44,20 @@ Problems Corrected since version 1.4.7:
8) An incorrect comment concerning Debian's use of the SYBSYSLOCK
option has been removed from shorewall.conf.
9) Previously, neither the 'routefilter' interface option nor the
ROUTE_FILTER parameter were working properly. This has been
corrected. The definition of the ROUTE_FILTER option has changed
however. Previously, ROUTE_FILTER=Yes was documented as enabling
route filtering on all interfaces (which didn't work). Beginning
with this release, setting ROUTE_FILTER=Yes will enable route
filtering of all interfaces brought up while Shorewall is
started. As a consequence, ROUTE_FILTER=Yes can coexist with the use
of the 'routefilter' option in the interfaces file.
Migration Issues:
None.
1. The definition of the ROUTE_FILTER option in shorewall.conf has
changed as described in item 9) above.
New Features:
@ -84,3 +95,4 @@ New Features:

View File

@ -349,11 +349,12 @@ CLAMPMSS=No
# ROUTE FILTERING
#
# Set this variable to "Yes" or "yes" if you want kernel route filtering on all
# interfaces (anti-spoofing measure).
# interfaces started while Shorewall is started (anti-spoofing measure).
#
# If this variable is not set or is set to the empty value, "No" is assumed.
# In that case, you can still enable route filtering on individual interfaces
# in the /etc/shorewall/interfaces file.
# Regardless of the setting of ROUTE_FILTER, you can still enable route filtering
# on individual interfaces using the 'routefilter' option in the
# /etc/shorewall/interfaces file.
ROUTE_FILTER=No