Hello,
>
> ok. i don't know how to split up the rest of the change though.
>
> here's an updated diff that includes the rest of the kernel changes and
> the pfctl and pf.conf tweaks.
>
> it's probably useful for me to try and explain at a high level what
> i think the semantics should be, otherwise we might end up arguing about
> which bits of the current config i broke.
>
> so, from an extremely high level point of view, and apologies if
> this is condescending, pf sits between the network stack and an
> interface that a packet travels on. for connections handled by the
> local box, this means packets come from the stack and get an output
> interface selected by a route lookup, then pf checks it, and then
> it goes out the selected interface. replies come into an interface,
> get checked by pf, and then enter the stack. when forwarding, a
> packet comes into an interface, pf checks it, the stack does a route
> lookup to pick an interface, pf checks it again, and then it goes
> out the interface.
>
> so what does it mean when route-to (or reply-to) gets involved? i'm
> saying that when route-to is applied to a packet, pf takes the packet
> away from the stack and immediately forwards it toward to specified
> destination address. for a packet entering the system, ie, when the
> packet is going from the interface into the stack, route-to should
> pretend that it is forwarding the packet and basically push it
> straight out an interface. however, like normal forwarding via the
> stack, there might be some policy on packets leaving that interface that
> you want to apply, so pf should run pf_test in that situation so the
> policy can be applied. this is especially useful if you need to apply
> nat-to when packets leave a particular interface.
>
> however, if you route-to when a packet is on the way out of the
> stack, i'm arguing that pf should not run again against that packet.
> currently route-to rules run pf_test again if the interface the packet
> is routed out of changes, which means pf runs multiple times against a
> packet if rules keep changing which interface it goes out. this means
> there's loop prevention in pf to mitigate against this, and weird
> potentials for multiple states to be created when nat gets involved.
>
> for simplicity, both in terms of reasoning and code i think pf should
> only be run once when a packet enters the system, and only once when it
> leaves the system. the only reason i can come up with for running
> pf_test multiple times when route-to changes the outgoing interface is
> so you can check the packet with "pass out on $new_if" type rules. we
> don't rerun pf again when nat/rdr changes addresses, so this feels
> inconsistent to me.
I understand that simple is better here, so I won't object
if we will lean towards simplified model above. However I still
would like to share my view on current PF.
the way I understand how things (should) work currently is fairly simple:
we always run pf_test() as packet crosses interface.
packet can cross interface either in outbound or
inbound direction.
this way we can always create a complex route-to loops,
however it can also solve some route-to vs. NAT issues.
consider those fairly innocent rules:
--------8<---------------8<---------------8<------------------8<--------
table <hops> { 10.10.10.10, 172.16.1.1 }
pass out on em0 from 192.168.1.0/24 to any route-to <hops>
pass out on em1 from 192.168.1.0 to any nat-to (em1)
pass out on em2 all
--------8<---------------8<---------------8<------------------8<--------
Rules above should currently work, but will stop if we will
go with simplified model.
I'll be OK with your simplified model if it will make things
more explicit:
route-to option should be applied on inbound rules
only
reply-to option should be applied on outbound rule
only
dup-to option can go either way (in/out)
does it make sense? IMO yes, because doing route-to
on outbound path feels unnatural to me.
</snip>
>
> this also breaks the ability to do route-to without states. is there a
> reason to do that apart from the DSR type things? did we agree that
> those use cases could be handled by sloppy states instead?
If I remember correct we need to make 'keep state' mandatory
for route-to so it can work well with pfsync(4), right?
>
> lastly, the "argument" or address specified with route-to (and
> reply-to and dup-to) is a destination address, not a next-hop. this
> has been discussed on the lists a couple of times before, so i won't
> go over it again, except to reiterate that it allows pf to force
> "sticky" path selection while opening up the possibility for ecmp
> and failover for where that path traverses.
I keep forgetting about it as I still stick to current interpretation.
I've seen changes to pfctl. Diff below still allows rule:
pass in on net0 from 192.168.1.0/24 to any route-to 10.10.10.10@em0
it also allows rule:
pass in on net0 from 192.168.1.0/24 to any route-to em0
I think we don't want support those two anymore, is that correct?
thanks and
regards
sashan