iptables.rules.sh


# ------------------------------------------------------------------------------------------
# -- 
# ------------------------------------------------------------------------------------------
  

IPT=/usr/sbin/iptables

EXTINT=eth3

EXTIP=130.88.zyx.wvu


# ------------------------------------------------------------------------------------------
# -- SECTION 0.3 ::  :
# ------------------------------------------------------------------------------------------


. /root/etc/iptables.rules.functions.sh


# ------------------------------------------------------------------------------------------
# -- 
# ------------------------------------------------------------------------------------------


if [ "$1" == "--restart-ssh-service" ] ; then

    restart_chain_ssh_service
    exit

elif [ "$1" == "--restart-total" ] ; then

    echo -e "\nTotal restart..."

else
    echo -e "\nDoing nothing."
    echo -e "\nUsage:"
    echo -e "    --restart-ssh-service"
    echo -e "    --restart-total  [--no-revert]"
    echo -e "\n"
    exit
fi


# ------------------------------------------------------------------------------------------
# -- SECTION 0.1 ::  Start by cleaning the bath :
# ------------------------------------------------------------------------------------------


for i in filter nat mangle
do
    $IPT -t $i -F
    $IPT -t $i -X
done


$IPT -t filter -P INPUT  ACCEPT
$IPT -t filter -P OUTPUT ACCEPT
$IPT -t filter -P FORWARD ACCEPT
    #
    # ...these are changed to DROP at the bottom...
    #


# ------------------------------------------------------------------------------------------
# -- SECTION 0.2 :: DEBUG :
# ------------------------------------------------------------------------------------------

    # ...just in case we get it horribly wrong, here are some liferafts for the sysadmins...

for host in 130.88.pqr.aaa  130.88.pqr.aab
do
    $IPT -t filter -i $EXTINT  -A INPUT  -p tcp -s $host -j ACCEPT
    $IPT -t filter -o $EXTINT  -A OUTPUT -p tcp -d $host -j ACCEPT
done


# ------------------------------------------------------------------------------------------
# --
# ------------------------------------------------------------------------------------------


# -- allow traffic from an existing connection:
#
$IPT -t filter -A INPUT  -m state --state ESTABLISHED,RELATED  -j ACCEPT
$IPT -t filter -A OUTPUT -m state --state ESTABLISHED,RELATED  -j ACCEPT


# ------------------------------------------------------------------------------------------
# -- Safety net:  revert to last saved rule set after a few minutes unless state otherwise :
# ------------------------------------------------------------------------------------------


Q_REV=""
REVERT_TIME="2 minutes"

if [ "$2" == "--no-revert" ] ; then
    echo -e "\nNot reverting..."
    until [ "$Q_REV" == "NOREVERT" ] ; do
        echo -e "     ...enter NOREVERT to confirm or Ctrl-C to exit..."
        read Q_REV
    done
    echo -e "Confirmed --- NOT reverting..."
else
    echo -e "\nWill revert to saved set in $REVERT_TIME..."
    sleep 1

    AT_CMD="at -m -f /root/etc/iptables.load_active.sh now + $REVERT_TIME"
    echo -e "\nReverting using:"
    echo -e "    $AT_CMD\n"
    $AT_CMD
    echo -e "\nIssuing remaining firewall commands..."
fi


# ------------------------------------------------------------------------------------------
# -- SECTION 0.4 ::
# ------------------------------------------------------------------------------------------


#
# -- somethings like to seem to send externally-addressed traffic over any and 
#    all interfaces :
#

$IPT -t filter -A INPUT   -s $EXTIP -j ACCEPT
$IPT -t filter -A OUTPUT  -d $EXTIP -j ACCEPT
    #
    # **NOT**:    $IPT -t filter -A INPUT   -d $EXTIP -j ACCEPT     **NO!!!**
    # **NOT**:    $IPT -t filter -A OUTPUT  -s $EXTIP -j ACCEPT     **NO!!!**
    #


# ------------------------------------------------------------------------------------------
# -- SECTION 0.5 :: Other interfaces :
# ------------------------------------------------------------------------------------------


