Access control script for Public Library

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello - 

I am a complete iptables newbie who is trying to re-write a wireless hotspot
script that I found on the net to control internet access for our library patrons. 

I found the script at: 

http://www.feedface.com/folkert/study/hotspot/src/firewall.sh.txt

I am trying to re-write it so that I can use squid and dansguardian to proxy and
filter the web. I need it to transparently proxy. I have a system set up now
that uses squid to grant or deny access, but it can only block web access; I my
need is for a firewall that can block all network access so that a given PC
can't chat or play online games as well as surf the net after time has run out.

The script, as far as I have gotten, works well. When I fire it up, my test PC
can't go anywhere except the sign up page (which it is redirected to no matter
what), and when I add the PC to the access list (by typing firewall.sh add <ip>
<mac>), that PC is able to surf. 

My problem comes in when I try to do the transparent proxy part. when I try to
add the rule: 
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080

To the script, it does not work, and dansguardian will not even start. I have
played around with various permutations of this rule, and have gotten nowhere. 

Can anybody help? 

Thanks - 

Mark Ehle
=======
Following is the script (firewall.sh) as far as I have it:

#!/bin/bash

###############################################################################
#   name: firewall.sh
# author: Mark Ehle
#   date: 03-30-05
# with much thanks given to Folkert Saathoff at http://www.feedface.com/folkert
###############################################################################

#===========================
# variables
#===========================

# command-line arguments
COMMAND=$0
ACTION=$1
IP=$2
MAC=$3

# program locations
IPTABLES=/sbin/iptables
MODPROBE=/sbin/modprobe
DEPMOD=/sbin/depmod

# Local Network variables
LAN_GW="10.0.0.1"
LAN_NET="10.0.0.0/8"
LAN_INT="eth1"

# External network variables
EXT_INT_IP="<insert external interface ip here>"
EXT_INT="eth0"

#Name Server IP
NS="insert Name server ip here"

#===========================
# subroutines
#===========================
load_modules() {
    $DEPMOD -a
    for module in "ip_conntrack ip_tables iptable_filter iptable_mangle
iptable_nat ipt_LOG ipt_limit ipt_MASQUERADE"; do
        $MODPROBE $module 
    done
    return
}

start_ip_forwarding() {
    echo 1 > /proc/sys/net/ipv4/ip_forward
    return
}

show_usage()
{
    echo "usage:"
    echo "$COMMAND reset"
    echo "$COMMAND add IP MAC"
    echo "$COMMAND del IP MAC"
    exit 1;
}

fferror()
{
    echo "^_^'"
    echo "error setting netfilter: $ACTION"
    exit 1
}

flush_tables() {
    for TABLE in filter nat mangle; do
        for SWITCH in F X Z; do
            $IPTABLES -t $TABLE -$SWITCH
        done
    done
    return
}

create_new_chains() {
    #filter chain for accepting authenticated clients 
    $IPTABLES -t filter -N fclient
    #filter chain for not rerouting authenticated clients 
    $IPTABLES -t nat -N dclient
    #filter chain for routing from authenticated clients 
    $IPTABLES -t nat -N sclient
    
    #default filter policy is DROP
    $IPTABLES -t filter -P INPUT DROP
    $IPTABLES -t filter -P OUTPUT DROP
    $IPTABLES -t filter -P FORWARD DROP

    return
}

