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