$IPT -t filter -i eth0 -A INPUT  -j ACCEPT
$IPT -t filter -o eth0 -A OUTPUT -j ACCEPT

$IPT -t filter -i eth1 -A INPUT  -j ACCEPT
$IPT -t filter -o eth1 -A OUTPUT -j ACCEPT

$IPT -t filter -i eth2 -A INPUT  -j ACCEPT
$IPT -t filter -o eth2 -A OUTPUT -j ACCEPT


# ------------------------------------------------------------------------------------------
# -- SECTION 0.6 :: Local Interface :
# ------------------------------------------------------------------------------------------


local_interface_rules "LO_SPOOF" 


# ==========================================================================================
# == SECTION 1 :: TRUSTED HOSTS :
# ==========================================================================================


    # ...trusted host stuff is the first major section...
    # ...trusted host stuff is the first major section...

$IPT -N TRUSTED_HOST
$IPT -A TRUSTED_HOST -j ACCEPT


# ------------------------------------------------------------------------------------------
# -- Backups :
# ------------------------------------------------------------------------------------------


$IPT -N BACKUPS

for host in  tbu.abc  tbu.abd
do
    $IPT -t filter -A INPUT   -i $EXTINT -d $EXTIP  -s 130.88.$host  -j BACKUPS
    $IPT -t filter -A OUTPUT  -o $EXTINT -s $EXTIP  -d 130.88.$host  -j BACKUPS
done

$IPT -A BACKUPS -j TRUSTED_HOST


# ------------------------------------------------------------------------------------------
# -- Patching :
# ------------------------------------------------------------------------------------------


$IPT -N PATCHING


$IPT -t filter -A OUTPUT  -o $EXTINT -s $EXTIP  -d www.vendor.country  -j PATCHING
$IPT -t filter -A INPUT   -i $EXTINT -d $EXTIP  -s www.vendor.country  -j PATCHING

$IPT -t filter -A OUTPUT  -o $EXTINT -s $EXTIP  -d mirror.dom  -j PATCHING
$IPT -t filter -A INPUT   -i $EXTINT -d $EXTIP  -s mirror.dom  -j PATCHING


$IPT -A PATCHING -j TRUSTED_HOST


# ==========================================================================================
# == SECTION 2 :: PINHOLE LOOKUPS and OUTBOUND CONNECTIONS :
# ==========================================================================================


# ------------------------------------------------------------------------------------------
# -- DNS :  
# ------------------------------------------------------------------------------------------

    # ...we want to talk to our local DNS servers...

$IPT -N DNS_LOOKUPS

$IPT -t filter -A OUTPUT -o $EXTINT -s $EXTIP -p udp --dport 53 -j DNS_LOOKUPS
$IPT -t filter -A INPUT  -i $EXTINT -d $EXTIP -p udp --sport 53 -j DNS_LOOKUPS

allow_udp_out  DNS_LOOKUPS  130.88.ac.efg  130.88.ac.efh  130.88.baa.ghi 

$IPT -t filter -A DNS_LOOKUPS  -j LOG  --log-prefix " **DNS_LOOKUPS DROP** "
$IPT -t filter -A DNS_LOOKUPS  -j DROP
    #
    # -- Pinhole chain:
    #     -- default-log-and-drop;
    #         -- we should use only trusted DNS servers, else nothing is secure!
    #


# ------------------------------------------------------------------------------------------
# -- SysLog :
# ------------------------------------------------------------------------------------------

    # ...allow out UDP packets to our remote syslog servers...

$IPT -N SYSLOG_OUT

$IPT -t filter -A OUTPUT -o $EXTINT -s $EXTIP -p udp --dport 514 -j SYSLOG_OUT
$IPT -t filter -A INPUT  -i $EXTINT -d $EXTIP -p udp --sport 514 -j SYSLOG_OUT

allow_udp_out  SYSLOG_OUT  syslogone.manc.ac.uk  syslogtwo.manc.ac.uk

$IPT -t filter -A SYSLOG_OUT  -j LOG  --log-prefix " **SYSLOG_OUT DROP** "
$IPT -t filter -A SYSLOG_OUT  -j DROP
    #
    # -- Pinhole chain:
    #     -- default-log-and-drop;
    #         -- we should copy syslogs to only trusted syslog servers...
    #


