Stupid pf tricks

From WTFwiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Key services as non-root..

Because I'm a bit paranoid, and don't like things running as root, and things need to run as root to bind to ports < 1024...

 rdr on $ext_if inet proto udp from any to ($ext_if) port 162 -> 127.0.0.1 port 10162

This means I can run my SNMP trap-catcher bound to 127.0.0.1:10162 as a non-root user, and pf does the dirty work.


"pf proxy"

(Customer) <--> [E](pf proxy)[I] <--> (Destination:D)

  • Note.. this is awful. You've been warned.
  • E: "ext_if", customer-facing interface, IP: 1.2.3.4
  • I: "int_if", destination-facing interface, IP: 2.3.4.5
  • D: destination IP: 5.6.7.8
 ext_if="fxp0"
 int_if="fxp1"

 dest_real="5.6.7.8"
 dest_fake="2.3.4.5"

 rdr on $ext_if from any to $dest_fake -> $dest_real
 nat on $int_if from any to $dest_real -> ($int_if)

ORDER OF rdr/nat RULES IS IMPORTANT, SOMEHOW.


Redirecting on a bridge(4) untagging/retagging VLANs on the way

  • fxp0: LAN-facing
  • fxp1: WAN-facing, valid ("routable") IP: 10.80.0.2/24
  • vlan150: vlan 50 vlandev fxp0, no IP
  • vlan250: vlan 50 vlandev fxp1, no IP
  • bridge0: (vlan150, vlan250)
  • Ruleset:
 lan_if="fxp0"
 wan_if="fxp1"
 vlan_if="vlan150"

 localhost="10.80.0.2"

 table <customer> { 10.70.0.0/29 }

 no rdr on $wan_if inet proto tcp from $localhost to any port 80
 rdr inet proto tcp from any to any port 80 -> ($wan_if) port 8008

 pass in quick on $vlan_if route-to ( lo0 127.0.0.1 ) proto tcp from <customer> to ($wan_if) port 8008

Determining Rule Numbers

When you do tcpdump -e and pf reports the rule that the packet matched, you can lookup that rule by using

 pfctl -sr -vv

which will print out a numbered list of the rules (scrub rules and the like, while they show up, don't increment the index, so a simple pfctl -sr and getting line XX won't work).