Greetings all,
I have very successfully been using OpenBSD 4.5 to manage both our
corporate firewall as well as the firewall in our production gaming
environment. However recently I have been given the task from the home
office to do some basic regional IP blocking. Great thinks I, I will
create a table and at the same time create an extra table for the IP's
of spammers and users whom we want to keep out of our game.
So in my pf.conf I created two tables:
table <blocked_ip> persist file "/etc/blocked_ip"
table <asian_ip> persist file "/etc/blocked_asian_ip"
blocked_ip is the table for the occasional user we want to boot, and
blocked_asian_ip is a list of ip nets in select asian countries that we
want to disallow. Right now blocked_asian_ip is empty and blocked_ip
looks like this:
220.249.167.192
208.43.3.90
123.128.151.190
60.217.150.82
98.126.4.99
74.222.14.10
60.217.153.214
222.135.105.242
114.108.128.220
71.137.134.82
174.139.11.22
121.156.65.187
210.118.194.65
Nothing looks wrong so far to me. So then I added a block in quick rule
in my pf.conf to blackhole these tables of ip's. Here is my complete
pf.conf:
# macros
ext_if="vlan2"
int_if="vlan5"
slbnet_if="vlan3"
adminnet_if="vlan4"
# service groups
priv_tcp_services="{ 8020 }"
sql_port="{ 1433 }"
rdp_services="{ 3389 }"
icmp_types="echoreq"
crm_ports="{80 443 8080}"
# These are IP's that are allowed full access
trusted_hosts="{24.16.115.5 203.238.151.208 203.238.151.216
203.238.151.210 203.238.151.217 67.18.69.66 222.110.172.248
76.121.252.154 71.121.162.98 98.117.116.77}"
payment_gateway="{66.211.168.126 217.22.128.136 217.22.128.227
207.46.232.182 128.30.52.170 128.30.52.38 128.30.52.51 128.30.52.52
128.30.52.53 128.30.52.54 128.30.52.166 128.30.52.168 216.167.121.109}"
# internal private hosts
ad1="10.1.0.10"
sql1="10.1.1.1"
sql2="10.1.1.2"
sql3="10.1.1.3"
sql4="10.1.1.4"
mirsrv1="10.3.2.1"
mirsrv2="10.3.2.2"
mirsrv3="10.3.2.3"
mirsrv4="10.3.2.4"
webbill="10.3.2.20"
webbillms="10.1.2.20"
billtest="10.3.2.21"
crm="10.1.2.21"
billadmin="10.3.2.22"
web1="10.3.1.1"
web2="10.3.1.2"
sql5="10.1.1.5"
web3="10.3.1.3"
monitor1="10.1.0.20"
# banned IP addresses
table <testgeoff> persist
table <blocked_ip> persist file "/etc/blocked_ip"
table <asian_ip> persist file "/etc/blocked_asian_ip"
# options
set block-policy return
set loginterface $ext_if
set skip on lo
# scrub
scrub in
# nat/rdr
nat on $ext_if from !($ext_if) -> ($ext_if:0)
nat on $slbnet_if from $trusted_hosts -> ($slbnet_if:0)
nat-anchor "ftp-proxy/*"
rdr-anchor "ftp-proxy/*"
rdr pass on $int_if proto tcp to port ftp -> 127.0.0.1 port 8021
# Temporary remote connections for RDP from the Korean offices
rdr on $ext_if proto tcp from $trusted_hosts to 66.150.173.5 port 4100
-> $sql1 port 3389
rdr on $ext_if proto tcp from $trusted_hosts to 66.150.173.5 port 4101
-> $sql2 port 3389
rdr on $ext_if proto tcp from $trusted_hosts to 66.150.173.5 port 4102
-> $sql3 port 3389
rdr on $ext_if proto tcp from $trusted_hosts to 66.150.173.5 port 4103
-> $sql4 port 3389
rdr on $ext_if proto tcp from $trusted_hosts to 66.150.173.5 port 4104
-> $mirsrv1 port 3389
rdr on $ext_if proto tcp from $trusted_hosts to 66.150.173.5 port 4105
-> $mirsrv2 port 3389
rdr on $ext_if proto tcp from $trusted_hosts to 66.150.173.5 port 4106
-> $mirsrv3 port 3389
rdr on $ext_if proto tcp from $trusted_hosts to 66.150.173.5 port 4107
-> $mirsrv4 port 3389
rdr on $ext_if proto tcp from $trusted_hosts to 66.150.173.5 port 4108
-> $webbill port 3389
rdr on $ext_if proto tcp from $trusted_hosts to 66.150.173.5 port 4109
-> $webbillms port 3389
rdr on $ext_if proto tcp from $trusted_hosts to 66.150.173.5 port 4110
-> $billtest port 3389
rdr on $ext_if proto tcp from $trusted_hosts to 66.150.173.5 port 4111
-> $crm port 3389
rdr on $ext_if proto tcp from $trusted_hosts to 66.150.173.5 port 4112
-> $billadmin port 3389
rdr on $ext_if proto tcp from $trusted_hosts to 66.150.173.5 port 4113
-> $web1 port 3389
rdr on $ext_if proto tcp from $trusted_hosts to 66.150.173.5 port 4114
-> $web2 port 3389
rdr on $ext_if proto tcp from $trusted_hosts to 66.150.173.5 port 4115
-> $sql5 port 3389
rdr on $ext_if proto tcp from $trusted_hosts to 66.150.173.5 port 4116
-> $web3 port 3389
# Temporary remote connections for SQL from the Korean offices
rdr on $ext_if proto tcp from $trusted_hosts to 66.150.173.5 port 5100
-> $sql1 port 1433
rdr on $ext_if proto tcp from $trusted_hosts to 66.150.173.5 port 5101
-> $sql2 port 1433
rdr on $ext_if proto tcp from $trusted_hosts to 66.150.173.5 port 5102
-> $sql3 port 1433
rdr on $ext_if proto tcp from $trusted_hosts to 66.150.173.5 port 5103
-> $sql4 port 1433
rdr on $ext_if proto tcp from $trusted_hosts to 66.150.173.5 port 5104
-> $billtest port 1433
rdr on $ext_if proto tcp from $trusted_hosts to 66.150.173.5 port 5105
-> $sql5 port 1433
# Redirects for the MIR game apps
rdr on $ext_if proto tcp from any to 66.150.173.6 port 7000 -> $mirsrv1
rdr on $ext_if proto tcp from any to 66.150.173.6 port 7100 -> $mirsrv4
rdr on $ext_if proto tcp from any to 66.150.173.6 port {7200 7201 7202
7203 7204 7205} -> $mirsrv4
rdr on $ext_if proto tcp from $trusted_hosts to 66.150.173.10 port 80 ->
$crm port 80
rdr on $ext_if proto tcp from $trusted_hosts to 66.150.173.10 port 443
-> $crm port 443
rdr on $ext_if proto tcp from $trusted_hosts to 66.150.173.10 port 8080
-> $crm port 8080
# filter rules
block in log
block in log quick from <blocked_ip> to any
block in log quick from <asian_ip> to any
block in log quick from <testgeoff> to any
pass out keep state
anchor "ftp-proxy/*"
antispoof quick for { lo $int_if }
# Rules to pass in on the external interface for local services
pass in on $ext_if inet proto tcp from any to ($ext_if) port
$priv_tcp_services flags S/SA keep state
#
# Rules to pass in for rdr rules
#
pass in on $ext_if inet proto tcp from $trusted_hosts to $crm port
$crm_ports flags S/SA keep state
pass in on $ext_if inet proto tcp from $trusted_hosts to {$sql1 $sql2
$sql3 $sql4 $mirsrv1 $mirsrv2 $mirsrv3 $mirsrv4 $webbill $webbillms
$billtest $crm $billadmin $web1 $web2 $sql5 $web3} port 3389 keep state
pass in on $ext_if inet proto tcp from $trusted_hosts to {$sql1 $sql2
$sql3 $sql4 $billtest $sql5} port 1433 keep state
pass in on $ext_if inet proto {tcp udp} from any to $mirsrv1 port 7000
flags S/SA keep state
pass in on $ext_if inet proto {tcp udp} from any to $mirsrv4 port {7100
7200 7201 7202 7203 7204 7205} flags S/SA keep state
#
# Rules inbound for the slbnet
#
pass in on $slbnet_if from 10.3.0.0/16 to {$ad1 $monitor1} keep state
pass in on $slbnet_if inet proto tcp from 10.3.0.0/16 to {$sql1 $sql2
$sql3 $sql4 $sql5 $billtest} port $sql_port keep state
pass in on $slbnet_if inet proto {tcp udp} from 10.3.0.0/16 to
$webbillms port {21001 21011} keep state
pass in on $slbnet_if inet proto udp from $mirsrv3 to $sql2 port 10001
keep state
pass in on $slbnet_if inet proto tcp from $billtest to 192.168.16.46
port 1433 keep state
# Allow in certain ICMP traffic
pass in inet proto icmp all icmp-type $icmp_types keep state
# Allow traffic from the internal network to make any connection to the
outside world.
# this rule needs to be deleted in next change request as redundant
pass in on $int_if from 10.1.0.0/16 to 10.3.0.0/16 keep state
pass in quick on $int_if
However when I go to add an additional IP to the table, nothing happens.
I append the address to the blocked_ip file, then I issue "pfctl -f
/etc/pf.conf". I can see via tcpdump quite clearly that a given user, in
this case 114.108.128.220, is allowed in through the firewall. And if I
test for the the IP:
sudo pfctl -t blocked_ip -T test 114.108.128.220
1/1 addresses match.
So what gives? Do I need to do something additional to get it to reload
all the table information?
Thanks everyone.
Geoff Sweet
Operations Engineer
WeMade Entertainment USA.