PF route-to behavior
Alexandre Biancalana
ale at seudns.net
Tue Mar 13 03:25:07 UTC 2007
Tom Judge wrote:
> Alexandre Biancalana wrote:
>> Tom Judge wrote:
>>> Alexandre Biancalana wrote:
>>>> Tom Judge wrote:
>>>>> Alexandre Biancalana wrote:
>>>>>> Tom Judge wrote:
>>>>>>> Alexandre Biancalana wrote:
>>>>>>>> Tom Judge wrote:
>>>>>>>>> Alexandre Biancalana wrote:
>>>>>>>>>> Hi List,
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> I´m doing a firewall setup using 6-STABLE + PF with two
>>>>>>>>>> internet links but I can't do the route-to rule function as I
>>>>>>>>>> need.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> (default gw) ______
>>>>>>>>>> Link A <-----------> |int A |
>>>>>>>>>> | |
>>>>>>>>>> Link B <-----------> |int B |
>>>>>>>>>> |______|
>>>>>>>>>> FreeBSD FW
>>>>>>>>>>
>>>>>>>>>> A simple thing that I need to do is test the two Internet
>>>>>>>>>> links to know if they are up or not. To do this I could ping
>>>>>>>>>> or connect tcp ports on some external ips thought each link,
>>>>>>>>>> using nc and hping I tried do this generate
>>>>>>>>>> connections/packets from each network interface connected to
>>>>>>>>>> each link but the packets always go out by the interface
>>>>>>>>>> indicated by machines default route.
>>>>>>>>>>
>>>>>>>>>> I tried to add this rules in pf to force packets out by the
>>>>>>>>>> right interface based in your source address, but this does
>>>>>>>>>> not work, and the packets generated with ip of int B are
>>>>>>>>>> going out by int A.
>>>>>>>>>>
>>>>>>>>>> pass out log on $int_a route-to ( $int_b $int_b_gw ) from
>>>>>>>>>> $int_b to any
>>>>>>>>>> pass out log on $int_b route-to ( $int_a $int_a_gw ) from
>>>>>>>>>> $int_a to any
>>>>>>>>>>
>
> <SNIP/>
>
>> I understand that, I just don't see much difference in your rules and
>> my rules example... the both examples should work... but here none
>> off then work.....
>>
>> Adding a static destination route to an external host via gw_b and
>> ping with int_a address, the packet exit by int_b with int_a source
>> address... the same behavior...
>>
>> I tried your way:
>>
>> pass out log on $int_a route-to ( $int_b $int_b_gw ) from $int_b to !
>> int_b:network
>> pass out log on $int_b route-to ( $int_a $int_a_gw ) from $int_a to !
>> int_a:network
>>
>>
>> # pfctl -vv -sr
>> @28 pass out log on int_a route-to (int_b int_b_gw) inet from
>> int_b_ip to ! int_b:network
>> [ Evaluations: 88 Packets: 0 Bytes: 0
>> States: 0 ]
>> @29 pass out log on int_b route-to (int_a int_a_gw) inet from int_a
>> to ! int_a:network
>> [ Evaluations: 80 Packets: 0 Bytes: 0
>> States: 0 ]
>>
>> Any more hints ?!
>
> Han Hwei Woo wrote:
> > Just to be certain, are you aware that for PF, the last matching
> rule is
> > applied? Also, you can use the command:
> > # pfctl -vv -sr
> > to examine how your rules are being matched.
>
> Try the following which forces the first rule the packet matches
> (marked with quick) to be the final rule used to process the packet:
>
> pass out quick log on $int_a route-to ( $int_b $int_b_gw ) from $int_b
> to ! int_b:network
> pass out quick log on $int_b route-to ( $int_a $int_a_gw ) from $int_a
> to ! int_a:network
I added an keep state at end of each rule and now all works ! I will do
more tests and report any problem...
Thanks in advance !!!
Alexandre
More information about the freebsd-net
mailing list