2

THE PROBLEM

I have multiple internet connections on a linux machine, I want each internet connection to use a specific DNS nameserver. /etc/resolv.conf is a problem, since it uses a global name server for all open internet connections.

Please note that the connections are all open and being used at the same time.

WHAT I NEED?

A way to say to linux the following:

Use DNS Nameserver A for internet connection 1

Use DNS Nameserver B for internet connection 2

Use DNS Nameserver C for internet connection 3

The problem is that /etc/resolv.conf uses the same nameserver for all conenections.


The exact requirement above I have to stick to.

Since the application I'm working on measure's ISP performance and DNS response time.

Using OpenDNS wont do me any good.

As for DHCP, I'm already obtaining DNS automatically from the ISP, but only the last DNS servers are being used in resolve.conf overwriting the previous name servers.

Need help.

9 Answers 9

13

In essence you have two issues:

  1. default resolver behaviour
  2. packet routing

The first is relatively easily solved if you develop your own test code. End-user programs almost always end up using libresolv and it's the res_init() function therein that's responsible for reading /etc/resolv.conf and setting the DNS servers for subsequent queries by that program. It's very easy to explicitly reset the DNS servers on a per-program instance within your own code.

The second problem requires network level changes. It's likely that you have three default routes, and no specific routing table entries for each ISP. You need to find out which subnet your three ISPs' name servers are in, and then add a route to that subnet that forces the traffic to exit via the right ISP.

For example, if an ISP is using 192.168.1.1 as a DNS server, then you need:

  # route add -net 192.168.1.0/24 gw w.x.y.z

where w.x.y.z is the address of the next hop facing that particular ISP.

Note that all of this would be a lot simpler if you didn't try to test three ISPs all at the same time from the same machine!

I've done bulk testing of DNS servers and rejected trying to do it with them all connected at once - it's far, far, easier to do them one at a time.

3
  • 2
    I would vote this up a dozen times if I could. The person asking the question needs to solve their real problem, not their invented problem. Aug 8, 2009 at 14:24
  • It's a damn crazy question, for sure. :) Aug 8, 2009 at 18:52
  • +1 for noting that it would be easier for three machines. If need be, use one physical machines and two virtual machines.
    – Kevin M
    Aug 9, 2009 at 6:44
4

Why don't use dig for performing your test?

It would be so easier:

#using local resolver (with cache)
dig +noall +stats www.google.com | grep ";; Query time"
;; Query time: 3 msec

#using opendns
dig +noall +stats google.com @208.67.222.222 | grep ";; Query time" 
;; Query time: 28 msec

#using my isp dns
dig +noall +stats google.com @212.27.40.240  | grep ";; Query time" 
;; Query time: 20 msec
3

Typically, the routing decision of "which route to use / which ISP to send a connection via" is done based on destination IP address. You don't have a destination IP address until you make a DNS request to map the destination hostname to a destination IP address.

If your config isn't "typical", you need to provide more details.

Until then, you have a chicken/egg situation. You can't decide which DNS server to use until you know which ISP you're going to be using, and (barring something special which you've not yet described here) you don't know what ISP you'll be using until you've performed the DNS lookup and obtained the destination IP address.

You mention that you are working on an application to measure ISP performance and DNS response time. Your least complex bet may be to monitor one ISP at a time.

More details from you may permit more detailed, relevant answers.

0

Wouldn't it make more sense to use the DHCP from the ISP and automatically obtain the DNS servers that way instead of hard coding them?

0

As alternative you can even ignore the DNS servers of your ISP and go with OpenDNS (unless your ISP is silly enough to block DNS requests to external DNS servers).

0

Maybe resolvconf or openresolv is what you are looking for:

0

I think Benoit gave you the right answer. You should not try to solve this problem within CentOS. If you write an application for measuring the performances of the internet connection then this application should choose the DNS server (and not CentOS itself).

If you use dig for the performance test or do it directly within your application is up to you. But either way you can specify directly what DNS server you want to take.

Another open question is: How do you do the traffic shaping and routing? Are those solely static?

2
  • half right - the app needs to pick the DNS server (see my answer) but the O/S has to pick the right network interface to reach that server.
    – Alnitak
    Aug 8, 2009 at 13:54
  • That's why I asked about the routing and traffic shaping. But, yes, your answer is a lot clearer. (It looks to me that the person who asked the question did not think about it yet. That's why I did not got into details about it.) Aug 8, 2009 at 22:41
0

You can try putting DNS lines like the following in your /etc/sysconfig/network-scripts/ifcfg-eth{0,1,2} files. I'm not certain this will actually achieve what you want however.

# Networking Interface
DEVICE=eth0
BOOTPROTO=static
HWADDR=00:11:22:33:44:55
ONBOOT=yes
IPADDR=10.10.10.100
NETMASK=255.255.255.0
DNS1=10.10.10.1
DNS2=10.10.10.2
0

Here is what I would do.

1) Set up each ISP on a separate NIC. This allows for easier routing.

2) Setup statics routes that force queries to isp A's dns servers to use isp A's interface/gateway. Repeat for the other isps (B's dns through interface b, etc).

3) Use dig the test the dns servers. The routes you added should make sure that the queries go out the correct interface to the correct isp.

0

You must log in to answer this question.

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