###
### The mangle chains are arranged as follows.
###
-### The PREROUTING hook simply invokes in-classify and out-classify chains as
-### subroutines. These will tail-call appropriate classification chains.
+### The INPUT and FORWARD hooks simply invokes in-classify and out-classify
+### chains as subroutines. These will tail-call appropriate classification
+### chains.
###
### The in-classify chain is responsible for both source address
### classification and verifying that the packet arrived from the correct
for entry in $ifmap; do
iface=${entry%=*} q=${entry##*=}
eval nets=\$ifnets_$q
- trace "iface $iface [$q] = $nets"
aa=!
for n in $nets; do
eval "addrs=\"\$net_inet_$n \$net_inet6_$n\""
done
eval ifaddrs_$q=\$aa
trace "iface $q = $iface; nets = $nets; addrs = $aa"
-trace "alladdrs = $alladdrs"
done
+trace "alladdrs = $alladdrs"
## Populate the `out-classify' chain, matching networks.
prepare_to () { mode=goto fail=mark-to-$net_class_default; }
-matchnets -d mark-from : prepare_to out-classify "" 0 $allnets
+matchnets -d mark-to : prepare_to out-classify "" 0 $allnets
## A `finish' hook for rejecting known address ranges arriving on a
## default-reachable interface.
## interfaces. We should match an address to a particular interface.
chains=""
for net in $nets; do
- eval hosts=\$net_hosts_$net
+ eval hosts=\$net_hosts_$net class=\$net_class_$net
for host in $hosts; do
eval ha=\$host_inet_$host ha6=\$host_inet6_$host
trace "$host : $class -> $iface"
done
## Fill in the black holes in the network. Some of these might actually be
-## known networks, so don't fill those in again.
+## known networks, so don't fill those in again. See RFC5735 or its
+## successors.
for addr in \
10.0.0.0/8 172.16.0.0/12 192.168.0.0/16 \
127.0.0.0/8 \
m4_divert(92)m4_dnl
## Put the final default decision on the in-default chain, and attach the
-## classification chains to the PREROUTING hook.
+## classification chains to the INPUT and (maybe) FORWARD hooks.
for iface in $defaultifaces; do
run ip46tables -t mangle -A in-$iface -g in-default
done
-run ip46tables -t mangle -A PREROUTING -j in-classify
-run ip46tables -t mangle -A PREROUTING -j out-classify
+chains="INPUT"
+case $forward in 1) chains="$chains FORWARD" ;; esac
+for c in $chains; do
+ run ip46tables -t mangle -A $c -j in-classify
+ run ip46tables -t mangle -A $c -j out-classify
+done
## Incoming stuff to or from a link-local address is OK.
run ip46tables -t mangle -A INPUT \