Selecting the outbound ip address in Linux

Recently, I wanted to assign a second public IP address to a Linux (Debian) server. First thing that came to mind was to create a network interface alias like so:

/etc/network/interfaces

iface eth0 inet dhcp

iface eth0:0 inet static
    address x.x.x.x (the secondary IP)
    gateway x.x.x.x (the secondary IP gateway)
    netmask x.x.x.x (the secondary IP netmask)

Creating a network interface alias makes sense because both my IP addresses are in the same subnet. Doing this worked, but it also posed a problem. I had to be able to specifiy which of my IP addresses was used for outbound connections. Here's how.

At first I wasn't sure how to do this, so I did a quick Google search. I found various solutions to my problem, but most of them somehow didn't work.

Possible solutions

One suggestion was to add a route to the kernel routing table using ip route add default dev eth0, which was supposed to route all traffic over the eth0 device, which is assigned my preferred ip for outbound connections. I'm not sure why this didn't work, maybe because the eth0:0 network interface is also bound to the eth0 device.

Another suggestion was to specify a gateway only for the interface you want to have outbound traffic routed to, like this:

/etc/network/interfaces

iface eth0 inet dhcp

    iface eth0:0 inet static
    address x.x.x.x (the secondary IP)
    gateway x.x.x.x (the secondary IP gateway)
    netmask x.x.x.x (the secondary IP netmask)

Unfortunately, this didn't work either.

The solution

Finally I found this page on the Linode wiki which had a solution that actually worked for me:

/etc/network/interfaces

iface eth0 inet dhcp
    up /sbin/ip addr add the.secondary.ip.here/24 dev eth0

This should basically do about the same as binding the ip to a network device alias without specifying a gateway. The only difference is that using an alias you basically create a virtual network device, while using the method above you just bind the ip to the existing physical network device. I'm not sure in what way this is exactly different in regard of the IP address used for outbound connections.

If anyone can explain the difference between solution #2 and #3 please do so in the comments below.