First version of generic source routing script
[source-route.git] / source-route
1 #!/bin/sh
2 # This script set up source routing for a given interface
3 # Argument $1: The gateway
4 # Example usage: In /etc/network/interfaces
5 # iface eth7 inet static
6 #     address 192.168.5.42/24
7 #     /root/source-route-via-v4 192.168.1.15
8
9 #set -x 
10 iface=$LOGICAL
11 rttable=from$LOGICAL
12 LOGGER="logger -t source-route-via"
13
14 $LOGGER -- IFACE=$IFACE LOGICAL=$LOGICAL ADDRFAM=$ADDRFAM METHOD=$METHOD MODE=$MODE PHASE=$PHASE VERBOSITY=$VERBOSITY PATH=$PATH
15
16 if ! which ipv4calc >/dev/null
17 then
18     echo ipv4calc not found: apt-get install libnetwork-ipv4addr-perl >&2
19     exit 2
20 fi
21 if ! which ipv6calc >/dev/null
22 then
23     echo ipv6calc not found: apt-get install ipv6calc >&2
24     exit 2
25 fi
26 if test -z "$LOGICAL"
27 then
28    echo \$LOGICAL var is empty. >&2
29    exit 2
30 fi
31 if test "$PHASE" != "post-up"
32 then
33    echo $0 is only valid in "post-up". >&2
34    exit 2
35 fi
36 if test -z "$1"
37 then
38    echo Missing gateway parameter. >&2
39    exit 2
40 fi
41
42 RT_TABLES=/etc/iproute2/rt_tables
43 if ! grep -q $rttable /etc/iproute2/rt_tables
44 then
45         $LOGGER $RT_TABLES does not have $rttable entry.
46         echo $RT_TABLES does not have $rttable entry. >&2
47         exit 2
48 fi
49
50 case $ADDRFAM in
51 inet)
52         IPFLAG=-4
53         ;;
54 inet6)
55         IPFLAG=-6
56         ;;
57 *)
58         $LOGGER \$ADDRFAM must be inet or inet6. Ignoring.
59         exit 0
60         ;;
61 esac
62 IPADDR=$(ip $IPFLAG -o addr show $LOGICAL | grep -w $ADDRFAM | grep global | sed -re "s/.*$ADDRFAM (.*)\/.*/\1/")
63 IPCIDR=$(ip -o addr show $LOGICAL | grep -w $ADDRFAM | grep global | sed -re "s/.*$ADDRFAM .*\/([^ ]*).*/\1/")
64 if test "$ADDRFAM" = "inet6"
65 then
66         IPNET=$(ipv6calc --in ipv6 --out ipv6 --maskprefix $IPADDR/$IPCIDR)
67 else
68         IPNET=$(ipv4calc --network $IPADDR/$IPCIDR)/$IPCIDR
69 fi
70 echo IP address: $IPADDR >&2
71 echo CIDR: $IPCIDR >&2
72 echo Network: $IPNET >&2
73
74 # Setting up source routing on $iface, so that packets from $iface don't get answered on another interface
75 if ! ip $IPFLAG route show table $rttable | grep -q default  # Once only
76 then
77         $LOGGER Setting up default gateway on iproute2 table $rttable
78         $LOGGER -- ip $IPFLAG route add $IPNET dev "$iface" scope link table $rttable
79         ip $IPFLAG route add $IPNET dev "$iface" scope link table $rttable
80         $LOGGER -- ip $IPFLAG route add default via "$1" dev "$iface" table $rttable
81         ip $IPFLAG route add default via "$1" dev "$iface" table $rttable
82 fi
83 if ! ip $IPFLAG rule show | grep -q $rttable  # Once only
84 then
85         $LOGGER Setting up source routing on "$iface" from $IPADDR
86         $LOGGER -- ip $IPFLAG rule add from $IPADDR table $rttable
87         ip $IPFLAG rule add from $IPADDR table $rttable
88 fi
89
90 ip $IPFLAG route flush cache