#! /bin/bash
# Bash script firewall with IP Address and MAC Address filtering
# (C) 2009 by [email protected]
###### VARIABLE
files1="/etc/network/lists.filter"
files2="/etc/network/administrator.filter"
device=eth1
ip_subnet=192.168.0.0/24
device_inet=ppp+
ssh=212
webmin=10000
samba_cups=135,137,138,139,445,631
http=80
http_SSL=443
smtp=25
smtp_SSL=465
pop3=110
pop3_SSL=995
DNS=53
ftp=20,21
ftp_SSL=115,989,990
proxy=3128
havp=8080
icp=3130
time=13,123
range_port=1025:65535
###### SCRIPT
echo "FIREWALL STATUS: All Firewall Drop & Reset";
/sbin/iptables -t mangle -F
/sbin/iptables -t nat -F
/sbin/iptables -t filter -F
/sbin/iptables -t filter -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
echo "FIREWALL STATUS: MTU Setting";
/sbin/iptables -t mangle -A FORWARD -o $device -p tcp -m tcp --tcp-flags SYN,RST SYN -m tcpmss --mss 1400:1536 -j TCPMSS --clamp-mss-to-pmtu
/sbin/iptables -t mangle -A FORWARD -o $device_inet -p tcp -m tcp --tcp-flags SYN,RST SYN -m tcpmss --mss 1400:1536 -j TCPMSS --clamp-mss-to-pmtu
echo "FIREWALL STATUS: Mangle created for Proxy Port at number 4";
/sbin/iptables -t mangle -A OUTPUT -m tos --tos Maximize-Reliability -j MARK --set-mark 0x04
/sbin/iptables -t mangle -A OUTPUT -m tos --tos 0x04 -j MARK --set-mark 0x4
/sbin/iptables -t mangle -A FORWARD -m tos --tos 0x04 -j MARK --set-mark 0x04
/sbin/iptables -t mangle -A POSTROUTING -m tos --tos 0x04 -j MARK --set-mark 0x04
#echo "FIREWALL STATUS: Drop all PREROUTING on $device";
#/sbin/iptables -t nat -I PREROUTING -i $device -j DROP
echo "FIREWALL STATUS: Drop all FORWARD on $device";
/sbin/iptables -t filter -I FORWARD -i $device -j DROP
echo "FIREWALL STATUS: IP & MAC Filtering on device $device";
echo "FIREWALL STATUS: Allow access for IP-ADDRESS and MAC-ADDRESS: ";
cat $files1 | while read ip_address mac_address client; do
/sbin/iptables -t nat -I PREROUTING -i $device -s $ip_address -j ACCEPT
/sbin/iptables -t nat -I PREROUTING -i $device -s $ip_address -p tcp -m tcp --dport $http -j REDIRECT --to-ports $proxy
/sbin/iptables -t nat -I PREROUTING -i $device -s $ip_address -p udp -m udp --dport $http -j REDIRECT --to-ports $proxy
/sbin/iptables -t filter -I FORWARD -i $device -s $ip_address -m mac --mac-source $mac_address -j ACCEPT
/sbin/iptables -t filter -A INPUT -i $device -s $ip_address -m mac --mac-source $mac_address -p tcp -m multiport --dports $samba_cups -j ACCEPT
/sbin/iptables -t filter -A INPUT -i $device -s $ip_address -m mac --mac-source $mac_address -p udp -m multiport --dports $samba_cups -j ACCEPT
/sbin/iptables -t filter -A INPUT -i $device -s $ip_address -m mac --mac-source $mac_address -p tcp -m multiport --dports $http,$http_SSL,$smtp,$smtp_SSL,$pop3,$pop3_SSL,$DNS,$ftp,$ftp_SSL -j ACCEPT
/sbin/iptables -t filter -A INPUT -i $device -s $ip_address -m mac --mac-source $mac_address -p udp -m multiport --dports $http,$http_SSL,$smtp,$smtp_SSL,$pop3,$pop3_SSL,$DNS,$ftp,$ftp_SSL -j ACCEPT
/sbin/iptables -t filter -A INPUT -i $device -s $ip_address -m mac --mac-source $mac_address -p tcp -m multiport --dports $proxy,$havp,$icp,$time -j ACCEPT
/sbin/iptables -t filter -A INPUT -i $device -s $ip_address -m mac --mac-source $mac_address -p udp -m multiport --dports $proxy,$havp,$icp,$time -j ACCEPT
/sbin/iptables -t nat -A POSTROUTING -s $ip_address -o $device_inet -j MASQUERADE
echo "$ip_address [$mac_address] => $client";
done
cat $files2 | while read ip_address mac_address client; do
/sbin/iptables -t nat -I PREROUTING -i $device -s $ip_address -m mac --mac-source $mac_address -j ACCEPT
/sbin/iptables -t nat -I PREROUTING -i $device -s $ip_address -p tcp -m tcp --dport $http -j REDIRECT --to-ports $proxy
/sbin/iptables -t nat -I PREROUTING -i $device -s $ip_address -p udp -m udp --dport $http -j REDIRECT --to-ports $proxy
/sbin/iptables -t filter -I FORWARD -i $device -s $ip_address -m mac --mac-source $mac_address -j ACCEPT
/sbin/iptables -t filter -A INPUT -i $device -s $ip_address -m mac --mac-source $mac_address -p tcp -m multiport --dports $samba_cups -j ACCEPT
/sbin/iptables -t filter -A INPUT -i $device -s $ip_address -m mac --mac-source $mac_address -p udp -m multiport --dports $samba_cups -j ACCEPT
/sbin/iptables -t filter -A INPUT -i $device -s $ip_address -m mac --mac-source $mac_address -p tcp -m multiport --dports $http,$http_SSL,$smtp,$smtp_SSL,$pop3,$pop3_SSL,$DNS,$ftp,$ftp_SSL -j ACCEPT
/sbin/iptables -t filter -A INPUT -i $device -s $ip_address -m mac --mac-source $mac_address -p udp -m multiport --dports $http,$http_SSL,$smtp,$smtp_SSL,$pop3,$pop3_SSL,$DNS,$ftp,$ftp_SSL -j ACCEPT
/sbin/iptables -t filter -A INPUT -i $device -s $ip_address -m mac --mac-source $mac_address -p tcp -m multiport --dports $proxy,$havp,$icp,$time -j ACCEPT
/sbin/iptables -t filter -A INPUT -i $device -s $ip_address -m mac --mac-source $mac_address -p udp -m multiport --dports $proxy,$havp,$icp,$time -j ACCEPT
/sbin/iptables -t filter -A INPUT -i $device -s $ip_address -m mac --mac-source $mac_address -p tcp -m multiport --dports $ssh,$webmin -j ACCEPT
/sbin/iptables -t filter -A INPUT -i $device -s $ip_address -m mac --mac-source $mac_address -p udp -m multiport --dports $ssh,$webmin -j ACCEPT
/sbin/iptables -t filter -A INPUT -i $device -s $ip_address -m mac --mac-source $mac_address -p tcp -m tcp --dport $range_port -j ACCEPT
/sbin/iptables -t filter -A INPUT -i $device -s $ip_address -m mac --mac-source $mac_address -p udp -m udp --dport $range_port -j ACCEPT
/sbin/iptables -t nat -A POSTROUTING -s $ip_address -o $device_inet -j MASQUERADE
echo "$ip_address [$mac_address] => $client this Administrator Host";
done
echo "FIREWALL STATUS: Drop all INPUT on $device";
/sbin/iptables -t filter -A INPUT -i $device -j DROP
echo "FIREWALL STATUS: Port Filtering on $device_inet";
/sbin/iptables -t filter -A INPUT -i $device_inet -p tcp -m multiport --dports $http,$http_SSL,$ssh,$webmin -j ACCEPT
/sbin/iptables -t filter -A INPUT -i $device_inet -p udp -m multiport --dports $http,$http_SSL,$ssh,$webmin -j ACCEPT
/sbin/iptables -t filter -A INPUT ! -s $ip_subnet -i $device_inet -p tcp -m multiport --dports $smtp,$smtp_SSL -j DROP
/sbin/iptables -t filter -A INPUT -i $device_inet -p tcp -j REJECT --reject-with tcp-reset
/sbin/iptables -t filter -A INPUT -i $device_inet -p udp -j REJECT --reject-with icmp-port-unreachable
/sbin/iptables -t filter -A INPUT -i $device_inet -p icmp -m icmp --icmp-type 8 -j DROP
/sbin/iptables -t filter -A FORWARD -i $device_inet -p icmp -m length --length 92 -j DROP
/sbin/iptables -t filter -A INPUT -i $device_inet -p icmp --icmp-type echo-request -j DROP
echo "FIREWALL STATUS: Drop all INPUT on $device_inet";
/sbin/iptables -t filter -A INPUT -i $device_inet -j DROP
echo "FIREWALL STATUS: Log created...";
/sbin/iptables -t filter -A INPUT -p tcp -m limit --limit 5/min -j LOG --log-prefix "Iptables: Denied TCP Port: " --log-level 7
/sbin/iptables -t filter -A INPUT -p udp -m limit --limit 5/min -j LOG --log-prefix "Iptables: Denied UDP Port: " --log-level 7
/sbin/iptables -t filter -A INPUT -p icmp -m limit --limit 5/min -j LOG --log-prefix "Iptables: Denied ICMP Port: " --log-level 7
/sbin/iptables -t filter -A INPUT -p tcp -m state --state NEW -m multiport --dports $http,$http_SSL -j LOG --log-prefix "HTTP_CONN: TCP port: "
/sbin/iptables -t filter -A INPUT -p tcp -m state --state NEW -m multiport --dports $proxy,$havp -j LOG --log-prefix "PROXY_CONN: TCP port: "
/sbin/iptables -t filter -A INPUT -p udp -m state --state NEW -m multiport --dports $http,$http_SSL -j LOG --log-prefix "HTTPS_CONN: UDP port: "
/sbin/iptables -t filter -A INPUT -p udp -m state --state NEW -m multiport --dports $proxy,$havp -j LOG --log-prefix "PROXY_CONN: UDP port: "
/sbin/iptables -t filter -A INPUT -p tcp -m state --state NEW -m multiport --dports $ssh -j LOG --log-prefix "SSH_CONN: TCP port: "
/sbin/iptables -t filter -A INPUT -p udp -m state --state NEW -m multiport --dports $ssh -j LOG --log-prefix "SSH_CONN: UDP port: "