Note: Our setup is a CentOS 6 box, running Shorewall 4.5.4 (from the

Prereqs:

First off, you should print out the MultiISP document from the Shorewall website and start marking it up with notes:

http://shorewall.net/MultiISP.html

About 98% of the answers are in the MultiISP file or one of the other shorewall documents. The other 2% are found on the mailing list.

A) I suggest renaming your ethernet devices to have more meaningful names. In a CentOS environment, we do this in /etc/sysconfig/network-scripts by:

- Renaming ifcfg-eth0 to ifcfg-newname
- Editing ifcfg-newname and using DEVICE=newname

We used "wancbl" (our cable modem, 25-30Mbps inbound, 2-3Mbps outbound, DHCP address), "want1" (our T1 line, static IP), "lan1" and "lan2" for the internal ethernet ports.

This made it much easier for us to see traffic when looking using "atop" or other tools, rather then trying to remember eth0..eth3 and which was what.

B) Turn off the NetworkManager service if you have it installed. Simply doing "chkconfig NetworkManager off" takes care of it in CentOS/RHEL.

- The number one bugaboo when you have NetworkManager installed is that it likes to overwrite your /etc/resolv.conf file (and does other things not suitable for a firewall server).

C) We bonded our two LAN ethernet ports (lan1 and lan2) into a simple active-backup (mode 1) bond called "bond0". So wherever we refer to "bond0", that is our internal LAN address.

Setting up bonding is not hard, but beyond the scope of this.

D) We are still using IPv4 for everything. While our T1 provider is talking about IPv6 rollout soon, our cable modem provider has no plans at all.

E) Use a version control system for /etc, /usr/local and any other directories where configuration files might be stored. My recommendation has been FSVS (stores data into a SVN repository) for a number of years. But you could also use git, hg, cvs, etc.

- It allows you to easily revert changes, without having to reach for the backup tapes.

- You can leave notes to yourself in the commit messages (in addition to leaving comments inside the configuration file). With FSVS, I can look back at the entire history of the server and see when I installed and configured a particular bit of software, what files I touched, and what I changed.

- Doing a diff between the configuration right after you installed something and after you mucked it up makes it easy to undo changes (or see how you did something 2-3 years from now).

...

Files that we changed from the Shorewall 4.5.4 defaults:

A) Zones file (self-explanatory, we don't yet use a DMZ zone or anything fancy like VLANs):
/etc/shorewall/zones

fw      firewall
loc     ipv4
net     ipv4

B) Interfaces (options may not be 100% correct, but seems to work):
/etc/shorewall/interfaces

loc bond0 dhcp,logmartians,nosmurfs,required,tcpflags
net wancbl dhcp,logmartians,nosmurfs,optional,tcpflags
net want1 logmartians,nosmurfs,optional,tcpflags

In your case, since both WAN interfaces are DHCP, you'll need to use the dhcp option on both. For us, only "wancbl" interface used a DHCP address.

Since DHCP is in use on the internal LAN, the bond0 interface also needed the 'dhcp' option.

C) Policies (you should customize this based on how secure you want things, letting the $FW talk to everything is probably not best):
/etc/shorewall/policies

loc net ACCEPT
net all DROP info
$FW loc ACCEPT
$FW net ACCEPT
all all REJECT info

D) Rules (you will be doing very custom things to this based on your needs, we run SSH on multiple ports, only allow SSH from outside via port 2222/tcp, plus we have NTP and BIND, plus allowing ICMP):
/etc/shorewall/rules

ACCEPT loc $FW tcp 22 # SSHD port
ACCEPT loc $FW tcp 2222 # 2nd SSHD port
ACCEPT net $FW tcp 2222 # only allow SSH over tcp/2222 from outside

ACCEPT $FW net udp ntp
ACCEPT loc $FW udp ntp
ACCEPT $FW loc udp ntp
REDIRECT loc ntp udp ntp # redirect NTP traffic to firewall NTP server

DNS/ACCEPT $FW net
DNS/ACCEPT loc $FW
DNS/ACCEPT $FW loc
DNS/ACCEPT loc net

