Реклама: |
Lets go back to the 4 rule set from the previous section:
pass in quick on tun0 proto tcp from any to 20.20.20.1/32 port = 23 keep state
pass out quick on tun0 proto tcp from any to any keep state
block in quick all
block out quick all
This is almost, but not quite, satisfactory. The problem is that it's not just SYN
packets that're allowed to go to port 23, any old packet can get through. We can change
this by using the flags option:
pass in quick on tun0 proto tcp from any to 20.20.20.1/32 port = 23 flags S keep state
pass out quick on tun0 proto tcp from any to any flags S keep state
block in quick all
block out quick all
Now only TCP packets, destined for 20.20.20.1, at port 23, with a lone SYN flag will
be allowed in and entered into the state table. A lone SYN flag is only present as the
very first packet in a TCP session (called the TCP handshake) and that's really what we
wanted all along. There's at least two advantages to this: No arbitrary packets can come
in and make a mess of your state table. Also, FIN and XMAS scans will fail since they set
flags other than the SYN flag.[[dagger]] [[footnote: [[dagger]] Some examples use flags
S/SA instead of flags S. flags S actually equates to flags
S/AUPRFS and matches against only the SYN packet out of all six possible flags, while
flags S/SA will allow packets that may or may not have the URG, PSH, FIN, or RST
flags set. Some protocols demand the URG or PSH flags, and S/SAFR would be a
better choice for these, however we feel that it is less secure to blindly use S/SA
when it isn't required. But it's your firewall. ]] Now all incoming packets must either be
handshakes or have state already. If anything else comes in, it's probably a port scan or
a forged packet. There's one exception to that, which is when a packet comes in that's
fragmented from its journey. IPF has provisions for this as well, the keep frags
keyword. With it, IPF will notice and keep track of packets that are fragmented, allowing
the expected fragments to to go through. Lets rewrite the 3 rules to log forgeries and
allow fragments:
pass in quick on tun0 proto tcp from any to 20.20.20.1/32 port = 23 flags S keep state
keep frags
pass out quick on tun0 proto tcp from any to any keep state flags S keep frags
block in log quick all
block out log quick all
This works because every packet that should be allowed through makes it into the
state table before the blocking rules are reached. The only scan this won't detect is a
SYN scan itself. If you're truely worried about that, you might even want to log all
initial SYN packets.