.iter() gives you references in the first place. But .filter()has to give another layer of references in order to work with all types, because if it didn't, it would consume the iterator's elements – which would make it impossible for those elements to be returned if the item type wasn't Clone or Copy.
This is because iterator code is generic, designed to also work on types that cannot be copied. And Rust doesn't automatically flatten references, except some magic around the . operator.
Alternatives:
filter(|&&v| v > 2);
Moving && to the pattern in closure arguments removes the reference and gives you just the value