From 7c99efcfdd45fcb3ffbdd1a4dca4ef4c79c0471d Mon Sep 17 00:00:00 2001
From: tbrehm <t.brehm@ispconfig.org>
Date: Wed, 09 Jul 2008 14:45:19 -0400
Subject: [PATCH] Added support for bastille firewall.
---
install/apps/bastille-firewall | 93 ++
install/apps/bastille-ipchains | 654 +++++++++++++++
server/plugins-available/mysql_clientdb_plugin.inc.php | 1
install/install.php | 10
install/lib/installer_base.lib.php | 54 +
interface/web/admin/form/firewall.tform.php | 4
install/apps/bastille_licence.txt | 339 +++++++
install/update.php | 6
server/plugins-available/firewall_plugin.inc.php | 126 ++
server/conf/bastille-firewall.cfg.master | 320 +++++++
install/apps/bastille-netfilter | 626 ++++++++++++++
install/tpl/bastille-firewall.cfg.master | 320 +++++++
12 files changed, 2,550 insertions(+), 3 deletions(-)
diff --git a/install/apps/bastille-firewall b/install/apps/bastille-firewall
new file mode 100644
index 0000000..2f701ec
--- /dev/null
+++ b/install/apps/bastille-firewall
@@ -0,0 +1,93 @@
+#!/bin/sh
+#
+# bastille-firewall Load/unload ipchains rulesets
+#
+# do not rename this file unless you edit /sbin/bastille-firewall-reset
+#
+# chkconfig: 2345 5 98
+# description: A firewall/packet-filter script for Linux systems \
+# that allows the machine to be used as a gateway system
+#
+# $Id: bastille-firewall,v 1.6 2002/02/24 17:19:14 peterw Exp $
+# Copyright (c) 1999-2002 Peter Watkins
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Thanks to David Ranch, Brad A, Don G, and others for their suggestions
+#
+# This script is designed to be used as a SysV-style init script.
+#
+# It should be run with a "start" argument
+# 1) as an rc?.d "S" script, _before_ the "network" script
+# [copy this to /etc/rc.d/init.d/bastille-firewall (or your equivalent of
+# /etc/rc.d/init.d) and run 'chkconfig -add bastille-firewall' ]
+# 2) any time an interface is brought up or changed, e.g.
+# establishing a PPP conection or renewing a DHCP lease
+# [copy 'bastille-firewall-reset', 'bastille-firewall-schedule'
+# and 'ifup-local' to /sbin/]
+#
+# Normally you Do Not _Ever_ Want to run this with a "stop" argument!
+#
+# Note that running this with "stop" will disable the firewall and open
+# your system to all network traffic; if you make changes to these rules,
+# apply them by running the script again with a "start" argument.
+#
+# ** As of 0.99-beta1, this script merely kicks off the real script,
+# either /sbin/bastille-ipchains or /sbin/bastille-netfilter
+
+# Default is to use the 'ipchains' script, which will load the
+# ipchains compatibility module if you're using a 2.4 kernel
+REALSCRIPT=/sbin/bastille-ipchains
+PATH=/sbin:/bin:/usr/sbin:/usr/bin
+
+# exit function to be called in place of regular Bourne exit
+clean_exit()
+{
+ rmdir /var/lock/bastille-firewall 2>/dev/null
+ exit $1
+}
+
+[ ! -d /var/lock ] && mkdir -m 0755 /var/lock
+
+mkdir -m 0700 /var/lock/bastille-firewall 2>/dev/null
+if [ $? -ne 0 ]; then
+ if [ -n "${BASTILLE_FWALL_QUIET_FAIL}" ]; then exit 0; fi
+ echo "ERROR: bastille-firewall currently being reset or lock is stuck."
+ echo "To un-stick, remove the directory /var/lock/bastille-firewall"
+ exit 1
+fi
+
+if [ -n "$(uname -r | awk -F. ' $1 == 2 && $2 > 2 {print}')" ]; then
+ # We are using Linux 2.3 or newer; use the netfilter script if available
+ if [ -x /sbin/bastille-netfilter ]; then
+ REALSCRIPT=/sbin/bastille-netfilter
+ fi
+fi
+
+if [ ! -x ${REALSCRIPT} ]; then
+ echo "ERROR: \"${REALSCRIPT}\" not available!"
+ clean_exit 1
+fi
+
+${REALSCRIPT} "$1"
+bretval=$?
+
+# Use "subsys" locks to indicate our status
+case "$1" in
+ start|restart|reload)
+ if [ $bretval -eq 0 ]; then touch /var/lock/subsys/bastille-firewall; fi
+ ;;
+ stop)
+ rm -f /var/lock/subsys/bastille-firewall
+ ;;
+esac
+
+clean_exit $bretval
+
diff --git a/install/apps/bastille-ipchains b/install/apps/bastille-ipchains
new file mode 100644
index 0000000..5755014
--- /dev/null
+++ b/install/apps/bastille-ipchains
@@ -0,0 +1,654 @@
+#!/bin/sh
+#
+# /sbin/bastille-ipchains Load/unload ipchains rulesets
+#
+# $Source: /cvsroot/bastille-linux/dev/working_tree/Bastille/bastille-ipchains,v $
+# Modified by: $Author: peterw $
+# $Date: 2001/08/18 15:38:31 $
+# $Revision: 1.18 $
+#
+# Copyright (C) 1999-2001 Peter Watkins
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Thanks to David Ranch, Brad A, Don G, and others for their suggestions
+#
+# This script is designed to be called BY a SysV-style init script.
+#
+# It should be run with a "start" argument
+# 1) BY an rc?.d "S" script, _before_ the "network" script
+# (normally via the "bastille-firewall" init script;
+# as of 2001/02/14, the only purpose of bastille-firewall
+# is to start this script)
+# 2) any time an interface is brought up or changed, e.g.
+# establishing a PPP conection or renewing a DHCP lease
+# [also copy 'bastille-firewall-reset', 'bastille-firewall-schedule' and
+# 'ifup-local' to /sbin/ (in addition to the bastille-firewall init script]
+#
+# Normally you Do Not _Ever_ Want to run this with a "stop" argument!
+#
+# Note that running this with "stop" will disable the firewall and open
+# your system to all network traffic; if you make changes to these rules,
+# apply them by running the script again with a "start" argument.
+
+PATH=/bin:/sbin:/usr/bin:/usr/sbin
+IPCHAINS=/sbin/ipchains
+CONFIG=/etc/Bastille/bastille-firewall.cfg
+
+if [ ! -f ${CONFIG} ]; then
+ echo "ERROR: unable to read configuration file \"${CONFIG}\""
+ exit 1
+fi
+
+# source the configuration file, which will set environment variables
+. ${CONFIG}
+
+if [ -z "${TRUSTED_IFACES}" ]; then
+ echo "ERROR: no trusted interfaces specified! Exiting!"
+ exit 1
+fi
+
+#
+# Computed values
+#
+# These things should be queried/computed at run time
+#
+# LOCAL_ADDRESSES
+#
+# LOCAL_ADDRESSES lists all IP addresses for this server
+# (for the INTERNAL_SERVICES rules); if you have virtual
+# network devices, you may want to hand-code this, e.g.
+# LOCAL_ADDRESSES="127.0.0.0/8"
+#
+# The following makes a list of all current IP addresses
+LOCAL_ADDRESSES=`ifconfig | grep "inet addr" | awk '{print $2}' | awk -F: '{print $2"/32"}' | sed s:127\.0\.0\.1/32:127.0.0.1/8: `
+#
+#
+# INTERNAL_NETWORKS
+#
+# INTERNAL_NETWORKS lists the masked networks for the INT_INTERFACES
+# e.g. INTERNAL_NETWORKS="10.0.0.0/255.0.0.0"
+# The following makes a list of all current internal IP addresses _with netmasks_
+for i in ${INTERNAL_IFACES} ; do
+ INTERNAL_NETWORKS="${INTERNAL_NETWORKS} `ifconfig ${i} 2>/dev/null| grep "inet addr" | awk '{print $2":"$4}' | awk -F: '{print $2"/"$4}' | sed 's:127\.0\.0\.1/$:127.0.0.1/8:'`"
+done
+#
+#
+# DNS_SERVERS
+#
+# Derive this from /etc/resolv.conf if it's not set already
+# Note we only take the first three as most systems' resolvers
+# can only use three nameservers; see MAXNS in resolv.h for details
+MAXNS=3
+if [ -z "${DNS_SERVERS}" ]; then
+ DNS_SERVERS=`grep nameserver /etc/resolv.conf | awk -F\# '{print $1}' | grep '^nameserver' | awk '{print $2"/32"}' | head -${MAXNS}`
+fi
+#
+#
+# LOG_FLAG
+#
+# Flag to add to ${REJECT_METHOD} rules to force logging
+if [ "${LOG_FAILURES}" = "Y" ]; then
+ LOG_FLAG="-l"
+else
+ LOG_FLAG=""
+fi
+#
+#
+# CALLED_METHOD
+#
+# Variable to hold $1, for use in functions (which have their own $1 vars)
+CALLED_METHOD="$1"
+#
+#
+# REJECT_METHOD
+# Convert netfilter/DROP to ipchains/DENY
+if [ "${REJECT_METHOD}" = "DROP" ]; then
+ REJECT_METHOD="DENY"
+fi
+#
+#
+# NTP_SERVERS
+#
+# Do hostname lookups for any names in NTP_SERVERS
+#
+ntp_server_addrs=""
+for n in ${NTP_SERVERS}; do
+ ip=`echo ${n} | egrep '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'`
+ if [ -n "${ip}" ]; then
+ # looks like an IP address, use it as-is
+ ntp_server_addrs="${ntp_server_addrs} ${ip}"
+ else
+ # use 'host' t resolve address
+ ip=`host ${n} 2>/dev/null| awk '/ has address / { print $4 }' | head -1`
+ ntp_server_addrs="${ntp_server_addrs} ${ip}"
+ fi
+done
+
+
+#
+# Shell functions
+#
+# include_supplemental
+# source supplemental (plug-in) firewall scripts
+include_supplemental()
+{
+ # args: $1 = nickname for the supplemental phase
+ nickname="$1"
+ if [ -e /etc/Bastille/firewall.d/${nickname}.sh ]; then
+ cd /etc/Bastille/firewall.d && . ./${nickname}.sh
+ fi
+ if [ -d /etc/Bastille/firewall.d/${nickname}.d ]; then
+ for s in `ls /etc/Bastille/firewall.d/${nickname}.d/*.sh`; do
+ cd /etc/Bastille/firewall.d/${nickname}.d && \
+ . ${s}
+ done
+ fi
+}
+#
+# do_masq_mods
+# Function to load/unload "ip_masq_*" kernel modules
+do_masq_mods()
+{
+ # args: $1 = "load" or "unload"
+ #
+ # find the currently loaded modules
+ masq_mods=`lsmod | awk '{print $1}' | grep '^ip_masq_'`
+ #
+ # Step 1: unload unwanted modules
+ for m in ${masq_mods} ; do
+ UNLOAD_THIS_MOD=Y
+ for normal_mod in ${IP_MASQ_MODULES} ; do
+ if [ "ip_masq_${normal_mod}" = $m ]; then
+ # this module is _supposed_ to be loaded
+ UNLOAD_THIS_MOD=N
+ fi
+ done
+ if [ "${CALLED_METHOD}" = "stop" -o -z "${IP_MASQ_NETWORK}" ]; then
+ # we're either disabling the firewall or we've disabled masquerading,
+ # so we should unload _all_ masq modules
+ UNLOAD_THIS_MOD=Y
+ fi
+ if [ $UNLOAD_THIS_MOD = "Y" -a $1 = "unload" ]; then
+ rmmod $m || echo "Error unloading ${m} module"
+ fi
+ done
+ # Step 2: load wanted modules that are not already loaded
+ if [ $1 = "load" ]; then
+ for normal_mod in ${IP_MASQ_MODULES} ; do
+ MOD_LOADED=N
+ for m in ${masq_mods} ; do
+ if [ "ip_masq_${normal_mod}" = ${m} ]; then
+ MOD_LOADED=Y
+ fi
+ done
+ if [ $MOD_LOADED = "N" ]; then
+ insmod "ip_masq_${normal_mod}" || echo "Error loading ip_masq_${normal_mod} module"
+ fi
+ done
+ fi
+}
+
+# See how we were called.
+case "$1" in
+ start|reload|restart)
+ #
+ # anything to do before resetting?
+ include_supplemental pre-reset
+ #
+ # For Red Hat users, let's ensure that its firewalls are disabled
+ rhtest_ipchains=`chkconfig --list ipchains 2>/dev/null | grep :on`
+ rhtest_iptables=`chkconfig --list iptables 2>/dev/null | grep :on`
+ bftest=`chkconfig --list bastille-firewall 2>/dev/null | grep :on`
+ if [ \( -n "${rhtest_ipchains}" -o -n "${rhtest_iptables}" \) -a -n "${bftest}" ]; then
+ echo
+ echo "bastille-firewall conflicts with Red Hat 7.1's 'ipchains'"
+ echo "and 'iptables' firewalls. We are disabling Red Hat's firewalls."
+ [ -n "${rhtest_ipchains}" ] && chkconfig --level 0123456 ipchains off
+ [ -n "${rhtest_iptables}" ] && chkconfig --level 0123456 iptables off
+ echo
+ fi
+ # load the IPCHAINS compatibilty module if we're using a 2.4 kernel
+ if [ -n "$(uname -r | awk -F. ' $1 == 2 && $2 > 2 {print}')" ]; then
+ echo "Loading ipchains compatibility module"
+ modprobe ipchains
+ fi
+ #
+ # we set defaults to DENY now to minimize possible interruptions
+ # if this script is re-run to reset rules
+ #
+ # set default policy to disallow forwarding
+ ${IPCHAINS} -P forward DENY
+ # flush rules
+ ${IPCHAINS} -F forward
+ # default is to disallow incoming traffic
+ ${IPCHAINS} -P input DENY
+ # flush rules
+ ${IPCHAINS} -F input
+ # disallow outbound until we set up the explicit outbound rules
+ ${IPCHAINS} -P output DENY
+ # flush rules
+ ${IPCHAINS} -F output
+
+ # Run our "early" custom script if it exists
+ [ -f /etc/Bastille/bastille-firewall-early.sh ] && . /etc/Bastille/bastille-firewall-early.sh
+
+ # any new-style "early" plugins?
+ include_supplemental early
+
+ # always allow MTU discovery packets
+ ${IPCHAINS} -A input -p icmp --icmp-type fragmentation-needed -j ACCEPT
+ ${IPCHAINS} -A output -p icmp --icmp-type fragmentation-needed -j ACCEPT
+
+ include_supplemental pre-local-block
+
+ # Block any non-local attempts to get localhost addresses
+ # per woody@thebunker.net's bugtraq post
+ ${IPCHAINS} -A input -d 127.0.0.0/8 ! -i lo -j ${REJECT_METHOD} ${LOG_FLAG}
+
+ # Fragments
+ if [ "${ALLOW_FRAGMENTS}" = "N" ]; then
+ ${IPCHAINS} -A input -f -j ${REJECT_METHOD}
+ fi
+
+ # from the ipchains HOWTO, I think
+ if [ "${ENABLE_SRC_ADDR_VERIFY}" = "Y" ]; then
+ if [ -e /proc/sys/net/ipv4/conf/all/rp_filter ]; then
+ echo -n "Setting up IP spoofing protection..."
+ for f in /proc/sys/net/ipv4/conf/*/rp_filter; do
+ echo 1 > $f
+ done
+ echo " done."
+ else
+ echo "WARNING: errors encountered while trying to enable IP spoofing protection!"
+ fi
+ fi
+
+ include_supplemental pre-trusted
+
+ # Allow all traffic from trusted interfaces
+ echo -n "Allowing traffic from trusted interfaces..."
+ for t_iface in ${TRUSTED_IFACES} ; do
+ ${IPCHAINS} -A input -i ${t_iface} -d 0.0.0.0/0 -j ACCEPT
+ done
+ echo " done. "
+
+ # If you have networks that route traffic to each other through this
+ # server, you may want to add some forwarding rules, here, e.g.
+ # one way, 192.168.*.* -> 10.*.*.* with 192.168.*.* on "eth0"
+ #${IPCHAINS} -A forward -i eth0 -s 192.168.0.0/16 -d 10.0.0.0/8 -j ACCEPT
+ # the other direction, 10.*.*.* -> 192.168.*.* with 10.*.*.* on "eth1"
+ #${IPCHAINS} -A forward -i eth1 -d 192.168.0.0/16 -s 10.0.0.0/8 -j ACCEPT
+
+ include_supplemental pre-mcast-block
+
+ # No packets with multicast source addresses (Joshua K, RFC 1122)
+ ${IPCHAINS} -A input -s 224.0.0.0/4 -j ${REJECT_METHOD} ${LOG_FLAG}
+
+ # Forwarding
+
+ include_supplemental pre-nat
+
+ # IP Masquerading/forwarding
+ #
+ # Unload masq modules (maybe we're disabling masquerading, maybe we changed the module list)
+ do_masq_mods unload
+ #
+ if [ -n "${IP_MASQ_NETWORK}" ]; then
+ echo -n "Setting up masquerading rules..."
+ # since we've set the default forwarding policy to
+ # reject, we can enable forwarding now
+ echo 1 > /proc/sys/net/ipv4/ip_forward
+ # set up rules for masqueraded networks
+ for net in ${IP_MASQ_NETWORK} ; do
+ if [ "${DROP_SMB_NAT_BCAST}" = "Y" ]; then
+ # NetBIOS
+ ${IPCHAINS} -A forward -p tcp -s ${net} -d 0.0.0.255/0.0.0.255 137:139 -j ${REJECT_METHOD} ${LOG_FLAG}
+ ${IPCHAINS} -A forward -p udp -s ${net} -d 0.0.0.255/0.0.0.255 137:139 -j ${REJECT_METHOD} ${LOG_FLAG}
+ fi
+ for pub in ${PUBLIC_IFACES} ; do
+ # NAT should be one-way, deny traffic from public
+ # interfaces that is addresses to masq'ed networks
+ ${IPCHAINS} -A input -d ${net} -i ${pub} -j ${REJECT_METHOD} ${LOG_FLAG}
+ # spoofed addreses from outside
+ ${IPCHAINS} -A input -s ${net} -i ${pub} -j ${REJECT_METHOD} ${LOG_FLAG}
+ # enable forwarding
+ ${IPCHAINS} -A forward -s ${net} -i ${pub} -j MASQ
+ done
+ done
+ echo " done."
+ echo -n "Loading masquerading modules..."
+ do_masq_mods load
+ echo " done."
+ fi
+
+ echo -n "Setting up chains for public/internal interface traffic..."
+
+ # make a public input chain
+ ${IPCHAINS} -N PUB_IN 2> /dev/null
+ ${IPCHAINS} -F PUB_IN
+ # as close to setting policy as we can get
+ ${IPCHAINS} -A PUB_IN -j DENY
+ # make a public output chain
+ ${IPCHAINS} -N PUB_OUT 2> /dev/null
+ ${IPCHAINS} -F PUB_OUT
+ # as close to setting policy as we can get
+ ${IPCHAINS} -A PUB_OUT -j DENY
+
+ # make an "INTERNAL" input chain
+ ${IPCHAINS} -N INT_IN 2> /dev/null
+ ${IPCHAINS} -F INT_IN
+ # as close to setting policy as we can get
+ ${IPCHAINS} -A INT_IN -j DENY
+ # make an "INTERNAL" output chain
+ ${IPCHAINS} -N INT_OUT 2> /dev/null
+ ${IPCHAINS} -F INT_OUT
+ # as close to setting policy as we can get
+ ${IPCHAINS} -A INT_OUT -j DENY
+
+ include_supplemental pre-chain-split
+
+ # direct packets to the INTERNAL_* chains
+ for iface in ${INTERNAL_IFACES} ; do
+ ${IPCHAINS} -A input -i ${iface} -j INT_IN
+ ${IPCHAINS} -A output -i ${iface} -j INT_OUT
+ NON_LOOPBACK_SEEN=N
+ for net in ${LOCAL_ADDRESSES} ; do
+ if [ ${net} != "127.0.0.1/8" ]; then
+ NON_LOOPBACK_SEEN=Y
+ fi
+ done
+ # complain if no local addresses
+ if [ ${NON_LOOPBACK_SEEN} = "N" ]; then
+ echo "WARNING: no non-loopback local addresses; protection from INTERNAL_IFACES not enabled!"
+ fi
+ done
+
+ # Direct PUBLIC interface traffic to the proper chain
+ for iface in ${PUBLIC_IFACES} ; do
+ ${IPCHAINS} -A input -i ${iface} -j PUB_IN
+ ${IPCHAINS} -A output -i ${iface} -j PUB_OUT
+ done
+
+ include_supplemental pre-audit
+
+ # Auditing must be set up before these packets are blocked!
+ #
+ for service in ${TCP_AUDIT_SERVICES} ; do
+ ${IPCHAINS} -A PUB_IN -p tcp -d 0.0.0.0/0 ${service} -y -l
+ done
+ for service in ${UDP_AUDIT_SERVICES} ; do
+ ${IPCHAINS} -A PUB_IN -p udp -d 0.0.0.0/0 ${service} -l
+ done
+ for type in ${ICMP_AUDIT_TYPES} ; do
+ ${IPCHAINS} -A PUB_IN -p icmp --icmp-type ${type} -d 0.0.0.0/0 -l
+ done
+
+ # disallow any attempts to get to internal interfaces from outside
+ # not good if this is supposed to route between normal networks
+ for int in ${INTERNAL_NETWORKS} ; do
+ # deny traffic from public
+ # interfaces that is addressed to internal networks
+ ${IPCHAINS} -A PUB_IN -d ${int} -j ${REJECT_METHOD} ${LOG_FLAG}
+ # spoofed addreses from outside
+ ${IPCHAINS} -A PUB_IN -s ${int} -j ${REJECT_METHOD} ${LOG_FLAG}
+ done
+
+ echo " done. "
+
+ echo -n "Setting up general rules..."
+
+ include_supplemental pre-dhcp
+
+ # Allow response from DHCP servers
+ for iface in ${DHCP_IFACES} ; do
+ for chain in input PUB_IN INT_IN ; do
+ # allow UDP responses
+ ${IPCHAINS} -A ${chain} -p udp -s 0.0.0.0/0 bootps -d 255.255.255.255/0 bootpc -j ACCEPT
+ # normally we allow TCP data returns so this is redundant
+ # ${IPCHAINS} -A ${chain} -p tcp -s 0.0.0.0/0 bootps -d 255.255.255.255/0 bootpc -j ACCEPT
+ done
+ # make link so dhcpcd runs firewall when IP changes (if no such file already)
+ [ ! -d /etc/dhcpc ] && mkdir /etc/dhcpc -m 0750
+ if [ -x /sbin/bastille-firewall-reset -a ! -L /etc/dhcpc/dhcpcd-${iface}.exe ]; then
+ ln -s /sbin/bastille-firewall-reset /etc/dhcpc/dhcpcd-${iface}.exe
+ fi
+ done
+
+ include_supplemental pre-internal
+
+ # internal interface rules
+ for net in ${LOCAL_ADDRESSES} ; do
+ # Allow accessses to TCP services on this system
+ for serv in ${TCP_INTERNAL_SERVICES} ; do
+ ${IPCHAINS} -A INT_IN -p tcp -d ${net} ${serv} -j ACCEPT
+ done
+ ${IPCHAINS} -A INT_IN -p tcp -d ${net} ${serv} \! -y -j ACCEPT
+ # UDP services
+ for serv in ${UDP_INTERNAL_SERVICES} ; do
+ ${IPCHAINS} -A INT_IN -p udp -d ${net} ${serv} -j ACCEPT
+ done
+ done
+ # ICMP
+ # hopefully you don't care about hiding from internal hosts!
+ ${IPCHAINS} -A INT_IN -p icmp -d 0.0.0.0/0 -j ACCEPT
+ ${IPCHAINS} -A INT_OUT -p icmp -d 0.0.0.0/0 -j ACCEPT
+ # ...but if you do... try this... (and see the PUB_IN rules below)
+ #for type in ${ICMP_ALLOWED_TYPES} ; do
+ # ${IPCHAINS} -A INT_IN -p icmp --icmp-type ${type} -d 0.0.0.0/0 -j ACCEPT
+ #done
+ #for type in ${ICMP_OUTBOUND_DISABLED_TYPES} ; do
+ # ${IPCHAINS} -A INT_OUT -p icmp --icmp-type ${type} -j REJECT
+ #done
+
+ # input rules
+ #
+ # public interfaces
+
+ include_supplemental pre-input
+
+ # --------------------- ICMP --------------------------
+ for type in ${ICMP_ALLOWED_TYPES} ; do
+ ${IPCHAINS} -A PUB_IN -p icmp --icmp-type ${type} -d 0.0.0.0/0 -j ACCEPT
+ done
+
+ # --------------------- TCP --------------------------
+ for serv in ${TCP_PUBLIC_SERVICES} ; do
+ ${IPCHAINS} -A PUB_IN -p tcp -d 0.0.0.0/0 ${serv} -j ACCEPT
+ done
+
+ # if you're disallowing ICMP, you may be trying to look
+ # invisible/disable ping, so let's just drop these attempts
+ ${IPCHAINS} -A PUB_IN -p icmp -d 0.0.0.0/0 -j DENY ${LOG_FLAG}
+
+ for chain in PUB_IN INT_IN ; do
+ if [ ${FORCE_PASV_FTP} != "Y" ]; then
+ # no point explicitly blocking TCP services unless active FTP is enabled
+ # Step 1: block the high port TCP services
+ for serv in ${TCP_BLOCKED_SERVICES} ; do
+ # only block -y initial connects; in case the port was needlessly
+ # specified, this should still enable it to be used as a source
+ # port for non-FTP connecions from this host or machines using it as a gateway
+ ${IPCHAINS} -A ${chain} -p tcp -d 0.0.0.0/0 ${serv} -y -j ${REJECT_METHOD} ${LOG_FLAG}
+ done
+ # FEATURE: check bound high TCP and complain?
+ # Step 2: allow the ftp-data connections
+ ${IPCHAINS} -A ${chain} -p tcp -d 0.0.0.0/0 1024: -s 0.0.0.0/0 ftp-data -j ACCEPT
+ fi
+
+ # general response to my TCP requests
+ ${IPCHAINS} -A ${chain} -p tcp \! -y -j ACCEPT
+
+ # no TCP requests to other ports (redundant)
+ # ${IPCHAINS} -A ${chain} -p tcp -j ${REJECT_METHOD} ${LOG_FLAG}
+
+ # --------------------- UDP --------------------------
+ for serv in ${UDP_PUBLIC_SERVICES} ; do
+ ${IPCHAINS} -A PUB_IN -p udp -d 0.0.0.0/0 ${serv} -j ACCEPT
+ done
+
+ # This isn't necessary unless you have DNS_SERVERS or NTP_SERVERS
+ # but who wouldn't have DNS servers configured?
+ for serv in ${UDP_BLOCKED_SERVICES} ; do
+ ${IPCHAINS} -A ${chain} -p udp -d 0.0.0.0/0 ${serv} -j ${REJECT_METHOD} ${LOG_FLAG}
+ done
+
+ for dns_net in ${DNS_SERVERS} ; do
+ ${IPCHAINS} -A ${chain} -p udp -s ${dns_net} domain -d 0.0.0.0/0 1024: -j ACCEPT
+ done
+
+ for ntp_net in ${ntp_server_addrs} ; do
+ # this allows unprivileged queries, e.g. 'ntpdate'
+ ${IPCHAINS} -A ${chain} -p udp -s ${ntp_net} ntp -d 0.0.0.0/0 1024: -j ACCEPT
+ # this allows you to run an ntp daemon to maintain
+ # system time nore gracefully than with 'ntpdate'
+ ${IPCHAINS} -A ${chain} -p udp -s ${ntp_net} ntp -d 0.0.0.0/0 ntp -j ACCEPT
+ done
+ # Reject other UDP (redundant)
+ #${IPCHAINS} -A ${chain} -p udp -j ${REJECT_METHOD} ${LOG_FLAG}
+ done
+
+
+ # end of loop through public interfaces for input rules
+
+ if [ ${FORCE_PASV_FTP} != "Y" -a \( -n "${PUBLIC_IFACES}" -o -n "${INTERNAL_IFACES}" \) ]; then
+ # warning
+ echo
+ echo "WARNING: allowing \"active\" FTP; any unknown TCP services running"
+ echo "on high ports will be vulnerable; blocking too many high TCP ports"
+ echo "may affect various TCP _clients_ running on this machine or using"
+ echo "this machine as a gateway."
+ fi
+
+ # now we can deny the attempts from the internal interfaces to this host
+ for tnet in ${LOCAL_ADDRESSES} ; do
+ for chain in PUB_IN INT_IN ; do
+ ${IPCHAINS} -A ${chain} -d ${tnet} -j ${REJECT_METHOD} ${LOG_FLAG}
+ done
+ done
+ # now that we've blocked attempts from the internal interfaces
+ # to the IP's on this server, we need to accept other connections
+ # so the IP Masq / NAT will function
+ for net in ${IP_MASQ_NETWORK} ; do
+ for chain in PUB_IN INT_IN ; do
+ ${IPCHAINS} -A ${chain} -s ${net} -j ACCEPT
+ done
+ done
+
+ # --------------------- catch-all --------------------------
+ # Reject all other traffic (redundant if not logging)
+ if [ ${LOG_FAILURES} = "Y" ]; then
+ for chain in input forward PUB_IN INT_IN ; do
+ ${IPCHAINS} -A ${chain} -j ${REJECT_METHOD} ${LOG_FLAG}
+ done
+ fi
+
+ #
+ echo " done."
+
+ echo -n "Setting up outbound rules..."
+
+ include_supplemental pre-output
+
+ # block outbound ICMP types (usu. to hide from traceroute)
+ for type in ${ICMP_OUTBOUND_DISABLED_TYPES} ; do
+ # ** The following will limit ICMP on public and internal interfaces:
+ # for chain in PUB_OUT INT_OUT ; do
+ # ** but our default is to only limit outbound ICMP on public interfaces
+ for chain in PUB_OUT ; do
+ ${IPCHAINS} -A ${chain} -p icmp --icmp-type ${type} -j REJECT ${LOG_FLAG}
+ done
+ done
+ #
+ # Here you might really lock things down if this is a server,
+ # e.g., to keep it from doing anything but connecting to
+ # SMTP servers and responding to Web requests, or whatever
+ # the specific requirements are.
+ #
+ # Such lockdowns are recommended if the situation affords you
+ # that flexibility.
+ #
+ # default is to enable outbound traffic
+ # (again, here, for a server you might default to ${REJECT_METHOD} )
+ ${IPCHAINS} -P output ACCEPT
+
+ include_supplemental pre-policy-reset
+
+ # Now that all rules are set, we can change the policies
+ # to the user preference safely
+ ${IPCHAINS} -P forward ${REJECT_METHOD}
+ ${IPCHAINS} -P input ${REJECT_METHOD}
+ # to set default "policies" for PUB_* and INT_* chains, add a final rule
+ if [ ${LOG_FAILURES} != "Y" ]; then
+ # if LOG_FAILURES were set, we would have already done this
+ for chain in PUB_IN INT_IN ; do
+ ${IPCHAINS} -A ${chain} -j ${REJECT_METHOD} ${LOG_FLAG}
+ done
+ fi
+ for chain in PUB_OUT INT_OUT ; do
+ ${IPCHAINS} -A ${chain} -j ACCEPT
+ done
+ # rule 1 in all of these chains is a deny rule; remove it so other rules work
+ for chain in PUB_IN INT_IN PUB_OUT INT_OUT ; do
+ ${IPCHAINS} -D ${chain} -j DENY
+ done
+
+ include_supplemental post-rule-setup
+
+ echo " done."
+
+ ;;
+ stop)
+ include_supplemental pre-drop-rules
+ echo
+ echo "WARNING: reverting to default settings (dropping firewall)"
+ # We should disable NAT/forwarding even if not set to restore defaults
+ echo -n "disabling IP forwarding..."
+ echo 0 > /proc/sys/net/ipv4/ip_forward
+ echo " done."
+ echo -n "unloading masquerading modules..."
+ do_masq_mods unload
+ echo " done."
+ # flushing seems to leave the default input at ${REJECT_METHOD}
+ echo -n "resetting default input rules to accept..."
+ ${IPCHAINS} -P input ACCEPT
+ echo " done."
+ echo -n "resetting default output rule to accept..."
+ ${IPCHAINS} -P output ACCEPT
+ echo " done."
+ # We disabled forwarding with the /proc interface, but we
+ # reset FORWARD to ACCEPT because that;s the normal default
+ echo -n "resetting default forward rule to accept..."
+ ${IPCHAINS} -P forward ACCEPT
+ echo " done."
+ for chain in input output forward ; do
+ echo -n "flushing ${chain} rules..."
+ ${IPCHAINS} -F ${chain}
+ echo " done."
+ done
+ # flush and delete the user-defined chains
+ echo -n "removing user-defined chains..."
+ for chain in PUB_IN PUB_OUT INT_IN INT_OUT ; do
+ ${IPCHAINS} -F ${chain}
+ ${IPCHAINS} -X ${chain}
+ done
+ include_supplemental post-drop-rules
+ echo " done."
+ ;;
+ status)
+ ${IPCHAINS} -L -v -n
+ ;;
+ *)
+ echo "Usage: $0 {start|restart|reload|stop|status}"
+ exit 1
+esac
+
+exit 0
+
diff --git a/install/apps/bastille-netfilter b/install/apps/bastille-netfilter
new file mode 100644
index 0000000..2ffb333
--- /dev/null
+++ b/install/apps/bastille-netfilter
@@ -0,0 +1,626 @@
+#!/bin/sh
+#
+# /sbin/bastille-netfilter Load/unload netfilter rulesets
+#
+# $Source: /cvsroot/bastille-linux/dev/working_tree/Bastille/bastille-netfilter,v $
+# Modified by: $Author: peterw $
+# $Date: 2002/01/11 02:23:14 $
+# $Revision: 1.27 $
+#
+# Copyright (C) 1999-2001 Peter Watkins
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Thanks to David Ranch, Brad A, Don G, Jay Beale and others
+# (especially the netfilter mailing list!) for their suggestions
+#
+# This script is designed to be called BY a SysV-style init script.
+#
+# It should be run with a "start" argument
+# 1) BY an rc?.d "S" script, _before_ the "network" script
+# (normally via the "bastille-firewall" init script;
+# as of 2001/02/14, the only purpose of bastille-firewall
+# is to start this script)
+# 2) any time an interface is brought up or changed, e.g.
+# establishing a PPP conection or renewing a DHCP lease
+# [also copy 'bastille-firewall-reset', 'bastille-firewall-schedule' and
+# 'ifup-local' to /sbin/ (in addition to the bastille-firewall init script]
+#
+# Normally you Do Not _Ever_ Want to run this with a "stop" argument!
+#
+# Note that running this with "stop" will disable the firewall and open
+# your system to all network traffic; if you make changes to these rules,
+# apply them by running the script again with a "start" argument.
+
+PATH=/bin:/sbin:/usr/bin:/usr/sbin
+IPTABLES=/sbin/iptables
+CONFIG=/etc/Bastille/bastille-firewall.cfg
+
+if [ ! -x ${IPTABLES} ]; then
+ echo "ERROR: \"${IPTABLES}\" does not exist!"
+ if [ -x /sbin/bastille-ipchains ]; then
+ # better to fall back to 'ipchains' than do nothing
+ unset IPTABLES
+ echo "Executing /sbin/bastille-ipchains $1"
+ /sbin/bastille-ipchains $1
+ exit $?
+ fi
+ exit 1
+fi
+
+if [ ! -f ${CONFIG} ]; then
+ echo "ERROR: unable to read configuration file \"${CONFIG}\""
+ exit 1
+fi
+
+# source the configuration file, which will set environment variables
+. ${CONFIG}
+
+if [ -z "${REJECT_METHOD}" ]; then
+ echo "ERROR: no reject method specified (corrupt config file?) Exiting!"
+ exit 1
+fi
+
+
+#
+# Computed values
+#
+# These things should be queried/computed at run time
+#
+# LOCAL_ADDRESSES
+#
+# LOCAL_ADDRESSES lists all IP addresses for this server
+# (for the INTERNAL_SERVICES rules); if you have virtual
+# network devices, you may want to hand-code this, e.g.
+# LOCAL_ADDRESSES="127.0.0.0/8"
+#
+# The following makes a list of all current IP addresses
+LOCAL_ADDRESSES=`ifconfig | grep "inet addr" | awk '{print $2}' | awk -F: '{print $2"/32"}' | sed s:127\.0\.0\.1/32:127.0.0.1/8: `
+#
+#
+# DEFAULT_GW_IFACE
+#
+# The name of the address that is the default gateway (for SNAT)
+DEFAULT_GW_IFACE=`netstat -nr | awk '$1 == "0.0.0.0" {print $8}'`
+#
+#
+# INTERNAL_NETWORKS
+#
+# INTERNAL_NETWORKS lists the masked networks for the INT_INTERFACES
+# e.g. INTERNAL_NETWORKS="10.0.0.0/255.0.0.0"
+# The following makes a list of all current internal IP addresses _with netmasks_
+for i in ${INTERNAL_IFACES} ; do
+ INTERNAL_NETWORKS="${INTERNAL_NETWORKS} `ifconfig ${i} | grep "inet addr" | awk '{print $2":"$4}' | awk -F: '{print $2"/"$4}' | sed 's:127\.0\.0\.1/$:127.0.0.1/8:'`"
+ if [ $i = "${DEFAULT_GW_IFACE}" ]; then
+ DEFAULT_GW_IP=`ifconfig ${i} | grep "inet addr" | awk '{print $2}'`
+ fi
+done
+#
+#
+# CALLED_METHOD
+#
+# Variable to hold $1, for use in functions (which have their own $1 vars)
+CALLED_METHOD="$1"
+#
+#
+# REJECT_METHOD
+#
+# Convert ipchains/DENY to netfilter/DROP
+if [ "${REJECT_METHOD}" = "DENY" ]; then
+ REJECT_METHOD="DROP"
+fi
+
+# counter number to help toubleshoot
+RULENUM=0
+
+#
+# Shell functions
+#
+# include_supplemental
+# source supplemental (plug-in) firewall scripts
+include_supplemental()
+{
+ # args: $1 = nickname for the supplemental phase
+ nickname="$1"
+ if [ -e /etc/Bastille/firewall.d/${nickname}.sh ]; then
+ cd /etc/Bastille/firewall.d && . ./${nickname}.sh
+ fi
+ if [ -d /etc/Bastille/firewall.d/${nickname}.d ]; then
+ for s in `ls /etc/Bastille/firewall.d/${nickname}.d/*.sh`; do
+ cd /etc/Bastille/firewall.d/${nickname}.d && \
+ . ${s}
+ done
+ fi
+}
+#
+# incr_rule_num
+# Increment counter number to help toubleshoot
+incr_rule_num()
+{
+ RULENUM=`expr $RULENUM + 1`
+ return 0
+}
+#
+# do_masq_mods
+# Function to load/unload NAT kernel modules
+do_masq_mods()
+{
+ # args: $1 = "load" or "unload"
+ #
+ # find the currently loaded modules
+ masq_mods=`lsmod | awk '{print $1}' | grep '^ip_nat_'`
+ #
+ # Step 1: unload unwanted modules
+ for m in ${masq_mods} ; do
+ UNLOAD_THIS_MOD=Y
+ for normal_mod in ${IP_MASQ_MODULES} ; do
+ if [ "ip_nat_${normal_mod}" = $m -o "ip_nat_${normal_mod}_conntrack" = $m ]; then
+ # this module is _supposed_ to be loaded
+ UNLOAD_THIS_MOD=N
+ fi
+ done
+ if [ "${CALLED_METHOD}" = "stop" -o -z "${IP_MASQ_NETWORK}" ]; then
+ # we're either disabling the firewall or we've disabled masquerading,
+ # so we should unload _all_ masq modules
+ UNLOAD_THIS_MOD=Y
+ fi
+ if [ $UNLOAD_THIS_MOD = "Y" -a $1 = "unload" ]; then
+ rmmod ${m} || echo "Error unloading ${m} module"
+ fi
+ done
+ # Step 2: load wanted modules that are not already loaded
+ if [ $1 = "load" ]; then
+ for normal_mod in ${IP_MASQ_MODULES} ; do
+ MOD_LOADED=N
+ for m in ${masq_mods} ; do
+ if [ "ip_nat_${normal_mod}" = $m ]; then
+ MOD_LOADED=Y
+ fi
+ done
+ if [ $MOD_LOADED = "N" ]; then
+ insmod "ip_nat_${normal_mod}" || echo "Error loading ip_nat_${normal_mod} module"
+ fi
+ # try to load any _conntrack variants
+ modprobe "ip_nat_${normal_mod}_conntrack" 2>/dev/null
+ done
+ fi
+}
+
+# See how we were called.
+case "$1" in
+ start|restart|reload)
+ #
+ # anything to do before resetting?
+ include_supplemental pre-reset
+ #
+ # Make sure we don't have any ipchains rules!
+ for c in INPUT OUTPUT FORWARD; do
+ ipchains -P ${c} DENY 2>/dev/null
+ ipchains -F ${c} 2>/dev/null
+ done
+ ipchains -X 2>/dev/null
+ rmmod ipchains 2>/dev/null
+ #
+ # For Red Hat users, let's ensure that its firewalls are disabled
+ rhtest_ipchains=`chkconfig --list ipchains 2>/dev/null | grep :on`
+ rhtest_iptables=`chkconfig --list iptables 2>/dev/null | grep :on`
+ bftest=`chkconfig --list bastille-firewall 2>/dev/null | grep :on`
+ if [ \( -n "${rhtest_ipchains}" -o -n "${rhtest_iptables}" \) -a -n "${bftest}" ]; then
+ echo
+ echo "bastille-firewall conflicts with Red Hat 7.1's 'ipchains'"
+ echo "and 'iptables' firewalls. We are disabling Red Hat's firewalls."
+ [ -n "${rhtest_ipchains}" ] && chkconfig --level 0123456 ipchains off
+ [ -n "${rhtest_iptables}" ] && chkconfig --level 0123456 iptables off
+ echo
+ fi
+ #
+ # Make sure the iptables/netfilter kernel module is loaded
+ modprobe ip_tables
+ #
+ # Clean up the default chains
+ #
+ # we set defaults to DROP to minimize possible interruptions
+ # if this script is re-run to reset rules
+ #
+ for chain in INPUT OUTPUT FORWARD ; do
+ ${IPTABLES} -P ${chain} DROP
+ # flush rules
+ ${IPTABLES} -F ${chain}
+ done
+ #
+ for chain in PREROUTING POSTROUTING ; do
+ ${IPTABLES} -t nat -F ${chain}
+ done
+ ${IPTABLES} -t mangle -F PREROUTING
+ # Our custom chains
+ for chain in PUB_IN PUB_OUT INT_IN INT_OUT ; do
+ ${IPTABLES} -N ${chain} 2> /dev/null
+ ${IPTABLES} -F ${chain}
+ ${IPTABLES} -A ${chain} -j DROP
+ done
+
+ # PAROLE chain is used for TCP services
+ ${IPTABLES} -N PAROLE 2> /dev/null
+ ${IPTABLES} -F PAROLE
+ if [ "${IP_ALWAYS_USE_STATE}" = "Y" ]; then
+ # nmap NULL scans pass the --syn test, but this doesn't seem
+ # to catch them, either
+ [ "${LOG_FAILURES}" = "Y" ] && \
+ ${IPTABLES} -A PAROLE -p tcp --tcp-flags ALL NONE -j LOG --log-level ${IP_LOG_LEVEL} --log-prefix "PAROLE ${REJECT_METHOD} $RULENUM" ; incr_rule_num
+ ${IPTABLES} -A PAROLE -p tcp --tcp-flags ALL NONE -j ${REJECT_METHOD}
+ ${IPTABLES} -A PAROLE -p tcp -m state --state NEW --syn -j ACCEPT
+ [ "${LOG_FAILURES}" = "Y" ] && \
+ ${IPTABLES} -A PAROLE -p tcp -j LOG --log-level ${IP_LOG_LEVEL} --log-prefix "PAROLE ${REJECT_METHOD} $RULENUM" ; incr_rule_num
+ ${IPTABLES} -A PAROLE -p tcp -j ${REJECT_METHOD}
+ fi
+ ${IPTABLES} -A PAROLE -j ACCEPT
+
+ # Run our "early" custom script if it exists
+ [ -f /etc/Bastille/bastille-firewall-early.sh ] && . /etc/Bastille/bastille-firewall-early.sh
+
+ # any new-style "early" plugins?
+ include_supplemental early
+
+ # enable stateful rules
+ modprobe ip_conntrack
+ modprobe ip_conntrack_ftp
+ modprobe ipt_LOG
+
+ # from the ipchains HOWTO
+ if [ "${ENABLE_SRC_ADDR_VERIFY}" = "Y" ]; then
+ if [ -e /proc/sys/net/ipv4/conf/all/rp_filter ]; then
+ echo -n "Setting up IP spoofing protection..."
+ for f in /proc/sys/net/ipv4/conf/*/rp_filter; do
+ echo 1 > $f
+ done
+ echo " done."
+ else
+ echo "WARNING: errors encountered while trying to enable IP spoofing protection!"
+ fi
+ fi
+
+ include_supplemental pre-local-block
+
+ # Block any non-local attempts to get localhost addresses
+ # per woody@thebunker.net's bugtraq post
+ [ "${LOG_FAILURES}" = "Y" ] && \
+ ${IPTABLES} -A INPUT -p tcp -d 127.0.0.0/8 ! -i lo -j LOG --log-level ${IP_LOG_LEVEL} --log-prefix "INPUT ${REJECT_METHOD} $RULENUM" ; incr_rule_num
+ ${IPTABLES} -A INPUT -p tcp -d 127.0.0.0/8 ! -i lo -j ${REJECT_METHOD}
+
+ # Uncomment this to really, truly block active FTP
+ # (shouldn't be necessary if ip_conntrack_ftp does its job)
+ #if [ ${FORCE_PASV_FTP} = "Y" ]; then
+ # [ "${LOG_FAILURES}" = "Y" ] && \
+ # ${IPTABLES} -A INPUT -p tcp --sport ftp-data -j LOG --log-level ${IP_LOG_LEVEL} --log-prefix "INPUT ${REJECT_METHOD} $RULENUM " ; incr_rule_num
+ # ${IPTABLES} -A INPUT -p tcp --sport ftp-data -j ${REJECT_METHOD}
+ # [ "${LOG_FAILURES}" = "Y" ] && \
+ # ${IPTABLES} -A FORWARD -p tcp --sport ftp-data -j LOG --log-level ${IP_LOG_LEVEL} --log-prefix "FORWARD ${REJECT_METHOD} $RULENUM " ; incr_rule_num
+ # ${IPTABLES} -A FORWARD -p tcp --sport ftp-data -j ${REJECT_METHOD}
+ #fi
+
+ include_supplemental pre-established
+
+ # Stateful data returns (this should include ICMP messages)
+ # ...for data to this box
+ ${IPTABLES} -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
+ ${IPTABLES} -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
+
+ # Fragments
+ if [ "${ALLOW_FRAGMENTS}" = "N" ]; then
+ [ "${LOG_FAILURES}" = "Y" ] && \
+ ${IPTABLES} -A INPUT -f -j LOG --log-level ${IP_LOG_LEVEL} --log-prefix "INPUT ${REJECT_METHOD} $RULENUM " ; incr_rule_num
+ ${IPTABLES} -A INPUT -f -j ${REJECT_METHOD}
+ fi
+
+ include_supplemental pre-trusted
+
+ # Allow all traffic from trusted interfaces
+ echo -n "Allowing traffic from trusted interfaces..."
+ for t_iface in ${TRUSTED_IFACES} ; do
+ # we could be pickier here, e.g. only allow traffic
+ # that looks valid
+ ${IPTABLES} -A INPUT -i ${t_iface} -j ACCEPT
+ done
+ echo " done. "
+
+ # If you have networks that route traffic to each other through this
+ # server, you may want to add some forwarding rules, here, e.g.
+ # one way, 192.168.*.* -> 10.*.*.* with 192.168.*.* on "eth0"
+ #
+ # Note: I _think_ this is right; if not, please let me know!
+ #
+ #${IPTABLES} -A FORWARD -i eth0 -s 192.168.0.0/16 -d 10.0.0.0/8 -j ACCEPT
+ # the other direction, 10.*.*.* -> 192.168.*.* with 10.*.*.* on "eth1"
+ #${IPTABLES} -A FORWARD -i eth1 -d 192.168.0.0/16 -s 10.0.0.0/8 -j ACCEPT
+
+ include_supplemental pre-mcast-block
+
+ # No packets with multicast source addresses (Joshua K, RFC 1122)
+ # (If you want to enable multicast, comment this out!)
+ [ "${LOG_FAILURES}" = "Y" ] && \
+ ${IPTABLES} -A INPUT -s 224.0.0.0/4 -j LOG --log-level ${IP_LOG_LEVEL} --log-prefix "INPUT ${REJECT_METHOD} $RULENUM " ; incr_rule_num
+ ${IPTABLES} -A INPUT -s 224.0.0.0/4 -j ${REJECT_METHOD}
+
+ # Forwarding
+
+ include_supplemental pre-nat
+
+ # IP Masquerading/forwarding
+ #
+ # Unload masq modules (maybe we're disabling masquerading, maybe we changed the module list)
+ #do_masq_mods unload
+ #
+ if [ -n "${IP_MASQ_NETWORK}" ]; then
+ echo -n "Loading NAT modules..."
+ modprobe iptable_nat
+ echo " done."
+ echo -n "Setting up masquerading rules..."
+ # since we've set the default forwarding policy to
+ # reject, we can enable forwarding now
+ echo 1 > /proc/sys/net/ipv4/ip_forward
+ # set up rules for masqueraded networks
+ for net in ${IP_MASQ_NETWORK} ; do
+ for pub in ${PUBLIC_IFACES} ; do
+ # NAT should be one-way, deny traffic from public
+ # interfaces that is addresses to masq'ed networks
+ [ "${LOG_FAILURES}" = "Y" ] && \
+ ${IPTABLES} -A INPUT -d ${net} -i ${pub} -j LOG --log-level ${IP_LOG_LEVEL} --log-prefix "INPUT ${REJECT_METHOD} $RULENUM " ; incr_rule_num
+ ${IPTABLES} -A INPUT -d ${net} -i ${pub} -j ${REJECT_METHOD}
+ # spoofed addreses from outside
+ [ "${LOG_FAILURES}" = "Y" ] && \
+ ${IPTABLES} -A INPUT -s ${net} -i ${pub} -j LOG --log-level ${IP_LOG_LEVEL} --log-prefix "INPUT ${REJECT_METHOD} $RULENUM " ; incr_rule_num
+ ${IPTABLES} -A INPUT -s ${net} -i ${pub} -j ${REJECT_METHOD}
+ if [ "${DROP_SMB_NAT_BCAST}" = "Y" ]; then
+ # NetBIOS
+ [ "${LOG_FAILURES}" = "Y" ] && \
+ ${IPTABLES} -A FORWARD -p tcp -s ${net} -o ${pub} --dport 137:139 -d 0.0.0.255/0.0.0.255 -j LOG --log-level ${IP_LOG_LEVEL} --log-prefix "FORWARD ${REJECT_METHOD} $RULENUM " ; incr_rule_num
+ ${IPTABLES} -A FORWARD -p tcp -s ${net} -o ${pub} --dport 137:139 -d 0.0.0.255/0.0.0.255 -j ${REJECT_METHOD}
+ [ "${LOG_FAILURES}" = "Y" ] && \
+ ${IPTABLES} -A FORWARD -p udp -s ${net} -o ${pub} --dport 137:139 -d 0.0.0.255/0.0.0.255 -j LOG --log-level ${IP_LOG_LEVEL} --log-prefix "FORWARD ${REJECT_METHOD} $RULENUM " ; incr_rule_num
+ ${IPTABLES} -A FORWARD -p udp -s ${net} -o ${pub} --dport 137:139 -d 0.0.0.255/0.0.0.255 -j ${REJECT_METHOD}
+ fi
+ # set up a NAT rule with MASQ -- se below for SNAT
+ ${IPTABLES} -t nat -A POSTROUTING -s ${net} -o ${pub} -j MASQUERADE
+ ${IPTABLES} -A FORWARD -s ${net} -o ${pub} -j ACCEPT
+ done
+ done
+ # If you have a statuc address for the public interface,
+ # you might prefer setting upp static NAT instead of the
+ # -j MASQUERADE code above:
+ #${IPTABLES} -t nat -A POSTROUTING -o ${DEFAULT_GW_IFACE} -j SNAT --to ${DEFAULT_GW_IP}
+ echo " done."
+ echo -n "Loading masquerading modules..."
+ do_masq_mods load
+ echo " done."
+ fi
+
+ include_supplemental pre-chain-split
+
+ echo -n "Setting up chains for public/internal interface traffic..."
+
+ # Direct PUBLIC interface traffic to the proper chain
+ for iface in ${PUBLIC_IFACES} ; do
+ ${IPTABLES} -A INPUT -i ${iface} -j PUB_IN
+ ${IPTABLES} -A OUTPUT -o ${iface} -j PUB_OUT
+ done
+
+
+ # disallow any attempts to get to internal interfaces from outside
+ # not good if this is supposed to route between normal networks
+ for int in ${INTERNAL_NETWORKS} ; do
+ # deny traffic from public
+ # interfaces that is addressed to internal networks
+ [ "${LOG_FAILURES}" = "Y" ] && \
+ ${IPTABLES} -A PUB_IN -d ${int} -j LOG --log-level ${IP_LOG_LEVEL} --log-prefix "PUB_IN ${REJECT_METHOD} $RULENUM " ; incr_rule_num
+ ${IPTABLES} -A PUB_IN -d ${int} -j ${REJECT_METHOD}
+ # spoofed addreses from outside
+ [ "${LOG_FAILURES}" = "Y" ] && \
+ ${IPTABLES} -A PUB_IN -s ${int} -j LOG --log-level ${IP_LOG_LEVEL} --log-prefix "PUB_IN ${REJECT_METHOD} $RULENUM " ; incr_rule_num
+ ${IPTABLES} -A PUB_IN -s ${int} -j ${REJECT_METHOD}
+ done
+
+ # direct packets to the INTERNAL_* chains
+ for iface in ${INTERNAL_IFACES} ; do
+ ${IPTABLES} -A INPUT -i ${iface} -j INT_IN
+ ${IPTABLES} -A OUTPUT -o ${iface} -j INT_OUT
+ done
+ echo " done. "
+
+ echo -n "Setting up general rules..."
+
+ include_supplemental pre-dhcp
+
+ # Allow response from DHCP servers
+ for iface in ${DHCP_IFACES} ; do
+ # make link so dhcpcd runs firewall when IP changes (if no such file already)
+ [ ! -d /etc/dhcpc ] && mkdir /etc/dhcpc -m 0750
+ if [ -x /sbin/bastille-firewall-reset -a ! -L /etc/dhcpc/dhcpcd-${iface}.exe ]; then
+ ln -s /sbin/bastille-firewall-reset /etc/dhcpc/dhcpcd-${iface}.exe
+ fi
+ done
+
+ include_supplemental pre-internal
+
+ # internal interface rules
+ # Allow accessses to TCP services on this system
+ for serv in ${TCP_INTERNAL_SERVICES} ; do
+ ${IPTABLES} -A INT_IN -p tcp --dport ${serv} -j PAROLE
+ done
+ # UDP services
+ for serv in ${UDP_INTERNAL_SERVICES} ; do
+ ${IPTABLES} -A INT_IN -p udp --dport ${serv} -j ACCEPT
+ done
+ # ICMP
+ # hopefully you don't care about hiding from internal hosts!
+ ${IPTABLES} -A INT_IN -p icmp -j ACCEPT
+ ${IPTABLES} -A INT_OUT -p icmp -j ACCEPT
+ # ...but if you do... try this... (and see the PUB_IN rules below)
+ #for type in ${ICMP_ALLOWED_TYPES} ; do
+ # ${IPTABLES} -A INT_IN -p icmp --icmp-type ${type} -j ACCEPT
+ #done
+
+ include_supplemental pre-input
+
+ # input rules
+ #
+ # public interfaces
+
+ # --------------------- ICMP --------------------------
+ for type in ${ICMP_ALLOWED_TYPES} ; do
+ ${IPTABLES} -A PUB_IN -p icmp --icmp-type ${type} -j ACCEPT
+ done
+
+ # --------------------- TCP --------------------------
+ for serv in ${TCP_PUBLIC_SERVICES} ; do
+ ${IPTABLES} -A PUB_IN -p tcp --dport ${serv} -j PAROLE
+ done
+
+ # --------------------- UDP --------------------------
+ for serv in ${UDP_PUBLIC_SERVICES} ; do
+ ${IPTABLES} -A PUB_IN -p udp --dport ${serv} -j ACCEPT
+ done
+
+ include_supplemental pre-audit
+
+ # -------------- Public interface input auditing ---------------
+ # Note that this will only audit services that are not actually available
+ #
+ for service in ${TCP_AUDIT_SERVICES} ; do
+ ${IPTABLES} -A PUB_IN -p tcp --dport ${service} -m state --state NEW,INVALID -m limit --limit 5/second --limit-burst 8 -j LOG --log-level ${IP_LOG_LEVEL} --log-prefix "audit"
+ done
+ for service in ${UDP_AUDIT_SERVICES} ; do
+ ${IPTABLES} -A PUB_IN -p udp --dport ${service} -m state --state NEW,INVALID -m limit --limit 5/second --limit-burst 8 -j LOG --log-level ${IP_LOG_LEVEL} --log-prefix "audit"
+ done
+ for type in ${ICMP_AUDIT_TYPES} ; do
+ ${IPTABLES} -A PUB_IN -p icmp --icmp-type ${type} -m state --state NEW,INVALID -m limit --limit 5/second --limit-burst 8 -j LOG --log-level ${IP_LOG_LEVEL} --log-prefix "audit"
+ done
+
+ # if you're disallowing ICMP, you may be trying to look
+ # invisible/disable ping, so let's just drop these attempts
+ [ "${LOG_FAILURES}" = "Y" ] && \
+ ${IPTABLES} -A PUB_IN -p icmp -j LOG --log-level ${IP_LOG_LEVEL} --log-prefix "PUB_IN DROP $RULENUM" ; incr_rule_num
+ ${IPTABLES} -A PUB_IN -p icmp -j DROP
+
+ # --------------------- catch-all --------------------------
+ # Reject all other traffic (redundant if not logging)
+ if [ ${LOG_FAILURES} = "Y" ]; then
+ for chain in INPUT PUB_IN INT_IN ; do
+ [ "${LOG_FAILURES}" = "Y" ] && \
+ ${IPTABLES} -A ${chain} -j LOG --log-level ${IP_LOG_LEVEL} --log-prefix "${chain} ${REJECT_METHOD} $RULENUM " ; incr_rule_num
+ ${IPTABLES} -A ${chain} -j ${REJECT_METHOD}
+ done
+ fi
+
+ #
+ echo " done."
+
+ include_supplemental pre-output
+
+ echo -n "Setting up outbound rules..."
+ #
+ # Here you might really lock things down if this is a server,
+ # e.g., to keep it from doing anything but connecting to
+ # SMTP servers and responding to Web requests, or whatever
+ # the specific requirements are.
+ #
+ # Such lockdowns are recommended if the situation affords you
+ # that flexibility.
+ #
+ # If you want to only allow the server to respond to requests
+ # (and not even make DNS/dhcp/ntp queries!), then uncomment these lines:
+ # # Note: if the connection table fills, you won't be able to
+ # # respond to requests if you rely on "-m state" with these rules
+ # ${IPTABLES} -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
+ # [ ${LOG_FAILURES} = "Y" ] && \
+ # ${IPTABLES} -A OUTPUT -j LOG --log-level ${IP_LOG_LEVEL} --log-prefix "OUTPUT ${REJECT_METHOD} $RULENUM " ; incr_rule_num
+ # ${IPTABLES} -A OUTPUT -j REJECT
+ #
+ # default is to enable outbound traffic
+ ${IPTABLES} -P OUTPUT ACCEPT
+
+ include_supplemental pre-policy-reset
+
+ # Now that all rules are set, we can change the policies
+ # to the user preference safely
+ [ ${REJECT_METHOD} != "DROP" ] && ${IPTABLES} -A FORWARD -j ${REJECT_METHOD}
+ [ ${REJECT_METHOD} != "DROP" ] && ${IPTABLES} -A INPUT -j ${REJECT_METHOD}
+ # to set default "policies" for PUB_* and INT_* chains, add a final rule
+ if [ ${LOG_FAILURES} != "Y" ]; then
+ # if LOG_FAILURES were set, we would have already done this
+ for chain in PUB_IN INT_IN INPUT FORWARD; do
+ [ "${LOG_FAILURES}" = "Y" ] && \
+ ${IPTABLES} -A ${chain} -j LOG --log-level ${IP_LOG_LEVEL} --log-prefix "${chain} ${REJECT_METHOD} $RULENUM " ; incr_rule_num
+ ${IPTABLES} -A ${chain} -j ${REJECT_METHOD}
+ done
+ fi
+ for chain in PUB_OUT INT_OUT ; do
+ ${IPTABLES} -A ${chain} -j ACCEPT
+ done
+ # rule 1 in all of these chains is a deny rule; remove it so other rules work
+ for chain in PUB_IN INT_IN PUB_OUT INT_OUT ; do
+ ${IPTABLES} -D ${chain} -j DROP
+ done
+
+ include_supplemental post-rule-setup
+
+ echo " done."
+
+ ;;
+ stop)
+ include_supplemental pre-drop-rules
+ echo
+ echo "WARNING: reverting to default settings (dropping firewall)"
+ # We should disable NAT/forwarding even if not set to restore defaults
+ echo -n "disabling IP forwarding..."
+ echo 0 > /proc/sys/net/ipv4/ip_forward
+ echo " done."
+ echo -n "unloading masquerading modules..."
+ do_masq_mods unload
+ echo " done."
+ # flushing leaves the default input at ${REJECT_METHOD}
+ echo -n "resetting default input rules to accept..."
+ ${IPTABLES} -P INPUT ACCEPT
+ echo " done."
+ echo -n "resetting default output rule to accept..."
+ ${IPTABLES} -P OUTPUT ACCEPT
+ echo " done."
+ # We disabled forwarding with the /proc interface, but we
+ # reset FORWARD to ACCEPT because that;s the normal default
+ echo -n "resetting default forward rule to accept..."
+ ${IPTABLES} -P FORWARD ACCEPT
+ echo " done."
+ for chain in INPUT OUTPUT FORWARD ; do
+ echo -n "flushing ${chain} rules..."
+ ${IPTABLES} -F ${chain}
+ echo " done."
+ done
+ for chain in PREROUTING POSTROUTING ; do
+ ${IPTABLES} -t nat -F ${chain}
+ done
+ ${IPTABLES} -t mangle -F PREROUTING
+ # flush and delete the user-defined chains
+ echo -n "removing user-defined chains..."
+ for chain in PUB_IN PUB_OUT INT_IN INT_OUT PAROLE ; do
+ ${IPTABLES} -F ${chain}
+ ${IPTABLES} -X ${chain}
+ done
+ include_supplemental post-drop-rules
+ echo " done."
+ ;;
+ status)
+ ${IPTABLES} -L -v -n
+ ;;
+ *)
+ echo "Usage: $0 {start|restart|reload|stop|status}"
+ exit 1
+esac
+
+exit 0
+
diff --git a/install/apps/bastille_licence.txt b/install/apps/bastille_licence.txt
new file mode 100644
index 0000000..d511905
--- /dev/null
+++ b/install/apps/bastille_licence.txt
@@ -0,0 +1,339 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff --git a/install/install.php b/install/install.php
index 257b5b2..2c82e7d 100644
--- a/install/install.php
+++ b/install/install.php
@@ -175,6 +175,10 @@
//* Configure Apache
swriteln('Configuring Apache');
$inst->configure_apache();
+
+ //* Configure Firewall
+ swriteln('Configuring Firewall');
+ $inst->configure_firewall();
//* Configure ISPConfig
swriteln('Installing ISPConfig');
@@ -282,6 +286,12 @@
$inst->configure_apache();
}
+ //** Configure Firewall
+ if(strtolower($inst->simple_query('Configure Firewall Server',array('y','n'),'y')) == 'y') {
+ swriteln('Configuring Firewall');
+ $inst->configure_firewall();
+ }
+
//** Configure ISPConfig :-)
if(strtolower($inst->simple_query('Install ISPConfig Web-Interface',array('y','n'),'y')) == 'y') {
swriteln('Installing ISPConfig');
diff --git a/install/lib/installer_base.lib.php b/install/lib/installer_base.lib.php
index 87c0751..0ac9d6b 100644
--- a/install/lib/installer_base.lib.php
+++ b/install/lib/installer_base.lib.php
@@ -595,6 +595,58 @@
}
+ public function configure_firewall()
+ {
+ global $conf;
+
+ $dist_init_scripts = $conf['init_scripts'];
+
+ if(is_dir("/etc/Bastille")) caselog("mv -f /etc/Bastille /etc/Bastille.backup", $FILE, __LINE__);
+ @mkdir("/etc/Bastille", octdec($directory_mode));
+ if(is_dir("/etc/Bastille.backup/firewall.d")) caselog("cp -pfr /etc/Bastille.backup/firewall.d /etc/Bastille/", $FILE, __LINE__);
+ caselog("cp -f tpl/bastille-firewall.cfg.master /etc/Bastille/bastille-firewall.cfg", $FILE, __LINE__);
+ caselog("chmod 644 /etc/Bastille/bastille-firewall.cfg", $FILE, __LINE__);
+ $content = rf("/etc/Bastille/bastille-firewall.cfg");
+ $content = str_replace("{DNS_SERVERS}", "", $content);
+
+ $tcp_public_services = '';
+ $udp_public_services = '';
+
+ $row = $this->db->queryOneRecord("SELECT * FROM firewall WHERE server_id = ".intval($this->conf['server_id']));
+
+ if(trim($row["tcp_port"]) != '' || trim($row["udp_port"]) != ''){
+ $tcp_public_services = trim(str_replace(',',' ',$row["tcp_port"]));
+ $udp_public_services = trim(str_replace(',',' ',$row["udp_port"]));
+ } else {
+ $tcp_public_services = '21 22 25 53 80 110 443 8080 10000';
+ $udp_public_services = '53';
+ }
+ $content = str_replace("{TCP_PUBLIC_SERVICES}", $tcp_public_services, $content);
+ $content = str_replace("{UDP_PUBLIC_SERVICES}", $udp_public_services, $content);
+
+ wf("/etc/Bastille/bastille-firewall.cfg", $content);
+
+ if(is_file($dist_init_scripts."/bastille-firewall")) caselog("mv -f $dist_init_scripts/bastille-firewall $dist_init_scripts/bastille-firewall.backup_".date("m_d_Y__H_i_s", $current_date), $FILE, __LINE__);
+ caselog("cp -f apps/bastille-firewall $dist_init_scripts", $FILE, __LINE__);
+ caselog("chmod 700 $dist_init_scripts/bastille-firewall", $FILE, __LINE__);
+
+ if(is_file("/sbin/bastille-ipchains")) caselog("mv -f /sbin/bastille-ipchains /sbin/bastille-ipchains.backup", $FILE, __LINE__);
+ caselog("cp -f apps/bastille-ipchains /sbin", $FILE, __LINE__);
+ caselog("chmod 700 /sbin/bastille-ipchains", $FILE, __LINE__);
+
+ if(is_file("/sbin/bastille-netfilter")) caselog("mv -f /sbin/bastille-netfilter /sbin/bastille-netfilter.backup", $FILE, __LINE__);
+ caselog("cp -f apps/bastille-netfilter /sbin", $FILE, __LINE__);
+ caselog("chmod 700 /sbin/bastille-netfilter", $FILE, __LINE__);
+
+ exec("which ipchains &> /dev/null", $ipchains_location, $ret_val);
+ if(!is_file("/sbin/ipchains") && !is_link("/sbin/ipchains") && $ret_val == 0) phpcaselog(@symlink(shell_exec("which ipchains"), "/sbin/ipchains"), 'create symlink', $FILE, __LINE__);
+ unset($ipchains_location);
+ exec("which iptables &> /dev/null", $iptables_location, $ret_val);
+ if(!is_file("/sbin/iptables") && !is_link("/sbin/iptables") && $ret_val == 0) phpcaselog(@symlink(trim(shell_exec("which iptables")), "/sbin/iptables"), 'create symlink', $FILE, __LINE__);
+ unset($iptables_location);
+
+ }
+
public function install_ispconfig()
{
@@ -711,7 +763,7 @@
//* make sure that the server config file (not the interface one) is only readable by the root user
exec("chmod 600 $install_dir/server/lib/$configfile");
exec("chown root:root $install_dir/server/lib/$configfile");
- if(@is_file("$install_dir/server/lib/mysql_clientdb.conf") {
+ if(@is_file("$install_dir/server/lib/mysql_clientdb.conf")) {
exec("chmod 600 $install_dir/server/lib/mysql_clientdb.conf");
exec("chown root:root $install_dir/server/lib/mysql_clientdb.conf");
}
diff --git a/install/tpl/bastille-firewall.cfg.master b/install/tpl/bastille-firewall.cfg.master
new file mode 100644
index 0000000..e43d0df
--- /dev/null
+++ b/install/tpl/bastille-firewall.cfg.master
@@ -0,0 +1,320 @@
+#
+# /etc/bastille-firewall.cfg
+#
+# Configuration file for both 2.2/ipchains and 2.4/netfilter scripts
+#
+# $Source: /cvsroot/bastille-linux/dev/working_tree/Bastille/bastille-firewall.cfg,v $
+# Modified by: $Author: peterw $
+# $Date: 2002/01/04 13:34:18 $
+# $Revision: 1.7 $
+#
+# Copyright (C) 1999-2001 Peter Watkins
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Thanks to David Ranch, Brad A, Don G, and others for their suggestions
+
+# the configuration values should be whitespace-delimited lists of
+# appropriate values, e.g.
+# TCP_PUBLIC_SERVICES="80 smtp ssh"
+# lists Web (port 80), SMTP mail, and Secure Shell ports
+#
+# This script is suitable for workstations or simple NAT firewalls;
+# you may want to add more "output" restrictions for serious servers
+
+# 0) DNS servers (Linux 2.2/ipchains only)
+# You must list your DNS servers here so that
+# the firewall will allow them to service your lookup requests
+#
+# List of DNS servers/networks to allow "domain" responses from
+# This _could_ be nameservers as a list of <ip-address>/32 entries
+#DNS_SERVERS="a.b.c.d/32 e.f.g.h/32"
+# If you are running a caching nameserver, you'll need to allow from
+# "0.0.0.0/0" so named can query any arbitrary nameserver
+# (To enable a caching nameserver, you will also probably need to
+# add "domain" to the TCP and UDP public service lists.)
+#DNS_SERVERS="0.0.0.0/0"
+#
+# To have the DNS servers parsed from /etc/resolv.conf at runtime,
+# as normal workstations will want, make this variable empty
+#DNS_SERVERS=""
+#
+# Please make sure variable assignments are on single lines; do NOT
+# use the "\" continuation character (so Bastille can change the
+# values if it is run more than once)
+DNS_SERVERS="{DNS_SERVERS}"
+
+
+# 1) define your interfaces (all systems)
+# Note a "+" acts as a wildcard, e.g. ppp+ would match any PPP
+# interface
+#
+# list internal/trusted interfaces
+# traffic from these interfaces will be allowed
+# through the firewall, no restrictions
+#TRUSTED_IFACES="lo" # MINIMAL/SAFEST
+#
+# list external/untrusted interfaces
+#PUBLIC_IFACES="eth+ ppp+ slip+" # SAFEST
+#
+# list internal/partially-trusted interfaces
+# e.g. if this acts as a NAT/IP Masq server and you
+# don't want clients on those interfaces having
+# full network access to services running on this
+# server (as the TRUSTED_IFACES allows)
+#INTERNAL_IFACES="" # SAFEST
+#
+# Please make sure variable assignments are on single lines; do NOT
+# use the "\" continuation character (so Bastille can change the
+# values if it is run more than once)
+TRUSTED_IFACES="lo" # MINIMAL/SAFEST
+PUBLIC_IFACES="eth+ ppp+ slip+ venet+" # SAFEST
+INTERNAL_IFACES="" # SAFEST
+
+
+# 2) services for which we want to log access attempts to syslog (all systems)
+# Note this only audits connection attempts from public interfaces
+#
+# Also see item 12, LOG_FAILURES
+#
+#TCP_AUDIT_SERVICES="telnet ftp imap pop3 finger sunrpc exec login linuxconf ssh"
+# anyone probing for BackOrifice?
+#UDP_AUDIT_SERVICES="31337"
+# how about ICMP?
+#ICMP_AUDIT_TYPES=""
+#ICMP_AUDIT_TYPES="echo-request" # ping/MS tracert
+#
+# To enable auditing, you must have syslog configured to log "kern"
+# messages of "info" level; typically you'd do this with a line in
+# syslog.conf like
+# kern.info /var/log/messages
+# though the Bastille port monitor will normally want these messages
+# logged to a named pipe instead, and the Bastille script normally
+# configures syslog for "kern.*" which catches these messages
+#
+# Please make sure variable assignments are on single lines; do NOT
+# use the "\" continuation character (so Bastille can change the
+# values if it is run more than once)
+#TCP_AUDIT_SERVICES="telnet ftp imap pop3 finger sunrpc exec login linuxconf ssh"
+#UDP_AUDIT_SERVICES="31337"
+#ICMP_AUDIT_TYPES=""
+
+
+# 3) services we allow connections to (all systems)
+#
+# FTP note:
+# To allow your machine to service "passive" FTP clients,
+# you will need to make allowances for the passive data
+# ports; Bastille users should read README.FTP for more
+# information
+#
+# "public" interfaces:
+# TCP services that "public" hosts should be allowed to connect to
+#TCP_PUBLIC_SERVICES="" # MINIMAL/SAFEST
+#
+# UDP services that "public" hosts should be allowed to connect to
+#UDP_PUBLIC_SERVICES="" # MINIMAL/SAFEST
+#
+# "internal" interfaces:
+# (NB: you will need to repeat the "public" services if you want
+# to allow "internal" hosts to reach those services, too.)
+# TCP services that internal clients can connect to
+#TCP_INTERNAL_SERVICES="" # MINIMAL/SAFEST
+#
+# UDP services that internal clients can connect to
+#UDP_INTERNAL_SERVICES="" # MINIMAL/SAFEST
+#
+# Please make sure variable assignments are on single lines; do NOT
+# use the "\" continuation character (so Bastille can change the
+# values if it is run more than once)
+TCP_PUBLIC_SERVICES="{TCP_PUBLIC_SERVICES}" # MINIMAL/SAFEST
+UDP_PUBLIC_SERVICES="{UDP_PUBLIC_SERVICES}" # MINIMAL/SAFEST
+TCP_INTERNAL_SERVICES="" # MINIMAL/SAFEST
+UDP_INTERNAL_SERVICES="" # MINIMAL/SAFEST
+
+# 4) passive/active FTP (Linux 2.2/ipchains only)
+# FTP is a firewall nightmare; if you allow "normal" FTP connections,
+# you must be careful to block any TCP services that are listening
+# on high ports; it's safer to require your FTP clients to use
+# "passive" mode.
+#
+# Note this will also force clients on machines
+# that use this one for NAT/IP Masquerading to use passive mode
+# for connections that go through this server (e.g. from the
+# internal network to public Internet machines
+#
+# For more information about FTP, see the Bastille README.FTP doc
+#
+#FORCE_PASV_FTP="N"
+#FORCE_PASV_FTP="Y" # SAFEST
+#
+FORCE_PASV_FTP="Y" # SAFEST
+
+
+# 5) Services to explicitly block. (Linux 2.2/ipchains only)
+# See FTP note above
+# Note that ranges of ports are specified with colons, and you
+# can specify an open range by using only one number, e.g.
+# 1024: means ports >= 1024 and :6000 means ports <= 6000
+#
+# TCP services on high ports that should be blocked if not forcing passive FTP
+# This should include X (6000:6010) and anything else revealed by 'netstat -an'
+# (this does not matter unless you're not forcing "passive" FTP)
+#TCP_BLOCKED_SERVICES="6000:6020"
+#
+# UDP services to block: this should be UDP services on high ports.
+# Your only vulnerability from public interfaces are the DNS and
+# NTP servers/networks (those with 0.0.0.0 for DNS servers should
+# obviously be very careful here!)
+#UDP_BLOCKED_SERVICES="2049"
+#
+# types of ICMP packets to allow
+#ICMP_ALLOWED_TYPES="destination-unreachable" # MINIMAL/SAFEST
+# the following allows you to ping/traceroute outbound
+#ICMP_ALLOWED_TYPES="destination-unreachable echo-reply time-exceeded"
+#
+# Please make sure variable assignments are on single lines; do NOT
+# use the "\" continuation character (so Bastille can change the
+# values if it is run more than once)
+TCP_BLOCKED_SERVICES="6000:6020"
+UDP_BLOCKED_SERVICES="2049"
+ICMP_ALLOWED_TYPES="destination-unreachable echo-reply time-exceeded echo-request"
+
+
+# 6) Source Address Verification (all Linux systems)
+# This helps prevent "IP Spoofing" attacks
+#
+ENABLE_SRC_ADDR_VERIFY="Y" # SAFEST
+
+
+# 7) IP Masquerading / NAT. (all systems)
+# List your internal/masq'ed networks here
+#
+# Also see item 4, FORCE_PASV_FTP, as that setting affects
+# clients using IP Masquerading through this machine
+#
+# Set this variable if you're using IP Masq / NAT for a local network
+#IP_MASQ_NETWORK="" # DISABLE/SAFEST
+#IP_MASQ_NETWORK="10.0.0.0/8" # example
+#IP_MASQ_NETWORK="192.168.0.0/16" # example
+#
+# Have lots of masq hosts? uncomment the following six lines
+# and list the hosts/networks in /etc/firewall-masqhosts
+# the script assumes any address without a "/" netmask afterwards
+# is an individual address (netmask /255.255.255.255):
+#if [ -f /etc/firewall-masqhosts ]; then
+# echo "Reading list of masq hosts from /etc/firewall-masqhosts"
+# # Read the file, but use 'awk' to strip comments
+# # Note the sed bracket phrase includes a space and tab char
+# IP_MASQ_NETWORK=`cat /etc/firewall-masqhosts | awk -F\# '/\// {print $1; next} /[0-9]/ {print $1"/32"}' |sed 's:[ ]*::g'`
+#fi
+#
+# Masq modules
+# NB: The script will prepend "ip_masq_" to each module name
+#IP_MASQ_MODULES="cuseeme ftp irc quake raudio vdolive" # ALL (?)
+#IP_MASQ_MODULES="ftp raudio vdolive" # RECOMMENDED
+#
+# Please make sure variable assignments are on single lines; do NOT
+# use the "\" continuation character (so Bastille can change the
+# values if it is run more than once)
+IP_MASQ_NETWORK="" # DISABLE/SAFEST
+IP_MASQ_MODULES="ftp raudio vdolive" # RECOMMENDED
+
+
+# 8) How to react to disallowed packets (all systems)
+# whether to "REJECT" or "DROP" disallowed packets; if you're running any
+# public services, you probably ought to use "REJECT"; if in serious stealth
+# mode, choose "DROP" so simple probes don't know if there's anything out there
+# NOTE: disallowed ICMP packets are discarded with "DROP", as
+# it would not make sense to "reject" the packet if you're
+# trying to disallow ping/traceroute
+# NOTE: the scripts that set up the filter rules will interpret these
+# keywords as needed, e.g. "DROP" becomes "DENY" for Linux 2.2/ipchains
+#
+REJECT_METHOD="DROP"
+
+
+# 9) DHCP (Linux 2.2/ipchains only)
+# In case your server needs to get a DHCP address from some other
+# machine (e.g. cable modem)
+#DHCP_IFACES="eth0" # example, to allow you to query on eth0
+#DHCP_IFACES="" # DISABLED
+#
+# Please make sure variable assignments are on single lines; do NOT
+# use the "\" continuation character (so Bastille can change the
+# values if it is run more than once)
+DHCP_IFACES="" # DISABLED
+
+
+# 10) NTP servers (Linux 2.2/ipchains only)
+# more UDP fun. List IP addresses or network space of NTP servers
+#
+#NTP_SERVERS="" # DISABLE NTP QUERIES / SAFEST
+#NTP_SERVERS="a.b.c.d/32 e.f.g.h/32" # example, to allow querying 2 servers
+#
+# Please make sure variable assignments are on single lines; do NOT
+# use the "\" continuation character (so Bastille can change the
+# values if it is run more than once)
+NTP_SERVERS="" # DISABLE NTP QUERIES / SAFEST
+
+
+# 11) more ICMP. (Linux 2.2/ipchains only)
+# Control the outbound ICMP to make yourself invisible to
+# traceroute probes
+#
+#ICMP_OUTBOUND_DISABLED_TYPES="destination-unreachable time-exceeded"
+#
+# Please make sure variable assignments are on single lines; do NOT
+# use the "\" continuation character (so Bastille can change the
+# values if it is run more than once)
+ICMP_OUTBOUND_DISABLED_TYPES="destination-unreachable time-exceeded"
+
+
+# 12) Logging (all systems)
+# With this enabled, ipchains will log all blocked packets.
+# ** this could generate huge logs **
+# This is primarily intended for the port mointoring system;
+# also note that you probably do not want to "AUDIT" any services
+# that you are not allowing, as doing so would mean duplicate
+# logging
+LOG_FAILURES="N" # do not log blocked packets
+
+# 13) Block fragmented packets (all systems)
+# There's no good reason to allow these
+#ALLOW_FRAGMENTS="N" # safest
+ALLOW_FRAGMENTS="Y" # old behavior
+
+# 14) Prevent SMB broadcasts from leaking out NAT setup (all systems)
+# Windows machines will poll teh net with SMB broadcasts,
+# basically advertising their existence. Most folks agree
+# that this traffic should be dropped
+#DROP_SMB_NAT_BCAST="N" # allow them (are you sure?)
+DROP_SMB_NAT_BCAST="Y" # drop those packets
+
+# 15) Log level (iptables/netfilter/Linux 2.4 only)
+# Control what level of logging is used when the firewall logs
+# information. Default is warning (4). Lowest priority is
+# debug (7); highest is emergency (0). To prevent syslog
+# from copying iptables error messages to the console, set
+# this to 6 (7 would also work, but 6 is recommended)
+# You can also stop syslogd/klogd from printing kernel
+# messages to the console by issuing the command
+# setterm -msg off
+#IP_LOG_LEVEL=6 # level used in 2.2/ipchains
+IP_LOG_LEVEL=4 # iptables/netfilter default
+
+# 16) Always attempt to use stateful features for inbound connections
+# Always using state will allow the firewall to reject invalid
+# packets sent to otherwise open TCP services, e.g. XMAS, NULL
+# and SIN/FYN scans. The downside to choosing this behavior is that
+# services may become unreachable if the packet filter's state
+# table becomes full.
+IP_ALWAYS_USE_STATE="N" # default, ensures services remain available
+#IP_ALWAYS_USE_STATE="Y" # disallow invalid packets
\ No newline at end of file
diff --git a/install/update.php b/install/update.php
index d5e349c..f51a222 100644
--- a/install/update.php
+++ b/install/update.php
@@ -200,6 +200,12 @@
//* Configure DBServer
swriteln('Configuring DBServer');
$inst->configure_dbserver();
+
+ if(@is_dir('/etc/Bastille')) {
+ //* Configure Firewall
+ swriteln('Configuring Firewall');
+ $inst->configure_firewall();
+ }
}
//** Configure ISPConfig
diff --git a/interface/web/admin/form/firewall.tform.php b/interface/web/admin/form/firewall.tform.php
index 40593ca..2f4ace8 100644
--- a/interface/web/admin/form/firewall.tform.php
+++ b/interface/web/admin/form/firewall.tform.php
@@ -79,7 +79,7 @@
'regex' => '/^[\s0-9\,]{0,255}$/',
'errmsg'=> 'tcp_ports_error_regex'),
),
- 'default' => '',
+ 'default' => '21,22,25,53,80,110,443,8080,10000',
'value' => '',
'width' => '30',
'maxlength' => '255'
@@ -91,7 +91,7 @@
'regex' => '/^[\s0-9\,]{0,255}$/',
'errmsg'=> 'tcp_ports_error_regex'),
),
- 'default' => '',
+ 'default' => '53',
'value' => '',
'width' => '30',
'maxlength' => '255'
diff --git a/server/conf/bastille-firewall.cfg.master b/server/conf/bastille-firewall.cfg.master
new file mode 100644
index 0000000..b9658c9
--- /dev/null
+++ b/server/conf/bastille-firewall.cfg.master
@@ -0,0 +1,320 @@
+#
+# /etc/bastille-firewall.cfg
+#
+# Configuration file for both 2.2/ipchains and 2.4/netfilter scripts
+#
+# $Source: /cvsroot/bastille-linux/dev/working_tree/Bastille/bastille-firewall.cfg,v $
+# Modified by: $Author: peterw $
+# $Date: 2002/01/04 13:34:18 $
+# $Revision: 1.7 $
+#
+# Copyright (C) 1999-2001 Peter Watkins
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Thanks to David Ranch, Brad A, Don G, and others for their suggestions
+
+# the configuration values should be whitespace-delimited lists of
+# appropriate values, e.g.
+# TCP_PUBLIC_SERVICES="80 smtp ssh"
+# lists Web (port 80), SMTP mail, and Secure Shell ports
+#
+# This script is suitable for workstations or simple NAT firewalls;
+# you may want to add more "output" restrictions for serious servers
+
+# 0) DNS servers (Linux 2.2/ipchains only)
+# You must list your DNS servers here so that
+# the firewall will allow them to service your lookup requests
+#
+# List of DNS servers/networks to allow "domain" responses from
+# This _could_ be nameservers as a list of <ip-address>/32 entries
+#DNS_SERVERS="a.b.c.d/32 e.f.g.h/32"
+# If you are running a caching nameserver, you'll need to allow from
+# "0.0.0.0/0" so named can query any arbitrary nameserver
+# (To enable a caching nameserver, you will also probably need to
+# add "domain" to the TCP and UDP public service lists.)
+#DNS_SERVERS="0.0.0.0/0"
+#
+# To have the DNS servers parsed from /etc/resolv.conf at runtime,
+# as normal workstations will want, make this variable empty
+#DNS_SERVERS=""
+#
+# Please make sure variable assignments are on single lines; do NOT
+# use the "\" continuation character (so Bastille can change the
+# values if it is run more than once)
+DNS_SERVERS="{DNS_SERVERS}"
+
+
+# 1) define your interfaces (all systems)
+# Note a "+" acts as a wildcard, e.g. ppp+ would match any PPP
+# interface
+#
+# list internal/trusted interfaces
+# traffic from these interfaces will be allowed
+# through the firewall, no restrictions
+#TRUSTED_IFACES="lo" # MINIMAL/SAFEST
+#
+# list external/untrusted interfaces
+#PUBLIC_IFACES="eth+ ppp+ slip+" # SAFEST
+#
+# list internal/partially-trusted interfaces
+# e.g. if this acts as a NAT/IP Masq server and you
+# don't want clients on those interfaces having
+# full network access to services running on this
+# server (as the TRUSTED_IFACES allows)
+#INTERNAL_IFACES="" # SAFEST
+#
+# Please make sure variable assignments are on single lines; do NOT
+# use the "\" continuation character (so Bastille can change the
+# values if it is run more than once)
+TRUSTED_IFACES="lo" # MINIMAL/SAFEST
+PUBLIC_IFACES="eth+ ppp+ slip+ venet+" # SAFEST
+INTERNAL_IFACES="" # SAFEST
+
+
+# 2) services for which we want to log access attempts to syslog (all systems)
+# Note this only audits connection attempts from public interfaces
+#
+# Also see item 12, LOG_FAILURES
+#
+#TCP_AUDIT_SERVICES="telnet ftp imap pop3 finger sunrpc exec login linuxconf ssh"
+# anyone probing for BackOrifice?
+#UDP_AUDIT_SERVICES="31337"
+# how about ICMP?
+#ICMP_AUDIT_TYPES=""
+#ICMP_AUDIT_TYPES="echo-request" # ping/MS tracert
+#
+# To enable auditing, you must have syslog configured to log "kern"
+# messages of "info" level; typically you'd do this with a line in
+# syslog.conf like
+# kern.info /var/log/messages
+# though the Bastille port monitor will normally want these messages
+# logged to a named pipe instead, and the Bastille script normally
+# configures syslog for "kern.*" which catches these messages
+#
+# Please make sure variable assignments are on single lines; do NOT
+# use the "\" continuation character (so Bastille can change the
+# values if it is run more than once)
+#TCP_AUDIT_SERVICES="telnet ftp imap pop3 finger sunrpc exec login linuxconf ssh"
+#UDP_AUDIT_SERVICES="31337"
+#ICMP_AUDIT_TYPES=""
+
+
+# 3) services we allow connections to (all systems)
+#
+# FTP note:
+# To allow your machine to service "passive" FTP clients,
+# you will need to make allowances for the passive data
+# ports; Bastille users should read README.FTP for more
+# information
+#
+# "public" interfaces:
+# TCP services that "public" hosts should be allowed to connect to
+#TCP_PUBLIC_SERVICES="" # MINIMAL/SAFEST
+#
+# UDP services that "public" hosts should be allowed to connect to
+#UDP_PUBLIC_SERVICES="" # MINIMAL/SAFEST
+#
+# "internal" interfaces:
+# (NB: you will need to repeat the "public" services if you want
+# to allow "internal" hosts to reach those services, too.)
+# TCP services that internal clients can connect to
+#TCP_INTERNAL_SERVICES="" # MINIMAL/SAFEST
+#
+# UDP services that internal clients can connect to
+#UDP_INTERNAL_SERVICES="" # MINIMAL/SAFEST
+#
+# Please make sure variable assignments are on single lines; do NOT
+# use the "\" continuation character (so Bastille can change the
+# values if it is run more than once)
+TCP_PUBLIC_SERVICES="{tmpl_var name="TCP_PUBLIC_SERVICES"}" # MINIMAL/SAFEST
+UDP_PUBLIC_SERVICES="{tmpl_var name="UDP_PUBLIC_SERVICES"}" # MINIMAL/SAFEST
+TCP_INTERNAL_SERVICES="" # MINIMAL/SAFEST
+UDP_INTERNAL_SERVICES="" # MINIMAL/SAFEST
+
+# 4) passive/active FTP (Linux 2.2/ipchains only)
+# FTP is a firewall nightmare; if you allow "normal" FTP connections,
+# you must be careful to block any TCP services that are listening
+# on high ports; it's safer to require your FTP clients to use
+# "passive" mode.
+#
+# Note this will also force clients on machines
+# that use this one for NAT/IP Masquerading to use passive mode
+# for connections that go through this server (e.g. from the
+# internal network to public Internet machines
+#
+# For more information about FTP, see the Bastille README.FTP doc
+#
+#FORCE_PASV_FTP="N"
+#FORCE_PASV_FTP="Y" # SAFEST
+#
+FORCE_PASV_FTP="Y" # SAFEST
+
+
+# 5) Services to explicitly block. (Linux 2.2/ipchains only)
+# See FTP note above
+# Note that ranges of ports are specified with colons, and you
+# can specify an open range by using only one number, e.g.
+# 1024: means ports >= 1024 and :6000 means ports <= 6000
+#
+# TCP services on high ports that should be blocked if not forcing passive FTP
+# This should include X (6000:6010) and anything else revealed by 'netstat -an'
+# (this does not matter unless you're not forcing "passive" FTP)
+#TCP_BLOCKED_SERVICES="6000:6020"
+#
+# UDP services to block: this should be UDP services on high ports.
+# Your only vulnerability from public interfaces are the DNS and
+# NTP servers/networks (those with 0.0.0.0 for DNS servers should
+# obviously be very careful here!)
+#UDP_BLOCKED_SERVICES="2049"
+#
+# types of ICMP packets to allow
+#ICMP_ALLOWED_TYPES="destination-unreachable" # MINIMAL/SAFEST
+# the following allows you to ping/traceroute outbound
+#ICMP_ALLOWED_TYPES="destination-unreachable echo-reply time-exceeded"
+#
+# Please make sure variable assignments are on single lines; do NOT
+# use the "\" continuation character (so Bastille can change the
+# values if it is run more than once)
+TCP_BLOCKED_SERVICES="6000:6020"
+UDP_BLOCKED_SERVICES="2049"
+ICMP_ALLOWED_TYPES="destination-unreachable echo-reply time-exceeded echo-request"
+
+
+# 6) Source Address Verification (all Linux systems)
+# This helps prevent "IP Spoofing" attacks
+#
+ENABLE_SRC_ADDR_VERIFY="Y" # SAFEST
+
+
+# 7) IP Masquerading / NAT. (all systems)
+# List your internal/masq'ed networks here
+#
+# Also see item 4, FORCE_PASV_FTP, as that setting affects
+# clients using IP Masquerading through this machine
+#
+# Set this variable if you're using IP Masq / NAT for a local network
+#IP_MASQ_NETWORK="" # DISABLE/SAFEST
+#IP_MASQ_NETWORK="10.0.0.0/8" # example
+#IP_MASQ_NETWORK="192.168.0.0/16" # example
+#
+# Have lots of masq hosts? uncomment the following six lines
+# and list the hosts/networks in /etc/firewall-masqhosts
+# the script assumes any address without a "/" netmask afterwards
+# is an individual address (netmask /255.255.255.255):
+#if [ -f /etc/firewall-masqhosts ]; then
+# echo "Reading list of masq hosts from /etc/firewall-masqhosts"
+# # Read the file, but use 'awk' to strip comments
+# # Note the sed bracket phrase includes a space and tab char
+# IP_MASQ_NETWORK=`cat /etc/firewall-masqhosts | awk -F\# '/\// {print $1; next} /[0-9]/ {print $1"/32"}' |sed 's:[ ]*::g'`
+#fi
+#
+# Masq modules
+# NB: The script will prepend "ip_masq_" to each module name
+#IP_MASQ_MODULES="cuseeme ftp irc quake raudio vdolive" # ALL (?)
+#IP_MASQ_MODULES="ftp raudio vdolive" # RECOMMENDED
+#
+# Please make sure variable assignments are on single lines; do NOT
+# use the "\" continuation character (so Bastille can change the
+# values if it is run more than once)
+IP_MASQ_NETWORK="" # DISABLE/SAFEST
+IP_MASQ_MODULES="ftp raudio vdolive" # RECOMMENDED
+
+
+# 8) How to react to disallowed packets (all systems)
+# whether to "REJECT" or "DROP" disallowed packets; if you're running any
+# public services, you probably ought to use "REJECT"; if in serious stealth
+# mode, choose "DROP" so simple probes don't know if there's anything out there
+# NOTE: disallowed ICMP packets are discarded with "DROP", as
+# it would not make sense to "reject" the packet if you're
+# trying to disallow ping/traceroute
+# NOTE: the scripts that set up the filter rules will interpret these
+# keywords as needed, e.g. "DROP" becomes "DENY" for Linux 2.2/ipchains
+#
+REJECT_METHOD="DROP"
+
+
+# 9) DHCP (Linux 2.2/ipchains only)
+# In case your server needs to get a DHCP address from some other
+# machine (e.g. cable modem)
+#DHCP_IFACES="eth0" # example, to allow you to query on eth0
+#DHCP_IFACES="" # DISABLED
+#
+# Please make sure variable assignments are on single lines; do NOT
+# use the "\" continuation character (so Bastille can change the
+# values if it is run more than once)
+DHCP_IFACES="" # DISABLED
+
+
+# 10) NTP servers (Linux 2.2/ipchains only)
+# more UDP fun. List IP addresses or network space of NTP servers
+#
+#NTP_SERVERS="" # DISABLE NTP QUERIES / SAFEST
+#NTP_SERVERS="a.b.c.d/32 e.f.g.h/32" # example, to allow querying 2 servers
+#
+# Please make sure variable assignments are on single lines; do NOT
+# use the "\" continuation character (so Bastille can change the
+# values if it is run more than once)
+NTP_SERVERS="" # DISABLE NTP QUERIES / SAFEST
+
+
+# 11) more ICMP. (Linux 2.2/ipchains only)
+# Control the outbound ICMP to make yourself invisible to
+# traceroute probes
+#
+#ICMP_OUTBOUND_DISABLED_TYPES="destination-unreachable time-exceeded"
+#
+# Please make sure variable assignments are on single lines; do NOT
+# use the "\" continuation character (so Bastille can change the
+# values if it is run more than once)
+ICMP_OUTBOUND_DISABLED_TYPES="destination-unreachable time-exceeded"
+
+
+# 12) Logging (all systems)
+# With this enabled, ipchains will log all blocked packets.
+# ** this could generate huge logs **
+# This is primarily intended for the port mointoring system;
+# also note that you probably do not want to "AUDIT" any services
+# that you are not allowing, as doing so would mean duplicate
+# logging
+LOG_FAILURES="N" # do not log blocked packets
+
+# 13) Block fragmented packets (all systems)
+# There's no good reason to allow these
+#ALLOW_FRAGMENTS="N" # safest
+ALLOW_FRAGMENTS="Y" # old behavior
+
+# 14) Prevent SMB broadcasts from leaking out NAT setup (all systems)
+# Windows machines will poll teh net with SMB broadcasts,
+# basically advertising their existence. Most folks agree
+# that this traffic should be dropped
+#DROP_SMB_NAT_BCAST="N" # allow them (are you sure?)
+DROP_SMB_NAT_BCAST="Y" # drop those packets
+
+# 15) Log level (iptables/netfilter/Linux 2.4 only)
+# Control what level of logging is used when the firewall logs
+# information. Default is warning (4). Lowest priority is
+# debug (7); highest is emergency (0). To prevent syslog
+# from copying iptables error messages to the console, set
+# this to 6 (7 would also work, but 6 is recommended)
+# You can also stop syslogd/klogd from printing kernel
+# messages to the console by issuing the command
+# setterm -msg off
+#IP_LOG_LEVEL=6 # level used in 2.2/ipchains
+IP_LOG_LEVEL=4 # iptables/netfilter default
+
+# 16) Always attempt to use stateful features for inbound connections
+# Always using state will allow the firewall to reject invalid
+# packets sent to otherwise open TCP services, e.g. XMAS, NULL
+# and SIN/FYN scans. The downside to choosing this behavior is that
+# services may become unreachable if the packet filter's state
+# table becomes full.
+IP_ALWAYS_USE_STATE="N" # default, ensures services remain available
+#IP_ALWAYS_USE_STATE="Y" # disallow invalid packets
\ No newline at end of file
diff --git a/server/plugins-available/firewall_plugin.inc.php b/server/plugins-available/firewall_plugin.inc.php
new file mode 100644
index 0000000..8525bf3
--- /dev/null
+++ b/server/plugins-available/firewall_plugin.inc.php
@@ -0,0 +1,126 @@
+<?php
+
+/*
+Copyright (c) 2008, Till Brehm, projektfarm Gmbh
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+ * Neither the name of ISPConfig nor the names of its contributors
+ may be used to endorse or promote products derived from this software without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+class firewall_plugin {
+
+ var $plugin_name = 'firewall_plugin';
+ var $class_name = 'firewall_plugin';
+
+
+ /*
+ This function is called when the plugin is loaded
+ */
+
+ function onLoad() {
+ global $app;
+
+ /*
+ Register for the events
+ */
+
+ //* Mailboxes
+ $app->plugins->registerEvent('firewall_insert',$this->plugin_name,'insert');
+ $app->plugins->registerEvent('firewall_update',$this->plugin_name,'update');
+ $app->plugins->registerEvent('firewall_delete',$this->plugin_name,'delete');
+
+
+ }
+
+
+ function insert($event_name,$data) {
+ global $app, $conf;
+
+ $this->update($event_name,$data);
+
+ }
+
+ function update($event_name,$data) {
+ global $app, $conf;
+
+ $tcp_ports = '';
+ $udp_ports = '';
+
+ $ports = explode(',',$data["new"]["tcp_port"]);
+ if(is_array($ports)) {
+ foreach($ports as $p) {
+ $p_int = intval($p);
+ if($p_int > 0) $tcp_ports .= $p_int . ' ';
+ }
+ }
+ $tcp_ports = trim($tcp_ports);
+
+ $ports = explode(',',$data["new"]["udp_port"]);
+ if(is_array($ports)) {
+ foreach($ports as $p) {
+ $p_int = intval($p);
+ if($p_int > 0) $udp_ports .= $p_int . ' ';
+ }
+ }
+ $udp_ports = trim($udp_ports);
+
+
+ $tpl = new tpl();
+ $tpl->newTemplate("bastille-firewall.cfg.master");
+
+ $tpl->setVar("TCP_PUBLIC_SERVICES",$tcp_ports);
+ $tpl->setVar("UDP_PUBLIC_SERVICES",$udp_ports);
+
+ file_put_contents('/etc/Bastille/bastille-firewall.cfg',$tpl->grab());
+ $app->log('Writing firewall configuration /etc/Bastille/bastille-firewall.cfg',LOGLEVEL_DEBUG);
+ unset($tpl);
+
+ if($data["new"]["active"] == 'y')) {
+ exec('/etc/init.d/bastille-firewall restart');
+ if(@is_file('/etc/debian_version')) exec('update-rc.d bastille-firewall defaults');
+ $app->log('Restarting the firewall',LOGLEVEL_DEBUG);
+ } else {
+ exec('/etc/init.d/bastille-firewall stop');
+ if(@is_file('/etc/debian_version')) exec('update-rc.d bastille-firewall remove');
+ $app->log('Stopping the firewall',LOGLEVEL_DEBUG);
+ }
+
+
+ }
+
+ function delete($event_name,$data) {
+ global $app, $conf;
+
+ exec('/etc/init.d/bastille-firewall stop');
+ if(@is_file('/etc/debian_version')) exec('update-rc.d bastille-firewall remove');
+ $app->log('Stopping the firewall',LOGLEVEL_DEBUG);
+
+ }
+
+
+
+
+} // end class
+
+?>
\ No newline at end of file
diff --git a/server/plugins-available/mysql_clientdb_plugin.inc.php b/server/plugins-available/mysql_clientdb_plugin.inc.php
index 7711236..4699379 100644
--- a/server/plugins-available/mysql_clientdb_plugin.inc.php
+++ b/server/plugins-available/mysql_clientdb_plugin.inc.php
@@ -60,6 +60,7 @@
if($data["new"]["type"] == 'mysql') {
if(!include_once(ISPC_LIB_PATH.'/mysql_clientdb.conf')) {
$app->log('Unable to open'.ISPC_LIB_PATH.'/mysql_clientdb.conf',LOGLEVEL_ERROR);
+ return;
}
//* Connect to the database
--
Gitblit v1.9.1