8

I have two ethernet interfaces in my computer, which is running Ubuntu 9.04. Both interfaces sport static IPs, but use separate gateways. My /etc/network/interfaces file looks something like this:

auto eth0 eth1
iface eth0 inet static
  address 10.0.0.5
  netmask 255.255.255.0
  gateway 10.0.0.1

iface eth1 inet static
  address 192.168.2.5
  netmask 255.255.255.0
  gateway 192.168.2.1

I want to have all traffic going to the internet-at-large run through eth0, but it seems to want to go through eth1. Is there a way that I can channel my general outbound traffic through eth0 instead and only use eth1 for traffic to its subnet?

The answer should be persistent; that is to say, it should survive reboot without a superuser needing to run a command after restart.

EDIT: as requested, here is the output of my route -n command:

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.0.0.0        0.0.0.0         255.255.255.0   U     0      0        0 eth0
192.168.2.0     0.0.0.0         255.255.255.0   U     0      0        0 eth1
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 eth1
0.0.0.0         192.168.2.1     0.0.0.0         UG    100    0        0 eth1
0.0.0.0         10.0.0.1        0.0.0.0         UG    100    0        0 eth0
1
  • I suggest you to add the output of "route" command to your question.
    – Anonymous
    Commented Jul 15, 2009 at 14:49

5 Answers 5

12

You should only have one default gateway. If you remove the gateway line from eth1, it'll all just work (after networking is restarted).

4
  • Manual routing isn't needed here. Commented Jul 15, 2009 at 15:01
  • Depends. The OP hasn't specified whether his eth1 has networks other than the local one connected to it. The fact that he's bothered specifying a gateway would make me assume he has.
    – Cian
    Commented Jul 15, 2009 at 15:04
  • 2
    Question clearly states that eth1 should only be used for traffic within it's own subnet. Commented Jul 15, 2009 at 15:06
  • You're right. Edited to reflect that.
    – Cian
    Commented Jul 15, 2009 at 15:11
4

Remove gateway from eth1 in /etc/network/interfaces and add it as a static route:

route add -net 192.168.2.0 netmask 255.255.255.0 gw 192.168.2.1

With this, 10.0.0.1 will be your default gateway and eth1 will be used only to connect to 192.168.2.0 network

4
  • That route command looks superfluous.
    – Dan Carley
    Commented Jul 15, 2009 at 14:58
  • You're right, is not necessary. My fault.
    – hdanniel
    Commented Jul 15, 2009 at 15:02
  • 1
    It is superfluous. Interfaces will automatically route to directly connected networks.
    – Cian
    Commented Jul 15, 2009 at 15:02
  • And of course - if you think about what it would do - you don't want to static route all of a direct attached subnet to one host on the same subnet.
    – Dan Carley
    Commented Jul 15, 2009 at 15:04
2

Modifing the routing table with route as suggested will fix this temporarily, but it will revert to it's current state on the next boot.

It would be possible to set route rules in /etc/rc.local or some kind of other init script, but in this case the simplest option is just to remove the gateway from eth1 in the interfaces file.

By removing that gateway that system will still automatically use eth1 as the route 192.168.2/24, but will route all other traffic through eth0.

2
  • 2
    If you need to specify manual routes, I'd rather do it through post-/up interface-options and either running ip route directly or through a script, and possibly have a pre-/down interface-option to remove those routes again. This interfaces better with ifup/ifdown. Commented Jul 15, 2009 at 15:11
  • @Kjetil agreed, that is a nicer solution. Commented Jul 15, 2009 at 15:15
1

Look at your current routing table by typing in route. Your machine will use the first default gw it sees in the routing table. This will be denoted by default or 0.0.0.0 as the destination. If you only want eth1 to be used for the local 192.168.2.0/24 network, remove the gateway command. This should make eth1's default gw your only default one.

1

I've been using this solution for 4+ years, have published it on the Linode wiki, and it's been working flawlessly. Edit /etc/network/interfaces and make it match this:

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0
iface eth0 inet static
    address <the outbound IP>
    netmask <the netmask for the outbound IP, usually 255.255.255.0>
    gateway <the gateway for the outbound IP>
    up /sbin/ip addr add <the primary IP>/24 dev eth0

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .