plugin-loader: Optionally use load option in each plugin section to load plugins
[strongswan.git] / src / _updown_espmark / _updown_espmark
1 #! /bin/sh
2 # iproute2 version, default updown script
3 #
4 # Copyright (C) 2003-2004 Nigel Meteringham
5 # Copyright (C) 2003-2004 Tuomo Soini
6 # Copyright (C) 2002-2004 Michael Richardson
7 # Copyright (C) 2005      Andreas Steffen <andreas.steffen@strongsec.com>
8 #
9 # This program is free software; you can redistribute it and/or modify it
10 # under the terms of the GNU General Public License as published by the
11 # Free Software Foundation; either version 2 of the License, or (at your
12 # option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
13 #
14 # This program is distributed in the hope that it will be useful, but
15 # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
16 # or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
17 # for more details.
18
19
20
21 # CAUTION:  Installing a new version of strongSwan will install a new
22 # copy of this script, wiping out any custom changes you make.  If
23 # you need changes, make a copy of this under another name, and customize
24 # that, and use the (left/right)updown parameters in ipsec.conf to make
25 # FreeS/WAN use yours instead of this default one.
26
27 # things that this script gets (from ipsec_pluto(8) man page)
28 #
29 #
30 #      PLUTO_VERSION
31 #              indicates  what  version of this interface is being
32 #              used.  This document describes version  1.1.   This
33 #              is upwardly compatible with version 1.0.
34 #
35 #       PLUTO_VERB
36 #              specifies the name of the operation to be performed
37 #              (prepare-host, prepare-client, up-host, up-client,
38 #              down-host, or down-client).  If the address family
39 #              for security gateway to security gateway communica-
40 #              tions is IPv6, then a suffix of -v6 is added to the
41 #              verb.
42 #
43 #       PLUTO_CONNECTION
44 #              is the name of the  connection  for  which  we  are
45 #              routing.
46 #
47 #       PLUTO_INTERFACE
48 #              is the name of the ipsec interface to be used.
49 #
50 #       PLUTO_ME
51 #              is the IP address of our host.
52 #
53 #       PLUTO_MY_ID
54 #              is the ID of our host.
55 #
56 #       PLUTO_MY_CLIENT
57 #              is the IP address / count of our client subnet.  If
58 #              the  client  is  just  the  host,  this will be the
59 #              host's own IP address / max (where max  is  32  for
60 #              IPv4 and 128 for IPv6).
61 #
62 #       PLUTO_MY_SOURCEIP
63 #              if non-empty, then the source address for the route will be
64 #              set to this IP address.
65 #
66 #       PLUTO_MY_PROTOCOL
67 #              is the IP protocol that will be transported.
68 #
69 #       PLUTO_MY_PORT
70 #              is  the  UDP/TCP  port  to  which  the IPsec SA  is
71 #              restricted on our side.
72 #
73 #       PLUTO_PEER
74 #              is the IP address of our peer.
75 #
76 #       PLUTO_PEER_ID
77 #              is the ID of our peer.
78 #
79 #       PLUTO_PEER_CLIENT
80 #              is the IP address / count of the peer's client sub-
81 #              net.   If the client is just the peer, this will be
82 #              the peer's own IP address / max (where  max  is  32
83 #              for IPv4 and 128 for IPv6).
84 #
85 #       PLUTO_PEER_PROTOCOL
86 #              is the IP protocol that will be transported.
87 #
88 #       PLUTO_PEER_PORT
89 #              is  the  UDP/TCP  port  to  which  the IPsec SA  is
90 #              restricted on the peer side.
91 #
92 #       PLUTO_XAUTH_ID
93 #              is an optional user ID employed by the XAUTH protocol
94 #
95 #       PLUTO_MARK_IN
96 #              is an optional XFRM mark set on the inbound IPsec SA
97 #
98 #       PLUTO_MARK_OUT
99 #              is an optional XFRM mark set on the outbound IPsec SA
100 #
101 #       PLUTO_UDP_ENC
102 #              contains the remote UDP port in the case of ESP_IN_UDP
103 #              encapsulation
104 #
105
106 # logging of VPN connections
107 #
108 # tag put in front of each log entry:
109 TAG=vpn
110 #
111 # syslog facility and priority used:
112 FAC_PRIO=local0.notice
113 #
114 # to create a special vpn logging file, put the following line into
115 # the syslog configuration file /etc/syslog.conf:
116 #
117 # local0.notice                   -/var/log/vpn
118 #
119
120 # check interface version
121 case "$PLUTO_VERSION" in
122 1.[0])  # Older Pluto?!?  Play it safe, script may be using new features.
123         echo "$0: obsolete interface version \`$PLUTO_VERSION'," >&2
124         echo "$0:       called by obsolete Pluto?" >&2
125         exit 2
126         ;;
127 1.*)    ;;
128 *)      echo "$0: unknown interface version \`$PLUTO_VERSION'" >&2
129         exit 2
130         ;;
131 esac
132
133 # check parameter(s)
134 case "$1:$*" in
135 ':')                    # no parameters
136         ;;
137 ipfwadm:ipfwadm)        # due to (left/right)firewall; for default script only
138         ;;
139 custom:*)               # custom parameters (see above CAUTION comment)
140         ;;
141 *)      echo "$0: unknown parameters \`$*'" >&2
142         exit 2
143         ;;
144 esac
145
146 # utility functions for route manipulation
147 # Meddling with this stuff should not be necessary and requires great care.
148 uproute() {
149         doroute add
150         ip route flush cache
151 }
152 downroute() {
153         doroute delete
154         ip route flush cache
155 }
156
157 addsource() {
158         st=0
159         if ! ip -o route get ${PLUTO_MY_SOURCEIP%/*} | grep -q ^local
160         then
161             it="ip addr add ${PLUTO_MY_SOURCEIP%/*}/32 dev $PLUTO_INTERFACE"
162             oops="`eval $it 2>&1`"
163             st=$?
164             if test " $oops" = " " -a " $st" != " 0"
165             then
166                 oops="silent error, exit status $st"
167             fi
168             if test " $oops" != " " -o " $st" != " 0"
169             then
170                 echo "$0: addsource \`$it' failed ($oops)" >&2
171             fi
172         fi
173         return $st
174 }
175
176 doroute() {
177         st=0
178         parms="$PLUTO_PEER_CLIENT"
179
180         parms2=
181         if [ -n "$PLUTO_NEXT_HOP" ]
182         then
183            parms2="via $PLUTO_NEXT_HOP"
184         fi
185         parms2="$parms2 dev $PLUTO_INTERFACE"
186
187         if [ -z "$PLUTO_MY_SOURCEIP" ]
188         then
189             for dir in /etc/sysconfig /etc/conf.d; do
190                 if [ -f "$dir/defaultsource" ]
191                 then
192                     . "$dir/defaultsource"
193                 fi
194             done
195
196             if [ -n "$DEFAULTSOURCE" ]
197             then
198                 PLUTO_MY_SOURCEIP=$DEFAULTSOURCE
199             fi
200         fi
201
202         parms3=
203         if test "$1" = "add" -a -n "$PLUTO_MY_SOURCEIP"
204         then
205             addsource
206             parms3="$parms3 src ${PLUTO_MY_SOURCEIP%/*}"
207         fi
208
209         case "$PLUTO_PEER_CLIENT_NET/$PLUTO_PEER_CLIENT_MASK" in
210         "0.0.0.0/0.0.0.0")
211                 # opportunistic encryption work around
212                 # need to provide route that eclipses default, without
213                 # replacing it.
214                 it="ip route $1 0.0.0.0/1 $parms2 $parms3 &&
215                         ip route $1 128.0.0.0/1 $parms2 $parms3"
216                 ;;
217         *)      it="ip route $1 $parms $parms2 $parms3"
218                 ;;
219         esac
220         oops="`eval $it 2>&1`"
221         st=$?
222         if test " $oops" = " " -a " $st" != " 0"
223         then
224             oops="silent error, exit status $st"
225         fi
226         if test " $oops" != " " -o " $st" != " 0"
227         then
228             echo "$0: doroute \`$it' failed ($oops)" >&2
229         fi
230         return $st
231 }
232
233 # define ESP mark
234 ESP_MARK=50
235
236 # add the following static rule to the INPUT chain in the mangle table
237 # iptables -t mangle -A INPUT -p 50 -j MARK --set-mark 50
238
239 # NAT traversal via UDP encapsulation is supported with the rule
240 # iptables -t mangle -A INPUT -p udp --dport 4500 -j MARK --set-mark 50
241
242 # in the presence of KLIPS and ipsecN interfaces do not use ESP mark rules
243 if [ `echo "$PLUTO_INTERFACE" | grep "ipsec"` ]
244 then
245         CHECK_MARK=""
246 else
247         CHECK_MARK="-m mark --mark $ESP_MARK"
248 fi
249
250 # are there port numbers?
251 if [ "$PLUTO_MY_PORT" != 0 ]
252 then
253         S_MY_PORT="--sport $PLUTO_MY_PORT"
254         D_MY_PORT="--dport $PLUTO_MY_PORT"
255 fi
256 if [ "$PLUTO_PEER_PORT" != 0 ]
257 then
258         S_PEER_PORT="--sport $PLUTO_PEER_PORT"
259         D_PEER_PORT="--dport $PLUTO_PEER_PORT"
260 fi
261
262 # resolve octal escape sequences
263 PLUTO_MY_ID=`printf "$PLUTO_MY_ID"`
264 PLUTO_PEER_ID=`printf "$PLUTO_PEER_ID"`
265
266 # the big choice
267 case "$PLUTO_VERB:$1" in
268 prepare-host:*|prepare-client:*)
269         # delete possibly-existing route (preliminary to adding a route)
270         case "$PLUTO_PEER_CLIENT_NET/$PLUTO_PEER_CLIENT_MASK" in
271         "0.0.0.0/0.0.0.0")
272                 # need to provide route that eclipses default, without
273                 # replacing it.
274                 parms1="0.0.0.0/1"
275                 parms2="128.0.0.0/1"
276                 it="ip route delete $parms1 2>&1 ; ip route delete $parms2 2>&1"
277                 oops="`ip route delete $parms1 2>&1 ; ip route delete $parms2 2>&1`"
278                 ;;
279         *)
280                 parms="$PLUTO_PEER_CLIENT"
281                 it="ip route delete $parms 2>&1"
282                 oops="`ip route delete $parms 2>&1`"
283                 ;;
284         esac
285         status="$?"
286         if test " $oops" = " " -a " $status" != " 0"
287         then
288                 oops="silent error, exit status $status"
289         fi
290         case "$oops" in
291         *'RTNETLINK answers: No such process'*)
292                 # This is what route (currently -- not documented!) gives
293                 # for "could not find such a route".
294                 oops=
295                 status=0
296                 ;;
297         esac
298         if test " $oops" != " " -o " $status" != " 0"
299         then
300                 echo "$0: \`$it' failed ($oops)" >&2
301         fi
302         exit $status
303         ;;
304 route-host:*|route-client:*)
305         # connection to me or my client subnet being routed
306         uproute
307         ;;
308 unroute-host:*|unroute-client:*)
309         # connection to me or my client subnet being unrouted
310         downroute
311         ;;
312 up-host:*)
313         # connection to me coming up
314         # If you are doing a custom version, firewall commands go here.
315         iptables -I INPUT 1 -i $PLUTO_INTERFACE -p $PLUTO_MY_PROTOCOL \
316             -s $PLUTO_PEER_CLIENT_NET/$PLUTO_PEER_CLIENT_MASK $S_PEER_PORT \
317             -d $PLUTO_ME $D_MY_PORT $CHECK_MARK -j ACCEPT
318         iptables -I OUTPUT 1 -o $PLUTO_INTERFACE -p $PLUTO_PEER_PROTOCOL \
319             -s $PLUTO_ME $S_MY_PORT \
320             -d $PLUTO_PEER_CLIENT_NET/$PLUTO_PEER_CLIENT_MASK $D_PEER_PORT -j ACCEPT
321         #
322         if [ "$PLUTO_PEER_CLIENT" = "$PLUTO_PEER/32" ]
323         then
324           logger -t $TAG -p $FAC_PRIO \
325             "+ $PLUTO_PEER_ID $PLUTO_PEER -- $PLUTO_ME"
326         else
327           logger -t $TAG -p $FAC_PRIO \
328             "+ $PLUTO_PEER_ID $PLUTO_PEER_CLIENT == $PLUTO_PEER -- $PLUTO_ME"
329         fi
330         ;;
331 down-host:*)
332         # connection to me going down
333         # If you are doing a custom version, firewall commands go here.
334         # connection to me going down
335         # If you are doing a custom version, firewall commands go here.
336         iptables -D INPUT -i $PLUTO_INTERFACE -p $PLUTO_MY_PROTOCOL \
337             -s $PLUTO_PEER_CLIENT_NET/$PLUTO_PEER_CLIENT_MASK $S_PEER_PORT \
338             -d $PLUTO_ME $D_MY_PORT $CHECK_MARK -j ACCEPT
339         iptables -D OUTPUT -o $PLUTO_INTERFACE -p $PLUTO_PEER_PROTOCOL \
340             -s $PLUTO_ME $S_MY_PORT \
341             -d $PLUTO_PEER_CLIENT_NET/$PLUTO_PEER_CLIENT_MASK $D_PEER_PORT -j ACCEPT
342         #
343         if [ "$PLUTO_PEER_CLIENT" = "$PLUTO_PEER/32" ]
344         then
345           logger -t $TAG -p $FAC_PRIO -- \
346             "- $PLUTO_PEER_ID $PLUTO_PEER -- $PLUTO_ME"
347         else
348           logger -t $TAG -p $FAC_PRIO -- \
349           "- $PLUTO_PEER_ID $PLUTO_PEER_CLIENT == $PLUTO_PEER -- $PLUTO_ME"
350         fi
351         ;;
352 up-client:)
353         # connection to my client subnet coming up
354         # If you are doing a custom version, firewall commands go here.
355         iptables -I FORWARD 1 -o $PLUTO_INTERFACE -p $PLUTO_PEER_PROTOCOL \
356             -s $PLUTO_MY_CLIENT_NET/$PLUTO_MY_CLIENT_MASK $S_MY_PORT \
357             -d $PLUTO_PEER_CLIENT_NET/$PLUTO_PEER_CLIENT_MASK $D_PEER_PORT -j ACCEPT
358         iptables -I FORWARD 1 -i $PLUTO_INTERFACE -p $PLUTO_MY_PROTOCOL \
359             -s $PLUTO_PEER_CLIENT_NET/$PLUTO_PEER_CLIENT_MASK $S_PEER_PORT \
360             -d $PLUTO_MY_CLIENT_NET/$PLUTO_MY_CLIENT_MASK $D_MY_PORT \
361                $CHECK_MARK -j ACCEPT
362         #
363         if [ "$PLUTO_PEER_CLIENT" = "$PLUTO_PEER/32" ]
364         then
365           logger -t $TAG -p $FAC_PRIO \
366             "+ $PLUTO_PEER_ID $PLUTO_PEER -- $PLUTO_ME == $PLUTO_MY_CLIENT"
367         else
368           logger -t $TAG -p $FAC_PRIO \
369             "+ $PLUTO_PEER_ID $PLUTO_PEER_CLIENT == $PLUTO_PEER -- $PLUTO_ME == $PLUTO_MY_CLIENT"
370         fi
371         ;;
372 down-client:)
373         # connection to my client subnet going down
374         # If you are doing a custom version, firewall commands go here.
375         iptables -D FORWARD -o $PLUTO_INTERFACE -p $PLUTO_PEER_PROTOCOL \
376             -s $PLUTO_MY_CLIENT_NET/$PLUTO_MY_CLIENT_MASK $S_MY_PORT \
377             -d $PLUTO_PEER_CLIENT_NET/$PLUTO_PEER_CLIENT_MASK $D_PEER_PORT -j ACCEPT
378         iptables -D FORWARD -i $PLUTO_INTERFACE -p $PLUTO_MY_PROTOCOL \
379             -s $PLUTO_PEER_CLIENT_NET/$PLUTO_PEER_CLIENT_MASK $S_PEER_PORT \
380             -d $PLUTO_MY_CLIENT_NET/$PLUTO_MY_CLIENT_MASK $D_MY_PORT \
381                $CHECK_MARK -j ACCEPT
382         #
383         if [ "$PLUTO_PEER_CLIENT" = "$PLUTO_PEER/32" ]
384         then
385           logger -t $TAG -p $FAC_PRIO -- \
386             "- $PLUTO_PEER_ID $PLUTO_PEER -- $PLUTO_ME == $PLUTO_MY_CLIENT"
387         else
388           logger -t $TAG -p $FAC_PRIO -- \
389             "- $PLUTO_PEER_ID $PLUTO_PEER_CLIENT == $PLUTO_PEER -- $PLUTO_ME == $PLUTO_MY_CLIENT"
390         fi
391         ;;
392 up-client:ipfwadm)
393         # connection to client subnet, with (left/right)firewall=yes, coming up
394         # This is used only by the default updown script, not by your custom
395         # ones, so do not mess with it; see CAUTION comment up at top.
396         ipfwadm -F -i accept -b -S $PLUTO_MY_CLIENT_NET/$PLUTO_MY_CLIENT_MASK \
397                 -D $PLUTO_PEER_CLIENT_NET/$PLUTO_PEER_CLIENT_MASK
398         ;;
399 down-client:ipfwadm)
400         # connection to client subnet, with (left/right)firewall=yes, going down
401         # This is used only by the default updown script, not by your custom
402         # ones, so do not mess with it; see CAUTION comment up at top.
403         ipfwadm -F -d accept -b -S $PLUTO_MY_CLIENT_NET/$PLUTO_MY_CLIENT_MASK \
404                 -D $PLUTO_PEER_CLIENT_NET/$PLUTO_PEER_CLIENT_MASK
405         ;;
406 #
407 # IPv6
408 #
409 prepare-host-v6:*|prepare-client-v6:*)
410         ;;
411 route-host-v6:*|route-client-v6:*)
412         # connection to me or my client subnet being routed
413         #uproute_v6
414         ;;
415 unroute-host-v6:*|unroute-client-v6:*)
416         # connection to me or my client subnet being unrouted
417         #downroute_v6
418         ;;
419 up-host-v6:*)
420         # connection to me coming up
421         # If you are doing a custom version, firewall commands go here.
422         ;;
423 down-host-v6:*)
424         # connection to me going down
425         # If you are doing a custom version, firewall commands go here.
426         ;;
427 up-client-v6:)
428         # connection to my client subnet coming up
429         # If you are doing a custom version, firewall commands go here.
430         ;;
431 down-client-v6:)
432         # connection to my client subnet going down
433         # If you are doing a custom version, firewall commands go here.
434         ;;
435 *)      echo "$0: unknown verb \`$PLUTO_VERB' or parameter \`$1'" >&2
436         exit 1
437         ;;
438 esac