# ------------------------------------------------------------------------------------------
# -- SMTP :
# ------------------------------------------------------------------------------------------

    # ...allow out email to given router (e.g., "your job has finished..."), but no
    #    connection inward...

$IPT -N SMTP_OUT

$IPT -t filter -A OUTPUT -o $EXTINT  -p tcp --dport 25  -s $EXTIP  -j SMTP_OUT
$IPT -t filter -A INPUT  -i $EXTINT  -p tcp --sport 25  -d $EXTIP  -j SMTP_OUT

allow_tcp_out  SMTP_OUT  relay.manc.ac.uk  
 
$IPT -t filter -A SMTP_OUT  -j LOG  --log-prefix " **SMTP_OUT DROP** "
$IPT -t filter -A SMTP_OUT  -j DROP
    #
    # -- Pinhole chain:
    #     -- default-log-and-drop;
    #         -- we should be using the UoM SMTP relay for everything.
    #


# ------------------------------------------------------------------------------------------
# -- NTP (Pub Int) :  
# ------------------------------------------------------------------------------------------

    # ...we want to talk to our local NTP servers...

$IPT -N NTP_LOOKUPS

$IPT -t filter -A OUTPUT -o $EXTINT -s $EXTIP -p udp --dport 123 -j NTP_LOOKUPS
$IPT -t filter -A INPUT  -i $EXTINT -d $EXTIP -p udp --sport 123 -j NTP_LOOKUPS

allow_udp_out  NTP_LOOKUPS  ntpone.manc.ac.uk  ntptwo.manc.ac.uk  

$IPT -t filter -A NTP_LOOKUPS  -j LOG  --log-prefix " **NTP_LOOKUPS DROP** "
$IPT -t filter -A NTP_LOOKUPS  -j DROP
    #
    # -- Pinhole chain:
    #     -- default-log-and-drop:
    #         -- getting time right is important for security , so use only
    #            trusted NTP boxen.
    #


# ==========================================================================================
# == SECTION 3 :: SERVICES ON LOW-NUMBERED PORTS :
# ==========================================================================================


# ------------------------------------------------------------------------------------------
# -- Web Service :  
# ------------------------------------------------------------------------------------------


$IPT -N WEB_SERVICE

$IPT -t filter -A INPUT  -i $EXTINT -d $EXTIP  -p tcp -m multiport --sports 80,443  -j WEB_SERVICE
$IPT -t filter -A OUTPUT -o $EXTINT -s $EXTIP  -p tcp -m multiport --sports 80,443  -j WEB_SERVICE

allow_tcp_in  WEB_SERVICE  130.88.0.0/16  

$IPT -t filter -A WEB_SERVICE  -j LOG  --log-prefix " **WEB_SERVICE DROP** "
$IPT -t filter -A WEB_SERVICE  -j DROP
    #
    # -- Pinhole chain for service on low-numbered port:
    #     -- default-log-and-drop;
    #         -- should be no other traffic to/from our port 80;
    #


# ------------------------------------------------------------------------------------------
# -- SSH Service :
# ------------------------------------------------------------------------------------------


$IPT -N SSH_SERVICE 

$IPT -t filter -A INPUT  -i $EXTINT  -p tcp --dport 22  -d $EXTIP  -j SSH_SERVICE
$IPT -t filter -A OUTPUT -o $EXTINT  -p tcp --sport 22  -s $EXTIP  -j SSH_SERVICE

restart_chain_ssh_service



# ==========================================================================================
# == SECTION 4 :: SERVICES USING HIGH-NUMBERED PORTS :
# ==========================================================================================


# ------------------------------------------------------------------------------------------
# -- Ganglia "Service" :
# ------------------------------------------------------------------------------------------

    # ...allow Man4 to talk to our Ganglia-related daemons...

$IPT -N GANGLIA_SERVICE

$IPT -t filter -A INPUT   -i $EXTINT -d $EXTIP  -p tcp -m multiport --dports 8443,8649,8651,8652  -j GANGLIA_SERVICE
$IPT -t filter -A OUTPUT  -o $EXTINT -s $EXTIP  -p tcp -m multiport --sports 8443,8649,8651,8652  -j GANGLIA_SERVICE

