$ cat pf.conf ext_if="bge0" int_if="bge1" dmz_if="nfe0" openvpn_if="tun0" carp=" bge0 bge1 nfe0 " pfsync="nfe1" #table persist table persist set skip on lo set block-policy return #scrub in nat on $ext_if from (carp1) -> (carp0:0) rdr pass on $ext_if proto tcp from any to any port ssh \ -> 127.0.0.1 port ssh rdr pass on $ext_if proto { tcp udp } from any to any port domain \ -> 127.0.0.1 port domain rdr pass on $int_if proto { tcp udp } from any to any port domain \ -> 127.0.0.1 port domain rdr pass on $ext_if proto tcp from any to any port time \ -> 127.0.0.1 port time pass quick on $pfsync proto pfsync pass quick on { $carp } proto carp block in on $ext_if pass in on $int_if pass in on $dmz_if to ! $int_if:network pass in proto icmp all label "in" pass out keep state $ cat ifconfig.carp lo0: flags=8049 mtu 33168 groups: lo inet 127.0.0.1 netmask 0xff000000 inet6 ::1 prefixlen 128 inet6 fe80::1%lo0 prefixlen 64 scopeid 0x6 nfe0: flags=8943 mtu 1500 lladdr 00:16:36:76:17:3b description: dmz media: Ethernet autoselect (1000baseT full-duplex,master) status: active inet 172.17.254.254 netmask 0xffffff00 broadcast 172.17.254.255 inet6 fe80::216:36ff:fe76:173b%nfe0 prefixlen 64 scopeid 0x1 nfe1: flags=8843 mtu 1500 lladdr 00:16:36:76:17:3c description: pfsync media: Ethernet autoselect (1000baseT full-duplex) status: active inet 172.17.128.254 netmask 0xffffff00 broadcast 172.17.128.255 inet6 fe80::216:36ff:fe76:173c%nfe1 prefixlen 64 scopeid 0x2 bge0: flags=8943 mtu 1500 lladdr 00:16:36:76:17:39 description: external gateway media: Ethernet autoselect (1000baseT full-duplex,rxpause,txpause) status: active inet6 fe80::216:36ff:fe76:1739%bge0 prefixlen 64 scopeid 0x3 bge1: flags=8943 mtu 1500 lladdr 00:16:36:76:17:3a description: internal gateway media: Ethernet autoselect (1000baseT full-duplex,rxpause,txpause) status: active inet 172.17.1.254 netmask 0xffffff00 broadcast 172.17.1.255 inet6 fe80::216:36ff:fe76:173a%bge1 prefixlen 64 scopeid 0x4 enc0: flags=0<> mtu 1536 pfsync0: flags=41 mtu 1460 pfsync: syncdev: nfe1 syncpeer: 224.0.0.240 maxupd: 128 groups: carp pfsync pflog0: flags=141 mtu 33168 groups: pflog carp0: flags=8843 mtu 1500 lladdr 00:00:5e:00:01:01 description: carp external gateway carp: MASTER carpdev bge0 vhid 1 advbase 1 advskew 0 groups: carp egress inet6 fe80::200:5eff:fe00:101%carp0 prefixlen 64 scopeid 0x8 inet 204.16.153.246 netmask 0xfffffffc broadcast 204.16.153.247 carp1: flags=8843 mtu 1500 lladdr 00:00:5e:00:01:01 description: carp internal gateway carp: MASTER carpdev bge1 vhid 1 advbase 1 advskew 0 groups: carp inet6 fe80::200:5eff:fe00:101%carp1 prefixlen 64 scopeid 0x9 inet 172.17.1.1 netmask 0xffffff00 broadcast 172.17.1.255 carp2: flags=8843 mtu 1500 lladdr 00:00:5e:00:01:02 description: carp dmz carp: MASTER carpdev nfe0 vhid 2 advbase 1 advskew 0 groups: carp inet6 fe80::200:5eff:fe00:102%carp2 prefixlen 64 scopeid 0xa inet 172.17.254.1 netmask 0xffffff00 broadcast 172.17.254.255 $ cat netstat.carp Routing tables Internet: Destination Gateway Flags Refs Use Mtu Interface default 204.16.153.245 UGS 0 0 - carp0 127/8 127.0.0.1 UGRS 0 0 33168 lo0 127.0.0.1 127.0.0.1 UH 0 0 33168 lo0 172.17.1/24 link#4 UC 0 0 - bge1 172.17.1.1 172.17.1.1 UH 0 0 - carp1 172.17.1.16 00:04:f2:15:04:4f UHLc 0 0 - bge1 172.17.128/24 link#2 UC 0 0 - nfe1 172.17.254/24 link#1 UC 0 0 - nfe0 172.17.254.1 172.17.254.1 UH 0 0 - carp2 204.16.153.244/30 link#8 UC 0 0 - carp0 204.16.153.245 00:01:97:36:b4:0a UHLc 0 0 - carp0 224/4 127.0.0.1 URS 0 0 33168 lo0 $ cat pfctl.carp TRANSLATION RULES: nat on bge0 from (carp1) to any -> (carp0:0) rdr pass on bge0 inet proto tcp from any to any port = ssh -> 127.0.0.1 port 22 rdr pass on bge0 inet proto tcp from any to any port = domain -> 127.0.0.1 port 53 rdr pass on bge0 inet proto udp from any to any port = domain -> 127.0.0.1 port 53 rdr pass on bge1 inet proto tcp from any to any port = domain -> 127.0.0.1 port 53 rdr pass on bge1 inet proto udp from any to any port = domain -> 127.0.0.1 port 53 rdr pass on bge0 inet proto tcp from any to any port = time -> 127.0.0.1 port 37 FILTER RULES: pass quick on bge0 proto carp all keep state pass quick on bge1 proto carp all keep state pass quick on nfe0 proto carp all keep state pass quick on nfe1 proto pfsync all keep state block return in on bge0 all pass in on bge1 all flags S/SA keep state pass in on nfe0 inet from any to ! 172.17.1.0/24 flags S/SA keep state pass in proto icmp all keep state label "in" pass out all flags S/SA keep state pass quick on bge1 all no state label "local-nic" queue(def_in, pri_in) pass quick on tun0 all no state label "local-nic" queue(def_in, pri_in) pass quick on bge0 all no state label "local-nic" queue(def_in, pri_in) pass quick on bge1 all no state label "local-nic" queue(def_in, pri_in) pass quick on nfe0 all no state label "local-nic" queue(def_in, pri_in) block drop in quick on ! lo inet from 127.0.0.0/8 to any block drop in quick on ! lo inet6 from ::1 to any block drop in quick inet from 127.0.0.1 to any block drop in quick on ! bge1 inet from 172.17.1.0/24 to any block drop in quick inet from 172.17.1.254 to any block drop in quick inet6 from ::1 to any block drop in quick on lo0 inet6 from fe80::1 to any block drop in quick on bge1 inet6 from fe80::216:36ff:fe76:173a to any pass in on bge0 proto tcp from any to (bge0) port = ssh flags S/SA keep state label "ssh-in" queue(def_in, pri_in) pass in log on bge0 proto tcp from any to (bge0) port = smtp flags S/SA keep state pass out log on bge0 proto tcp from (bge0) to any port = smtp flags S/SA keep state pass in on bge0 proto tcp from any to any port = 1194 flags S/SA keep state label "openvpn" queue(def_in, pri_in) pass in on bge0 proto udp from any to any port = 1194 keep state label "openvpn" queue(def_in, pri_in) No queue in use STATES: all pfsync 172.17.128.254 -> 224.0.0.240 SINGLE:NO_TRAFFIC all carp 204.16.153.246 -> 224.0.0.18 SINGLE:NO_TRAFFIC all carp 172.17.1.254 -> 224.0.0.18 SINGLE:NO_TRAFFIC all udp 127.0.0.1:53 <- 172.17.1.1:53 <- 172.17.1.148:35926 MULTIPLE:MULTIPLE all udp 127.0.0.1:53 <- 172.17.1.1:53 <- 172.17.1.156:47836 MULTIPLE:MULTIPLE all carp 172.17.254.254 -> 224.0.0.18 SINGLE:NO_TRAFFIC all udp 127.0.0.1:53 <- 172.17.1.1:53 <- 172.17.1.213:32865 MULTIPLE:MULTIPLE all udp 127.0.0.1:53 <- 172.17.1.1:53 <- 172.17.1.152:40327 MULTIPLE:MULTIPLE all udp 127.0.0.1:53 <- 172.17.1.1:53 <- 172.17.1.160:57819 SINGLE:MULTIPLE INFO: Status: Enabled for 0 days 00:02:01 Debug: Urgent State Table Total Rate current entries 9 searches 68131 563.1/s inserts 93 0.8/s removals 84 0.7/s Counters match 67264 555.9/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 2 0.0/s proto-cksum 0 0.0/s state-mismatch 0 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 LABEL COUNTERS: in 30582 0 0 0 0 0 0 local-nic 67171 3792 282105 3595 267145 197 14960 local-nic 63377 0 0 0 0 0 0 local-nic 63377 63376 3625228 26985 1479389 36391 2145839 local-nic 1 0 0 0 0 0 0 local-nic 1 1 72 0 0 1 72 ssh-in 0 0 0 0 0 0 0 openvpn 0 0 0 0 0 0 0 openvpn 0 0 0 0 0 0 0 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 0s LIMITS: states hard limit 10000 src-nodes hard limit 10000 frags hard limit 5000 tables hard limit 1000 table-entries hard limit 200000 TABLES: bruteforce OS FINGERPRINTS: 696 fingerprints loaded