ACCEPT loc $FW icmp
ACCEPT $FW loc icmp
ACCEPT $FW net icmp
ACCEPT net $FW icmp

E) Masq file (NAT for the LAN clients to the internet). The example here uses 192.168.0.0/24 as our internal LAN address range (in reality we use a 172.x.y.z range). The important thing is that you need to list both WAN ethernet devices, with the same internal LAN address range for both lines.:
/etc/shorewall/masq

wancbl 192.168.0.0/24
want1 192.168.0.0/24

F) Providers (I am still a bit fuzzy about things here). Note that we use TRACK_PROVIDERS=Yes and USE_DEFAULT_RT=Yes in the shorewall.conf file. This affects how you define your two providers:
/etc/shorewall/providers

provcbl 1 2 - wancbl detect balance=100
provt1 2 2 - want1 999.999.999.999 balance=1

- Replace 999.999.999.999 with "detect" if you are using DHCP, or enter the static external IP address assigned to that interface.

- USE_DEFAULT_RT=Yes means that the DUPLICATE column should be left as '-' in the providers file.

- TRACK_PROVIDERS=Yes automatically adds "track" to the OPTIONS column, which is why I don't specify it as "track,balance=###".

- The 100:1 weight means that 99% of all traffic goes out over the "wancbl" interface. Only if the cable modem is down, does it start to route traffic over our T1 line.

- The provider names (1st column) will also show up in your routing tables (see "shorewall show routing"). So we prefix our provider names with "prov" to make it clearer.

- If you need specific traffic to go out over the secondary provider, then you need to play with "rtrules" or "tcrules" (we don't use this yet, so that is not a certainty). Get it working first without touching those files.

- I have been unable to get "fallback" option working properly in Shorewall 4.5.4. But the above works well enough for our purposes.

G) shorewall.conf (the main config file). I am only listing lines that changed from the base install. You should *definitely* read the main Shorewall documentation and make notes in the configuration file for why you changed a particular value.
/etc/shorewall/shorewall.conf

VERBOSITY=2
NULL_ROUTE_RFC1918=Yes
RESTORE_DEFAULT_ROUTE=No
TRACK_PROVIDERS=Yes
USE_DEFAULT_RT=Yes

H) The "routestopped" file (for Shorewall v4.5.4), it has a different name in later versions of Shorewall (stoppedrules). These are the iptables rules that get generate whenever Shorewall shuts down.

bond0 - - icmp
bond0 - - tcp 22
bond0 - - udp 123
bond0 - - tcp 2222

want1 - source icmp
want1 - source tcp 2222

wancbl - source icmp
wancbl - source tcp 2222

...

That's the end of the *simple* stuff. Other then the providers file and defining multiple WAN interfaces, it looks very similar to a single-ISP setup.

...

LSM configuration notes:

- We used lsm-0.163-1.foo6.src.rpm for our LSM install on CentOS 6.

- The default LSM configuration is not quite correct for working with Shorewall.

...

A) You need to change a few defaults in the lsm.conf file. These lines were all added or changed inside the "defaults{}" block.

eventscript=/etc/lsm/script
notifyscript=
status=1

B) Before the "#EOF" line at the end of the /etc/lsm/lsm.conf file, you need to add the following line:

include /var/lib/shorewall/lsm.conf

C) A sample /var/lib/shorewall/lsm.conf

connection {
    name=T1
    checkip=999.999.999.999
    device=want1
    ttl=2
}

connection {
    name=Cablevision
    checkip=999.999.999.999
    device=wancbl
    ttl=2
}

- You should replace "999.999.999.999" with the current DHCP IP address

- This file actually gets written out by Shorewall, but for testing LSM, you will want to initially create it by hand.

D) You do *not* need to run LSM as a service. On CentOS 6, if "chkconfig --list lsm" shows that LSM is running in runlevels 3-5, then you should "chkconfig lsm off" to disable the service.

E) /etc/lsm/script - This is the script that LSM will run whenever the status of a link changes (eventscript= argument in /etc/lsm/lsm.conf). See attachment to this email for a copy of our LSM script (which is slightly different then the Shorewall MultiISP example script).

