* LINUX FIREWALL
@ 2005-01-18 2:41 unixsecurity
0 siblings, 0 replies; only message in thread
From: unixsecurity @ 2005-01-18 2:41 UTC (permalink / raw)
To: netfilter
I am working on a ip tables firewall for linux. Can anyone help me with
what I need to complete my firewall.
This is a web server.
1) I want to block all incoming ports, block all forward ports and leave
open all outgoing ports
2) I want to prevent bomb attacks
3) I want to prevent denail of service attacks
4) I want to leave open only the ports I want to be used
Does anyone have any suggestions as to how I can change this kind of
firewall configuration to be what I need for an Internet web server.
# IPTABLES Firewall Example (you are here)
# Red Hat Linux firewall using iptables
# Revised December, 2002
# configured by Dennis G. Allard and Don Cohen, http://oceanpark.com
# This script has been used on servers running Red Hat 7.3 and 8.0
#
# Permission to copy is granted provided that credit is given
# to the author and whatever HOWTOs are used to understand this
# stuff.
#
# No warranty is implied. Use at your own risk!!
# Using this script
# -----------------
#
# I save this file as /etc/sysconfig/iptables-precursor
# and then source it and run iptables-save to create
# /etc/sysconfig/iptables, which is an input file
# consumed by the script /etc/rc.d/init.d/iptables,
# which in turn makes use of the script /sbin/iptables-restore.
#
# Before mucking with setting up iptables, you should
# disconnect the machine from the internet. Examine
# and understand the current set of iptables rules
# before you reconnect to the internet.
#
# To configure the set of iptables rules:
#
# /etc/rc.d/init.d/iptables stop
# source /etc/sysconfig/iptables-precursor
#
# To save the current set of iptables rules for use at next reboot:
#
# iptables-save > /etc/sysconfig/iptables
#
# To dynamically restart iptables after modifying /etc/sysconfig/iptables:
#
# /etc/rc.d/init.d/iptables restart
#
# Note that /etc/rc.d/init.d/iptables is a script. You can read it to
# gain understanding of how iptables uses iptables-restore to restore
# iptables firewall rules at reboot.
#
# To examine the current set of rules in effect:
#
# /etc/rc.d/init.d/iptables status
#
# However, I prefer to show the current set of rules via:
#
# iptables -nvL -t filter
# iptables -nvL -t nat
#
# or
#
# iptables -vL -t filter
# iptables -vL -t nat
#
#
# To configure iptables to be used at next system reboot:
#
# chkconfig --add iptables
#
# To see if iptables is currently configured to start at boot, do:
#
# chkconfig --list iptables
#
# (You might have to do chkconfig --del ipchains to remove ipchains)
#
# The rest of this file is derived from my old ipchains script.
#
# A word about routing
# --------------------
#
# Note that this web page does not discuss routing decisions. Routing
# (see the 'ifconfig' and 'route' commands) decides which interface an
# incoming packet will be delivered to, i.e. if a given packet will be
# 'input' to this machine or be 'forwarded' to some interface for
# delivery to another machine, say on an internal network. You should
# have your routing configured before you attempt to configure your
# firewall.
# The network
# -----------
#
# This firewall is running on a gateway machine having multiple ethernet
# interfaces, a public one, eth0, which is a DSL connection to an ISP,
# and one or more internal ones, including eth1, which is assigned to
# 192.168.0.1, an IP number on my internal private network. My public
# network has static IP numbers 66.14.136.144 through 66.14.136.148.
# Currently, all of my static IP numbers are assigned as virtual IPs to
# interface eth0 of the firewall machine itself. For this reason, most
# of the rules below are INPUT rules. Were I to route some of my public
# static IP numbers to interfaces on one or more machines inside the
# firewall on the internal network, I would modify certain rules to be
# FORWARD rules instead of INPUT rules. I show some examples below of
# FORWARD rules.
#
# The gateway at my ISP is 66.14.136.1. I run a few web servers on
# 66.14.136.148, a DNS server on 66.14.136.144, and sendmail (someday
# hopefully soon to be qmail) on 66.14.136.145. I sometimes run dnscache
# on 66.14.136.145.
#
# Using this file in a more complex network would require some
# modifications. Particular attention would need to be given to using
# the right the IP numbers and interfaces, among other things.
# Preliminaries
# -------------
#
# To permit machines internal to the network to be able to
# send IP packets to the outside world, enable IP Forwarding:
#
# echo 1 > /proc/sys/net/ipv4/ip_forward
#
# Prevent SYN floods from consuming memory resources:
#
# echo 1 > /proc/sys/net/ipv4/tcp_syncookies
#
# I place the above echo commands into /etc/rc.d/rc.local
# so that they will be executed at boot time.
# The basic idea of this firewall
# -------------------------------
#
# Provide rules that are applied in the following order:
#
# ACCEPT all UDP packets for certain UDP services
#
# Currently the only UDP connections I accept are to my secure DNS
# server, tinydns. For an explanation of why tinydns is secure, see:
# http://www.faqts.com/knowledge_base/view.phtml/aid/8739/fid/699.
#
# DENY all other UDP packets.
#
# ACCEPT SYN packets just for certain TCP services
#
# SYN packets are specified via the -syn flag in the input
# rules defined below. Note that certain services can be
# further filtered by xinetd.
#
# DENY all other TCP SYN packets.
#
# ACCEPT all other TCP packets that are part of existing connections
#
# DENY all other TCP packets.
#
# In other words, we allow any TCP packet through that is part of an
# established TCP connection, but we are very selective in just which
# connections we permit to be made to start off with.
#
# A brief explanation of SYN packets goes as follows. TCP connections
# are initiated via a hand shaking protocol between the client and server
# programs at either end of the connection. The very first TCP packet
# is sent by the client to the server and is called a SYN packet,
# because it has the SYN flag set to 1 in the TCP packet header. We
# only allow SYN packets for the specific servers running on specific
# ports of specific hosts. Subsequently, we only permit further TCP
# packets in that are determined to be part of a connection whose
# initial SYN packet was already accepted and responded to by one of our
# servers. This is done via 'Stateful Packet Inspection' provided by the
# netfilter functionality added to linux as of kernel 2.4. By stopping all
# other packets in their tracks, we limit attempts to attack our internal
# network.
#
# There are subtle ways that Denial of Service attacks can be performed
# if an attacker is able to somehow gain access to a machine inside our
# network or otherwise hijack a connection. However, even in such
# cases, current research is leading to ways to greatly limit the effect
# of such attacks. For further reading, see: http://www.cs3-
inc.com/ddos.html.
#
# For detailed background reading about iptables, please refer to:
# http://www.netfilter.org/documentation/tutorials/blueflux/iptables-
tutorial.html
#
# begin oceanpark.com firewall rules (using iptables)
# ---------------------------------------------------
# Here we go...
# Configure default policies (-P), meaning default rule to apply if no
# more specific rule below is applicable. These rules apply if a more
specific rule below
# is not applicable. Defaults are to DROP anything sent to firewall or
internal
# network, permit anything going out.
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# Flush (-F) all specific rules
iptables -F INPUT
iptables -F FORWARD
iptables -F OUTPUT
# iptables -F -t nat
# The rest of this file contains specific rules that are applied in the
order
# listed. If none applies, then the above policy rules are used.
# Forward all packets from eth1 (internal network) to eth0 (the internet).
# iptables -A FORWARD -i venet0 -o eth0 -j ACCEPT
# Forward packets that are part of existing and related connections from
eth0 to eth1.
# iptables -A FORWARD -i eth0 -o eth1 -m state --state ESTABLISHED,RELATED -
j ACCEPT
# Permit packets in to firewall itself that are part of existing and related
connections.
# iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
# Note, in the above two rules, a connection becomes ESTABLISHED in the
# iptables PREROUTING chain upon receipt of a SYNACK packet that is a
# response to a previously sent SYN packet. The SYNACK packet itself is
# considered to be part of the established connection, so no special
# rule is needed to allow the SYNACK packet itself.
# Allow all inputs to firewall from the internal network and local
interfaces
# iptables -A INPUT -i venet0 -s 0/0 -d 0/0 -j ACCEPT
# iptables -A INPUT -i lo -s 0/0 -d 0/0 -j ACCEPT
# Enable SNAT functionality on eth0
#
# SNAT is used to map private IP numbers of interfaces on the internal LAN
to one of
# my public static IP numbers. SNAT performs this mapping when a client
running
# on one of the internal machines initiates a TCP connection (SYN) through
eth0.
# iptables -A POSTROUTING -t nat -s 192.168.0.0/24 -o eth0 -j SNAT --to-
source 66.14.136.144
# Alternative to SNAT -- MASQUERADE
#
# If your firewall has a dynamic IP number because it connects to the
# internet itself via DHCP, then you probably cannot predict what the IP
# number is of your firewall's interface connected to the internet. In
# this case, you need a rule like the following that assigns the (an) IP
# number associated with eth0 to outgoing connections without you needing
# to know in advance (at time of writing this rule) what that IP number is:
#
# iptables -A POSTROUTING -t nat -o eth0 -j MASQUERADE
#
# Note that the above SNAT and MASQUERADE rules are applicable
# independent of how a host on the internal network is assigned its own
# internal IP number. The host could be assigned a static IP number on
# an internal nonpublic network (e.g. 10. or 192.168.) or it could be
# itself assigned a dynamic IP number from your own DHCP server running
# on the firewall, or it could even have a public static IP number.
# However, it seems unlikely that one would want to assign a public IP
# number to a host and then proceed to hide that number from the public.
# Deny any packet coming in on the public internet interface eth0
# which has a spoofed source address from our local networks:
# iptables -A INPUT -i eth0 -s 66.14.136.144/32 -j DROP
# iptables -A INPUT -i eth0 -s 66.14.136.145/32 -j DROP
# iptables -A INPUT -i eth0 -s 66.14.136.146/32 -j DROP
# iptables -A INPUT -i eth0 -s 66.14.136.147/32 -j DROP
# iptables -A INPUT -i eth0 -s 66.14.136.148/32 -j DROP
# iptables -A INPUT -i eth0 -s 192.168.0.0/24 -j DROP
# iptables -A INPUT -i eth0 -s 127.0.0.0/8 -j DROP
# Accept all tcp SYN packets for protocols SMTP, HTTP, HTTPS, and SSH:
# (SMTP connections are further audited by our SMTP server)
iptables -A INPUT -p tcp -s 0/0 -d xxx.xxx.xxx.xxx --destination-port 1 --
syn -
j ACCEPT
iptables -A INPUT -p tcp -s 0/0 -d xxx.xxx.xxx.xxx --destination-port 20 --
syn -j ACCEPT
iptables -A INPUT -p tcp -s 0/0 -d xxx.xxx.xxx.xxx --destination-port 21 --
syn -j ACCEPT
iptables -A INPUT -p tcp -s 0/0 -d xxx.xxx.xxx.xxx --destination-port 22 --
syn -j ACCEPT
iptables -A INPUT -p tcp -s 0/0 -d xxx.xxx.xxx.xxx --destination-port 25 --
syn -j ACCEPT
iptables -A INPUT -p tcp -s 0/0 -d xxx.xxx.xxx.xxx --destination-port 43 --
syn -j ACCEPT
iptables -A INPUT -p tcp -s 0/0 -d xxx.xxx.xxx.xxx --destination-port 53 --
syn -j ACCEPT
iptables -A INPUT -p tcp -s 0/0 -d xxx.xxx.xxx.xxx --destination-port 63 --
syn -j ACCEPT
iptables -A INPUT -p tcp -s 0/0 -d xxx.xxx.xxx.xxx --destination-port 70 --
syn -j ACCEPT
iptables -A INPUT -p tcp -s 0/0 -d xxx.xxx.xxx.xxx --destination-port 80 --
syn -j ACCEPT
iptables -A INPUT -p tcp -s 0/0 -d xxx.xxx.xxx.xxx --destination-port 110 --
syn -j ACCEPT
iptables -A INPUT -p tcp -s 0/0 -d xxx.xxx.xxx.xxx --destination-port 443 --
syn -j ACCEPT
iptables -A INPUT -p tcp -s 0/0 -d xxx.xxx.xxx.xxx --destination-port 465 --
syn -j ACCEPT
iptables -A INPUT -p tcp -s 0/0 -d xxx.xxx.xxx.xxx --destination-port 3306 --
syn -j ACCEPT
# Notice that the above rules are all INPUT rules. My current network
# does not require me to make use of FORWARD rules, since I run all
# publicly accessible servers directly on my firewall machine. But I
# promised above in the description of my network to give examples of
# rules used when there are servers running on machines on the internal
# network. Following are examples of FORWARD rules I would use if I ran
# mail, web, and ssh servers on machines on the internal network inside
# the firewall.
#
# iptables -A FORWARD -p tcp -s 0/0 -d 66.14.136.145/32 --destination-port
25 --syn -j ACCEPT
# iptables -A FORWARD -p tcp -s 0/0 -d 0/0 --destination-port 80 --syn -j
ACCEPT
# iptables -A FORWARD -p tcp -s 0/0 -d 0/0 --destination-port 443 --syn -j
ACCEPT
# iptables -A FORWARD -p tcp -s 0/0 -d 0/0 --destination-port 22 --syn -j
ACCEPT
#
# The first of the above four rules would be used if my routing
# delivered packets having destination 66.14.136.145 to any interface
# connected to my internal network. The second through fourth of the
# above four rules would be used if I my routing delivered packets
# having some public static IP as destination to some internal interface
# running a server listening to HTTP, HTTPS, or SSH ports. The
# difference between an INPUT rule and a FORWARD rule is that an INPUT
# rule applies to packets that are 'input' to this machine (the machine
# on which these iptables rules are installed), whereas a FORWARD rule
# applies to packets that are being 'fowarded', i.e. to packets that are
# passing through this machine to some other machine, such as a machine
# on my internal network.
#
# If I ran my mail server on an internal machine, I would no longer
# need my previous INPUT rule for 66.14.136.145 and would use the above
# FORWARD rule instead
# Finally, DENY all connection requests to any UDP port not yet provided
# for and all SYN connection requests to any TCP port not yet provided
# for. Using DENY instead of REJECT means that no 'ICMP port
# unreachable' response is sent back to the client attempting to
# connect. I.e., DENY just ignores connection attempts. Hence, use of
# DENY causes UDP connection requests to time out and TCP connection
# requests to hang. Hence, using DENY instead of REJECT may have
# the effect of frustrating attackers due to increasing the amount of
# time taken to probe ports.
# Note that there is a fundamental difference between UDP and TCP
# protocols. With UDP, there is no 'successful connection' response.
# With TCP, there is. So an attacking client will be left in the dark
# about whether or not the denied UDP packets arrived and will hang
# waiting for a response from denied TCP ports. An attacker will not
# be able to immediately tell if UDP connection requests are simply
# taking a long time, if there is a problem with connectivity between
# the attacking client and the server, or if the packets are being
# ignored. This increases the amount of time it takes for an attacker
# to scan all UDP ports. Similarly, TCP connection requests to denied
# ports will hang for a long time. By using REJECT instead of DENY, you
# would prevent access to a port in a more 'polite' manner, but give out
# more information to wannabe attackers, since the attacker can positively
# detect that a port is not accessible in a small amount of time from
# the 'ICMP port unreachable' response.
#-A input -s 0/0 -d 0/0 -p udp -j DENY
#-A input -s 0/0 -d 0/0 -p tcp -y -j DENY
iptables -A INPUT -s 0/0 -d 0/0 -p udp -j DROP
iptables -A INPUT -s 0/0 -d 0/0 -p tcp --syn -j DROP
# end oceanpark.com firewall rules (using iptables)
--
Greg Tibbetts
AAGT Hosting
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2005-01-18 2:41 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-01-18 2:41 LINUX FIREWALL unixsecurity
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.