ip route show src field

Solution 1:

When adding a route to a multihomed host, you might want to have control over the source IP address your host is sending from when starting communications using this route. This is what src is for.

A short example: you have a host with two interfaces and the IP addresses 192.168.1.123/24 and 10.45.22.12/24. You are adding a route to 78.22.45.0/24 via 10.45.22.1 and want to make sure you are not sending to 78.22.45.0/24 using the 192.168.1.123 address (maybe because the network 78.22.45.0/24 has no route back to 192.168.1.0/24 or because you do not want your traffic to take this route for one reason or the other):

ip route add 78.22.45.0/24 via 10.45.22.1 src 10.45.22.12

Note that the src you are giving would only affect the traffic originating at your very host. If a foreign packet is being routed, it obviously would already have a source IP address so it would be passed on unaltered (unless you are using NAT of course, but this is an entirely different matter). Also, this setting might be overridden by a process specifically choosing to bind to a specific address instead of using the defaults when initiating connections (rather rare).

Solution 2:

The src attribute is a hint that is used by the address selection algorithm. It is significant when a host has multiple IP addresses, which is usually, but not always, when it has multiple interfaces. While there are other rules that influence address selection, and a network application can also override the selection algorithm by using system calls like bind(), the src attribute is a way to use a routing-table lookup to answer the question, "If I want to initiate a connection to host X, which of my addresses should I use?"

Here is an example to illustrate the use and effect of the src attribute. To make the point that this is related to addresses and routes, not strictly to interfaces, this example host has only one network interface but two addresses. Furthermore, both addresses are on the same subnet to emphasize the fact that there is no other obvious way to choose which one to use.

$ ip -4 addr show dev eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    inet 10.1.0.2/24 brd 10.1.0.255 scope global eth0
    inet 10.1.0.16/24 scope global secondary eth0
$ ip route list dev eth0
10.1.0.32/27  scope link  src 10.1.0.16
10.1.0.0/24  proto kernel  scope link  src 10.1.0.2

This host can communicate with any of the other 252 addresses on this /24 subnet from either address, but by default it will use 10.1.0.16 when initiating a connection with 10.1.0.32 through 10.1.0.63, and use 10.1.0.2 for all the rest.

If the host is responding, rather than initiating, then it will respond from the destination address of the request. For example, if another host at 10.1.0.32 connects to this host at 10.1.0.2, the response will come from 10.1.0.2 even though that doesn't match the src attribute of the return route.