It needs to perform the following tasks when a link goes "up":

- Remove the [interface].status file
- Execute the Shorewall "firewall enable {device}" script

When the link goes down, it needs to:

- Execute the Shorewall "firewall disable {device}" script

Note: The above only works for Shorewall 4.5.4 and later.

I have added some other logging statements to the script that shoves the details and events into /var/log/lsm.log.

...

Now that LSM is setup, we can go back to setting up Shorewall to interact with LSM.

...

A) /etc/shorewall/isusable

This *should* be already setup by default. It looks for "[interface].status" files in the VARDIR, where LSM will write those status files.

B) /etc/shorewall/params

You *could* define various things here instead of hardcoding them in the other files. But we did not do so in our setup.

C) /etc/shorewall/started

This is the shell script commands that get run whenever shorewall starts up. We decided to use the single solitary line in our "started" file rather then check whether this was a "restart" command. The "start_lsm" is a function defined in /etc/shorewall/lib.private

# [Re]Start LSM
start_lsm

D) /etc/shorewall/restored

This is covered in the multi-ISP document. It checks to see if LSM is already running, otherwise it starts it.

# Start lsm if it isn't running
if [ -z "$(ps ax | grep 'lsm ' | grep -v 'grep ' )" ]; then
  start_lsm
fi

E) /etc/shorewall/lib.private

The meat-and-potatoes for interacting with LSM. It defines the "start_lsm()" shell function. See attached file.

- The checkip line can be written two ways. You can specify a static IP address that is the "next hop out" for that particular interface. Or you can use the "SW_(interfacename)_GATEWAY" environment variable for DHCP setups and also specify a fallback address.

Static version:
checkip=999.999.999.999

DHCP version:
checkip=${SW_WANCBL_GATEWAY:-999.999.999.999}

- 999.999.999.999 in this file needs to be your "next-hop" gateway IP address for that WAN interface, not the external IP address of your firewall.

- If you need to go two+ hops out, then you will *also* need to add a static "ip route". I'm not showing an example of that, and for cable modem setups it is probably not needed.

- Our lib.private is somewhat custom, with some additional logging added that is not in the MultiISP example document.

- start_lsm() is responsible for writing out the /var/shorewall/lsm.conf file.

- We should be using more of Shorewall variables (such as VARDIR) instead of hardcoding /var/lib/shorewall in places.

F) /etc/shorewall/findgw

This file may not exist by default, or may not be compatible with your distro. Sample versions of the "findgw" script can be found at:

http://www.shorewall.net/pub/shorewall/contrib/findgw/

Without the proper "findgw" file, you will see that even though the interface is up, there is no default route being added to that provider's routing table (see "shorewall show routing").

...

I think that's everything that we changed when setting up our MultiISP configuration. There are no warranties, but this should serve as a trail of breadcrumbs to help you figure out what needs to be touched.

#!/bin/sh
#
# (C) 2009 Mika Ilmaranta <[email protected]>
# (C) 2009 Tom Eastep <[email protected]>
#
# License: GPLv2
#
# Beginning with Shorewall 4.4.23, it is not necessary to restart the 
# firewall when an interface transitions between the usable and 
# unusable states.

STATE=${1}
NAME=${2}
CHECKIP=${3}
DEVICE=${4}
WARN_EMAIL=${5}
REPLIED=${6}
WAITING=${7}
TIMEOUT=${8}
REPLY_LATE=${9}
CONS_RCVD=${10}
CONS_WAIT=${11}
CONS_MISS=${12}
AVG_RTT=${13}

if [ -f /usr/share/shorewall-lite/lib.base ]; then
    VARDIR=/var/lib/shorewall-lite
    STATEDIR=/etc/shorewall-lite
else
    VARDIR=/var/lib/shorewall
    STATEDIR=/etc/shorewall
fi

[ -f ${STATEDIR}/vardir ] && . ${STATEDIR}/vardir

cat <<EOM | mail -s "LSM (fw2-sec): ${NAME} ${STATE}, DEV ${DEVICE}" 
${WARN_EMAIL}

Hi,

Connection ${NAME} is now ${STATE}.

