Add Session-Timeout support, prepare bandwidth var
[rahunas] / rahunas.firewall
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 IPTABLES=/sbin/iptables
7 IPSET=/usr/sbin/ipset
8
9 NAME="rahunas"
10
11 # These values are overriden in /etc/default/rahunas if they exist
12 RUN_DAEMON=no
13 DEV_WAN="eth0"
14 DEV_LAN="eth1"
15 BRIDGE=""
16 CLIENTS_RANGE_START="192.168.0.2"
17 CLIENTS_RANGE_END="192.168.0.254"
18 CLIENTS_NETWORK=""
19 CLIENTS_IGNORE_MAC=no
20
21 # Get configuration
22 if [ -r /etc/default/rahunas ]; then
23   . /etc/default/rahunas
24 fi
25
26 if [ "$RUN_DAEMON" = "no" ]; then
27   exit 0
28 fi
29
30 # Bridge config
31
32 if [ "$BRIDGE" = "yes" ]; then
33   DEV_IN_PARAM="-m physdev --physdev-in"
34 else
35   DEV_IN_PARAM="-i"
36 fi
37
38 # Set declaration
39 SETNAME="${NAME}_set"
40
41 # Chains declaration
42 CHAIN_INPUT="${NAME}_input"
43 CHAIN_FORWARD="${NAME}_forward"
44 CHAIN_MANGLE_PREROUTING="${NAME}_mangle_prerouting"
45 CHAIN_NAT_PREROUTING="${NAME}_nat_prerouting"
46 CHAIN_NAT_POSTROUTING="${NAME}_nat_postrouting"
47 CHAIN_NAT_AUTHEN="${NAME}_nat_authen"
48
49 ##
50 # Add set
51 ##
52 add_set () {
53   ipset_opt=""
54   ipset_ignoremac=""
55   
56   if [ "$CLIENTS_NETWORK" != "" ]; then
57     ipset_opt="--network $CLIENTS_NETWORK"
58   else
59     ipset_opt="--from $CLIENTS_RANGE_START --to $CLIENTS_RANGE_END"
60   fi
61   
62   if [ "$CLIENTS_IGNORE_MAC" = "yes" ]; then
63     ipset_ignoremac="--ignoremac"
64   fi
65   
66   $IPSET -N $SETNAME rahunas $ipset_opt $ipset_ignoremac 
67 }
68
69 ##
70 # Cleanup set
71 ##
72 cleanup_set () {
73   $IPSET -F $SETNAME
74   $IPSET -X $SETNAME
75 }
76
77 ##
78 # Cleanup old rules
79 ##
80 cleanup () {
81   $IPTABLES -D INPUT -j $CHAIN_INPUT
82   $IPTABLES -D FORWARD -j $CHAIN_FORWARD
83   $IPTABLES -t mangle -D PREROUTING -j $CHAIN_MANGLE_PREROUTING
84   $IPTABLES -t nat -D PREROUTING -j $CHAIN_NAT_PREROUTING
85   $IPTABLES -t nat -D POSTROUTING -j $CHAIN_NAT_POSTROUTING
86   
87   $IPTABLES -F $CHAIN_INPUT
88   $IPTABLES -X $CHAIN_INPUT
89   
90   $IPTABLES -F $CHAIN_FORWARD
91   $IPTABLES -X $CHAIN_FORWARD
92   
93   $IPTABLES -t mangle -F $CHAIN_MANGLE_PREROUTING
94   $IPTABLES -t mangle -X $CHAIN_MANGLE_PREROUTING
95   
96   $IPTABLES -t nat -F $CHAIN_NAT_PREROUTING
97   $IPTABLES -t nat -X $CHAIN_NAT_PREROUTING
98   
99   $IPTABLES -t nat -F $CHAIN_NAT_POSTROUTING
100   $IPTABLES -t nat -X $CHAIN_NAT_POSTROUTING
101   
102   $IPTABLES -t nat -F $CHAIN_NAT_AUTHEN
103   $IPTABLES -t nat -X $CHAIN_NAT_AUTHEN
104 }
105
106 ##
107 # Define new chains
108 ##
109 new_chains () {
110   $IPTABLES -N $CHAIN_INPUT
111   $IPTABLES -N $CHAIN_FORWARD
112   $IPTABLES -t mangle -N $CHAIN_MANGLE_PREROUTING
113   $IPTABLES -t nat -N $CHAIN_NAT_PREROUTING
114   $IPTABLES -t nat -N $CHAIN_NAT_POSTROUTING
115   $IPTABLES -t nat -N $CHAIN_NAT_AUTHEN
116 }
117
118 ##
119 # Policy
120 ##
121 policy () {
122   $IPTABLES -P INPUT DROP
123   $IPTABLES -P OUTPUT ACCEPT
124   $IPTABLES -P FORWARD DROP 
125 }
126
127 cleanup_policy () {
128   # Assume before the script running the default policy are all ACCEPT
129   $IPTABLES -P INPUT ACCEPT
130   $IPTABLES -P OUTPUT ACCEPT
131   $IPTABLES -P FORWARD ACCEPT 
132 }
133
134 rules () {
135   ##
136   # Init rules
137   ##
138   $IPTABLES -I INPUT -j $CHAIN_INPUT
139   $IPTABLES -I FORWARD -j $CHAIN_FORWARD
140   $IPTABLES -t mangle -I PREROUTING -j $CHAIN_MANGLE_PREROUTING
141   $IPTABLES -t nat -I PREROUTING -j $CHAIN_NAT_PREROUTING
142   $IPTABLES -t nat -I POSTROUTING -j $CHAIN_NAT_POSTROUTING
143   
144   ##
145   # Allow all traffic for established and related connections
146   ##
147   
148   $IPTABLES -A $CHAIN_INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
149   $IPTABLES -A $CHAIN_FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
150   
151   $IPTABLES -A $CHAIN_INPUT $DEV_IN_PARAM $DEV_WAN -m state --state NEW \
152     -j ACCEPT
153   $IPTABLES -A $CHAIN_INPUT -i lo -j ACCEPT
154   
155   ##
156   # Allow incoming to our DNS server
157   ##
158   $IPTABLES -A $CHAIN_INPUT -p udp --dport domain -j ACCEPT
159   
160   ##
161   # Allow incoming to our HTTP server for login page
162   ##
163   $IPTABLES -A $CHAIN_INPUT -p tcp -m multiport --dports 80,8443,8888 -j ACCEPT
164   
165   ##
166   # Allow incoming to our SSH server for remote maintenance access
167   ##
168   $IPTABLES -A $CHAIN_INPUT -p tcp --dport ssh -j ACCEPT
169   
170   ##
171   # Allow incoming to our DHCP
172   ##
173   $IPTABLES -I $CHAIN_INPUT $DEV_IN_PARAM $DEV_LAN \
174         -p udp --dport 67:68 -j ACCEPT
175   $IPTABLES -I $CHAIN_FORWARD $DEV_IN_PARAM $DEV_LAN \
176         -p udp --dport 67:68 -j DROP
177   
178   ##
179   # Mark the connections that have been authorized to save rule check time
180   ##
181   $IPTABLES -t mangle -A $CHAIN_MANGLE_PREROUTING -m set --set rahunas_set src,dst -j CONNMARK --set-mark 0x2 
182   
183   ##
184   # Accept Forwarding for the authorized clients
185   ##
186   $IPTABLES -A $CHAIN_FORWARD -m connmark --mark 0x2 -j ACCEPT
187   
188   ##
189   # Redirect unauthorized clients to login page (with rate limit throttle)
190   ##
191   
192   $IPTABLES -t nat -A $CHAIN_NAT_PREROUTING -p tcp -m multiport \
193     --dports 80,8080,8088,3128 \
194         $DEV_IN_PARAM $DEV_LAN -m connmark ! --mark 0x2 \
195         -j $CHAIN_NAT_AUTHEN
196   
197   $IPTABLES -t nat -A $CHAIN_NAT_AUTHEN \
198     -m recent --rcheck --seconds 15 --name AUTHEN_THROTTLE -j DROP
199   
200   $IPTABLES -t nat -A $CHAIN_NAT_AUTHEN -p tcp -m hashlimit --hashlimit 5/sec \
201     --hashlimit-mode srcip --hashlimit-burst 10 \
202     --hashlimit-htable-expire 15000 --hashlimit-name authen \
203     -j REDIRECT --to-port 8888
204   
205   $IPTABLES -t nat -A $CHAIN_NAT_AUTHEN -m recent --set --name AUTHEN_THROTTLE \
206     -j DROP
207   
208   ##
209   # Return to main chains
210   ##
211   $IPTABLES -A $CHAIN_INPUT -j RETURN
212   $IPTABLES -A $CHAIN_FORWARD -j RETURN
213   $IPTABLES -t mangle -A $CHAIN_MANGLE_PREROUTING -j RETURN
214   $IPTABLES -t nat -A $CHAIN_NAT_PREROUTING -j RETURN
215   $IPTABLES -t nat -A $CHAIN_NAT_POSTROUTING -j RETURN
216 }
217
218 start () {
219   add_set
220   new_chains
221   policy 
222   rules
223 }
224
225 stop () {
226   cleanup
227   cleanup_policy
228   cleanup_set
229 }
230
231 case "$1" in
232   start)
233     start
234     ;;
235   stop)
236     stop
237     ;;
238   restart)
239     stop
240     start
241     ;; 
242   *)
243     echo "Usage: /etc/rahunas/firewall.sh {start|stop|restart}"
244     exit 3
245     ;;
246 esac 
247
248 exit 0