LINUX FIREWALL

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

 



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



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

  Powered by Linux