Following parameters were passed:
newstate     = ${STATE}
name         = ${NAME}
checkip      = ${CHECKIP}
device       = ${DEVICE}
warn_email   = ${WARN_EMAIL}

Packet counters:
replied      = ${REPLIED} packets replied
waiting      = ${WAITING} packets waiting for reply
timeout      = ${TIMEOUT} packets that have timed out (= packet loss)
reply_late   = ${REPLY_LATE} packets that received a reply after timeout
cons_rcvd    = ${CONS_RCVD} consecutively received replies in sequence
cons_wait    = ${CONS_WAIT} consecutive packets waiting for reply
cons_miss    = ${CONS_MISS} consecutive packets that have timed out
avg_rtt      = ${AVG_RTT} average rtt, notice that waiting and timed out 
packets have rtt = 0 when calculating this

Your LSM Daemon

EOM

LSMLOG=/var/log/lsm.log
echo "--------------------------------------" >> $LSMLOG

if [ ${STATE} = up ]; then
# echo 0 > ${VARDIR}/${DEVICE}.status # Uncomment this line if you are running 
Shorewall 4.4.x or earlier
  rm -f ${VARDIR}/${DEVICE}.status
  ${VARDIR}/firewall enable ${DEVICE}
  echo "EVENT: ${VARDIR}/firewall enable ${DEVICE} @ $(date)" >> $LSMLOG
else
#  echo 1 > ${VARDIR}/${DEVICE}.status # Uncomment this line if you are running 
Shorewall 4.4.x or earlier
   ${VARDIR}/firewall disable ${DEVICE}
   echo "EVENT: ${VARDIR}/firewall disable ${DEVICE} @ $(date)" >> $LSMLOG
fi

/sbin/shorewall show routing >> $LSMLOG
echo "--------------------------------------" >> $LSMLOG

exit 0

#EOF
#
# Shorewall version 4 - lib.private File
#
# /etc/shorewall/lib.private
#
#       Use this file to declare shell functions to be called in the other
#       run-time extension scripts. The file will be copied into the generated
#       firewall script.
#
# See http://shorewall.net/shorewall_extension_scripts.htm for additional
# information.
#
###############################################################################

start_lsm() {
   LSMLOG=/var/log/lsm.log

   echo "--------------------------------" >> $LSMLOG
   echo "/etc/shorewall/lib.private -- start_lsm() @ $(date)" >> $LSMLOG

   #
   # Kill any existing lsm process(es)
   #
   echo "Kill any existing lsm processes" >> $LSMLOG
   killall lsm 2> /dev/null
   #
   # Create the Shorewall-specific part of the LSM configuration. This file is
   # included by /etc/lsm/lsm.conf
   #
   echo "Rewrite /var/lib/shorewall/lsm.conf" >> $LSMLOG
   echo "$(/usr/bin/printenv)" >> $LSMLOG
   cat <<EOF > /var/lib/shorewall/lsm.conf

connection {
    name=T1
    checkip=999.999.999.999
    device=want1
    ttl=2
}

connection {
    name=Cablevision
    checkip=${SW_WANCBL_GATEWAY:-999.999.999.999}
    device=wancbl
    ttl=2
}

EOF
   #
   # Since LSM assumes that interfaces start in the 'up' state, remove any
   # existing status files that might have an interface in the down state
   #
   echo "Remove existing *.status files" >> $LSMLOG
   rm -f /var/lib/shorewall/*.status
   #
   # Run LSM -- by default, it forks into the background
   #
   echo "START LSM" >> $LSMLOG
   /usr/sbin/lsm /etc/lsm/lsm.conf >> $LSMLOG

   echo "--------------------------------" >> $LSMLOG
}

------------------------------------------------------------------------------
How ServiceNow helps IT people transform IT departments:
1. Consolidate legacy IT systems to a single system of record for IT
2. Standardize and globalize service processes across IT
3. Implement zero-touch automation to replace manual, redundant tasks
http://pubads.g.doubleclick.net/gampad/clk?id=51271111&iu=/4140/ostg.clktrk
_______________________________________________
Shorewall-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/shorewall-users

Reply via email to