For a long time Solaris has had a ndd knob called 
ip_strict_dst_multihoming, which if enabled makes sure that unicast 
packets are not accepted if they are received on an interface which 
doesn't match their IP destination address. This is sometimes enabled to 
improve security.

The strong end-system model (see RFC 1122) talks about restricting 
things both at the receiving and sending ends, and we have some RFEs 
asking for that. What this means in practice is that the source IP 
address constrains the interface on which the packet can be sent out, 
whether the source IP address was set by the application (doing a 
bind()), or set as part of accepting a new TCP/SCTP connection.

So far our answer has been "given our current complexity that would be 
near impossible" (due the IRE_CACHE entries getting in the way in far 
too many ways.)

I was reminded of these RFEs last week, so I went and looked at how hard 
it would be to implement this on top of the changes being done for the 
IP Datapath Refactoring project, and it doesn't seem very hard; in about 
300 lines of added code we can make this work.

What I've prototyped has two ndd variables (to mirror the 
ip*_strict_dst_multihoming):
  ip_strict_src_multihoming for IPv4
  ip6_strict_src_multihoming for IPv6

One detailed question is how the system should work on a Solaris box 
configured as a router. For ip*_strict_dst_multihoming we accept the 
packet if both the arriving interface and the interface on which the IP 
address is configured has ILLF_ROUTER set. Do we need to do the same 
check for ip*_strict_src_multihoming, or is it sufficient to check if 
the interface on which the packet is sent has ILLF_ROUTER set?

    Erik


Reply via email to