#!/bin/sh

################ Start of IPFW rules file ###############################
# Flush out the list before we begin.
ipfw -q -f flush

# Set rules command prefix
cmd="ipfw -q add"
skip="skipto 800"
pif="rl0"     # interface name of Nic card facing the public internet


#################################################################
# No restrictions on Inside Lan Interface for private network
# Change re0 to your Lan Nic card interface name
#################################################################
$cmd 003 allow all from 192.168.0.0/24 to any via re0

#################################################################
# No restrictions on Loopback Interface
#################################################################
$cmd 004 allow all from any to any via lo0

#################################################################
# Insecure mobiles devices IPs are allocated by DHCP server into 
# 192.168.1.0/24 subnet.
# Access is denied to my local private network.
# Access to public Internet will be allowed below.
#################################################################
$cmd 006 allow udp from 192.168.1.0/24 68 to 192.168.1.1 67 in via re0
$cmd 007 allow udp from 192.168.1.1 67 to 192.168.1.0/24 68 out via re0
$cmd 008 deny all from 192.168.1.0/24 to 192.168.0.0/24 via re0
$cmd 009 deny all from 192.168.1.0/24 to 192.168.1.0/24 via re0

#################################################################
# check if packet is inbound and nat address if it is
#################################################################
$cmd 014 divert natd ip from any to any in via $pif

#################################################################
# Allow the packet through if it has previous been added to the
# the "dynamic" rules table by a allow keep-state statement.
#################################################################
$cmd 015 check-state

#################################################################
# Interface facing Public internet (Outbound Section)
# Interrogate session start requests originating from behind the
# firewall on the private network or from this gateway server
# destine for the public internet.
#################################################################

# Allow out access to my ISP's Domain name server.
$cmd 020 $skip tcp from any to 212.27.40.240 53 out via $pif setup keep-state
$cmd 021 $skip udp from any to 212.27.40.240 53 out via $pif keep-state
$cmd 022 $skip tcp from any to 212.27.40.241 53 out via $pif setup keep-state
$cmd 023 $skip udp from any to 212.27.40.241 53 out via $pif keep-state

# Allow out non-secure standard www function
$cmd 040 $skip tcp from any to any 80 out via $pif setup keep-state
$cmd 041 $skip tcp from any to any 8080 out via $pif setup keep-state
$cmd 042 $skip tcp from any to any 8088 out via $pif setup keep-state

# Allow out secure www function https over TLS SSL
$cmd 050 $skip tcp from any to any 443 out via $pif setup keep-state

# Allow out send & get email function
#$cmd 060 $skip tcp from any to any 25  out via $pif setup keep-state
$cmd 060 $skip tcp from 192.168.0.0/24{6,10} to any 25 out via $pif setup keep-state
$cmd 061 $skip tcp from any to any 110 out via $pif setup keep-state
$cmd 062 $skip tcp from any to any 995 out via $pif setup keep-state
$cmd 063 $skip tcp from any to any 465 out via $pif setup keep-state
$cmd 064 $skip tcp from any to any 993 out via $pif setup keep-state

# Allow keys lookup on PGP keyserver
$cmd 068 $skip tcp from any to any 11371 out via $pif setup keep-state

# Allow out FBSD (make install & CVSUP) functions
# Basically give user root "GOD" privileges.
$cmd 070 $skip tcp from me to any out via $pif setup keep-state uid root

# Allow out ICMP Echo Request and Destination Unreachable packets from any.
$cmd 080 $skip icmp from any to any out via $pif icmptypes 3,8 keep-state

# Allow out ICMP Echo Reply (ping) from me.
$cmd 081 $skip icmp from me to any out via $pif icmptypes 0 keep-state

# Allow traceroute from me.
$cmd 082 allow udp from me to any 33434-33524 out xmit $pif

# Allow out secure FTP, Telnet, and SCP
# This function is using SSH (secure shell)
$cmd 110 $skip tcp from 192.168.0.10 to any 22 out via $pif setup keep-state

# Allow out whois
$cmd 120 $skip tcp from any to any 43 out via $pif setup keep-state

# Allow out ntp
$cmd 130 $skip udp from any to any 123 out via $pif keep-state

# Allow out XMPP IM
$cmd 140 $skip tcp from any to any 5222 out via $pif setup keep-state
$cmd 141 $skip tcp from any to any 7777 out via $pif setup keep-state

# Mobile devices Android stuff
$cmd 200 $skip tcp from 192.168.1.0/24 to any 5228 out via $pif setup keep-state


#################################################################
# Interface facing Public internet (Inbound Section)
# Interrogate packets originating from the public internet
# destine for this gateway server or the private network.
#################################################################

# Deny all inbound traffic from non-routable reserved address spaces
$cmd 300 deny all from 192.168.0.0/16  to any in via $pif  #RFC 1918 private IP
$cmd 301 deny all from 172.16.0.0/12   to any in via $pif  #RFC 1918 private IP
$cmd 302 deny all from 10.0.0.0/8      to any in via $pif  #RFC 1918 private IP
$cmd 303 deny all from 127.0.0.0/8     to any in via $pif  #loopback
$cmd 304 deny all from 0.0.0.0/8       to any in via $pif  #loopback
$cmd 305 deny all from 169.254.0.0/16  to any in via $pif  #DHCP auto-config
$cmd 306 deny all from 192.0.2.0/24    to any in via $pif  #reserved for doc's
$cmd 307 deny all from 204.152.64.0/23 to any in via $pif  #Sun cluster 
$cmd 308 deny all from 224.0.0.0/3     to any in via $pif  #Class D & E multicast

# Deny ident
$cmd 315 deny tcp from any to any 113 in via $pif

# Deny all Netbios service. 137=name, 138=datagram, 139=session
# Netbios is MS/Windows sharing services.
# Block MS/Windows hosts2 name server requests 81
$cmd 320 deny tcp from any to any 137 in via $pif
$cmd 321 deny tcp from any to any 138 in via $pif
$cmd 322 deny tcp from any to any 139 in via $pif
$cmd 323 deny tcp from any to any 81  in via $pif
$cmd 324 deny tcp from any to any 445 in via $pif

# Deny any late arriving packets
$cmd 330 deny all from any to any frag in via $pif

# Deny ACK packets that did not match the dynamic rule table
$cmd 332 deny tcp from any to any established in via $pif

# Allow in ICMP packets (ping, traceroute...)
# 0  - Echo Reply
# 3  - Destination Unreachable
# 4  - Source Quench
# 8  - Echo Request
# 11 - Time-to-Live Exceeded
#$cmd 340 allow icmp from any to me in via $pif icmptypes 0,3,4,8,11
$cmd 340 allow icmp from any to me in via $pif icmptypes 3,4,8,11

# Allow in standard smtp function because I have a mail server
$cmd 350 $skip tcp from any to me 25 in via $pif setup limit src-addr 2

# Allow in standard www function because I have a web server
$cmd 370 $skip tcp from any to me 80 in via $pif setup limit src-addr 2

# Reject & Log all unauthorized incoming connections from the public internet
$cmd 400 deny log all from any to any in via $pif

# Reject & Log all unauthorized out going connections to the public internet
$cmd 450 deny log all from any to any out via $pif

# This is skipto location for outbound stateful rules
# and specifically allowed incoming
$cmd 800 divert natd ip from any to any out via $pif
$cmd 801 allow ip from any to any

# Everything else is denied by default
# deny and log all packets that fell through to see what they are
$cmd 999 deny log all from any to any


################ End of IPFW rules file ###############################
