Date: Sat, 18 Nov 2000 15:54:47 -0800 From: "Crist J . Clark" <cjclark@reflexnet.net> To: Sam Carleton <scarleton@bigfoot.com> Cc: security@FreeBSD.ORG Subject: Re: help setting up a filewall Message-ID: <20001118155447.K9740@149.211.6.64.reflexcom.com> In-Reply-To: <3A16C44B.4DEC2492@bigfoot.com>; from scarleton@bigfoot.com on Sat, Nov 18, 2000 at 01:02:51PM -0500 References: <3A16C44B.4DEC2492@bigfoot.com>
next in thread | previous in thread | raw e-mail | index | archive | help
[-- Attachment #1 --]
[Maybe it's just me, but I think that generic "how do I set up a
firewall?" questions are better suited for -questions. If you have
specific ipfw questions, there is the -ipfw list too. But I can
understand why people ask here.]
On Sat, Nov 18, 2000 at 01:02:51PM -0500, Sam Carleton wrote:
> I have read through the “Setting-up a Dual-Homed Host using IPFW and
> NATD”, but the script is not working for me. My setup is a bit
> different. My connectivity is via a cable modem.
>
> * In the article, it looks like the author was setup with a static
> external IP address. I have a dynamic ip address. How do I allow the
> DHCP server (Cable Modem) broadcasts to get to my outside NIC?
Here's what I do,
############
# Info about local net numbers
dhcpc_fxp0="64.6.192.0/19"
dhcps_fxp0="${dhcpc_fxp0}"
net="192.0.2.0/24"
iip="192.0.2.254"
ibc="192.0.2.255"
iif="de0"
oif=${natd_interface}
# This is a little more efficient, only one ifconfig(8) call
set -- `/sbin/ifconfig ${natd_interface} | /usr/bin/fgrep -w inet`
oip="$2"
obc="$6"
[snip]
############
# Let external DHCP work
for dhclient_interface in ${network_interfaces}; do
eval ifconfig_args=\$ifconfig_${dhclient_interface}
case ${ifconfig_args} in
[Dd][Hh][Cc][Pp])
eval dhcpc_range=\$dhcpc_$dhclient_interface
eval dhcps_range=\$dhcps_$dhclient_interface
$fwcmd add pass udp from ${dhcpc_range} 68 to ${dhcps_range} 67 out via ${dhclient_interface}
$fwcmd add pass udp from ${dhcps_range} 67 to ${dhcpc_range} 68 in via ${dhclient_interface}
$fwcmd add pass udp from 0.0.0.0 68 to 255.255.255.255 67 out via ${dhclient_interface}
$fwcmd add pass udp from ${dhcps_range} 67 to 255.255.255.255 68 in via ${dhclient_interface}
;;
esac
done
> * In the article, the author is only allowing the inside connections to
> connect to known DNS servers. I run a caching DNS server on the inside
> so I need to have the firewall configured so that the internal DNS
> server can talk to any other DNS server.
These two are only safe to do after you've stopped spoofing and other
stuff like that,
$fwcmd add pass udp from ${dns_server} to any 53 keep-state
$fwcmd add pass tcp from ${dns_server} to any 53 keep-state
> * In the article, it looks like the author is allowing things like HTTP
> and SSH to come into the firewall machine. I want those things to be
> passed onto another internal machine.
The rules may or may not change depending on where they are relative
to the divert(4) rule. Also, see 'redirect_address' and
'redirect_port' in natd(8). You did not post your natd.conf, so I
can't tell if you are already using those.
> Attached you will find my modifications to the rc.firewall script and
> relavent snips of rc.conf. If you have any thoughts on what I am doing
> wrong, please drop me an email. Thanks!
A few nitpicks about your ruleset, but nothing absolutely leaped out
at me as a problem that would totally break everything. Since you did
not tell us exactly what kind of problem you are having, it's hard to
know what to look for.
I attached a little script I use to help debug my rulesets. It's
really simple; it just cuts down on the verbosity of 'ipfw show' a
bit. With some minor mods, it can also really nicely work on the
rc.firewall script (although it does even help as-is).
> ------------rc.conf------------
> firewall_enable="Yes"
> firewall_type="Simple"
> firewall_script="/etc/rc.firewall"
> firewall_quite="No"
> natd_program="/sbin/natd"
> natd_enable="Yes"
> natd_interface="ep0"
> natd_flags="-f /etc/natd.conf"
When posting questions of this sort, entries relavent to interface
setup should be included as well.
> ------------rc.firewall------------
> ############
> # Setup system for firewall service.
> # $FreeBSD: src/etc/rc.firewall,v 1.30.2.4 2000/05/28 19:17:15 asmodai
> Exp $
This is a fairly old version of rc.firewall.
[snip]
> [Ss][Ii][Mm][Pp][Ll][Ee])
> ############
> # This is a prototype setup for a simple firewall. Configure this
> # machine as a named server and ntp server, and point all the machines
> # on the inside at this machine for those services.
> ############
>
> # set these to your outside interface network and netmask and ip
> oif="ep0"
> # onet="192.0.2.0"
> # omask="255.255.255.240"
> # oip="192.0.2.1"
>
> # set these to your inside interface network and netmask and ip
> iif="xl1"
> inet="192.168.0.0"
> imask="255.255.255.0"
> iip="192.168.0.6"
>
> # Stop spoofing
> ${fwcmd} add deny all from ${inet}:${imask} to any in via ${oif}
> # ${fwcmd} add deny all from ${onet}:${omask} to any in via ${iif}
>
> # Stop RFC1918 nets on the outside interface
> ${fwcmd} add deny all from 10.0.0.0/8 to any via ${oif}
> ${fwcmd} add deny all from any to 10.0.0.0/8 out via ${oif}
> ${fwcmd} add deny all from 172.16.0.0/12 to any via ${oif}
> ${fwcmd} add deny all from any to 172.16.0.0/12 out via ${oif}
> ${fwcmd} add deny all from 192.168.0.0/16 to any via ${oif}
> ${fwcmd} add deny all from any to 192.168.0.0/16 out via ${oif}
>
> # Stop draft-manning-dsua-01.txt nets on the outside interface
> ${fwcmd} add deny all from 0.0.0.0/8 to any via ${oif}
> ${fwcmd} add deny all from any to 0.0.0.0/8 via ${oif}
> ${fwcmd} add deny all from 169.254.0.0/16 to any via ${oif}
> ${fwcmd} add deny all from any to 169.254.0.0/16 via ${oif}
> ${fwcmd} add deny all from 192.0.2.0/24 to any via ${oif}
> ${fwcmd} add deny all from any to 192.0.2.0/24 via ${oif}
> ${fwcmd} add deny all from 224.0.0.0/4 to any via ${oif}
> ${fwcmd} add deny all from any to 224.0.0.0/4 via ${oif}
> ${fwcmd} add deny all from 240.0.0.0/4 to any via ${oif}
> ${fwcmd} add deny all from any to 240.0.0.0/4 via ${oif}
I'd log the above since you should not be seeing them and they can
help debug broken NAT setups.
> # Allow TCP through if setup succeeded
> ${fwcmd} add pass tcp from any to any established
>
> # Allow IP fragments to pass through
> ${fwcmd} add pass all from any to any frag
>
> # HTTP - Allow access to our web server
> ${fwcmd} add pass tcp from any to any 80 setup
>
> # SMTP - Allow access to sendmail for incoming e-mail
> ${fwcmd} add pass tcp from any to any 25 setup
>
> # FTP - Allow incoming data channel for outgoing connections,
> # Reject&Log all incoming control connections
> ${fwcmd} add pass tcp from any 20 to any 1024-65535 setup
> ${fwcmd} add deny tcp log tcp from any to any 21 in via ${oif} setup
^^^
Typo.
> # SSH Login - Allow & Log all incoming
> ${fwcmd} add pass log tcp from any to any 22 in via ${oif} setup
>
> # IDENT - Reset incoming connections
> ${fwcmd} add reset tcp from any to any 113 in via ${oif} setup
>
> # Reject&Log all setup of incoming connections from the outside
> ${fwcmd} add deny log tcp from any to any in via ${oif} setup
>
> # Allow setup of any other TCP connection
> ${fwcmd} add pass tcp from any to any setup
>
> # Allow access to our DNS
> # ${fwcmd} add pass tcp from any to ${oif} 53 setup
> # ${fwcmd} add pass udp from any to ${oif} 53
> # ${fwcmd} add pass udp from ${oif} 53 to any
>
> # Allow DNS queries out in the world
> ${fwcmd} add pass udp from any 53 to ${oif}
> ${fwcmd} add pass udp from ${oif} to any 53
These two previous sets of rules are messed up. You are using an
interface as a source and destination argument.
> # Allow NTP queries out in the world
> ${fwcmd} add pass udp from any 123 to any 123 via ${oif}
> ${fwcmd} add pass udp from any 123 to any via ${iif}
> ${fwcmd} add pass udp from any to any 123 via ${iif}
>
> # TRACEROUTE - Allow outgoing, but not incoming
> ${fwcmd} add pass udp from any to any 33434-33523 out via ${oif}
>
>
> ### ICMP RULES
>
> # ICMP packets
> # Allow all ICMP packets on internal interface
> ${fwcmd} add pass icmp from any to any via ${iif}
>
> # Allow outgoing pings, but not incoming
> ${fwcmd} add pass icmp from any to any icmptypes 8 out via ${oif}
> ${fwcmd} add pass icmp from any to any icmptypes 0 in via ${oif}
>
> # Allow Destination Unreachable, Source Quench, Time Exceeded, and Bad
> Head
> ${fwcmd} add pass icmp from any to any icmptypes 3,4,11,12 via ${oif}
>
> # Deny the rest of them
> ${fwcmd} add deny icmp from any to any
>
>
> # Everything else is denied by default, unless the
> # IPFIREWALL_DEFAULT_TO_ACCEPT option is set in your kernel
> # config file.
> ;;
[snip]
--
Crist J. Clark cjclark@alum.mit.edu
[-- Attachment #2 --]
#!/bin/sh
#
# ipfwsh - 2000/10/28, cjc
#
# Cut down verbosity of 'ipfw show' output
if [ $# -gt 1 ]; then
# Bad command line
echo "ipfwsh: bad args" >&2
echo "Usage: ipfwsh [iface]" >&2
exit 1
elif [ $# -eq 0 ]; then
# Print whole list, just cut expired dynamic rules
ipfw show |
awk -F'[ ,]' '$5 != 0 { print }'
else
# An interface name was given, note there is no failure if
# name is not valid
ipfw show |
awk -v"iface=$1" '/^## Dynamic rules:/ { exit } $0 ~ iface { print; next } /(via|recv|xmit)/ { next } { print }'
fi
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20001118155447.K9740>
