tech-userlevel archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Trying npf again



I tried switching from pf to npf before and it seemed to be not quite ready yet. I am trying again but running into problems.

My first question - is anyone out there actually running npf in a production environment?

My first issue was running npfctl without having npf installed. I was trying to create my first config on a GENERIC system. I wanted to use "npfctl validate" to check if my syntax was OK. Even with validate it wants to use /dev/npf so I ran it as root thinking that it wouldn't actually do anything with the device. So wrong. Not only did it read or write to the device but in doing so it completely hung the server. I have two issues with this - 1) don't access the device if simply validating the config file and 2) don't create the device if the driver is not installed or at least treat it as /dev/null.

So I built a new kernel and ran it under Xen so that I could work from the console and inspect things easier. I also ran a normal kernel with npf on a local machine. There were problems. Here is my npf.conf. It may seem a little weird for two reasons, it is generated from a script and I keep trying different things to make it work.

$ext_if = xennet0
$int_if = xennet1
# $Id: pf.conf.header 11409 2017-05-10 15:29:19Z darcy $
# Common npf.conf for Vex.Net

# These tables include IPs personally known to us.
table <FRIENDS> type hash file "/etc/friends.list"
table <ENEMIES> type hash file "/etc/enemies.list"

# The auto block table is built by a script examining attacks
table <AUTOBLOCK> type hash dynamic

alg "icmp"
set bpf.jit off

procedure "norm" {
    normalize: "random-id", "min-ttl" 512, "max-mss" 1432
}

group "external" on $ext_if {
    pass in final family inet4 proto icmp all
    pass stateful in final family inet4 proto tcp from <FRIENDS>
    block in final from <ENEMIES>
    block in final from <AUTOBLOCK>
    pass stateful in final proto tcp to any port 22
    pass in final proto udp to any port 123

    pass out final all
    block all
}

group "internal" on $int_if {
    pass out final on $ext_if proto tcp to 98.158.139.68 port smtp
    block out final on $ext_if proto tcp to any port smtp
    pass in final family inet4 proto icmp all
    pass stateful in final proto tcp all
    pass in final proto udp all
    pass out final family inet4 proto tcp all
}

group "localhost" on inet4(lo0) {
    pass stateful in final proto tcp to any port 22
    pass in final proto udp to any port 123
    pass stateful in final to inet4(lo0) apply "norm"
}

group default {
    pass stateful in final proto tcp flags S/SA to any port 22
    pass in final proto udp to any port 123
    pass in final on lo0 all
    pass stateful out final to any
    block in all
}

When I start the filter and ssh in from the local network I get this:

$ ssh dilbert.vex.net
Last login: Thu May 11 16:01:13 2017 from 98.158.139.93
NetBSD 7.1.0_PATCH (XEN3_DOMU) #0: Tue May 9 20:27:33 EDT 2017

And there it hangs. The console seems to be alive but "w" hangs for a bit and then shows me that I am logged in. Top shows no abnormal processes.

I then run "npfctl show" to see if it matches my config. The system hangs and needs to be hard booted. I tried <CTRL><ALT><ESC> to see where it is hanging but nothing happens. Perhaps it doesn't work under Xen.

I am running 7.1.0_PATCH NetBSD 7.1.0_PATCH (XEN3_DOMU) recently compiled.

--
D'Arcy J.M. Cain <darcy%NetBSD.org@localhost>
http://www.NetBSD.org/ IM:darcy%Vex.Net@localhost


Home | Main Index | Thread Index | Old Index