⬢ DragonFlyBSD Kernel Audit
DF-3456 / setup_pf.sh
← back to finding ↓ download raw
#!/bin/sh
# DF-3456 setup v6 (run as root in the guest).
#
# v6 lessons:
#  - pfctl drops EMPTY inline anchors; inline anchors need a placeholder rule
#  - an inline  anchor "inner1"  inside anchor "spam" is walked by the kernel
#    as the doubled path  spam/spam/inner1  -> load walked decoys there
#  - `pass all no state` so EVERY packet walks rules (no state short-circuit)
#
# main:
#   pass all no state
#   anchor "spam" {
#       <300 udp decoys>
#       anchor "inner1" { pass udp port 9998 }   -> walked as spam/spam/inner1
#       block drop udp 127.0.0.1->127.0.0.1 port 5555     (lo bypass sensor)
#       block drop udp from 10.0.2.2 port 53               (dns response sensor)
#       anchor "inner2" { pass udp port 9999 }   -> walked as spam/spam/inner2
#       <300 tail decoys>
#   }
#   anchor "ham" { pass udp port 9997 }          -> walked as ham
#   block drop udp 127.0.0.1->127.0.0.1 port 5556  (control)
NPRE=${NPRE:-300}
NTAIL=${NTAIL:-300}
CONF=/tmp/df3456-pf.conf

kldload pf 2>/dev/null

{
    echo '# DF-3456 ruleset v6'
    echo 'pass all no state'
    echo 'anchor "spam" {'
    i=0
    while [ $i -lt $NPRE ]; do
        echo "  pass inet proto udp from 127.0.0.1 to 127.0.0.1 port $((6000 + i % 1000))"
        i=$((i + 1))
    done
    echo '  anchor "inner1" {'
    echo '    pass inet proto udp from 127.0.0.1 to 127.0.0.1 port 9998'
    echo '  }'
    echo '  block drop inet proto udp from 127.0.0.1 to 127.0.0.1 port 5555'
    echo '  block drop inet proto udp from 10.0.2.2 to any port 53'
    echo '  anchor "inner2" {'
    echo '    pass inet proto udp from 127.0.0.1 to 127.0.0.1 port 9999'
    echo '  }'
    i=0
    while [ $i -lt $NTAIL ]; do
        echo "  pass inet proto udp from 127.0.0.1 to 127.0.0.1 port $((8100 + i % 500))"
        i=$((i + 1))
    done
    echo '}'
    echo 'anchor "ham" {'
    echo '  pass inet proto udp from 127.0.0.1 to 127.0.0.1 port 9997'
    echo '}'
    echo 'block drop inet proto udp from 127.0.0.1 to 127.0.0.1 port 5556'
} > $CONF

{
    i=0
    while [ $i -lt 1000 ]; do
        echo "pass inet proto udp from 127.0.0.1 to 127.0.0.1 port $((7000 + i % 1000))"
        i=$((i + 1))
    done
} > /tmp/df3456-inner1.conf
{
    i=0
    while [ $i -lt 10 ]; do
        echo "pass inet proto udp from 127.0.0.1 to 127.0.0.1 port $((8000 + i))"
        i=$((i + 1))
    done
} > /tmp/df3456-inner2.conf
{
    i=0
    while [ $i -lt 500 ]; do
        echo "pass inet proto udp from 127.0.0.1 to 127.0.0.1 port $((8600 + i % 500))"
        i=$((i + 1))
    done
} > /tmp/df3456-ham.conf

pfctl -d 2>/dev/null
pfctl -F all 2>/dev/null
pfctl -f $CONF || exit 1
pfctl -a spam/spam/inner1 -f /tmp/df3456-inner1.conf || exit 1
pfctl -a spam/spam/inner2 -f /tmp/df3456-inner2.conf || exit 1
pfctl -a ham -f /tmp/df3456-ham.conf || exit 1
echo "-- main ruleset:";    pfctl -sr
echo "-- inner1 decoys:";   pfctl -a spam/spam/inner1 -sr | wc -l
echo "-- inner2 decoys:";   pfctl -a spam/spam/inner2 -sr | wc -l
echo "-- ham decoys:";      pfctl -a ham -sr | wc -l
pfctl -e