Subject: pf & nat: blocking single machine inside LAN
To: None <netbsd-users@netbsd.org>
From: Mark Cullen <mark.r.cullen@gmail.com>
List: netbsd-users
Date: 07/12/2006 14:45:34
I'm having a slight problem here.

I have a simple NAT set up:

---
set block-policy return

ext_if="fxp1"
int_if="fxp0"

scrub in

# === nat
# web proxy
web_proxy_ip="10.0.0.245"
web_proxy_port="3128"

#no rdr on $int_if proto tcp from ($int_if:network) to ($int_if) port 80
#no rdr on $int_if proto tcp from $web_proxy_ip to any port 80
#rdr on $int_if proto tcp from ($int_if:network) to any port 80 -> 
$web_proxy_ip port $web_proxy_port
#no nat on $int_if proto tcp from ($int_if:network) to any port 80
#nat on $int_if proto tcp from ($int_if:network) to $web_proxy_ip port 
$web_proxy_port -> ($int_if:0)

# default nat
nat on $ext_if from !($ext_if) -> ($ext_if:0)
rdr on $int_if proto tcp from any to any port ftp -> 127.0.0.1 port 8021

# ftp proxy
nat-anchor "ftp-proxy/*"
rdr-anchor "ftp-proxy/*"

# === filter rules
# default to block
block in log

# allow adsl modem dhcp
pass quick on $ext_if proto udp from 192.168.0.1 port 67 to any port 68 
keep state

# keep state on all outgoing
pass out keep state

# allow local traffic quick
pass quick on { lo $int_if }
antispoof quick for { lo $int_if }

# allow ftp proxy
anchor "ftp-proxy/*"

# allow incoming
pass in quick on $ext_if proto tcp to ($ext_if) port 80 keep state
pass in quick on $ext_if proto tcp to ($ext_if) port 55000 >< 57000 keep 
state
--

Now, I have a machine inside the LAN, say 10.0.0.45, which I would like 
to block from using the internet (fxp1) after a certain time (my 
intention was to use a table and just run a script from cron which adds 
/ deletes the ip to the table when I need it to), but *must* still be 
able to connect to the machine internally (fxp0). However, because you 
cannot place any filter rules before NAT'ing, I am finding this rather 
difficult to achieve, as packets after the NAT'ing have their source 
address replaced with my external IP and then I can no longer match by 
internal IP's.

Can anyone see a nice way to achieve this?
-- 
Mark Cullen <mark.r.cullen@gmail.com>