The objective of this chapter is to give a fairly brief and short explanation
of each script available with this tutorial, and to provide an overview of the
scripts and what services they provide. These scripts are not in any way
perfect, and they may not fit your exact intentions perfectly. It is, in other
words, up to you to make these scripts suitable for your needs. The rest of this
tutorial should most probably be helpful in making this feat. The first section
of this tutorial deals with the actual structure that I have established in each
script so we may find our way within the script a bit easier.
All scripts written for this tutorial have been written after a specific
structure. The reason for this is that they should be fairly similar to
each other and to make it easier to find the differences between the scripts.
This structure should be fairly well documented in this brief chapter. This
chapter should hopefully give a short understanding to why all the scripts have
been written as they have, and why I have chosen to maintain this structure.
Even though this is the structure I have chosen, do note that this may not be
the best structure for your scripts. It is only a structure that I have chosen
to use since it fits the need of being easy to read and follow the best
according to my logic.
This is the structure that all scripts in this tutorial should follow. If they
differ in some way it is probably an error on my part, unless it is specifically
explained why I have broken this structure.
Configuration - First of all we have the
configuration options which the rest of the script should use. Configuration
options should pretty much always be the first thing in any shell-script.
Internet - This is the configuration section
which pertains to the Internet connection. This could be skipped if we do not
have any Internet connection. Note that there may be more subsections than those
listed here, but only such that pertain to our Internet connection.
DHCP - If there are possibly any special DHCP
requirements with this specific script, we will add the DHCP specific
configuration options here.
PPPoE - If there is a possibility that the
user that wants to use this specific script, and if there are any special
circumstances that raises the chances that he is using a PPPoE connection, we
will add specific options for those here.
LAN - If there is any LAN available behind the
firewall, we will add options pertaining to that in this section. This is most
likely, hence this section will almost always be available.
DMZ - If there is any reason to it, we will add
a DMZ zone configuration at this point. Most scripts lacks this section, mainly
because any normal home network, or small corporate network, will not have one.
Localhost - These options pertain to our
local-host. These variables are highly unlikely to change, but we have put most
of it into variables anyway. Hopefully, there should be no reason to change
these variables.
iptables - This section contains iptables
specific configuration. In most scripts and situations this should only require
one variable which tells us where the iptables binary is located.
Other - If there are any other specific
options and variables, they should first of all be fitted into the correct
subsection (If it pertains to the Internet connection, it should be
sub-sectioned there, etc). If it does not fit in anywhere, it should be
sub-sectioned directly to the configuration options somewhere.
Module loading - This section of the scripts
should maintain a list of modules. The first part should contain the required
modules, while the second part should contain the non-required modules.
Note that some modules that may raise security, or add certain services or
possibilities, may have been added even though they are not required. This
should normally be noted in such cases within the example scripts.
Required modules - This section should contain
the required modules, and possibly special modules that add to the security or
add special services to the administrator or clients.
Non-required modules - This section contains
modules that are not required for normal operations. All of these modules should
be commented out per default, and if you want to add the service it provides, it
is up to you.
proc configuration - This section should take
care of any special configuration needed in the proc file system. If some of
these options are required, they will be listed as such, if not, they should be
commented out per default, and listed under the non-required proc
configurations. Most of the useful proc configurations will be listed here, but
far from all of them.
Required proc configuration - This section
should contain all of the required proc configurations for the script in
question to work. It could possibly also contain configurations that raise
security, and possibly which add special services or possibilities for the
administrator or clients.
Non-required proc configuration - This section
should contain non-required proc configurations that may prove useful. All of
them should be commented out, since they are not actually necessary to get the
script to work. This list will contain far from all of the proc configurations
or nodes.
rules set up - By now the scripts should most
probably be ready to insert the rule-set. I have chosen to split all the rules
down after table and then chain names in the rule-sets, to make them easier to
follow and read. All user specified chains are created before we do anything to
the system built in chains. I have also chosen to set the chains and their rule
specifications in the same order as they are output by the iptables
-L command.
Filter table - First of all we go through the
filter table and its content. First of all we should set up all the policies in
the table.
Set policies - Set up all the default policies
for the system chains. Normally I will set DROP policies on the chains
in the filter table, and specifically ACCEPT services and streams that I want to
allow inside. This way we will get rid of all ports that we do not want to let
people use.
Create user specified chains - At this point
we create all the user specified chains that we want to use later on within this
table. We will not be able to use these chains in the system chains anyway if
they are not already created so we might as well get to it as soon as possible.
Create content in user specified chains -
After creating the user specified chains we may as well enter all the rules
within these chains. The only reason I have to enter this data at this point
already is that you may as well put it close to the creation of the user
specified chains. You may as well put this later on in your script, it is
totally up to you.
INPUT chain - When we have come this far, we
do not have a lot of things left to do within the filter table so we get
onto the INPUT chain. At this point we should add all rules within the INPUT
chain.
At this point we start following the output from the iptables
-L command as you may see. There is no reason for you to stay with
this structure, however, do try to avoid mixing up data from different tables
and chains since it will become much harder to read such rule-sets and to fix
possible problems.
FORWARD chain - At this point we go on to add
the rules within the FORWARD chain. Nothing special about this decision.
OUTPUT chain - Last of all in the filter
table, we add the rules dealing with the OUTPUT chain. There should, hopefully,
not be too much to do at this point.
nat table - After the filter table we take care
of the nat table. This is done after the filter table because of a number of
reasons within these scripts. First of all we do not want to turn the whole
forwarding mechanism and NAT function on at too early a stage, which could
possibly lead to packets getting through the firewall at just the wrong
time point (i.e., when the NAT has been turned on, but none of the filter
rules has been run). Also, I look upon the nat table as a sort of layer that
lies just outside the filter table and kind of surrounds it. The filter table
would hence be the core, while the nat table acts as a layer lying around the
filter table, and finally the mangle table lies around the nat table as a
second layer. This may be wrong in some perspectives, but not too far from
reality.
Set policies - First of all we set up all the
default policies within the nat table. Normally, I will be satisfied with the
default policy set from the beginning, namely the ACCEPT policy. This table
should not be used for filtering anyways, and we should not let packets be
dropped here since there are some really nasty things that may happen in such
cases due to our own presumptions. I let these chains be set to ACCEPT since
there is no reason not to do so.
Create user specified chains - At this point
we create any user specified chains that we want within the nat table. Normally
I do not have any of these, but I have added this section anyways, just in case.
Note that the user specified chains must be created before they can actually be
used within the system chains.
Create content in user specified chains - By
now it should be time to add all the rules to the user specified chains in the
nat table. The same thing goes here as for the user specified chains in the
filter table. We add this material here since I do not see any reason not to.
PREROUTING chain - The PREROUTING chain is
used to do DNAT on packets in case we have a need for it. In most scripts this
feature is not used, or at the very least commented out. The reason being that
we do not want to open up big holes to our local network without knowing about
it. Within some scripts we have this turned on by default since the sole
purpose of those scripts is to provide such services.
POSTROUTING chain - The POSTROUTING chain
should be fairly well used by the scripts I have written since most of them
depend upon the fact that you have one or more local networks that we want to
firewall against the Internet. Mainly we will try to use the SNAT target, but in
certain cases we are forced to use the MASQUERADE target instead.
OUTPUT chain - The OUTPUT chain is barely used
at all in any of the scripts. As it looks now, it is not broken, but I have been
unable to find any good reasons to use this chain so far. If anyone has a reason
to use this chain, send me a line and I will add it to the tutorial.
mangle table - The last table to do anything
about is the mangle table. Normally I will not use this table at all, since it
should normally not be used for anyone, unless they have specific needs, such as
masking all boxes to use the exact same TTL or to change TOS fields etc. I
have in other words chosen to leave these parts of the scripts more or less
blank, with a few exceptions where I have added a few examples of what it may be
used for.
Set policies - Set the default policies within
the chain. The same thing goes here as for the nat table, pretty much. The table
was not made for filtering, and hence you should avoid it alltogether. I have
not set any policies in any of the scripts in the mangle table one way or the
other, and you are encouraged not to do so either.
Create user specified chains - Create all the
user specified chains. Since I have barely used the mangle table at all in the
scripts, I have neither created any chains here since it is fairly unusable
without any data to use within it. However, this section was added just in case
someone, or I, would have the need for it in the future.
Create content in user specified chains - If
you have any user specified chains within this table, you may at this point add
the rules that you want within them here.
PREROUTING - At this point there is barely any
information in any of the scripts in this tutorial that contains any rules here.
INPUT chain - At this point there is barely any
information in any of the scripts in this tutorial that contains any rules here.
FORWARD chain - At this point there is barely any
information in any of the scripts in this tutorial that contains any rules here.
OUTPUT chain - At this point there is barely any
information in any of the scripts in this tutorial that contains any rules here.
POSTROUTING chain - At this point there is barely any
information in any of the scripts in this tutorial that contains any rules here.
Hopefully this should explain more in detail how each script is structured and
why they are structured in such a way.
Do note that these descriptions are extremely brief, and should mainly
just be seen as a brief explanation to what and why the scripts have been split
down as they have. There is nothing that says that this is the only and best way
to go.