-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
We have two firewalls running OpenBSD 4.2 with PF and CARP. We have two
web servers that we want to load balance traffic between and have
clients stay connected to one server as long as that server is up.
Our /etc/pf.conf and /etc/hoststated.conf files are configured per the
examples in "The Book of PF" on pages 51-53. The problem is that a web
client is not sticking to one server or the other. Each time we refresh
the page in the browser, we connect to the other server. The servers
each have a web page whose contents identify which server it is.
We have been testing this from clients with IP addresses on the
10.1.16.0/24 subnet which is attached to the trunk0 interface on the
firewalls. The web servers are on the 10.1.48.0/24 subnet connected to
trunk2 on the firewalls.
Here are the contents of the config files:
/etc/pf.conf
- ------------
int_if="trunk0"
build_if="trunk2"
webserver="10.1.48.200"
webports = "{ http, https }"
table <webpool> persist { 10.1.48.100, 10.1.48.101 }
set timeout src.track 60
rdr-anchor "hoststated/*"
rdr on $int_if proto tcp from any to $webserver port $webports -> \
~ <webpool> round-robin sticky-address
pass in on $int_if proto tcp from any to <webpool> port $webports
pass out on $build_if proto tcp from any to <webpool> port $webports
/etc/hoststated.conf
- --------------------
interval 30
timeout 2000
site1_public = "10.1.48.200"
site1_web1a = "10.1.48.100"
site1_web1b = "10.1.48.101"
# Port 80
table webpool {
~ real port http
~ check http "/up.txt" code 200
~ host $site1_web1a
~ host $site1_web1b
}
service site1 {
~ virtual host $site1_public port http
~ tag HOSTSTATED
~ table webpool
}
/etc/rc.conf
- ------------
hoststated_flags="" # for normal use: ""
pf=YES # Packet filter / NAT
pf_rules=/etc/pf.conf # Packet filter rules file
pflogd_flags= # add more flags, ie. "-s 256"
Any obvious ideas about why our client is bouncing between the web servers?
Could this be an issue with using trunk interfaces rather than the
individual Ethernet devices? Do we need to refer to the CARP interfaces?
Here is the results of running "pfctl -s all" after hitting refresh in
the browser several times and hitting both web servers.
PF State Info
- -------------
TRANSLATION RULES:
rdr-anchor "hoststated/*" all
rdr on trunk0 inet proto tcp from any to 10.1.48.200 port = www ->
<webpool> round-robin stic
ky-address
rdr on trunk0 inet proto tcp from any to 10.1.48.200 port = https ->
<webpool> round-robin st
icky-address
FILTER RULES:
pass in on trunk0 proto tcp from any to <webpool> port = www flags S/SA
keep state
pass in on trunk0 proto tcp from any to <webpool> port = https flags
S/SA keep state
pass out on trunk2 proto tcp from any to <webpool> port = www flags S/SA
keep state
pass out on trunk2 proto tcp from any to <webpool> port = https flags
S/SA keep state
No queue in use
STATES:
all carp 10.1.16.252 -> 224.0.0.18 SINGLE:NO_TRAFFIC
all carp 10.1.32.2 -> 224.0.0.18 SINGLE:NO_TRAFFIC
all carp 10.1.48.2 -> 224.0.0.18 SINGLE:NO_TRAFFIC
all carp 224.0.0.18 <- 10.1.16.2 NO_TRAFFIC:SINGLE
all tcp 10.1.48.2:1091 -> 10.1.48.101:80 FIN_WAIT_2:FIN_WAIT_2
all tcp 10.1.48.2:46783 -> 10.1.48.100:80 FIN_WAIT_2:FIN_WAIT_2
all tcp 10.1.48.2:6985 -> 10.1.48.101:80 FIN_WAIT_2:FIN_WAIT_2
all tcp 10.1.48.2:43486 -> 10.1.48.100:80 FIN_WAIT_2:FIN_WAIT_2
all tcp 10.1.48.2:14244 -> 10.1.48.101:80 FIN_WAIT_2:FIN_WAIT_2
all tcp 10.1.48.2:8754 -> 10.1.48.100:80 FIN_WAIT_2:FIN_WAIT_2
all tcp 10.1.48.101:80 <- 10.1.48.200:80 <- 10.1.16.60:2216
FIN_WAIT_2:FIN_WAIT_2
all tcp 10.1.16.60:2216 -> 10.1.48.101:80 FIN_WAIT_2:FIN_WAIT_2
all tcp 10.1.48.100:80 <- 10.1.48.200:80 <- 10.1.16.60:2217
FIN_WAIT_2:FIN_WAIT_2
all tcp 10.1.16.60:2217 -> 10.1.48.100:80 FIN_WAIT_2:FIN_WAIT_2
all tcp 10.1.48.101:80 <- 10.1.48.200:80 <- 10.1.16.60:2218
FIN_WAIT_2:FIN_WAIT_2
all tcp 10.1.16.60:2218 -> 10.1.48.101:80 FIN_WAIT_2:FIN_WAIT_2
all tcp 10.1.48.100:80 <- 10.1.48.200:80 <- 10.1.16.60:2219
FIN_WAIT_2:FIN_WAIT_2
all tcp 10.1.16.60:2219 -> 10.1.48.100:80 FIN_WAIT_2:FIN_WAIT_2
all tcp 10.1.48.101:80 <- 10.1.48.200:80 <- 10.1.16.60:2220
FIN_WAIT_2:FIN_WAIT_2
all tcp 10.1.16.60:2220 -> 10.1.48.101:80 FIN_WAIT_2:FIN_WAIT_2
all tcp 10.1.48.100:80 <- 10.1.48.200:80 <- 10.1.16.60:2221
FIN_WAIT_2:FIN_WAIT_2
all tcp 10.1.16.60:2221 -> 10.1.48.100:80 FIN_WAIT_2:FIN_WAIT_2
all tcp 10.1.48.2:26880 -> 10.1.48.101:80 FIN_WAIT_2:FIN_WAIT_2
all tcp 10.1.48.2:11005 -> 10.1.48.100:80 FIN_WAIT_2:FIN_WAIT_2
all tcp 10.1.48.2:26283 -> 10.1.48.101:80 FIN_WAIT_2:FIN_WAIT_2
all tcp 10.1.48.2:13055 -> 10.1.48.100:80 FIN_WAIT_2:FIN_WAIT_2
all tcp 10.1.48.2:43776 -> 10.1.48.101:80 FIN_WAIT_2:FIN_WAIT_2
all tcp 10.1.48.2:30663 -> 10.1.48.100:80 FIN_WAIT_2:FIN_WAIT_2
all tcp 10.1.48.2:39595 -> 10.1.48.101:80 FIN_WAIT_2:FIN_WAIT_2
all tcp 10.1.48.2:3984 -> 10.1.48.100:80 FIN_WAIT_2:FIN_WAIT_2
all tcp 10.1.48.2:18393 -> 10.1.48.101:80 FIN_WAIT_2:FIN_WAIT_2
all tcp 10.1.48.2:48273 -> 10.1.48.100:80 FIN_WAIT_2:FIN_WAIT_2
all tcp 10.1.48.2:16513 -> 10.1.48.101:80 FIN_WAIT_2:FIN_WAIT_2
all tcp 10.1.48.2:32860 -> 10.1.48.100:80 FIN_WAIT_2:FIN_WAIT_2
INFO:
Status: Enabled for 1 days 22:03:01 Debug: Urgent
State Table Total Rate
~ current entries 34
~ searches 3579299 21.6/s
~ inserts 27497 0.2/s
~ removals 27463 0.2/s
Counters
~ match 2519631 15.2/s
~ bad-offset 0 0.0/s
~ fragment 0 0.0/s
~ short 0 0.0/s
~ normalize 0 0.0/s
~ memory 0 0.0/s
~ bad-timestamp 0 0.0/s
~ congestion 0 0.0/s
~ ip-option 0 0.0/s
~ proto-cksum 0 0.0/s
~ state-mismatch 2 0.0/s
~ state-insert 0 0.0/s
~ state-limit 0 0.0/s
~ src-limit 0 0.0/s
~ synproxy 0 0.0/s
TIMEOUTS:
tcp.first 120s
tcp.opening 30s
tcp.established 86400s
tcp.closing 900s
tcp.finwait 45s
tcp.closed 90s
tcp.tsdiff 30s
udp.first 60s
udp.single 30s
udp.multiple 60s
icmp.first 20s
icmp.error 10s
other.first 60s
other.single 30s
other.multiple 60s
frag 30s
interval 10s
adaptive.start 6000 states
adaptive.end 12000 states
src.track 60s
LIMITS:
states hard limit 10000
src-nodes hard limit 10000
frags hard limit 5000
tables hard limit 1000
table-entries hard limit 100000
TABLES:
webpool
OS FINGERPRINTS:
696 fingerprints loaded
=====
Thanks
- --
David Goldsmith,
SANS NOC
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org
iD8DBQFHmilZ417vU8/9QfkRAtyeAJ49P6AmhbJhGMtQ8vbBHy+rj1zhUQCfSayh
2fsJx0IHcNWuP0aSF0dM6do=
=IcyZ
-----END PGP SIGNATURE-----