reset_firewall() {

    load_modules
    start_ip_forwarding
    flush_tables
    create_new_chains

    #allow all local traffic
    $IPTABLES -t filter -A  INPUT -i lo0 -j ACCEPT
    $IPTABLES -t filter -A OUTPUT -o lo0 -j ACCEPT

    #allow all icmp traffic self<->lan
    $IPTABLES -t filter -A  INPUT -i $LAN_INT -s $LAN_NET -d $LAN_GW -p icmp -j
ACCEPT
    $IPTABLES -t filter -A OUTPUT -o $LAN_INT -s $LAN_GW -d $LAN_NET -p icmp -j
ACCEPT

    #allow all icmp traffic self<->inet
    $IPTABLES -t filter -A  INPUT -i $EXT_INT -d $EXT_INT_IP -p icmp -j ACCEPT
    $IPTABLES -t filter -A OUTPUT -o $EXT_INT -s $EXT_INT_IP -p icmp -j ACCEPT

    #allow dhcp traffic self<->lan
    $IPTABLES -t filter -A  INPUT -i $LAN_INT -s 0.0.0.0/0 -d 255.255.255.255 -p
udp --dport 67:68 -j ACCEPT 
    $IPTABLES -t filter -A OUTPUT -o $LAN_INT -s $LAN_GW -d $LAN_NET -p udp
--sport 67:68 -j ACCEPT

    #allow all web traffic self<->lan
    for PORT in 80 443; do
        $IPTABLES -t filter -A  INPUT -i $LAN_INT -s $LAN_NET -d $LAN_GW -p tcp
--dport $PORT -j ACCEPT
        $IPTABLES -t filter -A OUTPUT -o $LAN_INT -s $LAN_GW -d $LAN_NET -p tcp
--sport $PORT -j ACCEPT
    done

    #allow all ssh and smb traffic to/from self
    for PORT in 22 139; do
        $IPTABLES -t filter -A  INPUT -p tcp --dport $PORT -j ACCEPT
        $IPTABLES -t filter -A OUTPUT -p tcp --sport $PORT -j ACCEPT
    done

    # allow dns
    $IPTABLES -t filter -A OUTPUT  -o $EXT_INT -s $EXT_INT_IP -d $NS -p udp
--dport 53 -j ACCEPT
    $IPTABLES -t filter -A  INPUT  -i $EXT_INT -s $NS -d $EXT_INT_IP -p udp
--sport 53 -j ACCEPT
    $IPTABLES -t filter -A FORWARD -i $LAN_INT -o $EXT_INT -s $LAN_NET -d $NS -p
udp --dport 53 -j ACCEPT 
    $IPTABLES -t filter -A FORWARD -i $EXT_INT -o $LAN_INT -s $NS -d $LAN_NET -p
udp --sport 53 -j ACCEPT 

    #enable source network address translation for dns
    $IPTABLES -t nat -A POSTROUTING  -s $LAN_NET -p udp --dport 53 -d $NS -o
$EXT_INT -j SNAT --to $EXT_INT_IP

    #check for allowed clients -> inet
    $IPTABLES -t filter -A FORWARD -i $LAN_INT -o $EXT_INT -s $LAN_NET -j fclient
    #reject all other clients
    $IPTABLES -t filter -A FORWARD -i $LAN_INT -o $EXT_INT -s $LAN_NET -j REJECT
--reject-with icmp-net-prohibited

    #allow established connections lan<->inet
    $IPTABLES -t filter -A FORWARD -i $EXT_INT -o $LAN_INT -d $LAN_NET -m state
--state ESTABLISHED -j ACCEPT

    #snat traffic from authenticated clients
    $IPTABLES -t nat -A POSTROUTING -s $LAN_NET -d ! $LAN_NET -j sclient    

    #do not dnat traffic from authenticated clients
    $IPTABLES -t nat -A PREROUTING -i $LAN_INT -d ! $LAN_GW -j dclient

    #enable dnat to self for all web traffic
    for PORT in 80 443; do
        $IPTABLES -t nat -A PREROUTING -i $LAN_INT -d ! $LAN_GW -p tcp --dport
$PORT -j DNAT --to $LAN_GW
    done

    #add default REJECT rule (just more polite than DROP)
    for CHAIN in INPUT OUTPUT FORWARD; do
        $IPTABLES -t filter -A $CHAIN -j REJECT;
    done
    return

}

add_usage() {
    echo "usage:"
    echo "$COMMAND add IP MAC"
    exit 1;
}

run_add() {
    [ "ff"$IP != "ff" ] || show_addclient_usage; [ "ff"$MAC != "ff" ] || add_usage
    #add client
    
    $IPTABLES -t filter -A fclient -s $IP -m mac --mac-source $MAC -j ACCEPT   
        || fferror $?
    $IPTABLES -t nat    -A dclient -s $IP -m mac --mac-source $MAC -j ACCEPT   
        || fferror $?
    $IPTABLES -t nat    -A sclient -s $IP -d ! $LAN_NET -j SNAT --to $EXT_INT_IP
       || fferror $?
    echo "added Client: IP $IP MAC $MAC";
    return
}

del_usage() {
    echo "usage:"
    echo "$COMMAND del IP MAC"
    exit 1;
}

run_del() {
    [ "ff"$IP != "ff" ] || show_delClient_usage; [ "ff"$MAC != "ff" ] || del_usage
    #delete client
    $IPTABLES -t filter -D fclient -s $IP -m mac --mac-source $MAC -j ACCEPT ||
fferror $?
    $IPTABLES -t nat -D dclient -s $IP -m mac --mac-source $MAC -j ACCEPT ||
fferror $?
    $IPTABLES -t nat -D sclient -s $IP -d ! $LAN_NET -j SNAT --to $EXT_INT_IP ||
fferror $?
    echo "removed Client: IP $IP MAC $MAC";
    return
}

#===========================
# Main 
#=========================== 

case "$ACTION" in
    reset ) reset_firewall;;
    add   ) run_add;;
    del   ) run_del;;
    *     ) show_usage;;
esac

exit



[Index of Archives]     [Linux Netfilter Development]     [Linux Kernel Networking Development]     [Netem]     [Berkeley Packet Filter]     [Linux Kernel Development]     [Advanced Routing & Traffice Control]     [Bugtraq]

  Powered by Linux