(Detailed description of problem, broached on "faults list" topic)

Two host, on oposite sides of gateway:

 _______            __________         _______
|       |          |          |       |       |
|    114.31 <-> 114.219    0.254 <-> 0.1      |
| priv  |          |   step   |       |  pub  |
|_______|          |__________|       |_______|

where,
PRIV (192.168.114.31) is private network host
PUB  (192.168.0.1)    is public host
STEP (192.168.114.219/192.168.0.254) is firewall gateway

Target:
  deny any access from PUB to PRIV, but allow PRIV to access PUB's
  resources (at least, pings and TCP)

OS version:

step# uname -a
OpenBSD step.oganer.net 4.2 GENERIC#0 i386

Ruleset variants and PF's behavior (trying to ping PUB and connect to
it's webserver):

   block in  inet from 192.168.0.1 to 192.168.114.31
   pass  in  inet from 192.168.114.31 to 192.168.0.1 flags S/SA keep state
    (does not work - neither pings nor TCP)
    Preferred version, because it does not affect queueing

 step# pfctl -ss
 all icmp 192.168.0.1:512 <- 192.168.114.31       0:0
 all tcp 192.168.0.1:80 <- 192.168.114.31:3538       CLOSED:SYN_SENT

   block in  inet from 192.168.0.1 to 192.168.114.31
   pass  out inet from 192.168.114.31 to 192.168.0.1 flags S/SA keep state
    (works)

 step# pfctl -ss
 all icmp 192.168.114.31:512 -> 192.168.0.1       0:0
 all tcp 192.168.114.31:3547 -> 192.168.0.1:80       ESTABLISHED:ESTABLISHED

In addition:

   block out inet from 192.168.0.1 to 192.168.114.31
   pass  in  inet from 192.168.114.31 to 192.168.0.1 flags S/SA keep state
    (works)

 step# pfctl -ss
 all icmp 192.168.0.1:512 <- 192.168.114.31       0:0
 all tcp 192.168.0.1:80 <- 192.168.114.31:3565       ESTABLISHED:ESTABLISHED

   block out inet from 192.168.0.1 to 192.168.114.31
   pass  out inet from 192.168.114.31 to 192.168.0.1 flags S/SA keep state
    (does not work)

 step# pfctl -ss
 all icmp 192.168.114.31:512 -> 192.168.0.1       0:0
 all tcp 192.168.114.31:3542 -> 192.168.0.1:80       ESTABLISHED:SYN_SENT

   block     inet from 192.168.0.1 to 192.168.114.31
   pass  in  inet from 192.168.114.31 to 192.168.0.1 flags S/SA keep state
    (does not work)

 step# pfctl -ss
 all icmp 192.168.0.1:512 <- 192.168.114.31       0:0
 all tcp 192.168.0.1:80 <- 192.168.114.31:3566       CLOSED:SYN_SENT

   block     inet from 192.168.0.1 to 192.168.114.31
   pass  out inet from 192.168.114.31 to 192.168.0.1 flags S/SA keep state
    (does not work)

 step# pfctl -ss
 all icmp 192.168.114.31:512 -> 192.168.0.1       0:0
 all tcp 192.168.114.31:3572 -> 192.168.0.1:80       ESTABLISHED:SYN_SENT

And one more:

   block     inet from 192.168.0.1 to 192.168.114.31
   pass      inet from 192.168.114.31 to 192.168.0.1 flags S/SA keep state
    (works)

 step# pfctl -ss
 all icmp 192.168.0.1:512 <- 192.168.114.31       0:0
 all icmp 192.168.114.31:512 -> 192.168.0.1       0:0
 all tcp 192.168.0.1:80 <- 192.168.114.31:3574       ESTABLISHED:ESTABLISHED
 all tcp 192.168.114.31:3574 -> 192.168.0.1:80       ESTABLISHED:ESTABLISHED

Supposition:
  In all non-working cases, answer packets, somewhy does not match
  created state (by iface and/or direction ?), and are blocked by
  block rule. In last case, each communication stream creates 2
  states. 

  "state-policy" option setting to "floating" or "if-bound" does not
  change situation.

Questions:
  Is this some kind of feature ? Is there any solution to make PF
  behave other way (for example, to work w/ first ruleset variant) ?

Ilya A. Kovalenko                      (mailto:[EMAIL PROTECTED])

Reply via email to