Modify firewall script and add new login template
authorNeutron Soutmun <neo.neutron@gmail.com>
Tue, 11 Nov 2008 05:27:38 +0000 (12:27 +0700)
committerNeutron Soutmun <neo.neutron@gmail.com>
Tue, 11 Nov 2008 05:27:38 +0000 (12:27 +0700)
2008-11-11  Neutron Soutmun <neo.neutron@gmail.com>

* rahunas.{default,firewall}: Add supporting for DHCP and DNS forwarding,
  Proxy, Transparent-Proxy and the Natwork Address Translation (Masquerading).
* weblogin/templates/rahunas/*: Add new login template for rahunas,
  "My inspiration" - featuring by my daughter, "Music".
* weblogin/{login,logout}.php: Adjust to support new template.

ChangeLog
rahunas.default
rahunas.firewall
weblogin/config.php
weblogin/login.php
weblogin/logout.php
weblogin/templates/rahunas/images/rahunas.png [new file with mode: 0644]
weblogin/templates/rahunas/images/rahunas.xcf [new file with mode: 0644]
weblogin/templates/rahunas/rahunas.html [new file with mode: 0644]

index 1100d27..0add76b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2008-11-11  Neutron Soutmun <neo.neutron@gmail.com>
+
+       * rahunas.{default,firewall}: Add supporting for DHCP and DNS forwarding, 
+         Proxy, Transparent-Proxy and the Natwork Address Translation (Masquerading).
+       * weblogin/templates/rahunas/*: Add new login template for rahunas, 
+         "My inspiration" - featuring by my daughter, "Music".
+       * weblogin/{login,logout}.php: Adjust to support new template.
+
 2008-11-06  Neutron Soutmun <neo.neutron@gmail.com>
 
        * src/rahunas.{h,c}, src/rh-task-memset.c, rh-task.h, src/rh-xmlrpc-server.c:
index 5e5a858..33765a7 100644 (file)
@@ -13,15 +13,43 @@ DEV_LAN="eth1"
 # Running in bridge mode - [yes|no]
 BRIDGE=no
 
+# MASQUERADE
+# MASQUERADE=[yes|no]
+MASQUERADE=yes
+
+# Server
+# SERVER=[hostname|IP]
+SERVER=172.30.0.1
+
 # Clients IP 
 # CLIENTS_RANGE_START and CLENTS_RANGE_END are [single ip].
 # CLIENTS_NETWORK is [network_address/netmask].
 # CLIENTS_IGNORE_MAC is [yes|no].
 #
-# Note: The CLIENTS_NETWORK will be used if it set whenever 
-# CLIENTS_RANGE_{START,STOP} are even set.
+# Note: The CLIENTS_NETWORK will be used and overide 
+# the CLIENTS_RANGE_{START,STOP}.
 
-CLIENTS_RANGE_START="192.168.0.2"
-CLIENTS_RANGE_END="192.168.0.254"
-CLIENTS_NETWORK=""
+CLIENTS_RANGE_START=""
+CLIENTS_RANGE_END=""
+CLIENTS_NETWORK="172.30.0.0/22"
 CLIENTS_IGNORE_MAC=no
+
+# Enable DHCP Forwarding
+# FORWARD_DHCP=[yes|no]
+FORWARD_DHCP=no
+
+# Enable DNS Forwarding 
+# FORWARD_DNS=[yes|no]
+FORWARD_DNS=no
+
+# Enable SQUID Cache-Proxy 
+# PROXY_PORT=[0 = disable]
+# PROXY_HOST=[hostname/IP]
+# TRANSPARENT_PROXY=[yes|no]
+
+PROXY_PORT=3128
+PROXY_HOST=localhost
+TRANSPARENT_PROXY=no
+
+# SSH - Secure Shell for maintenance
+SSH=yes
index f9f0299..5ba8b9e 100755 (executable)
@@ -31,8 +31,10 @@ fi
 
 if [ "$BRIDGE" = "yes" ]; then
   DEV_IN_PARAM="-m physdev --physdev-in"
+  DEV_OUT_PARAM="-m physdev --physdev-out"
 else
   DEV_IN_PARAM="-i"
+  DEV_OUT_PARAM="-o"
 fi
 
 # Set declaration
@@ -40,8 +42,11 @@ SETNAME="${NAME}_set"
 
 # Chains declaration
 CHAIN_INPUT="${NAME}_input"
+CHAIN_INPUT_AUTH="${NAME}_input_authorized"
 CHAIN_FORWARD="${NAME}_forward"
+CHAIN_FORWARD_AUTH="${NAME}_forward_authorized"
 CHAIN_MANGLE_PREROUTING="${NAME}_mangle_prerouting"
+CHAIN_MANGLE_POSTROUTING="${NAME}_mangle_postrouting"
 CHAIN_NAT_PREROUTING="${NAME}_nat_prerouting"
 CHAIN_NAT_POSTROUTING="${NAME}_nat_postrouting"
 CHAIN_NAT_AUTHEN="${NAME}_nat_authen"
@@ -78,20 +83,32 @@ cleanup_set () {
 # Cleanup old rules
 ##
 cleanup () {
+  $IPTABLES -D INPUT -m connmark --mark 0x02 -j $CHAIN_INPUT_AUTH
   $IPTABLES -D INPUT -j $CHAIN_INPUT
+  $IPTABLES -D FORWARD -m connmark --mark 0x02 -j $CHAIN_FORWARD_AUTH
   $IPTABLES -D FORWARD -j $CHAIN_FORWARD
   $IPTABLES -t mangle -D PREROUTING -j $CHAIN_MANGLE_PREROUTING
+  $IPTABLES -t mangle -D POSTROUTING -j $CHAIN_MANGLE_POSTROUTING
   $IPTABLES -t nat -D PREROUTING -j $CHAIN_NAT_PREROUTING
   $IPTABLES -t nat -D POSTROUTING -j $CHAIN_NAT_POSTROUTING
   
+  $IPTABLES -F $CHAIN_INPUT_AUTH
+  $IPTABLES -X $CHAIN_INPUT_AUTH
+
   $IPTABLES -F $CHAIN_INPUT
   $IPTABLES -X $CHAIN_INPUT
   
+  $IPTABLES -F $CHAIN_FORWARD_AUTH
+  $IPTABLES -X $CHAIN_FORWARD_AUTH
+
   $IPTABLES -F $CHAIN_FORWARD
   $IPTABLES -X $CHAIN_FORWARD
   
   $IPTABLES -t mangle -F $CHAIN_MANGLE_PREROUTING
   $IPTABLES -t mangle -X $CHAIN_MANGLE_PREROUTING
+
+  $IPTABLES -t mangle -F $CHAIN_MANGLE_POSTROUTING
+  $IPTABLES -t mangle -X $CHAIN_MANGLE_POSTROUTING
   
   $IPTABLES -t nat -F $CHAIN_NAT_PREROUTING
   $IPTABLES -t nat -X $CHAIN_NAT_PREROUTING
@@ -107,9 +124,12 @@ cleanup () {
 # Define new chains
 ##
 new_chains () {
+  $IPTABLES -N $CHAIN_INPUT_AUTH
   $IPTABLES -N $CHAIN_INPUT
+  $IPTABLES -N $CHAIN_FORWARD_AUTH
   $IPTABLES -N $CHAIN_FORWARD
   $IPTABLES -t mangle -N $CHAIN_MANGLE_PREROUTING
+  $IPTABLES -t mangle -N $CHAIN_MANGLE_POSTROUTING
   $IPTABLES -t nat -N $CHAIN_NAT_PREROUTING
   $IPTABLES -t nat -N $CHAIN_NAT_POSTROUTING
   $IPTABLES -t nat -N $CHAIN_NAT_AUTHEN
@@ -136,8 +156,13 @@ rules () {
   # Init rules
   ##
   $IPTABLES -I INPUT -j $CHAIN_INPUT
+  $IPTABLES -I INPUT -m connmark --mark 0x02 -j $CHAIN_INPUT_AUTH
   $IPTABLES -I FORWARD -j $CHAIN_FORWARD
+  $IPTABLES -I FORWARD -m connmark --mark 0x02 -j $CHAIN_FORWARD_AUTH
+
   $IPTABLES -t mangle -I PREROUTING -j $CHAIN_MANGLE_PREROUTING
+  $IPTABLES -t mangle -I POSTROUTING -j $CHAIN_MANGLE_POSTROUTING
+
   $IPTABLES -t nat -I PREROUTING -j $CHAIN_NAT_PREROUTING
   $IPTABLES -t nat -I POSTROUTING -j $CHAIN_NAT_POSTROUTING
   
@@ -148,15 +173,19 @@ rules () {
   $IPTABLES -A $CHAIN_INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
   $IPTABLES -A $CHAIN_FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
   
-  $IPTABLES -A $CHAIN_INPUT $DEV_IN_PARAM $DEV_WAN -m state --state NEW \
-    -j ACCEPT
   $IPTABLES -A $CHAIN_INPUT -i lo -j ACCEPT
   
   ##
   # Allow incoming to our DNS server
   ##
-  $IPTABLES -A $CHAIN_INPUT -p udp --dport domain -j ACCEPT
-  
+  if [ "$FORWARD_DNS" = "yes" ]; then
+    $IPTABLES -A $CHAIN_INPUT -p udp --dport domain -j ACCEPT
+    $IPTABLES -A $CHAIN_FORWARD -p udp --dport domain -j ACCEPT
+  else
+    $IPTABLES -A $CHAIN_INPUT -p udp --dport domain -j ACCEPT
+    $IPTABLES -A $CHAIN_FORWARD -p udp --dport domain -j DROP
+  fi 
+
   ##
   # Allow incoming to our HTTP server for login page
   ##
@@ -165,32 +194,69 @@ rules () {
   ##
   # Allow incoming to our SSH server for remote maintenance access
   ##
-  $IPTABLES -A $CHAIN_INPUT -p tcp --dport ssh -j ACCEPT
-  
+  if [ "$SSH" = "yes" ]; then
+    $IPTABLES -A $CHAIN_INPUT -p tcp --dport ssh -j ACCEPT
+  fi
+
+  ##
+  # Allow rate limited ICMP 
+  ##
+  $IPTABLES -A $CHAIN_INPUT -p icmp -m limit --limit 1/second -j ACCEPT
+
   ##
-  # Allow incoming to our DHCP
+  # Allow incoming DHCP request
   ##
-  $IPTABLES -I $CHAIN_INPUT $DEV_IN_PARAM $DEV_LAN \
-       -p udp --dport 67:68 -j ACCEPT
-  $IPTABLES -I $CHAIN_FORWARD $DEV_IN_PARAM $DEV_LAN \
-       -p udp --dport 67:68 -j DROP
+
+  if [ "$FORWARD_DHCP" = "yes" ]; then
+    $IPTABLES -A $CHAIN_INPUT $DEV_IN_PARAM $DEV_LAN \
+         -p udp --dport 67:68 -j DROP 
+    $IPTABLES -A $CHAIN_FORWARD $DEV_IN_PARAM $DEV_LAN \
+         -p udp --dport 67:68 -j ACCEPT
+  else
+    $IPTABLES -A $CHAIN_INPUT $DEV_IN_PARAM $DEV_LAN \
+         -p udp --dport 67:68 -j ACCEPT 
+    $IPTABLES -A $CHAIN_FORWARD $DEV_IN_PARAM $DEV_LAN \
+         -p udp --dport 67:68 -j DROP
+  fi
+
   
   ##
   # Mark the connections that have been authorized to save rule check time
   ##
-  $IPTABLES -t mangle -A $CHAIN_MANGLE_PREROUTING -m set --set rahunas_set src,dst -j CONNMARK --set-mark 0x2 
+  $IPTABLES -t mangle -A $CHAIN_MANGLE_PREROUTING -m set --set rahunas_set dst -j CONNMARK --set-mark 0x2 
+  $IPTABLES -t mangle -A $CHAIN_MANGLE_PREROUTING -m set --set rahunas_set src -j CONNMARK --set-mark 0x2 
   
   ##
   # Accept Forwarding for the authorized clients
   ##
-  $IPTABLES -A $CHAIN_FORWARD -m connmark --mark 0x2 -j ACCEPT
+  $IPTABLES -A $CHAIN_FORWARD_AUTH -j ACCEPT
+
+  ##
+  # SQUID Cache-Proxy
+  ##
+  if [ "$PROXY_PORT" != "0" ]; then
+    if [ "$PROXY_HOST" = "localhost" ]; then
+      $IPTABLES -A $CHAIN_INPUT_AUTH -p tcp --dport $PROXY_PORT -j ACCEPT
+    fi
+
+    if [ "$TRANSPARENT_PROXY" = "yes" ]; then
+      if [ "$PROXY_HOST" = "localhost" ]; then
+        $IPTABLES -t nat -A $CHAIN_NAT_PREROUTING -p tcp --dport http \
+          -m connmark --mark 0x02 -j REDIRECT --to-ports $PROXY_PORT
+      else
+        $IPTABLES -t nat -A $CHAIN_NAT_PRETROUTING -p tcp --dport http \
+          -m connmark --mark 0x02 \
+          -j DNAT --to-destination ${PROXY_HOST}:${PROXY_PORT}
+      fi
+    fi
+  fi
   
   ##
-  # Redirect unauthorized clients to login page (with rate limit throttle)
+  # Redirect unauthorized clients to login page (with rate limited throttling)
   ##
   
   $IPTABLES -t nat -A $CHAIN_NAT_PREROUTING -p tcp -m multiport \
-    --dports 80,8080,8088,3128 \
+    --dports 80,8080,8088,3128 -d ! $SERVER \
        $DEV_IN_PARAM $DEV_LAN -m connmark ! --mark 0x2 \
        -j $CHAIN_NAT_AUTHEN
   
@@ -204,13 +270,24 @@ rules () {
   
   $IPTABLES -t nat -A $CHAIN_NAT_AUTHEN -m recent --set --name AUTHEN_THROTTLE \
     -j DROP
+
+  ##
+  # MASQUERADE
+  ##
+  if [ "$MASQUERADE" = "yes" ]; then
+    $IPTABLES -t nat -A $CHAIN_NAT_POSTROUTING $DEV_OUT_PARAM $DEV_WAN \
+      -j MASQUERADE
+  fi
   
   ##
   # Return to main chains
   ##
+  $IPTABLES -A $CHAIN_INPUT_AUTH -j RETURN
   $IPTABLES -A $CHAIN_INPUT -j RETURN
+  $IPTABLES -A $CHAIN_FORWARD_AUTH -j RETURN
   $IPTABLES -A $CHAIN_FORWARD -j RETURN
   $IPTABLES -t mangle -A $CHAIN_MANGLE_PREROUTING -j RETURN
+  $IPTABLES -t mangle -A $CHAIN_MANGLE_POSTROUTING -j RETURN
   $IPTABLES -t nat -A $CHAIN_NAT_PREROUTING -j RETURN
   $IPTABLES -t nat -A $CHAIN_NAT_POSTROUTING -j RETURN
 }
@@ -228,6 +305,16 @@ stop () {
   cleanup_set
 }
 
+reload() {
+  # Do not cleanup set
+  cleanup
+  cleanup_policy
+
+  new_chains
+  policy 
+  rules
+}
+
 case "$1" in
   start)
     start
@@ -238,9 +325,12 @@ case "$1" in
   restart)
     stop
     start
+    ;;
+  reload)
+    reload     
     ;; 
   *)
-    echo "Usage: /etc/rahunas/firewall.sh {start|stop|restart}"
+    echo "Usage: /etc/rahunas/firewall.sh {start|stop|restart|reload}"
     exit 3
     ;;
 esac 
index 2026efe..4f6db86 100644 (file)
@@ -13,6 +13,7 @@ $config = array(
   "NAS_LOGIN_PORT" => "8443",
        "NAS_LOGIN_PROTO" => "https",
        "NAS_PORT" => 1,
+  "NAS_LOGIN_TITLE" => "RahuNAS Network",
        "DEFAULT_REDIRECT_URL" => "http://www.kku.ac.th",
   "UAM_TEMPLATE" => "kkuwifi"
 );
index e3e0f71..67c613f 100644 (file)
@@ -92,7 +92,7 @@ if ($forward) {
 // Login box
 $request_uri = $_SERVER['REQUEST_URI'];
 $loginbox = "<style>" .
-            "#rh_login_text { color: #000000; font-weight: bolder; }\n" .
+            "#rh_login_text { font-weight: bolder; }\n" .
             "#waiting { " .
             " position: absolute; ".
             " top: -215px;".
@@ -190,6 +190,8 @@ if ($handle) {
   fclose($handle);
 
   $html_buffer = str_replace("images/", $tpl_path."images/", $html_buffer);
+  $html_buffer = str_replace("<!-- Title -->", $config["NAS_LOGIN_TITLE"], 
+                             $html_buffer);
   $html_buffer = str_replace("<!-- Login -->", $loginbox, $html_buffer);
   $html_buffer = str_replace("<!-- JavaScript -->", $loginscript, $html_buffer);
   $html_buffer = str_replace("<body", 
index 3e89793..0ecc97c 100644 (file)
@@ -125,8 +125,8 @@ $valid_text = !$valid ? "" : "" .
 "</table>";
 $request_uri = $_SERVER['REQUEST_URI'];
 $loginbox = "<style>" .
-            "#bg { background: #ffffff; width: 80%;}".
-            "#rh_login_text { color: #000000; font-weight: bolder; }\n" .
+            "#bg { background: #000000; width: 80%;}".
+            "#rh_login_text { font-weight: bolder; }\n" .
             "#waiting { " .
             " position: absolute; ".
             " top: -215px;".
diff --git a/weblogin/templates/rahunas/images/rahunas.png b/weblogin/templates/rahunas/images/rahunas.png
new file mode 100644 (file)
index 0000000..44c2156
Binary files /dev/null and b/weblogin/templates/rahunas/images/rahunas.png differ
diff --git a/weblogin/templates/rahunas/images/rahunas.xcf b/weblogin/templates/rahunas/images/rahunas.xcf
new file mode 100644 (file)
index 0000000..c34d396
Binary files /dev/null and b/weblogin/templates/rahunas/images/rahunas.xcf differ
diff --git a/weblogin/templates/rahunas/rahunas.html b/weblogin/templates/rahunas/rahunas.html
new file mode 100644 (file)
index 0000000..1ee741d
--- /dev/null
@@ -0,0 +1,48 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>RahuNAS Authentication</title>
+<style type="text/css">
+<!--
+#rahunas_container {
+  margin-left: auto;
+  margin-right: auto;
+  text-align: left;
+  width: 700px;
+  height: 400px;
+  background: url(images/rahunas.png) no-repeat;
+}
+#rahunas_title {
+  position: relative;
+  text-align: center;
+  width: 660px;
+  left: 50px;
+  top: 50px;
+  color: #FFFFFF;
+  font-size: 18pt;
+  font-weight: bolder;
+}
+
+#rahunas_login_container {
+  position: relative;
+  left: 310px;
+  top: 160px;
+  width: 350px;
+  color: #FFFFFF;
+  font-size: 10pt;
+  font-weight: bolder;
+  text-align: left;
+}
+-->
+</style>
+</head>
+
+<body>
+<div id='rahunas_container'>
+  <div id='rahunas_title'><!-- Title --></div>
+  <div id='rahunas_login_container'><!-- Login --></div>
+</div>
+<!-- JavaScript -->
+</body>
+</html>