Add new iptables handle task
[rahunas] / tools / firewall.sh.in
1 #!/bin/sh
2 # The firewall script to provides the ability to capture the web request from 
3 # the clients and redirect them to the login page to get the authorization to 
4 # access the network.
5
6 PATH=/sbin:/bin:/usr/sbin:/usr/bin:@prefix@/sbin:@prefix@/bin
7 prefix=@prefix@
8 exec_prefix=@exec_prefix@
9
10 IPTABLES=/sbin/iptables
11 IPSET=/usr/sbin/ipset
12
13 NAME="rahunas"
14 INIT=@sysconfdir@/default/rahunas
15 RUN=@localstatedir@/run/rahunas-firewall
16 VSERVER_LIST=@localstatedir@/run/rahunas-vserver
17
18 RUN_DAEMON=no
19
20 test -f $INIT || exit 0 
21 . $INIT
22
23 test "$RUN_DAEMON" = "yes" || exit 0
24 test -f $RAHUNAS_CONFIG || exit 1
25 test -f $VSERVER_LIST || touch $VSERVER_LIST
26
27 get_section_name () {
28   file=$1
29   
30   grep "^.*\= {$" $file | sed "s/= {//" |  sed "s/^ *\(.*[^ ]\) *$/\1/"
31 }
32
33 get_config_value () {
34   section=$1
35   key=$2
36   file=$3
37
38   cat $file | sed -e "0,/$section = {/ ! { /}/,/$section = {/ ! s/^/>>/ }" | grep "^>>" | sed -e "s/^>>//g" | grep -w "$key" | cut -d= -f2 | sed "s/^ *\(.*[^ ]\) *$/\1/" | sed 's/"//g'
39 }
40
41 ##
42 #  Global Declaration
43 ##
44
45 # Main
46 MAIN_CONF_DIR=`get_config_value main conf_dir $RAHUNAS_CONFIG`
47 MAIN_BANDWIDTH_SHAPE=`get_config_value main bandwidth_shape $RAHUNAS_CONFIG`
48 MAIN_BITTORRENT_DOWNLOAD_MAX=`get_config_value main bittorrent_download_max $RAHUNAS_CONFIG`
49 MAIN_BITTORRENT_UPLOAD_MAX=`get_config_value main bittorrent_upload_max $RAHUNAS_CONFIG`
50 MAIN_DHCP=`get_config_value main dhcp $RAHUNAS_CONFIG`
51
52 if [ "$ENV_OVERRIDE" != "yes" ]; then
53   # Virtual Server : config
54   VSERVER_ID=
55   DEV_EXTERNAL=
56   DEV_INTERNAL=
57   BRIDGE=
58   MASQUERADE=
59   IGNORE_MAC=
60   VSERVER_IP=
61   CLIENTS=
62   EXCLUDED=
63   DNS=
64   SSH=
65   PROXY=
66   PROXY_HOST=
67   PROXY_PORT=
68   BITTORRENT=
69   BITTORRENT_ALLOW=
70   VSERVER_PORTS_ALLOW=
71   VSERVER_PORTS_INTERCEPT=
72   SETNAME=
73 fi
74
75 BANDWIDTH_SHAPE=
76 BITTORRENT_DOWNLOAD_MAX=
77 BITTORRENT_UPLOAD_MAX=
78
79
80 # Virtual Server : set and chains
81 CHAIN_INPUT=
82 CHAIN_INPUT_AUTH=
83 CHAIN_FORWARD=
84 CHAIN_FORWARD_AUTH=
85 CHAIN_MANGLE_PREROUTING=
86 CHAIN_MANGLE_FORWARD=
87 CHAIN_MANGLE_POSTROUTING=
88 CHAIN_NAT_PREROUTING=
89 CHAIN_NAT_POSTROUTING=
90 CHAIN_NAT_AUTHEN=
91 CHAIN_P2P_DETECT=
92 CHAIN_P2P_RECHECK=
93 CHAIN_P2P_CHECK=
94 P2P_SET=
95 P2P_ALLOW_SET=
96 DEV_IN_PARAM=
97 DEV_OUT_PARAM=
98
99 get_config () {
100   file=$1
101   opt=$2
102
103   if [ "$ENV_OVERRIDE" != "yes" ]; then
104     test -f $file || return 1
105   
106     SETNAME=`get_section_name $file`
107   
108     # Get configuration
109     VSERVER_ID=`get_config_value $SETNAME vserver_id $file`
110     test -n "$VSERVER_ID" || return 2
111   
112     if [ "$opt" = "start" ]; then
113       hash="$VSERVER_ID:$SETNAME"
114       test1=`grep -w "$hash" $VSERVER_LIST` || true
115       test2=`grep -w "$SETNAME" $VSERVER_LIST` || true
116     
117       test -n "$test1" -o -n "$test2" && return 3 
118   
119       echo "$hash:$file" >> $VSERVER_LIST
120     fi
121   
122     DEV_EXTERNAL=`get_config_value $SETNAME dev_external $file`
123     DEV_INTERNAL=`get_config_value $SETNAME dev_internal $file`
124     BRIDGE=`get_config_value $SETNAME bridge $file`
125     MASQUERADE=`get_config_value $SETNAME masquerade $file`
126     IGNORE_MAC=`get_config_value $SETNAME ignore_mac $file`
127     VSERVER_IP=`get_config_value $SETNAME vserver_ip $file`
128     CLIENTS=`get_config_value $SETNAME clients $file`
129     EXCLUDED=`get_config_value $SETNAME excluded $file`
130     DNS=`get_config_value $SETNAME dns $file`
131     SSH=`get_config_value $SETNAME ssh $file`
132     PROXY=`get_config_value $SETNAME proxy $file`
133     PROXY_HOST=`get_config_value $SETNAME proxy_host $file`
134     PROXY_PORT=`get_config_value $SETNAME proxy_port $file`
135     BITTORRENT=`get_config_value $SETNAME bittorrent $file`
136     BITTORRENT_ALLOW=`get_config_value $SETNAME bittorrent_allow $file`
137     VSERVER_PORTS_ALLOW=`get_config_value $SETNAME vserver_ports_allow $file`
138     VSERVER_PORTS_INTERCEPT=`get_config_value $SETNAME vserver_ports_intercept $file`
139   fi
140  
141   BANDWIDTH_SHAPE=$MAIN_BANDWIDTH_SHAPE
142   BITTORRENT_DOWNLOAD_MAX=$MAIN_BITTORRENT_DOWNLOAD_MAX
143   BITTORRENT_UPLOAD_MAX=$MAIN_BITTORRENT_UPLOAD_MAX
144
145   # Bridge config
146   if [ "$BRIDGE" = "yes" ]; then
147     DEV_IN_PARAM="-m physdev --physdev-in"
148     DEV_OUT_PARAM="-m physdev --physdev-out"
149   else
150     DEV_IN_PARAM="-i"
151     DEV_OUT_PARAM="-o"
152   fi
153   
154   # Chains declaration
155   CHAIN_INPUT="${SETNAME}_in"
156   CHAIN_INPUT_AUTH="${SETNAME}_in_auth"
157   CHAIN_FORWARD="${SETNAME}_fwd"
158   CHAIN_FORWARD_AUTH="${SETNAME}_fwd_auth"
159   CHAIN_MANGLE_PREROUTING="${SETNAME}_mg_pre"
160   CHAIN_MANGLE_FORWARD="${SETNAME}_mg_fwd"
161   CHAIN_MANGLE_POSTROUTING="${SETNAME}_mg_post"
162   CHAIN_NAT_PREROUTING="${SETNAME}_nat_pre"
163   CHAIN_NAT_POSTROUTING="${SETNAME}_nat_post"
164   CHAIN_NAT_AUTHEN="${SETNAME}_nat_authen"
165   
166   # P2P checking chains declaration
167   CHAIN_P2P_DETECT="${SETNAME}_p2p_detect"
168   CHAIN_P2P_RECHECK="${SETNAME}_p2p_rechk"
169   CHAIN_P2P_CHECK="${SETNAME}_p2p_chk"
170   P2P_SET="${SETNAME}_p2p"
171   P2P_ALLOW_SET="${SETNAME}_p2p_allow"
172 }
173
174 ##
175 # Add set
176 ##
177 add_set () {
178   ipset_opt=""
179   ipset_ignoremac=""
180   
181   ipset_opt="--network $CLIENTS"
182   
183   if [ "$IGNORE_MAC" = "yes" ]; then
184     ipset_ignoremac="--ignoremac"
185   fi
186   
187   $IPSET -N $SETNAME rahunas $ipset_opt $ipset_ignoremac 
188
189   if [ "$BITTORRENT" = "throttle" ]; then
190     $IPSET -N $P2P_SET iphash
191   fi
192
193   if [ -n "$BITTORRENT_ALLOW" ]; then
194     $IPSET -N $P2P_ALLOW_SET iphash 
195     for ip in $BITTORRENT_ALLOW
196     do
197       $IPSET -A $P2P_ALLOW_SET $ip
198     done
199   fi
200 }
201
202 ##
203 # Cleanup set
204 ##
205 cleanup_set () {
206   $IPSET -F $SETNAME
207   $IPSET -X $SETNAME
208
209   if [ "$BITTORRENT" = "throttle" ]; then
210     $IPSET -F $P2P_SET
211     $IPSET -X $P2P_SET 
212   fi
213
214   if [ -n "$BITTORRENT_ALLOW" ]; then
215     $IPSET -F $P2P_ALLOW_SET
216     $IPSET -X $P2P_ALLOW_SET 
217   fi
218 }
219
220 ##
221 # Navigation rules
222 ##
223 navigation_rules () {
224   opt=$1
225   if [ "$opt" = "start" ]; then
226     action="-I"
227   elif [ "$opt" = "stop" ]; then
228     action="-D"
229   fi
230
231   # INPUT from external
232   # TODO: Make a common firewall to filter the external requests.
233   $IPTABLES $action INPUT \
234     $DEV_IN_PARAM $DEV_EXTERNAL -j ACCEPT 
235
236   # INPUT
237   $IPTABLES $action INPUT \
238     $DEV_IN_PARAM $DEV_INTERNAL -s $CLIENTS \
239     -j $CHAIN_INPUT
240   $IPTABLES $action INPUT -m connmark --mark 2/2 \
241     $DEV_IN_PARAM $DEV_INTERNAL -s $CLIENTS \
242     -j $CHAIN_INPUT_AUTH
243
244   # FORWARD
245   $IPTABLES $action FORWARD \
246     $DEV_OUT_PARAM $DEV_INTERNAL -d $CLIENTS \
247     -j $CHAIN_FORWARD
248   $IPTABLES $action FORWARD \
249     $DEV_IN_PARAM $DEV_INTERNAL -s $CLIENTS \
250     -j $CHAIN_FORWARD
251
252   # In some situation the connections could not established before
253   # the FORWARD rules allow the clients, thus the connections never mark.
254   # Just allow them passthrough the rules if the connections do not mark but
255   # the clients are in the set (allow them).
256   $IPTABLES $action FORWARD -m set --set $SETNAME dst -j $CHAIN_FORWARD_AUTH
257   $IPTABLES $action FORWARD -m set --set $SETNAME src -j $CHAIN_FORWARD_AUTH
258
259   $IPTABLES $action FORWARD -m connmark --mark 2/2 \
260     $DEV_OUT_PARAM $DEV_INTERNAL -d $CLIENTS \
261     -j $CHAIN_FORWARD_AUTH
262   $IPTABLES $action FORWARD -m connmark --mark 2/2 \
263     $DEV_IN_PARAM $DEV_INTERNAL -s $CLIENTS \
264     -j $CHAIN_FORWARD_AUTH
265
266   # MANGLE
267   $IPTABLES -t mangle $action PREROUTING \
268     $DEV_IN_PARAM $DEV_INTERNAL -s $CLIENTS \
269     -j $CHAIN_MANGLE_PREROUTING
270   $IPTABLES -t mangle $action PREROUTING \
271     $DEV_IN_PARAM $DEV_EXTERNAL -d $CLIENTS \
272     -j $CHAIN_MANGLE_PREROUTING
273
274   $IPTABLES -t mangle $action FORWARD \
275     $DEV_OUT_PARAM $DEV_INTERNAL -d $CLIENTS \
276     -j $CHAIN_MANGLE_FORWARD
277   $IPTABLES -t mangle $action FORWARD \
278     $DEV_IN_PARAM $DEV_INTERNAL -s $CLIENTS \
279     -j $CHAIN_MANGLE_FORWARD
280
281   $IPTABLES -t mangle $action POSTROUTING \
282     $DEV_OUT_PARAM $DEV_INTERNAL -d $CLIENTS \
283     -j $CHAIN_MANGLE_POSTROUTING
284   $IPTABLES -t mangle $action POSTROUTING \
285     $DEV_OUT_PARAM $DEV_EXTERNAL -s $CLIENTS \
286     -j $CHAIN_MANGLE_POSTROUTING
287
288   # NAT
289   $IPTABLES -t nat $action PREROUTING \
290     $DEV_IN_PARAM $DEV_INTERNAL -s $CLIENTS \
291     -j $CHAIN_NAT_PREROUTING
292   $IPTABLES -t nat $action PREROUTING \
293     $DEV_IN_PARAM $DEV_EXTERNAL -d $CLIENTS \
294     -j $CHAIN_NAT_PREROUTING
295
296   $IPTABLES -t nat $action POSTROUTING \
297     $DEV_OUT_PARAM $DEV_INTERNAL -d $CLIENTS \
298     -j $CHAIN_NAT_POSTROUTING
299   $IPTABLES -t nat $action POSTROUTING \
300     $DEV_OUT_PARAM $DEV_EXTERNAL -s $CLIENTS \
301     -j $CHAIN_NAT_POSTROUTING
302 }
303
304 ##
305 # Cleanup old rules
306 ##
307 cleanup () {
308
309   navigation_rules stop  
310
311   $IPTABLES -F $CHAIN_INPUT_AUTH
312   $IPTABLES -X $CHAIN_INPUT_AUTH
313
314   $IPTABLES -F $CHAIN_INPUT
315   $IPTABLES -X $CHAIN_INPUT
316   
317   $IPTABLES -F $CHAIN_FORWARD_AUTH
318   $IPTABLES -X $CHAIN_FORWARD_AUTH
319
320   $IPTABLES -F $CHAIN_FORWARD
321   $IPTABLES -X $CHAIN_FORWARD
322   
323   $IPTABLES -t mangle -F $CHAIN_MANGLE_PREROUTING
324   $IPTABLES -t mangle -X $CHAIN_MANGLE_PREROUTING
325
326   $IPTABLES -t mangle -F $CHAIN_MANGLE_POSTROUTING
327   $IPTABLES -t mangle -X $CHAIN_MANGLE_POSTROUTING
328   
329   $IPTABLES -t nat -F $CHAIN_NAT_PREROUTING
330   $IPTABLES -t nat -X $CHAIN_NAT_PREROUTING
331   
332   $IPTABLES -t mangle -F $CHAIN_MANGLE_FORWARD
333   $IPTABLES -t mangle -X $CHAIN_MANGLE_FORWARD
334
335   $IPTABLES -t nat -F $CHAIN_NAT_POSTROUTING
336   $IPTABLES -t nat -X $CHAIN_NAT_POSTROUTING
337   
338   $IPTABLES -t nat -F $CHAIN_NAT_AUTHEN
339   $IPTABLES -t nat -X $CHAIN_NAT_AUTHEN
340
341   if [ "$BITTORRENT" = "throttle" ]; then
342     $IPTABLES -t mangle -F $CHAIN_P2P_CHECK
343     $IPTABLES -t mangle -X $CHAIN_P2P_CHECK
344
345     $IPTABLES -t mangle -F $CHAIN_P2P_RECHECK
346     $IPTABLES -t mangle -X $CHAIN_P2P_RECHECK
347
348     $IPTABLES -t mangle -F $CHAIN_P2P_DETECT
349     $IPTABLES -t mangle -X $CHAIN_P2P_DETECT
350   fi
351 }
352
353 ##
354 # Define new chains
355 ##
356 new_chains () {
357   $IPTABLES -N $CHAIN_INPUT_AUTH
358   $IPTABLES -N $CHAIN_INPUT
359   $IPTABLES -N $CHAIN_FORWARD_AUTH
360   $IPTABLES -N $CHAIN_FORWARD
361   $IPTABLES -t mangle -N $CHAIN_MANGLE_PREROUTING
362   $IPTABLES -t mangle -N $CHAIN_MANGLE_FORWARD
363   $IPTABLES -t mangle -N $CHAIN_MANGLE_POSTROUTING
364   $IPTABLES -t nat -N $CHAIN_NAT_PREROUTING
365   $IPTABLES -t nat -N $CHAIN_NAT_POSTROUTING
366   $IPTABLES -t nat -N $CHAIN_NAT_AUTHEN
367
368   if [ "$BITTORRENT" = "throttle" ]; then
369     $IPTABLES -t mangle -N $CHAIN_P2P_CHECK
370     $IPTABLES -t mangle -N $CHAIN_P2P_RECHECK
371     $IPTABLES -t mangle -N $CHAIN_P2P_DETECT
372   fi
373 }
374
375 ##
376 # Policy
377 ##
378 policy () {
379   $IPTABLES -P INPUT DROP
380   $IPTABLES -P OUTPUT ACCEPT
381   $IPTABLES -P FORWARD DROP 
382
383   $IPTABLES -A INPUT -i lo -j ACCEPT
384
385   # DHCP Settings
386
387   if [ "$MAIN_DHCP" = "yes" ]; then
388     $IPTABLES -A INPUT -p udp --dport 67:68 -j ACCEPT 
389     $IPTABLES -A FORWARD -p udp --dport 67:68 -j DROP
390   elif [ "$MAIN_DHCP" = "no" ]; then
391     $IPTABLES -A INPUT -p udp --dport 67:68 -j DROP 
392     $IPTABLES -A FORWARD -p udp --dport 67:68 -j DROP
393   elif [ "$MAIN_DHCP" = "forward" ]; then
394     $IPTABLES -A INPUT -p udp --dport 67:68 -j DROP 
395     $IPTABLES -A FORWARD -p udp --dport 67:68 -j ACCEPT
396   fi
397 }
398
399 cleanup_policy () {
400   # Assume before the script running the default policy are all ACCEPT
401   $IPTABLES -P INPUT ACCEPT
402   $IPTABLES -P OUTPUT ACCEPT
403   $IPTABLES -P FORWARD ACCEPT 
404
405   $IPTABLES -D INPUT -i lo -j ACCEPT
406
407   # DHCP Settings
408
409   if [ "$MAIN_DHCP" = "yes" ]; then
410     $IPTABLES -D INPUT -p udp --dport 67:68 -j ACCEPT 
411     $IPTABLES -D FORWARD -p udp --dport 67:68 -j DROP
412   elif [ "$MAIN_DHCP" = "no" ]; then
413     $IPTABLES -D INPUT -p udp --dport 67:68 -j DROP 
414     $IPTABLES -D FORWARD -p udp --dport 67:68 -j DROP
415   elif [ "$MAIN_DHCP" = "forward" ]; then
416     $IPTABLES -D INPUT -p udp --dport 67:68 -j DROP 
417     $IPTABLES -D FORWARD -p udp --dport 67:68 -j ACCEPT
418   fi
419 }
420
421 rules () {
422
423   navigation_rules start
424   
425   ##
426   # Allow all traffic for established and related connections
427   ##
428   
429   $IPTABLES -A $CHAIN_INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
430   $IPTABLES -A $CHAIN_FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
431   
432   $IPTABLES -A $CHAIN_INPUT -i lo -j ACCEPT
433   
434   ##
435   # Allow incoming to our DNS server
436   ##
437   if [ "$DNS" = "yes" ]; then
438     $IPTABLES -A $CHAIN_INPUT -p udp --dport domain -j ACCEPT
439     $IPTABLES -A $CHAIN_FORWARD -p udp --dport domain -j DROP
440   elif [ "$DNS" = "no" ]; then
441     $IPTABLES -A $CHAIN_INPUT -p udp --dport domain -j DROP
442     $IPTABLES -A $CHAIN_FORWARD -p udp --dport domain -j ACCEPT
443   elif [ "$DNS" = "forward" ]; then
444     $IPTABLES -A $CHAIN_INPUT -p udp --dport domain -j ACCEPT
445     $IPTABLES -A $CHAIN_FORWARD -p udp --dport domain -j ACCEPT
446   fi 
447
448   ##
449   # Allow incoming to our HTTP server for login page
450   ##
451   $IPTABLES -A $CHAIN_INPUT -p tcp -m multiport -d $VSERVER_IP\
452      --dports $VSERVER_PORTS_ALLOW \
453     -m recent --rcheck --seconds 6 --name incoming_throttle -j DROP
454
455   $IPTABLES -A $CHAIN_INPUT -p tcp -m multiport -d $VSERVER_IP \
456     --dports $VSERVER_PORTS_ALLOW \
457     -m hashlimit --hashlimit 20/sec \
458     --hashlimit-mode srcip --hashlimit-burst 30 \
459     --hashlimit-htable-expire 4000 --hashlimit-name incoming \
460     -j ACCEPT
461
462   $IPTABLES -A $CHAIN_INPUT -p tcp -m multiport -d $VSERVER_IP \
463     --dports $VSERVER_PORTS_ALLOW \
464     -m recent --set --name incoming_throttle -j DROP
465   
466   ##
467   # Allow incoming to our SSH server for remote maintenance access
468   ##
469   if [ "$SSH" = "yes" ]; then
470     $IPTABLES -A $CHAIN_INPUT -p tcp -d $VSERVER_IP --dport ssh -j ACCEPT
471   fi
472
473   ##
474   # Allow rate limited ICMP 
475   ##
476   $IPTABLES -A $CHAIN_INPUT -p icmp -m limit --limit 5/second \
477     -d $VSERVER_IP -j ACCEPT
478
479
480
481   ##
482   # Bittorrent Blocking (layer7 module in kernel is needed)
483   # Note: 
484   #   bittorrent-announce is customized pattern, warning if not exists.
485   ##
486   if [ "$BITTORRENT" = "yes" -o -n "$BITTORRENT_ALLOW" ]; then
487     if [ -n "$BITTORRENT_ALLOW" ]; then
488       BITTORRENT_ALLOW_OPTIONS="-m set ! --set $P2P_ALLOW_SET"
489
490       # Source host
491       $IPTABLES -t mangle -A $CHAIN_MANGLE_PREROUTING -m layer7 --l7proto bittorrent-announce $BITTORRENT_ALLOW_OPTIONS src -j DROP
492       $IPTABLES -t mangle -A $CHAIN_MANGLE_PREROUTING -m layer7 --l7proto bittorrent $BITTORRENT_ALLOW_OPTIONS src -j DROP
493     fi
494   else
495       $IPTABLES -t mangle -A $CHAIN_MANGLE_PREROUTING -m layer7 --l7proto bittorrent-announce -j DROP
496       $IPTABLES -t mangle -A $CHAIN_MANGLE_PREROUTING -m layer7 --l7proto bittorrent -j DROP
497   fi
498   
499   ##
500   # Mark the connections that have been authorized
501   ##
502   $IPTABLES -t mangle -A $CHAIN_MANGLE_PREROUTING -m set --set $SETNAME dst -j CONNMARK --set-mark 2 
503   $IPTABLES -t mangle -A $CHAIN_MANGLE_PREROUTING -m set --set $SETNAME src -j CONNMARK --set-mark 2 
504
505   ##
506   # P2P Throttle
507   ##
508   if [ "$BITTORRENT" = "throttle" ]; then
509     $IPTABLES -t mangle -A $CHAIN_MANGLE_FORWARD -m connmark --mark 2/2 -j $CHAIN_P2P_CHECK
510     $IPTABLES -t mangle -A $CHAIN_MANGLE_FORWARD -m set --set $P2P_SET src -j MARK --set-mark 3
511     $IPTABLES -t mangle -A $CHAIN_MANGLE_FORWARD -m set --set $P2P_SET dst -j MARK --set-mark 3
512
513
514     $IPTABLES -t mangle -A $CHAIN_P2P_CHECK -m layer7 --l7proto bittorrent -j $CHAIN_P2P_DETECT
515     $IPTABLES -t mangle -A $CHAIN_P2P_CHECK -m layer7 --l7proto bittorrent-announce -j $CHAIN_P2P_DETECT
516     $IPTABLES -t mangle -A $CHAIN_P2P_CHECK -m set --set $P2P_SET src -j $CHAIN_P2P_RECHECK
517     $IPTABLES -t mangle -A $CHAIN_P2P_CHECK -j RETURN
518
519
520     $IPTABLES -t mangle -A $CHAIN_P2P_DETECT -m recent --name $P2P_SET --update --seconds 600 -j RETURN
521     $IPTABLES -t mangle -A $CHAIN_P2P_DETECT -j SET --add-set $P2P_SET src
522     $IPTABLES -t mangle -A $CHAIN_P2P_DETECT -m recent --name $P2P_SET --set -j RETURN
523
524     $IPTABLES -t mangle -A $CHAIN_P2P_RECHECK -m recent --name $P2P_SET --rcheck --seconds 600 -j RETURN
525     $IPTABLES -t mangle -A $CHAIN_P2P_RECHECK -j SET --del-set $P2P_SET src
526     $IPTABLES -t mangle -A $CHAIN_P2P_RECHECK -m recent --name $P2P_SET --remove -j RETURN 
527   fi
528    
529   ##
530   # Accept Forwarding for the authorized clients
531   ##
532   $IPTABLES -A $CHAIN_FORWARD_AUTH -j ACCEPT
533
534   ##
535   # SQUID Cache-Proxy
536   ##
537   if [ "$PROXY" = "yes" -o "$PROXY" = "transparent" ]; then
538     if [ "$PROXY_HOST" = "localhost" -o "$PROXY_HOST" = "127.0.0.1" ]; then
539       $IPTABLES -A $CHAIN_INPUT_AUTH -p tcp --dport $PROXY_PORT -j ACCEPT
540     fi
541
542     if [ "$PROXY" = "transparent" ]; then
543       if [ "$PROXY_HOST" = "localhost" -o "$PROXY_HOST" = "127.0.0.1" ]; then
544         $IPTABLES -t nat -A $CHAIN_NAT_PREROUTING -p tcp --dport http \
545           -m connmark --mark 2/2 -j REDIRECT --to-ports $PROXY_PORT
546       else
547         $IPTABLES -t nat -A $CHAIN_NAT_PRETROUTING -p tcp --dport http \
548           -m connmark --mark 2/2 \
549           -j DNAT --to-destination $PROXY_HOST:$PROXY_PORT
550       fi
551     fi
552   fi
553   
554   ##
555   # Redirect unauthorized clients to login page (with rate limited throttling)
556   ##
557   
558   $IPTABLES -t nat -A $CHAIN_NAT_PREROUTING -p tcp -m multiport \
559     --dports $VSERVER_PORTS_INTERCEPT -d ! $VSERVER_IP \
560     -m connmark ! --mark 2/2 \
561     -j $CHAIN_NAT_AUTHEN
562   
563   $IPTABLES -t nat -A $CHAIN_NAT_AUTHEN -p tcp \
564     -j DNAT --to-destination $VSERVER_IP:80
565
566   ##
567   # MASQUERADE
568   ##
569   if [ "$MASQUERADE" = "yes" ]; then
570     $IPTABLES -t nat -A $CHAIN_NAT_POSTROUTING $DEV_OUT_PARAM $DEV_EXTERNAL \
571       -j MASQUERADE
572   fi
573
574   ##
575   # Excluded IP
576   ##
577   for excluded in $EXCLUDED;
578   do
579     $IPTABLES -t mangle -I $CHAIN_MANGLE_PREROUTING -s $excluded \
580       -j CONNMARK --set-mark 2
581     $IPTABLES -t mangle -I $CHAIN_MANGLE_PREROUTING -d $excluded \
582       -j CONNMARK --set-mark 2
583   done 
584   
585   ##
586   # Bandwidth Shaping: IMQ - Intermediate Queueing Device
587   ##
588   if [ "$BANDWIDTH_SHAPE" = "yes" ]; then
589     $IPTABLES -t mangle -I $CHAIN_MANGLE_POSTROUTING $DEV_OUT_PARAM $DEV_INTERNAL -j IMQ --todev 0
590     $IPTABLES -t mangle -I $CHAIN_MANGLE_PREROUTING $DEV_IN_PARAM $DEV_INTERNAL -j IMQ --todev 1
591   fi
592
593   ##
594   # Return to main chains
595   ##
596   $IPTABLES -A $CHAIN_INPUT_AUTH -j RETURN
597   $IPTABLES -A $CHAIN_INPUT -j RETURN
598   $IPTABLES -A $CHAIN_FORWARD_AUTH -j RETURN
599   $IPTABLES -A $CHAIN_FORWARD -j RETURN
600   $IPTABLES -t mangle -A $CHAIN_MANGLE_PREROUTING -j RETURN
601   $IPTABLES -t mangle -A $CHAIN_MANGLE_FORWARD -j RETURN
602   $IPTABLES -t mangle -A $CHAIN_MANGLE_POSTROUTING -j RETURN
603   $IPTABLES -t nat -A $CHAIN_NAT_PREROUTING -j RETURN
604   $IPTABLES -t nat -A $CHAIN_NAT_POSTROUTING -j RETURN
605 }
606
607 do_get_config () {
608   file=$1
609   opt=$2
610   get_config $file $opt || true
611   if [ $? -eq 1 ]; then
612     echo "Error: Could not parsing $file, file does not exists"
613     return 1
614   elif [ $? -eq 2 ]; then
615     echo "Error: Could not parsing $file, config file is malformed"
616     return 2
617   elif [ $? -eq 3 ]; then
618     if [ "$opt" != "stop" ]; then
619       echo "Error: Could not parsing $file, network's name is duplicated!"
620       return 3
621     fi
622   fi
623 }
624
625 start () {
626   test ! -f $RUN || return 0
627
628   if [ ! -d $MAIN_CONF_DIR ]; then
629     echo "Error: The config directory $MAIN_CONF_DIR does not exists"
630     exit 1
631   fi
632
633   policy 
634
635   touch $RUN
636 }
637
638 stop () {
639   test -f $RUN || return 0
640    
641   cleanup_policy
642
643   rm -f $RUN
644   echo "" > $VSERVER_LIST
645 }
646
647 restart() {
648   stop
649   start
650 }
651
652 start_config() {
653   add_set
654   new_chains
655   rules
656 }
657
658 start_config_env() {
659   do_get_config "" start
660   start_config
661 }
662
663 start_config_file() {
664   file=$1
665   do_get_config $file start
666   if [ $? -gt 0 ]; then
667     return
668   fi 
669   
670   start_config
671 }
672
673 stop_config() {
674   cleanup
675   cleanup_set
676 }
677
678 stop_config_env() {
679   do_get_config "" stop
680   stop_config
681 }
682
683 stop_config_file() {
684   file=$1
685   do_get_config $file stop
686   if [ $? -gt 0 ]; then
687     return
688   fi 
689
690   stop_config
691 }
692
693 case "$1" in
694   start)
695     start
696     ;;
697   stop)
698     stop
699     ;;
700   restart)
701     restart
702     ;;
703   start-config)
704     if [ "$ENV_OVERRIDE" = "yes" ]; then
705       start_config_env
706     elif [ -f "$2" ]; then
707       start_config_file $2
708     fi
709     ;;
710   stop-config)
711     if [ "$ENV_OVERRIDE" = "yes" ]; then
712       stop_config_env
713     elif [ -f "$2" ]; then
714       stop_config_file $2
715     fi
716     ;;
717   *)
718     N=@sysconfdir@/rahunas/firewall.sh
719     echo "Usage: $N {start|stop|restart}"
720     exit 3
721     ;;
722 esac 
723
724 exit 0