Traffic mysteriously dropping

Christopher McGee chris at xecu.net
Mon Apr 3 21:13:05 UTC 2006


Greg Hennessy wrote:

>>All rules that are block are also using log.  A lot of the 
>>pass rules do not because it generates such enormous logs.  I 
>>can try enable logging on every rule temporarily in order to 
>>troubleshoot this if necessary.
>>    
>>
>
>I would, you need to see what exactly is matching a flow. 
>
>  
>
>>> 
>>>
>>>      
>>>
>>Yes, if I tcpdump on em0, pflog0, and em1 simultaneously 
>>during a traffic test, the traffic hits em0, and never shows 
>>up as blocked in pflog0 and never shows up at all on em1.  As 
>>I stated, it's only 1 out of a bunch of connections, so there 
>>is no rule blocking all the traffic.
>>    
>>
>
>Hmmm, are you using route-to or such like in the policy ? If its not going
>out the interface you expect, it may be going out through another. 
>Time to tcpdump on everything including localhost to be sure. 
>
>Silly question,  is Jumbo frames enabled on one of the end points or are you
>running stock sized ethernet framing everywhere ?
>
>Has the firewall ever does transparent web caching ?
>
>Does the traffic route successfully if you disable pf with pfctl -d ? That
>should quickly determine if it's a routing or a firewall issue. 
>
>  
>
I am not using anything advanced like route-to.  The frames are the 
standard size, and this is not doing any kind of web caching or anything 
since the network behind it is mostly just mail servers, and a few web 
servers.  Unfortunately, since this is a production firewall, I can't 
really disable pf in this scenario.  I have done a simultaneous tcpdump 
on all the network interfaces, and pflog0 and lo0.  It did pretty much 
what I thought.  It would hit the outside interface, not even hit pf, 
and never pass through.  I have also found that it does log state 
mis-matches when this happens.  I found this with pf debugging enabled.

>>>Using interface groups without directionality, means that a 
>>>      
>>>
>>single rule 
>>    
>>
>>>will match the flow on both the ingress and egress interfaces.
>>> 
>>>Combined with antispoof, it makes for simpler policy
>>>
>>> 
>>>
>>>      
>>>
>>I have coded the rule as explained above and even as the 
>>first rule after the default block rule, it still drops 
>>traffic.  If I change it to non-stateful, it doesn't drop the 
>>connections.  I can't seem to get away from the thought of a 
>>state mis-match, however, I don't know why it would 
>>consistently do it on these http connections.
>>    
>>
>
>Hmmm, possibly something strange with the stack on the endpoints. 
>
>Are you using scrub in the policy ? 
>  
>
I am using scrub in the policy, however, as I've detailed above, this 
doesn't play a roll.

>>>What other blocks are in the policy ? 
>>>
>>> 
>>>
>>>      
>>>
>>I don't believe I'm doing any specifc blocks.  Just the 
>>default block and then allow what we need after that.
>>    
>>
>
>Time to do a quick grep to be completely sure, it's easy to miss one by just
>reading through a policy that large. 
>  
>
I have logging enabled in all the rules, so it will be logged no matter 
what it gets blocked by.  I think I have actually found the problem.  It 
is the state-mismatch, and it's because in our test scenario, all the 
requests are coming from 1 client.  There is a thread about this at 
http://www.benzedrine.cx/pf/msg07505.html.  If I choke down the 
tcp.closed time on the rule that allows this, it seems to minimize the 
problem.  Thanks for all the help everyone.

Chris


More information about the freebsd-pf mailing list