"Vincent Munari" <[EMAIL PROTECTED]> writes:
> Quelqu'un aurait-il des liens int�ressants o� iptables est
> d�cortiqu� et bien expliqu�? (en dehors des man pages et des HOW-TO
> qui ne sont pas asset d�taill�s � mon go�t)
ben voila le script que je vais bientot installer. je dois encore le
tester un peu, mais tout les commentaires sont les bienvenus. le
script je l'ai fait en copiant a gauche et a droite et en lisant la
doc. il est destine a etre demarre au boot (une partie en tout cas) et
l'autre partie lors du ppp/ip-up.
/etc/firewall/firewall peut etre copie dans /etc/init.d/,
/etc/firewall/firewall.ppp peut etre copie dans /etc/ppp/ip-up.d/ et
ip-down.d.
/etc/firewall/firewall
**********************************************************************
#!/bin/sh
PROG_NAME="$0"
IPTABLES_FW_SCRIPT="/etc/firewall/firewall.sh"
if [ ! -x "$IPTABLES_FW_SCRIPT" ]; then
IPTABLES_FW_SCRIPT=`dirname "$PROG_NAME"`"/iptables-fw.sh"
fi
# ----------------------------------------------------------------------
usage() {
cat <<EOF
Usage: $0 start|stop|restart|status
EOF
} # end of function usage
# ----------------------------------------------------------------------
if [ $# -ne 1 ]; then
usage
fi
cmd_arg="$1"
case "$cmd_arg" in
start)
$IPTABLES_FW_SCRIPT start main
$IPTABLES_FW_SCRIPT start private
;;
stop)
$IPTABLES_FW_SCRIPT stop private
$IPTABLES_FW_SCRIPT stop main
;;
restart)
$PROG_NAME stop
$PROG_NAME start
;;
status)
$IPTABLES_FW_SCRIPT status
;;
*)
usage
exit 1
;;
esac
exit 0
**********************************************************************
/etc/firewall/firewall.ppp
**********************************************************************
#!/bin/sh
echo $0 | grep '^/etc/ppp/ip-up.d/' && CMD=start
echo $0 | grep '^/etc/ppp/ip-down.d/' && CMD=stop
FIREWALL_SCRIPT="/etc/firewall/firewall.sh"
if [ ! -x "$FIREWALL_SCRIPT" ]; then
FIREWALL_SCRIPT=`dirname "$PROG_NAME"`"/iptables-fw.sh"
fi
[ ! -x $FIREWALL_SCRIPT ] && exit 1
#LOCALNET=`grep '^localnet' /etc/networks | sed -e '2,$d' -e
's/^.*[^0-9]\+\([0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+\).*$/\1/g'`
#LOCALNET_NETWORK=`/usr/bin/ipv4calc --network $LOCALNET`
LOCALNET_NETWORK=192.168.56.0
REMOTE_NETWORK=`/usr/bin/ipv4calc --network $PPP_REMOTE`
#LOCAL_NETWORK=`/usr/bin/ipv4calc --network $PPP_LOCAL`
GENERIC_IFACE=`echo $PPP_IFACE | /usr/bin/tr -d '[0-9]'`
echo REMOTE_NETWORK=$REMOTE_NETWORK, LOCALNET_NETWORK=$LOCALNET_NETWORK,
GENERIC_IFACE=$GENERIC_IFACE >> /tmp/ppp.log
if [ $REMOTE_NETWORK = $LOCALNET_NETWORK -a $GENERIC_IFACE = "ppp" ]; then
# we have the palm interface pppX
# we could also test for the device, but only because we use an alias
ARGS="$CMD palm $PPP_IFACE $PPP_LOCAL $PPP_REMOTE"
else
# else we brought up the link to the internet
ARGS="$CMD public $PPP_IFACE $PPP_LOCAL"
fi
echo $FIREWALL_SCRIPT $ARGS >> /var/log/ppp.log
$FIREWALL_SCRIPT $ARGS
**********************************************************************
/etc/firewall/firewall.sh
**********************************************************************
#!/bin/sh
PROG_NAME="$0"
DYNAMIC_VALUE="_dynamic_"
ECHO="/bin/echo"
# --------------------------------------------------------------------
PRIVATE_IP_HOST_ARGON="192.168.56.1/32"
PRIVATE_IP_HOST_PLUTO="192.168.56.10/32"
# ... ... ... ... ... ... ... ... ... ... ... ..
INTERNAL_INTERFACE="eth0"
PRIVATE_IF="$DYNAMIC_VALUE"
PRIVATE_IP="$DYNAMIC_VALUE"
PRIVATE_CIDR="$DYNAMIC_VALUE"
PRIVATE_NET="$DYNAMIC_VALUE"
PRIVATE_BROADCAST="$DYNAMIC_VALUE"
# ... ... ... ... ... ... ... ... ... ... ... ..
PRIVATE_IP_DNS="$PRIVATE_IP_HOST_ARGON"
PRIVATE_IP_PROXY="$PRIVATE_IP_HOST_ARGON"
PRIVATE_IP_NTP="$PRIVATE_IP_HOST_ARGON"
PRIVATE_IP_LPD="$PRIVATE_IP_HOST_ARGON"
# ....................................................................
#DMZ_IF="eth2"
#DMZ_NET="192.168.99.0/24"
#DMZ_IP="192.168.99.11/32"
# ....................................................................
PUBLIC_IF="$DYNAMIC_VALUE"
PUBLIC_NET="0.0.0.0/0"
PUBLIC_IP="$DYNAMIC_VALUE"
# ....................................................................
LOOPBACK_IF="lo"
LOOPBACK_NET="127.0.0.0/8"
LOOPBACK_IP="127.0.0.1/32"
# ....................................................................
BROADCAST="255.255.255.255/32"
CLASS_A="10.0.0.0/8"
CLASS_B="172.16.0.0/12"
CLASS_C="192.168.0.0/16"
CLASS_D_MULTICAST="224.0.0.0/4"
CLASS_E_RESERVED_NET="240.0.0.0/5"
# --------------------------------------------------------------------
# --------------------------------------------------------------------
ERR_NO_ERROR=0
ERR_INIT=1
ERR_RUNNING=2
# --------------------------------------------------------------------
# --------------------------------------------------------------------
FD_ERROR="/dev/stderr"
FD_TRACE="$FD_ERROR"
FD_DEBUG="$FD_ERROR"
DEBUG="off" # possible values are "on" or "off"
[ "$IPTABLES_FW_DEBUG" = "on" ] && DEBUG="on"
DEBUG_CMD="$ECHO"
[ "$DEBUG" = "off" ] && DEBUG_CMD=""
DEPMOD="$DEBUG_CMD /sbin/depmod"
IPTABLES="$DEBUG_CMD /sbin/iptables"
MODPROBE="$DEBUG_CMD /sbin/modprobe"
SED="/bin/sed"
GREP="/bin/grep"
IPV4CALC="/usr/bin/ipv4calc"
TRACE="on" # possible values are "on" or "off"
# log variables
LOG_PRIO_NORMAL=6
LOG_PRIO_PARANOIA=7
LOG_PRIO_ALL=$LOG_PRIO_NORMAL
LOG_PREFIX_NORMAL=" "
LOG_PREFIX_PARANOIA="*"
LOG_PREFIX_ALL="!"
# --------------------------------------------------------------------
# --------------------------------------------------------------------
PORT_UNPRIV="1024:"
PORT_TR_SRC="32769:"
PORT_TR_DEST="33434:33523"
# --------------------------------------------------------------------
# --------------------------------------------------------------------
ctrl_main_usage() {
cat <<EOF
Usage: ctrl_main start|stop <private interface>
EOF
exit $ERR_RUNNING
} # end of function ctrl_main_usage
ctrl_main() {
trace "ctrl_main: ctrl_main: begin"
if [ $# -lt 2 ]; then
error "Missing/exessive arguments for 'ctrl_main' ($# args supplied)"
ctrl_main_usage
fi
main_cmd="$1"
case "$main_cmd" in
start)
action="-A"
;;
stop)
action="-D"
;;
*)
error "ctrl_main: wrong action '$main_cmd'."
return
;;
esac
intif="$2"
# --------------------------------------------------
$DEPMOD -a
trace "ctrl_main: modprobing modules"
$MODPROBE iptable_filter
$MODPROBE ip_conntrack
$MODPROBE ip_conntrack_ftp
# --------------------------------------------------
# --------------------------------------------------
trace "ctrl_main: cleaning up tables/chains"
# flushing all chains...
$IPTABLES -F
# deleting all existing chains
$IPTABLES -X
# reseting counters
$IPTABLES -Z
# policy: drop any packet
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD DROP
if [ "$main_cmd" = "start" ]; then
# ..............................................
# set up new chain to log and drop packets
trace "ctrl_main: create log-chains drop"
$IPTABLES -N log_DROP
$IPTABLES $action log_DROP \
-j LOG --log-level $LOG_PRIO_NORMAL \
--log-prefix="${LOG_PREFIX_NORMAL}Packet-drop: " \
### -m limit --limit 30/hour
$IPTABLES $action log_DROP -j DROP
$IPTABLES -N log_DROP_PARANOIA
$IPTABLES $action log_DROP_PARANOIA \
-j LOG --log-level $LOG_PRIO_PARANOIA \
--log-prefix="${LOG_PREFIX_PARANOIA}Packet-drop: " \
### -m limit --limit 30/hour
$IPTABLES $action log_DROP_PARANOIA -j DROP
$IPTABLES -N log_DROP_ALL
$IPTABLES $action log_DROP_ALL \
-j LOG --log-level $LOG_PRIO_ALL \
--log-prefix="${LOG_PREFIX_ALL}Packet-drop: " \
### -m limit --limit 30/hour
$IPTABLES $action log_DROP_ALL -j DROP
# ..............................................
# ..............................................
# set up new chain to log and reject packets
trace "ctrl_main: create log-chains reject"
$IPTABLES -N log_REJECT
$IPTABLES $action log_REJECT \
-j LOG --log-level $LOG_PRIO_NORMAL \
--log-prefix="${LOG_PREFIX_NORMAL}Packet-reject: " \
### -m limit --limit 30/hour
$IPTABLES $action log_REJECT -j REJECT
$IPTABLES -N log_REJECT_PARANOIA
$IPTABLES $action log_REJECT_PARANOIA \
-j LOG --log-level $LOG_PRIO_PARANOIA \
--log-prefix="${LOG_PREFIX_PARANOIA}Packet-reject: " \
### -m limit --limit 30/hour
$IPTABLES $action log_REJECT_PARANOIA -j REJECT
$IPTABLES -N log_REJECT_ALL
$IPTABLES $action log_REJECT_ALL \
-j LOG --log-level $LOG_PRIO_ALL \
--log-prefix="${LOG_PREFIX_ALL}Packet-reject: " \
### -m limit --limit 30/hour
$IPTABLES $action log_REJECT_ALL -j REJECT
# ..............................................
# ..............................................
# set up new chain to log and accept packets
trace "ctrl_main: create log-chains accept"
$IPTABLES -N log_ACCEPT
$IPTABLES $action log_ACCEPT \
-j LOG --log-level $LOG_PRIO_NORMAL \
--log-prefix="${LOG_PREFIX_NORMAL}Packet-ok: " \
### -m limit --limit 30/hour
$IPTABLES $action log_ACCEPT -j ACCEPT
$IPTABLES -N log_ACCEPT_PARANOIA
$IPTABLES $action log_ACCEPT_PARANOIA \
-j LOG --log-level $LOG_PRIO_PARANOIA \
--log-prefix="${LOG_PREFIX_PARANOIA}Packet-ok: " \
### -m limit --limit 30/hour
$IPTABLES $action log_ACCEPT_PARANOIA -j ACCEPT
$IPTABLES -N log_ACCEPT_ALL
$IPTABLES $action log_ACCEPT_ALL \
-j LOG --log-level $LOG_PRIO_ALL \
--log-prefix="${LOG_PREFIX_ALL}Packet-ok: " \
### -m limit --limit 30/hour
$IPTABLES $action log_ACCEPT_ALL -j ACCEPT
# ..............................................
fi
# --------------------------------------------------
# --------------------------------------------------
## Kernel flags
trace "ctrl_main: set kernel flags"
# disable ECN (Electronic Congestion Notification), at least
# for now....
trace "$ECHO 0 > /proc/sys/net/ipv4/tcp_ecn"
[ "$DEBUG" != "on" ] &&
$ECHO "0" > /proc/sys/net/ipv4/tcp_ecn
# To dynamically change kernel parameters and variables on the
# fly you need CONFIG_SYSCTL defined in your kernel. I would
# advise the following:
# Disable response to ping.
trace "$ECHO 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all"
[ "$DEBUG" != "on" ] &&
$ECHO "1" > /proc/sys/net/ipv4/icmp_echo_ignore_all
# Disable response to broadcasts.
# You don't want yourself becoming a Smurf amplifier.
trace "$ECHO 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts"
[ "$DEBUG" != "on" ] &&
$ECHO "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
# Don't accept source routed packets. Attackers can use
# source routing to generate traffic pretending to be from
# inside your network, but which is routed back along the
# path from which it came, namely outside, so attackers can
# compromise your network. Source routing is rarely used for
# legitimate purposes.
trace "$ECHO 0 > /proc/sys/net/ipv4/conf/all/accept_source_route"
[ "$DEBUG" != "on" ] &&
$ECHO "0" > /proc/sys/net/ipv4/conf/all/accept_source_route
# Disable ICMP redirect acceptance. ICMP redirects can be
# used to alter your routing tables, possibly to a bad end.
trace "$ECHO 0 > /proc/sys/net/ipv4/conf/all/accept_redirects"
[ "$DEBUG" != "on" ] &&
$ECHO "0" > /proc/sys/net/ipv4/conf/all/accept_redirects
# Enable bad error message protection.
trace "$ECHO 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses"
[ "$DEBUG" != "on" ] &&
$ECHO "1" > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
# Turn on reverse path filtering. This helps make sure that
# packets use legitimate source addresses, by automatically
# rejecting incoming packets if the routing table entry for
# their source address doesn't match the network interface
# they're arriving on. This has security advantages because
# it prevents so-called IP spoofing, however it can pose problems
# if you use asymmetric routing (packets from you to a host take
# a different path than packets from that host to you) or if you
# operate a non-routing host which has several IP addresses on
# different interfaces. (Note - If you turn on IP forwarding, you
# will also get this).
for interface in /proc/sys/net/ipv4/conf/*/rp_filter; do
trace "$ECHO 1 > $interface"
[ "$DEBUG" != "on" ] &&
$ECHO "1" > $interface
done
# Log spoofed packets, source routed packets, redirect packets.
trace "$ECHO 1 > /proc/sys/net/ipv4/conf/all/log_martians"
[ "$DEBUG" != "on" ] &&
$ECHO "1" > /proc/sys/net/ipv4/conf/all/log_martians
# lets turn off IP forwarding, for now
trace "$ECHO 0 > /proc/sys/net/ipv4/ip_forward"
[ "$DEBUG" != "on" ] &&
$ECHO "0" > /proc/sys/net/ipv4/ip_forward
# Note: With connection tracking, all fragments are reassembled
# before being passed to the packet-filtering code so there is
# no ip_always_defrag switch as there was in the 2.2 kernel.
# --------------------------------------------------
# --------------------------------------------------
# loopback interface is ok
trace "ctrl_main: configure loopback interface"
$IPTABLES $action INPUT -i $LOOPBACK_IF -j log_ACCEPT_ALL
$IPTABLES $action OUTPUT -o $LOOPBACK_IF -j log_ACCEPT_ALL
# --------------------------------------------------
# --------------------------------------------------
# delete the chains we've created in case we stop here.
if [ "$main_cmd" = "stop" ]; then
trace "ctrl_main: deleting log-chains"
for chain in log_DROP log_REJECT log_ACCEPT; do
$IPTABLES -F $chain
$IPTABLES -X $chain
done
fi
# --------------------------------------------------
trace "ctrl_main: end"
} # end of function ctrl_main
# --------------------------------------------------------------------
# --------------------------------------------------------------------
ctrl_private_usage() {
cat <<EOF
Usage: ctrl_private start|stop <private-interface>
EOF
ctrl_main start $INTERNAL_INTERFACE
exit $ERR_RUNNING
} # end of function ctrl_private_usage
ctrl_private() {
trace "ctrl_private: begin"
if [ $# -lt 2 ]; then
error "Missing/exessive arguments for 'ctrl_private' ($# args supplied)"
ctrl_private_usage
fi
private_cmd="$1"
case "$private_cmd" in
start)
action="-A"
;;
stop)
action="-D"
;;
*)
error "ctrl_private: wrong action '$private_cmd'."
ctrl_private_usage
return
;;
esac
# since this is for the routing, we have several interface
# (and associated ip addresses):
# internal interface and ip
intif="$2"
set_private_vars $intif
# --------------------------------------------------
# INCOMING and OUTGOING connections
# allow all incoming and outgoing TCP, UDP and ICMP connections
# (on the local network!)
# all TCP ports open are:
trace "ctrl_private: configure incoming TCP connections"
$IPTABLES $action INPUT -p tcp \
-i $intif -s $PRIVATE_NET -d $PRIVATE_IP \
-j log_ACCEPT_PARANOIA
$IPTABLES $action OUTPUT -p tcp \
-o $intif -s $PRIVATE_IP -d $PRIVATE_NET \
-j log_ACCEPT_PARANOIA
# all UDP ports open are:
trace "ctrl_private: configure incoming UDP connections"
$IPTABLES $action INPUT -p udp \
-i $intif -s $PRIVATE_NET -d $PRIVATE_IP \
-j log_ACCEPT_PARANOIA
$IPTABLES $action OUTPUT -p udp \
-o $intif -s $PRIVATE_IP -d $PRIVATE_NET \
-j log_ACCEPT_PARANOIA
# all ICMP messages open are:
trace "ctrl_private: configure incoming ICMP connections"
$IPTABLES $action INPUT -p icmp \
-i $intif -s $PRIVATE_NET -d $PRIVATE_IP \
-j log_ACCEPT_PARANOIA
$IPTABLES $action OUTPUT -p icmp \
-o $intif -s $PRIVATE_IP -d $PRIVATE_NET \
-j log_ACCEPT_PARANOIA
# --------------------------------------------------
# --------------------------------------------------
# all other packets are logged:
# trace "ctrl_private: default log & drop"
# $IPTABLES $action INPUT -j log_DROP
# $IPTABLES $action OUTPUT -j log_DROP
# $IPTABLES $action FORWARD -j log_DROP
# --------------------------------------------------
trace "ctrl_private: end"
} # end of function ctrl_private
# --------------------------------------------------------------------
# --------------------------------------------------------------------
ctrl_dmz_usage() {
cat <<EOF
Usage: ctrl_dmz start|stop <private-interface> <dmz-interface>
EOF
ctrl_main start $INTERNAL_INTERFACE
exit $ERR_RUNNING
} # end of function ctrl_dmz_usage
ctrl_dmz() {
trace "ctrl_dmz: begin"
if [ $# -ne 3 ]; then
error "Missing/exessive arguments for 'ctrl_dmz' ($# args supplied)"
ctrl_dmz_usage
fi
dmz_cmd="$1"
case "$dmz_cmd" in
start)
action="-A"
;;
stop)
action="-D"
;;
*)
error "ctrl_dmz: wrong action '$dmz_cmd'."
return
;;
esac
# internal interface and ip
intif="$2"
set_private_vars $intif
# --------------------------------------------------
# --------------------------------------------------
trace "ctrl_dmz: end"
} # end of function ctrl_dmz
# --------------------------------------------------------------------
# --------------------------------------------------------------------
ctrl_public_usage() {
cat <<EOF
Usage: ctrl_public start|stop <private-interface> <private-ip> <public-interface>
<public-ip>
EOF
ctrl_main start $INTERNAL_INTERFACE
exit $ERR_RUNNING
} # end of function ctrl_public_usage
ctrl_public() {
trace "ctrl_public: begin"
if [ $# -ne 4 ]; then
error "Missing/exessive arguments for 'ctrl_public' ($# args supplied)"
ctrl_public_usage
fi
public_cmd="$1"
case "$public_cmd" in
start)
action="-A"
;;
stop)
action="-D"
;;
*)
error "ctrl_public: wrong action '$public_cmd'."
return
;;
esac
# since this is for the routing, we have several interface
# (and associated ip addresses):
# internal interface and ip
intif="$2"
set_private_vars $intif
# external interface and ip
extint="$3"
extip="$4"
# --------------------------------------------------
## SYN-FLOODINGPROTECTION
# This rule maximises the rate of incoming connections. In
# order to do this we divert tcp packets with the SYN bit
# set off to a user-defined chain. Up to limit-burst
# connections can arrive in 1/limit seconds ..... in this
# case 4 connections in one second. After this, one of the
# burst is regained every second and connections are allowed
# again. The default limit is 3/hour. The default limit burst
# is 5.
trace "ctrl_public: syn-flood protection"
if [ "$public_cmd" = "start" ]; then
$IPTABLES -N sys_SYN_FLOOD
fi
$IPTABLES $action INPUT -i $extint -p tcp --syn -j sys_SYN_FLOOD
$IPTABLES $action sys_SYN_FLOOD -m limit \
--limit 1/s --limit-burst 4 -j RETURN
$IPTABLES $action sys_SYN_FLOOD -j log_DROP
## Make sure NEW tcp connections are SYN packets
trace "ctrl_public: check new TCP connection has syn flag set"
$IPTABLES $action INPUT -i $extint -p tcp ! --syn \
-m state --state NEW -j log_DROP
## FRAGMENTS
# I have to say that fragments scare me more than anything.
# Sending lots of non-first fragments was what allowed Jolt2
# to effectively "drown" Firewall-1. Fragments can be
# overlapped, and the subsequent interpretation of such
# fragments is very OS-dependent (see this paper for details).
# I am not going to trust any fragments.
# Log fragments just to see if we get any, and deny them too.
trace "ctrl_public: fragments handling"
$IPTABLES $action INPUT -i $extint -f \
-j LOG --log-prefix "IPTABLES FRAGMENTS: "
$IPTABLES $action INPUT -i $extint -f -j DROP
## SPOOFING
# Most of this anti-spoofing stuff is theoretically not really
# necessary with the flags we have set in the kernel above
# ........... but you never know there isn't a bug somewhere in
# your IP stack.
#
trace "ctrl_public: refuse spoofed packets"
# Refuse spoofed packets pretending to be from your IP address.
$IPTABLES $action INPUT -i $extint -s $extip -j log_DROP
# Refuse packets claiming to be to the loopback interface.
# Refusing packets claiming to be to the loopback interface
# protects against source quench, whereby a machine can be
# told to slow itself down by an icmp source quench to the
# loopback.
$IPTABLES $action INPUT -i $extint -d $LOOPBACK_NET \
-j log_DROP
for sense in INPUT OUTPUT; do
case "$sense" in
"INPUT")
sense_if="-i"
sense_comment="in"
;;
"OUTPUT")
sense_if="-o"
sense_comment="out"
;;
*)
sense_if=""
sense_comment="UNKNOWN"
;;
esac
trace "ctrl_public: refuse unroutable packets $sense_comment"
# Refuse packets claiming to be from (or going to) a
# Class A private network.
$IPTABLES $action $sense $sense_if $extint \
-s $CLASS_A \
-j log_DROP
# Refuse packets claiming to be from (or going to) a
# Class B private network.
$IPTABLES $action $sense $sense_if $extint \
-s $CLASS_B \
-j log_DROP
# Refuse packets claiming to be from (or going to) a
# Class C private network.
$IPTABLES $action $sense $sense_if $extint \
-s $CLASS_C \
-j log_DROP
# Refuse Class D multicast addresses. Multicast is
# illegal as a source address.
$IPTABLES $action $sense $sense_if $extint \
-s $CLASS_D_MULTICAST \
-j log_DROP
# Refuse Class E reserved IP addresses.
$IPTABLES $action $sense $sense_if $extint \
-s $CLASS_E_RESERVED_NET \
-j log_DROP
trace "ctrl_public: refuse broadcasts $sense_comment"
# Refuse broadcast address packets.
$IPTABLES $action $sense $sense_if $extint -d $PRIVATE_BROADCAST \
-j log_DROP
done
# --------------------------------------------------
# --------------------------------------------------
$IPTABLES $action OUTPUT -o $extint -p tcp \
-m state --state NEW,ESTABLISHED -j log_ACCEPT_PARANOIA
$IPTABLES $action INPUT -i $extint -p tcp \
-m state --state ESTABLISHED -j log_ACCEPT_PARANOIA
$IPTABLES $action OUTPUT -o $extint -p udp \
-m state --state NEW,ESTABLISHED -j log_ACCEPT_PARANOIA
$IPTABLES -A INPUT -i $extint -p udp \
-m state --state ESTABLISHED -j log_ACCEPT_PARANOIA
$IPTABLES $action OUTPUT -o $extint -p icmp \
-m state --state NEW,ESTABLISHED -j log_ACCEPT_PARANOIA
$IPTABLES -A INPUT -i $extint -p icmp \
-m state --state ESTABLISHED,RELATED -j log_ACCEPT_PARANOIA
# --------------------------------------------------
# --------------------------------------------------
# some ports to block explictly from going out and coming in:
trace "ctrl_public: explicit block"
for el in 137 138 139; do
for proto in tcp udp; do
$IPTABLES $action OUTPUT -o $extint -p $proto \
--dport $el -j log_DROP_PARANOIA
$IPTABLES $action INPUT -i $extint -p $proto \
--dport $el -j log_DROP_PARANOIA
done
done
for el in 6000:6007; do
$IPTABLES $action OUTPUT -o $extint -p tcp \
--dport $el -j log_DROP_PARANOIA
$IPTABLES $action INPUT -i $extint -p tcp \
--dport $el -j log_DROP_PARANOIA
done
# --------------------------------------------------
# --------------------------------------------------
trace "ctrl_public: control incoming new and invalid"
# Disallow NEW and INVALID incoming or forwarded packets from
# the external interface:
$IPTABLES $action INPUT -i $extint \
-m state --state NEW,INVALID -j log_DROP
$IPTABLES $action FORWARD -i $extint \
-m state --state NEW,INVALID -j log_DROP
# --------------------------------------------------
# --------------------------------------------------
trace "ctrl_public: masquerading"
# this is also a router, so we masquerade:
# masquerade out of the external interface
$IPTABLES -t nat $action POSTROUTING -o $extint -j MASQUERADE
# lets turn off IP forwarding, for now
if [ "$action" = "start" ]; then
ip_forwarding=1
else
ip_forwarding=0
fi
trace "$ECHO $ip_forwarding > /proc/sys/net/ipv4/ip_forward"
[ "$DEBUG" != "on" ] &&
$ECHO "$ip_forwarding" > /proc/sys/net/ipv4/ip_forward
echo $ip_forwarding > /proc/sys/net/ipv4/ip_forward
# --------------------------------------------------
# --------------------------------------------------
if [ "$public_cmd" = "stop" ]; then
trace "ctrl_public: cleanup syn-flood chain"
$IPTABLES -F sys_SYN_FLOOD
$IPTABLES -X sys_SYN_FLOOD
$IPTABLES -Z sys_SYN_FLOOD
fi
# --------------------------------------------------
trace "ctrl_public: end"
} # end of function ctrl_public
# --------------------------------------------------------------------
# --------------------------------------------------------------------
set_private_vars_usage() {
cat <<EOF
Usage: set_private_vars <private interface>
EOF
exit $ERR_RUNNING
} # end of function set_private_vars_usage
set_private_vars() {
trace "set_private_vars: begin"
if [ $# -ne 1 ]; then
set_private_vars_usage
fi
PRIVATE_IF="$1"
PRIVATE_IP="$PRIVATE_IP_HOST_PLUTO"
PRIVATE_IP_TMP=`echo "$PRIVATE_IP" | sed -e 's/\/.*$//g'`
PRIVATE_IP="$PRIVATE_IP_TMP/32"
# [ "$PRIVATE_IP" = "$DYNAMIC_VALUE" ] &&
# PRIVATE_IP="`ifconfig $PRIVATE_IF | $GREP 'inet addr:' | $SED -e
's/^\(.[^:]*:\)\([0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+\)\(.*$\)/\2/g'`/32"
# if [ `$ECHO $PRIVATE_IP | $GREP -E '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/[0-9]+$'` -ne
0 ]; then
# cat <<EOF
#
#set_private_vars: Unable to obtain a correct (private) IP address from the private
interface $PRIVATE_IF. Closing down firewall a maximum.
#
#EOF
# ctrl_main start $INTERNAL_INTERFACE
# exit $ERR_RUNNING
# fi
PRIVATE_CIDR=24
# if [ "$PRIVATE_CIDR" = "$DYNAMIC_VALUE" ]; then
# TMP_PRIVATE_IP=`$ECHO $PRIVATE_IP | sed -e 's/\/.*//g'`
# PRIVATE_CIDR=`$IPV4CALC --cidr $TMP_PRIVATE_IP`
# fi
[ "$PRIVATE_NET" = "$DYNAMIC_VALUE" ] &&
PRIVATE_NET="`$IPV4CALC --network $PRIVATE_IP_TMP/$PRIVATE_CIDR`/$PRIVATE_CIDR"
[ "$PRIVATE_BROADCAST" = "$DYNAMIC_VALUE" ] &&
PRIVATE_BROADCAST="`$IPV4CALC --broadcast
$PRIVATE_IP_TMP/$PRIVATE_CIDR`/$PRIVATE_CIDR"
trace " + private interface: $PRIVATE_IF"
trace " + private IP: $PRIVATE_IP"
trace " + private network: $PRIVATE_NET"
trace " + private broadcast: $PRIVATE_BROADCAST"
trace "set_private_vars: begin"
} # end of function set_private_vars
# --------------------------------------------------------------------
# --------------------------------------------------------------------
usage() {
cat <<EOF
Usage: $PROG_NAME start <target> [ <interface> <ip> ]
$PROG_NAME stop <target>
$PROG_NAME status
$PROG_NAME help
<target> specify which part to control [main|private|dmz|public|log]
<interface> the public interface (that connects to the internet/ISP)
<ip> the public IP address (assigned by the ISP)
The two arguments <interface> and <ip> are only needed
for the <internet> and <dmz> targets with the <start> command.
The 'log' target logs all dropped packets.
EOF
} # end of function usage
# --------------------------------------------------------------------
# --------------------------------------------------------------------
trace() {
[ "$TRACE" = "on" ] && $ECHO "$*" >> $FD_TRACE
} # end of function trace
# --------------------------------------------------------------------
# --------------------------------------------------------------------
debug() {
[ "$DEBUG_CMD" = "on" ] && $ECHO "$*" >> $FD_DEBUG
} # end of function debug
# --------------------------------------------------------------------
# --------------------------------------------------------------------
error() {
$ECHO "Error: $*" >> $FD_ERROR
} # end of function error
# --------------------------------------------------------------------
# --------------------------------------------------------------------
missing_variable() {
case $# in
1)
error "Variable $1 is undefined."
;;
2)
error "Variable $1 is undefined (use option '$2')."
;;
*)
error "Variable $1 is undefined & unknown option."
esac
exit $ERR_INIT
} # end of function missing_variable
# --------------------------------------------------------------------
while [ $# -gt 0 ]; do
FW_CMD="$1"
shift_n=1
trace "main loop: cmd=$FW_CMD"
case "$FW_CMD" in
help)
usage
exit $ERR_NO_ERROR
;;
start)
if [ $# -lt 2 ]; then
error "missing arguments for 'start' command"
usage
exit $ERR_INIT
fi
FW_TARGET="$2"
shift_n=2
trace "main loop: start: target=$FW_TARGET"
case "$FW_TARGET" in
dmz)
echo "UNUSED, YET..."
# ctrl_dmz $FW_CMD $INTERNAL_INTERFACE $DMZ_IF
;;
main)
ctrl_main $FW_CMD $INTERNAL_INTERFACE
;;
open)
$IPTABLES -F
$IPTABLES -Z
$IPTABLES -P INPUT ACCEPT
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -P FORWARD DROP
;;
private)
ctrl_private $FW_CMD $INTERNAL_INTERFACE
;;
public)
if [ $# -lt 4 ]; then
error "missing arguments for 'start public' command"
usage
exit $ERR_INIT
fi
PUBLIC_IF="$3"
PUBLIC_IP="$4"
shift_n=4
ctrl_public $FW_CMD $INTERNAL_INTERFACE $PUBLIC_IF $PUBLIC_IP
;;
*)
error "Unknown target '$FW_TARGET'"
usage
exit $ERR_INIT
;;
esac
;;
status)
trace "....'status' command"
$IPTABLES -L -v -n
exit $ERR_NO_ERROR
;;
stop)
trace "....'stop' command"
if [ $# -lt 2 ]; then
error "missing arguments for 'stop' command"
usage
exit $ERR_INIT
fi
FW_TARGET="$2"
shift_n=2
trace "main loop: stop: target=$FW_TARGET"
case "$FW_TARGET" in
dmz)
echo "UNUSED, YET..."
# ctrl_dmz $FW_CMD $INTERNAL_INTERFACE $DMZ_IF
;;
main)
ctrl_main $FW_CMD $INTERNAL_INTERFACE
;;
private)
ctrl_private $FW_CMD $INTERNAL_INTERFACE
;;
public)
ctrl_public $FW_CMD $INTERNAL_INTERFACE $PUBLIC_IF $PUBLIC_IP
;;
*)
error "Unknown target '$FW_TARGET' for '$FW_CMD' command"
usage
exit $ERR_INIT
;;
esac
;;
*)
error "Unknown command '$FW_CMD'"
usage
exit $ERR_INIT
;;
esac
shift $shift_n
done
exit $ERR_NO_ERROR
**********************************************************************
tom
--
as seen in a signature:
"In an open world without walls and fences,
who needs Gates and windows?"
--
http://www-internal.alphanet.ch/linux-leman/ avant de poser
une question. Ouais, pour se d�sabonner aussi.