$IPT -t filter -A INPUT   -i $EXTINT -d $EXTIP  -p udp -m multiport --dports 8443,8649,8651,8652  -j GANGLIA_SERVICE
$IPT -t filter -A OUTPUT  -o $EXTINT -s $EXTIP  -p udp -m multiport --sports 8443,8649,8651,8652  -j GANGLIA_SERVICE

allow_tcp_in  GANGLIA_SERVICE  ganglia.manc.ac.uk
allow_udp_in  GANGLIA_SERVICE  ganglia.manc.ac.uk

    #
    # -- Service on high-numbered ports:
    #
    #     -- assuming a daemon is bound to all these ports, there should be no traffic 
    #        other than that ACCEPTed above, so we should be able to default-DROP;
    #
    #     -- but it's possible that not all the above are in use, so we will DROP only NEW                                        DEVEL  DEVEL    !!!!!
    #        incoming packets and LOG the rest (which will, e.g., allow 8443 as the source
    #        port for an out-going connection) :                                                                                  DEVEL  DEVEL    !!!!!
    #
$IPT -t filter -A GANGLIA_SERVICE  -i $EXTINT -d $EXTIP  -m state --state NEW  -j LOG --log-prefix " **GANGLIA_SERVICE: DROP** "
$IPT -t filter -A GANGLIA_SERVICE  -i $EXTINT -d $EXTIP  -m state --state NEW  -j DROP
$IPT -t filter -A GANGLIA_SERVICE  -j LOG --log-prefix " **GANGLIA_SERVICE: LOG** "


# ==========================================================================================
# == SECTION 5 :: OUTREACH :
# ==========================================================================================


# ------------------------------------------------------------------------------------------
# -- SSH outwards :
# ------------------------------------------------------------------------------------------


$IPT -N SSH_FROM_US


$IPT -t filter -A OUTPUT -o $EXTINT  -p tcp --dport 22  -s $EXTIP  -j SSH_FROM_US
$IPT -t filter -A INPUT  -i $EXTINT  -p tcp --sport 22  -d $EXTIP  -j SSH_FROM_US

allow_tcp_out  SSH_FROM_US  sysadminone.manc.ac.uk  sysadmintwo.manc.ac.uk  

$IPT -t filter -A SSH_FROM_US  -j LOG  --log-prefix " **SSH_FROM_US DROP** "
$IPT -t filter -A SSH_FROM_US  -j DROP
    #
    # -- default-log-and-drop as for SSH outbound:
    #     -- this is really mean...
    #

 
# ------------------------------------------------------------------------------------------
# -- Web Out :  
# ------------------------------------------------------------------------------------------

    # [email protected] would to talk to squid1/2 and pulsar...

    ## Does Bruno still need this?  pulsar.vidar.ngs.manchester.ac.uk 80
    ## Does Bruno still need this?  pulsar.vidar.ngs.manchester.ac.uk 80

$IPT -N WEB_PROXY_OUT

$IPT -t filter -A OUTPUT -o $EXTINT -s $EXTIP  -p tcp --dport 3128  -j WEB_PROXY_OUT
$IPT -t filter -A INPUT  -i $EXTINT -d $EXTIP  -p tcp --sport 3128  -j WEB_PROXY_OUT

allow_tcp_out  WEB_PROXY_OUT  proxyone.manc.ac.uk  proxytwo.manc.ac.uk

$IPT -t filter -A WEB_PROXY_OUT  -j LOG  --log-prefix " **WEB_PROXY_OUT DROP** "
$IPT -t filter -A WEB_PROXY_OUT  -j DROP
    #
    # -- default-log-and-drop as we don't trust other Web Proxies --- they may forward
    #    us to faked/phishing sites for example...
    #

 
# ==========================================================================================
# == SECTION 6 :: FORWARDS/MASQUERADES/NAT :
# ==========================================================================================


