b9ae6ed256d5280206890f6667979e5859ddea75
[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_NEXT_HOP
48 #              is the next hop to which packets bound for the peer
49 #              must be sent.
50 #
51 #       PLUTO_INTERFACE
52 #              is the name of the ipsec interface to be used.
53 #
54 #       PLUTO_ME
55 #              is the IP address of our host.
56 #
57 #       PLUTO_MY_ID
58 #              is the ID of our host.
59 #
60 #       PLUTO_MY_CLIENT
61 #              is the IP address / count of our client subnet.  If
62 #              the  client  is  just  the  host,  this will be the
63 #              host's own IP address / max (where max  is  32  for
64 #              IPv4 and 128 for IPv6).
65 #
66 #       PLUTO_MY_CLIENT_NET
67 #              is the IP address of our client net.  If the client
68 #              is just the host, this will be the  host's  own  IP
69 #              address.
70 #
71 #       PLUTO_MY_CLIENT_MASK
72 #              is  the  mask for our client net.  If the client is
73 #              just the host, this will be 255.255.255.255.
74 #
75 #       PLUTO_MY_SOURCEIP
76 #              if non-empty, then the source address for the route will be
77 #              set to this IP address.
78 #
79 #       PLUTO_MY_PROTOCOL
80 #              is the IP protocol that will be transported.
81 #
82 #       PLUTO_MY_PORT
83 #              is  the  UDP/TCP  port  to  which  the IPsec SA  is
84 #              restricted on our side.
85 #
86 #       PLUTO_PEER
87 #              is the IP address of our peer.
88 #
89 #       PLUTO_PEER_ID
90 #              is the ID of our peer.
91 #
92 #       PLUTO_PEER_CA
93 #              is the CA which issued the cert of our peer.
94 #
95 #       PLUTO_PEER_CLIENT
96 #              is the IP address / count of the peer's client sub-
97 #              net.   If the client is just the peer, this will be
98 #              the peer's own IP address / max (where  max  is  32
99 #              for IPv4 and 128 for IPv6).
100 #
101 #       PLUTO_PEER_CLIENT_NET
102 #              is the IP address of the peer's client net.  If the
103 #              client is just the peer, this will  be  the  peer's
104 #              own IP address.
105 #
106 #       PLUTO_PEER_CLIENT_MASK
107 #              is  the  mask  for  the  peer's client net.  If the
108 #              client   is   just   the   peer,   this   will   be
109 #              255.255.255.255.
110 #
111 #       PLUTO_PEER_PROTOCOL
112 #              is the IP protocol that will be transported.
113 #
114 #       PLUTO_PEER_PORT
115 #              is  the  UDP/TCP  port  to  which  the IPsec SA  is
116 #              restricted on the peer side.
117 #
118
119 # logging of VPN connections
120 #
121 # tag put in front of each log entry:
122 TAG=vpn
123 #
124 # syslog facility and priority used:
125 FAC_PRIO=local0.notice
126 #
127 # to create a special vpn logging file, put the following line into
128 # the syslog configuration file /etc/syslog.conf:
129 #
130 # local0.notice                   -/var/log/vpn
131 #
132
133 # check interface version
134 case "$PLUTO_VERSION" in
135 1.[0])  # Older Pluto?!?  Play it safe, script may be using new features.
136         echo "$0: obsolete interface version \`$PLUTO_VERSION'," >&2
137         echo "$0:       called by obsolete Pluto?" >&2
138         exit 2
139         ;;
140 1.*)    ;;
141 *)      echo "$0: unknown interface version \`$PLUTO_VERSION'" >&2
142         exit 2
143         ;;
144 esac
145
146 # check parameter(s)
147 case "$1:$*" in
148 ':')                    # no parameters
149         ;;
150 ipfwadm:ipfwadm)        # due to (left/right)firewall; for default script only
151         ;;
152 custom:*)               # custom parameters (see above CAUTION comment)
153         ;;
154 *)      echo "$0: unknown parameters \`$*'" >&2
155         exit 2
156         ;;
157 esac
158
159 # utility functions for route manipulation
160 # Meddling with this stuff should not be necessary and requires great care.
161 uproute() {
162         doroute add
163         ip route flush cache
164 }
165 downroute() {
166         doroute delete
167         ip route flush cache
168 }
169
170 addsource() {
171         st=0
172         if ! ip -o route get ${PLUTO_MY_SOURCEIP%/*} | grep -q ^local
173         then
174             it="ip addr add ${PLUTO_MY_SOURCEIP%/*}/32 dev $PLUTO_INTERFACE"
175             oops="`eval $it 2>&1`"
176             st=$?
177             if test " $oops" = " " -a " $st" != " 0"
178             then
179                 oops="silent error, exit status $st"
180             fi
181             if test " $oops" != " " -o " $st" != " 0"
182             then
183                 echo "$0: addsource \`$it' failed ($oops)" >&2
184             fi
185         fi
186         return $st
187 }
188
189 doroute() {
190         st=0
191         parms="$PLUTO_PEER_CLIENT"
192
193         parms2=
194         if [ -n "$PLUTO_NEXT_HOP" ]
195         then
196            parms2="via $PLUTO_NEXT_HOP"
197         fi
198         parms2="$parms2 dev $PLUTO_INTERFACE"
199
200         if [ -z "$PLUTO_MY_SOURCEIP" ]
201         then
202             if [ -f /etc/sysconfig/defaultsource ]
203             then
204                 . /etc/sysconfig/defaultsource
205             fi
206
207             if [ -f /etc/conf.d/defaultsource ]
208             then
209                 . /etc/conf.d/defaultsource
210             fi
211
212             if [ -n "$DEFAULTSOURCE" ]
213             then
214                 PLUTO_MY_SOURCEIP=$DEFAULTSOURCE
215             fi
216         fi
217
218         parms3=
219         if test "$1" = "add" -a -n "$PLUTO_MY_SOURCEIP"
220         then
221             addsource
222             parms3="$parms3 src ${PLUTO_MY_SOURCEIP%/*}"
223         fi
224
225         case "$PLUTO_PEER_CLIENT_NET/$PLUTO_PEER_CLIENT_MASK" in
226         "0.0.0.0/0.0.0.0")
227                 # opportunistic encryption work around
228                 # need to provide route that eclipses default, without 
229                 # replacing it.
230                 it="ip route $1 0.0.0.0/1 $parms2 $parms3 &&
231                         ip route $1 128.0.0.0/1 $parms2 $parms3"
232                 ;;
233         *)      it="ip route $1 $parms $parms2 $parms3"
234                 ;;
235         esac
236         oops="`eval $it 2>&1`"
237         st=$?
238         if test " $oops" = " " -a " $st" != " 0"
239         then
240             oops="silent error, exit status $st"
241         fi
242         if test " $oops" != " " -o " $st" != " 0"
243         then
244             echo "$0: doroute \`$it' failed ($oops)" >&2
245         fi
246         return $st
247 }
248  
249 # define ESP mark
250 ESP_MARK=50
251
252 # add the following static rule to the INPUT chain in the mangle table
253 # iptables -t mangle -A INPUT -p 50 -j MARK --set-mark 50
254
255 # NAT traversal via UDP encapsulation is supported with the rule
256 # iptables -t mangle -A INPUT -p udp --dport 4500 -j MARK --set-mark 50
257
258 # in the presence of KLIPS and ipsecN interfaces do not use ESP mark rules
259 if [ `echo "$PLUTO_INTERFACE" | grep "ipsec"` ]
260 then
261         CHECK_MARK=""
262 else
263         CHECK_MARK="-m mark --mark $ESP_MARK"
264 fi
265
266 # are there port numbers?
267 if [ "$PLUTO_MY_PORT" != 0 ]
268 then
269         S_MY_PORT="--sport $PLUTO_MY_PORT"
270         D_MY_PORT="--dport $PLUTO_MY_PORT"
271 fi
272 if [ "$PLUTO_PEER_PORT" != 0 ]
273 then
274         S_PEER_PORT="--sport $PLUTO_PEER_PORT"
275         D_PEER_PORT="--dport $PLUTO_PEER_PORT"
276 fi
277
278 # resolve octal escape sequences
279 PLUTO_MY_ID=`printf "$PLUTO_MY_ID"`
280 PLUTO_PEER_ID=`printf "$PLUTO_PEER_ID"`
281
282 # the big choice
283 case "$PLUTO_VERB:$1" in
284 prepare-host:*|prepare-client:*)
285         # delete possibly-existing route (preliminary to adding a route)
286         case "$PLUTO_PEER_CLIENT_NET/$PLUTO_PEER_CLIENT_MASK" in
287         "0.0.0.0/0.0.0.0")
288                 # need to provide route that eclipses default, without 
289                 # replacing it.
290                 parms1="0.0.0.0/1"
291                 parms2="128.0.0.0/1"
292                 it="ip route delete $parms1 2>&1 ; ip route delete $parms2 2>&1"
293                 oops="`ip route delete $parms1 2>&1 ; ip route delete $parms2 2>&1`"
294                 ;;
295         *)
296                 parms="$PLUTO_PEER_CLIENT"
297                 it="ip route delete $parms 2>&1"
298                 oops="`ip route delete $parms 2>&1`"
299                 ;;
300         esac
301         status="$?"
302         if test " $oops" = " " -a " $status" != " 0"
303         then
304                 oops="silent error, exit status $status"
305         fi
306         case "$oops" in
307         *'RTNETLINK answers: No such process'*) 
308                 # This is what route (currently -- not documented!) gives
309                 # for "could not find such a route".
310                 oops=
311                 status=0
312                 ;;
313         esac
314         if test " $oops" != " " -o " $status" != " 0"
315         then
316                 echo "$0: \`$it' failed ($oops)" >&2
317         fi
318         exit $status
319         ;;
320 route-host:*|route-client:*)
321         # connection to me or my client subnet being routed
322         uproute
323         ;;
324 unroute-host:*|unroute-client:*)
325         # connection to me or my client subnet being unrouted
326         downroute
327         ;;
328 up-host:*)
329         # connection to me coming up
330         # If you are doing a custom version, firewall commands go here.
331         iptables -I INPUT 1 -i $PLUTO_INTERFACE -p $PLUTO_MY_PROTOCOL \
332             -s $PLUTO_PEER_CLIENT_NET/$PLUTO_PEER_CLIENT_MASK $S_PEER_PORT \
333             -d $PLUTO_ME $D_MY_PORT $CHECK_MARK -j ACCEPT
334         iptables -I OUTPUT 1 -o $PLUTO_INTERFACE -p $PLUTO_PEER_PROTOCOL \
335             -s $PLUTO_ME $S_MY_PORT \
336             -d $PLUTO_PEER_CLIENT_NET/$PLUTO_PEER_CLIENT_MASK $D_PEER_PORT -j ACCEPT
337         #
338         if [ "$PLUTO_PEER_CLIENT" = "$PLUTO_PEER/32" ]
339         then
340           logger -t $TAG -p $FAC_PRIO \
341             "+ $PLUTO_PEER_ID $PLUTO_PEER -- $PLUTO_ME"
342         else
343           logger -t $TAG -p $FAC_PRIO \
344             "+ $PLUTO_PEER_ID $PLUTO_PEER_CLIENT == $PLUTO_PEER -- $PLUTO_ME"
345         fi
346         ;;
347 down-host:*)
348         # connection to me going down
349         # If you are doing a custom version, firewall commands go here.
350         # connection to me going down
351         # If you are doing a custom version, firewall commands go here.
352         iptables -D INPUT -i $PLUTO_INTERFACE -p $PLUTO_MY_PROTOCOL \
353             -s $PLUTO_PEER_CLIENT_NET/$PLUTO_PEER_CLIENT_MASK $S_PEER_PORT \
354             -d $PLUTO_ME $D_MY_PORT $CHECK_MARK -j ACCEPT
355         iptables -D OUTPUT -o $PLUTO_INTERFACE -p $PLUTO_PEER_PROTOCOL \
356             -s $PLUTO_ME $S_MY_PORT \
357             -d $PLUTO_PEER_CLIENT_NET/$PLUTO_PEER_CLIENT_MASK $D_PEER_PORT -j ACCEPT
358         #
359         if [ "$PLUTO_PEER_CLIENT" = "$PLUTO_PEER/32" ]
360         then
361           logger -t $TAG -p $FAC_PRIO -- \
362             "- $PLUTO_PEER_ID $PLUTO_PEER -- $PLUTO_ME"
363         else
364           logger -t $TAG -p $FAC_PRIO -- \
365           "- $PLUTO_PEER_ID $PLUTO_PEER_CLIENT == $PLUTO_PEER -- $PLUTO_ME"
366         fi
367         ;;
368 up-client:)
369         # connection to my client subnet coming up
370         # If you are doing a custom version, firewall commands go here.
371         iptables -I FORWARD 1 -o $PLUTO_INTERFACE -p $PLUTO_PEER_PROTOCOL \
372             -s $PLUTO_MY_CLIENT_NET/$PLUTO_MY_CLIENT_MASK $S_MY_PORT \
373             -d $PLUTO_PEER_CLIENT_NET/$PLUTO_PEER_CLIENT_MASK $D_PEER_PORT -j ACCEPT
374         iptables -I FORWARD 1 -i $PLUTO_INTERFACE -p $PLUTO_MY_PROTOCOL \
375             -s $PLUTO_PEER_CLIENT_NET/$PLUTO_PEER_CLIENT_MASK $S_PEER_PORT \
376             -d $PLUTO_MY_CLIENT_NET/$PLUTO_MY_CLIENT_MASK $D_MY_PORT \
377                $CHECK_MARK -j ACCEPT
378         #
379         if [ "$PLUTO_PEER_CLIENT" = "$PLUTO_PEER/32" ]
380         then
381           logger -t $TAG -p $FAC_PRIO \
382             "+ $PLUTO_PEER_ID $PLUTO_PEER -- $PLUTO_ME == $PLUTO_MY_CLIENT"
383         else
384           logger -t $TAG -p $FAC_PRIO \
385             "+ $PLUTO_PEER_ID $PLUTO_PEER_CLIENT == $PLUTO_PEER -- $PLUTO_ME == $PLUTO_MY_CLIENT"
386         fi
387         ;;
388 down-client:)
389         # connection to my client subnet going down
390         # If you are doing a custom version, firewall commands go here.
391         iptables -D FORWARD -o $PLUTO_INTERFACE -p $PLUTO_PEER_PROTOCOL \
392             -s $PLUTO_MY_CLIENT_NET/$PLUTO_MY_CLIENT_MASK $S_MY_PORT \
393             -d $PLUTO_PEER_CLIENT_NET/$PLUTO_PEER_CLIENT_MASK $D_PEER_PORT -j ACCEPT
394         iptables -D FORWARD -i $PLUTO_INTERFACE -p $PLUTO_MY_PROTOCOL \
395             -s $PLUTO_PEER_CLIENT_NET/$PLUTO_PEER_CLIENT_MASK $S_PEER_PORT \
396             -d $PLUTO_MY_CLIENT_NET/$PLUTO_MY_CLIENT_MASK $D_MY_PORT \
397                $CHECK_MARK -j ACCEPT
398         #
399         if [ "$PLUTO_PEER_CLIENT" = "$PLUTO_PEER/32" ]
400         then
401           logger -t $TAG -p $FAC_PRIO -- \
402             "- $PLUTO_PEER_ID $PLUTO_PEER -- $PLUTO_ME == $PLUTO_MY_CLIENT"
403         else
404           logger -t $TAG -p $FAC_PRIO -- \
405             "- $PLUTO_PEER_ID $PLUTO_PEER_CLIENT == $PLUTO_PEER -- $PLUTO_ME == $PLUTO_MY_CLIENT"
406         fi
407         ;;
408 up-client:ipfwadm)
409         # connection to client subnet, with (left/right)firewall=yes, coming up
410         # This is used only by the default updown script, not by your custom
411         # ones, so do not mess with it; see CAUTION comment up at top.
412         ipfwadm -F -i accept -b -S $PLUTO_MY_CLIENT_NET/$PLUTO_MY_CLIENT_MASK \
413                 -D $PLUTO_PEER_CLIENT_NET/$PLUTO_PEER_CLIENT_MASK
414         ;;
415 down-client:ipfwadm)
416         # connection to client subnet, with (left/right)firewall=yes, going down
417         # This is used only by the default updown script, not by your custom
418         # ones, so do not mess with it; see CAUTION comment up at top.
419         ipfwadm -F -d accept -b -S $PLUTO_MY_CLIENT_NET/$PLUTO_MY_CLIENT_MASK \
420                 -D $PLUTO_PEER_CLIENT_NET/$PLUTO_PEER_CLIENT_MASK
421         ;;
422 #
423 # IPv6
424 #
425 prepare-host-v6:*|prepare-client-v6:*)
426         ;;
427 route-host-v6:*|route-client-v6:*)
428         # connection to me or my client subnet being routed
429         #uproute_v6
430         ;;
431 unroute-host-v6:*|unroute-client-v6:*)
432         # connection to me or my client subnet being unrouted
433         #downroute_v6
434         ;;
435 up-host-v6:*)
436         # connection to me coming up
437         # If you are doing a custom version, firewall commands go here.
438         ;;
439 down-host-v6:*)
440         # connection to me going down
441         # If you are doing a custom version, firewall commands go here.
442         ;;
443 up-client-v6:)
444         # connection to my client subnet coming up
445         # If you are doing a custom version, firewall commands go here.
446         ;;
447 down-client-v6:)
448         # connection to my client subnet going down
449         # If you are doing a custom version, firewall commands go here.
450         ;;
451 *)      echo "$0: unknown verb \`$PLUTO_VERB' or parameter \`$1'" >&2
452         exit 1
453         ;;
454 esac