7 ###############################################################################
11 ###############################################################################
13 # Tables (from SmartGatewayTablesOffset):
14 # +-----------------+-----------------+---------------+
15 # | sgwsrvtun table | egressif tables | sgwtun tables |
16 # +-----------------+-----------------+---------------+
17 # Example: 90 91 92 93 94 ...
20 # Rules (from SmartGatewayRulesOffset):
21 # +-----------------------+---------------------+-----------------+-----------------+---------------+
22 # | egressif bypass rules | olsrif bypass rules | sgwsrvtun rule | egressif rules | sgwtun rules |
23 # +-----------------------+---------------------+-----------------+-----------------+---------------+
24 # Example: 84 85 86 87 88 89 90 91 92 93 94 ...
27 ###############################################################################
31 ###############################################################################
33 declare IPVERSION_4="ipv4"
34 declare IPVERSION_6="ipv6"
36 declare MODE_GENERIC="generic"
37 declare MODE_OLSRIF="olsrif"
38 declare MODE_SGWSRVTUN="sgwsrvtun"
39 declare MODE_EGRESSIF="egressif"
40 declare MODE_SGWTUN="sgwtun"
42 declare ADDMODE_ADD="add"
43 declare ADDMODE_DEL="del"
45 declare -i MODE_GENERIC_ARGC=0
46 declare -i MODE_OLSRIF_ARGC=2
47 declare -i MODE_EGRESSIF_ARGC=4
48 declare -i MODE_SGWSRVTUN_ARGC=3
49 declare -i MODE_SGWTUN_ARGC=3
52 ###############################################################################
56 ###############################################################################
60 echo "The script was called as:"
61 echo " $script ${arguments[@]:-}"
64 echo " $script ipVersion mode addMode ifName tableNr ruleNr bypassRuleNr"
65 echo " - ipVersion : $IPVERSION_4 or $IPVERSION_6"
66 echo " - mode : $MODE_GENERIC, $MODE_OLSRIF, $MODE_EGRESSIF, $MODE_SGWSRVTUN or $MODE_SGWTUN"
67 echo " - addMode : $ADDMODE_ADD or $ADDMODE_DEL"
68 echo " - ifName : the interface name , only relevant for modes $MODE_EGRESSIF, $MODE_SGWSRVTUN, $MODE_SGWTUN"
69 echo " - tableNr : the routing table number , only relevant for modes $MODE_EGRESSIF, $MODE_SGWSRVTUN, $MODE_SGWTUN"
70 echo " - ruleNr : the ip rule number , only relevant for modes $MODE_EGRESSIF, $MODE_SGWSRVTUN, $MODE_SGWTUN"
71 echo " - bypassRuleNr: the bypass ip rule number, only relevant for mode $MODE_EGRESSIF, $MODE_OLSRIF"
76 while [ $# -gt 0 ]; do
77 if [ $firstLine -eq 1 ]; then
88 ###############################################################################
92 ###############################################################################
95 "$IPTABLES" $IPTABLES_ARGS -t mangle "$ADDMODE_IPTABLES" PREROUTING -m conntrack ! --ctstate NEW -j CONNMARK --restore-mark
96 "$IPTABLES" $IPTABLES_ARGS -t mangle "$ADDMODE_IPTABLES" OUTPUT -m conntrack ! --ctstate NEW -j CONNMARK --restore-mark
100 local interfaceName="$1"
101 local bypassRuleNr="$2"
103 "$IP" $IP_ARGS rule "$ADDMODE_IP" iif "$interfaceName" table main priority "$bypassRuleNr"
106 function egressif() {
107 local interfaceName="$1"
110 local bypassRuleNr="$4"
112 "$IPTABLES" $IPTABLES_ARGS -t mangle "$ADDMODE_IPTABLES" POSTROUTING -m conntrack --ctstate NEW -o "$interfaceName" -j CONNMARK --set-mark "$ruleNr"
113 "$IPTABLES" $IPTABLES_ARGS -t mangle "$ADDMODE_IPTABLES" INPUT -m conntrack --ctstate NEW -i "$interfaceName" -j CONNMARK --set-mark "$ruleNr"
114 "$IP" $IP_ARGS rule "$ADDMODE_IP" fwmark "$ruleNr" table "$tableNr" priority "$ruleNr"
115 "$IP" $IP_ARGS rule "$ADDMODE_IP" iif "$interfaceName" table main priority "$bypassRuleNr"
118 function sgwsrvtun() {
119 local interfaceName="$1"
123 "$IPTABLES" $IPTABLES_ARGS -t mangle "$ADDMODE_IPTABLES" PREROUTING -m conntrack --ctstate NEW -i "$interfaceName" -j CONNMARK --set-mark "$ruleNr"
124 "$IP" $IP_ARGS rule "$ADDMODE_IP" fwmark "$ruleNr" table "$tableNr" priority "$ruleNr"
128 local interfaceName="$1"
132 "$IPTABLES" $IPTABLES_ARGS -t mangle "$ADDMODE_IPTABLES" POSTROUTING -m conntrack --ctstate NEW -o "$interfaceName" -j CONNMARK --set-mark "$ruleNr"
133 "$IP" $IP_ARGS rule "$ADDMODE_IP" fwmark "$ruleNr" table "$tableNr" priority "$ruleNr"
137 ###############################################################################
141 ###############################################################################
144 declare -a arguments=( ${@} )
147 # we always need 3 arguments, check it
148 if [ $argc -lt 3 ]; then
149 error "Need at least 3 arguments"
154 # get first 3 arguments
161 # check IP version argument
162 if [ ! "$ipVersion" == "$IPVERSION_4" ] && \
163 [ ! "$ipVersion" == "$IPVERSION_6" ]; then
164 error "Illegal IP version"
169 # check mode argument
170 if [ ! "$mode" == "$MODE_GENERIC" ] && \
171 [ ! "$mode" == "$MODE_OLSRIF" ] && \
172 [ ! "$mode" == "$MODE_SGWSRVTUN" ] && \
173 [ ! "$mode" == "$MODE_EGRESSIF" ] && \
174 [ ! "$mode" == "$MODE_SGWTUN" ]; then
180 # check addMode argument
181 if [ ! "$addMode" == "$ADDMODE_ADD" ] && \
182 [ ! "$addMode" == "$ADDMODE_DEL" ]; then
183 error "Illegal addMode"
188 # check argument count for all modes
189 if ([ "$mode" == "$MODE_GENERIC" ] && [ $argc -lt $MODE_GENERIC_ARGC ]) || \
190 ([ "$mode" == "$MODE_OLSRIF" ] && [ $argc -lt $MODE_OLSRIF_ARGC ]) || \
191 ([ "$mode" == "$MODE_EGRESSIF" ] && [ $argc -lt $MODE_EGRESSIF_ARGC ]) || \
192 ([ "$mode" == "$MODE_SGWSRVTUN" ] && [ $argc -lt $MODE_SGWSRVTUN_ARGC ]) || \
193 ([ "$mode" == "$MODE_SGWTUN" ] && [ $argc -lt $MODE_SGWTUN_ARGC ]); then
194 if [ $argc -eq 0 ]; then
195 error "Not enough arguments arguments ($argc) for mode $mode"
197 error "Not enough arguments arguments ($argc) for mode $mode" "Arguments: ${@}"
203 # check argument count for all modes
204 if ([ "$mode" == "$MODE_GENERIC" ] && [ $argc -gt $MODE_GENERIC_ARGC ]) || \
205 ([ "$mode" == "$MODE_OLSRIF" ] && [ $argc -gt $MODE_OLSRIF_ARGC ]) || \
206 ([ "$mode" == "$MODE_EGRESSIF" ] && [ $argc -gt $MODE_EGRESSIF_ARGC ]) || \
207 ([ "$mode" == "$MODE_SGWSRVTUN" ] && [ $argc -gt $MODE_SGWSRVTUN_ARGC ]) || \
208 ([ "$mode" == "$MODE_SGWTUN" ] && [ $argc -gt $MODE_SGWTUN_ARGC ]); then
209 if [ $argc -eq 0 ]; then
210 error "Not enough arguments arguments ($argc) for mode $mode"
212 error "Not enough arguments arguments ($argc) for mode $mode" "Arguments: ${@}"
218 # process ipVersion argument
219 declare IPTABLES="iptables"
220 declare IPTABLES_ARGS=""
223 if [ "$ipVersion" == "$IPVERSION_6" ]; then
230 # process addMode argument
231 declare ADDMODE_IPTABLES="-D"
232 declare ADDMODE_IP="delete"
233 if [ "$addMode" == "$ADDMODE_ADD" ]; then
234 # first call the delete mode to remove any left-over rules
236 "$mode" "${@}" 2> /dev/null
239 ADDMODE_IPTABLES="-I"