# -- tweak that kernel :
#
echo 1 > /proc/sys/net/ipv4/ip_forward


    # ...recall that INPUT/OUTPUT rules do NOT affect traffic from 10.2.64.0/24 destined to be FORWARDed via 10.2.64.25\0, so we need
    #    addition block/allow rules here to filter storage and the compute nodes (see ascii-art diagram in the IPTables\ HOWTO)...


# -- forward stuff from 192.168.104.0/24, the headnode-facing interface of the compute-nodes :
#
# -- DNS :
#
$IPT -A FORWARD -p udp  -i eth0 -o eth3  -s 192.168.104.0/24 -d 130.88.ac.efg   -j ACCEPT
$IPT -A FORWARD -p udp  -i eth0 -o eth3  -s 192.168.104.0/24 -d 130.88.ac.efh   -j ACCEPT
$IPT -A FORWARD -p udp  -i eth0 -o eth3  -s 192.168.104.0/24 -d 130.88.baa.ghi  -j ACCEPT


# -- forward anything related/established :
#
$IPT -A FORWARD  -m state --state ESTABLISHED,RELATED  -j ACCEPT


# -- default don't forward :
#
$IPT -A FORWARD -j LOG --log-prefix " FORWARD-DROP "
$IPT -A FORWARD -j DROP


# -- we're going to a ball :
#
$IPT -t nat -A POSTROUTING -s 192.168.104.0/24 -j MASQUERADE



# ==========================================================================================
# == SECTION 7 :: TMP :
# ==========================================================================================


# -- for testing Gold stuff :
#
$IPT -t filter -A INPUT  -s ddd.rst.manchester.ac.uk -j ACCEPT
$IPT -t filter -A OUTPUT -d ddd.rst.manchester.ac.uk -j ACCEPT


# ==========================================================================================
# == SECTION 8 :: DEFAULTS :
# ==========================================================================================


    ## ...Silently drop the junkmail deluge :


$IPT -t filter -i $EXTINT -A INPUT -p udp --sport 137 --dport 137  -j DROP  # ...Windoze...
$IPT -t filter -i $EXTINT -A INPUT -p udp --sport 138 --dport 138  -j DROP  # ...Windoze...
$IPT -t filter -i $EXTINT -A INPUT -p udp --sport 520 --dport 520  -j DROP  # ...??????
$IPT -t filter -i $EXTINT -A INPUT -p udp --sport 631 --dport 631  -j DROP  # ...IPP...

$IPT -t filter -i $EXTINT -A INPUT -p udp -m multiport --destination-ports 1026,1027,1028,1029 -j DROP  # ...Windoze...

$IPT -t filter -i $EXTINT -A INPUT -p udp --sport 4500  --dport 4500  -j DROP  # ...??????
$IPT -t filter -i $EXTINT -A INPUT -p udp --sport 4501  --dport 4501  -j DROP  # ...??????
$IPT -t filter -i $EXTINT -A INPUT -p udp --sport 4502  --dport 4502  -j DROP  # ...??????

$IPT -t filter -i $EXTINT -A INPUT -s 130.88.zxy.250 -d 224.0.0.1   -j DROP  # ...all hosts multicast from router...


    ## ...Log everything else... 


$IPT -t filter -i $EXTINT -A INPUT  -m limit --limit 5/minute --limit-burst 10 -j LOG --log-level warn --log-tcp-sequence --log-tcp-options --log-ip-options --log-uid --log-prefix " **INPUT DEFAULT** "
$IPT -t filter -o $EXTINT -A OUTPUT -m limit --limit 5/minute --limit-burst 10 -j LOG --log-level warn --log-tcp-sequence --log-tcp-options --log-ip-options --log-uid --log-prefix " **OUTPUT DEFAULT** "


    ## ...then drop it : 


$IPT -t filter -i $EXTINT -A INPUT  -j DROP
$IPT -t filter -o $EXTINT -A OUTPUT -j DROP


# ==========================================================================================
# == SECTION 9 :: POLICY :
# ==========================================================================================


$IPT -t filter -P INPUT  DROP
$IPT -t filter -P OUTPUT DROP
$IPT -t filter -P FORWARD DROP


# ==========================================================================================
# == Time for a nice mug of tea.
# ==========================================================================================