- router DNS
- Posted by johnny bobby bee on January 12th, 2004
i've got 3 computers connected to a router. the router provides
nat/firewall/dhcp/dns services. if i want to assign my own DNS servers to
only one of the linux boxes, without making changes to the router configuration,
which script is the proper one to change and make the changes stick. i've
tried setting 'nameserver ip.address.of.dns' in '/etc/resolv.conf' but the
file gets re-written with the router settings on every network restart.
where can i make this simple change and have it stick and not be
re-written by the router DNS info?
cheers,
johnny
--
- Linux: the choice of a GNU generation
- free; as in free speech and free beer
remove '.eh' to email
- Posted by John-Paul Stewart on January 12th, 2004
johnny bobby bee wrote:
/etc/resolv.conf is the correct place. However, it would appear that
you're getting DNS info through DHCP (or equivalent) at network restart
and that's why /etc/resolv.conf is getting overwritten. You need to
find the config file for your DHCP client and tell it not to get DNS
info via DHCP.
- Posted by johnny bobby bee on January 12th, 2004
John-Paul Stewart typed:
found /sbin/dhclient-script - but it's a bit beyond my level of scripting
knowledge. i imagine that first function () is what does it, but there are
other references to /etc/resolv.conf in the file.
can anyone tell me where i'd have to make the changes?
/sbin/dhclient-script:
#!/bin/sh
# Network Interface Configuration System
#
# Based on:
# dhclient-script for Linux. Dan Halbert, March, 1997.
# Updated for Linux 2.[12] by Brian J. Murrell, January 1999.
# Notes:
# 0. This script is based on the netbsd script supplied with dhcp-970306.
# 1. ifconfig down apparently deletes all relevant routes and flushes
# the arp cache, so this doesn't need to be done explicitly.
# 2. The alias address handling here has not been tested AT ALL.
# I'm just going by the doc of modern Linux ip aliasing, which uses
# notations like eth0:0, eth0:1, for each alias.
# 3. I have to calculate the network address, and calculate the broadcast
# address if it is not supplied. This might be much more easily done
# by the dhclient C code, and passed on.
function make_resolv_conf() {
rm -f /etc/resolv.conf
if [ -n "$new_domain_name" ]; then
echo search $new_domain_name > /etc/resolv.conf
fi
if [ -n "$new_domain_name_servers" ]; then
for nameserver in $new_domain_name_servers; do
echo nameserver $nameserver >> /etc/resolv.conf
done
fi
[[ -x /sbin/update-resolvrdv ]] && /sbin/update-resolvrdv
}
# Must be used on exit. Invokes the local dhcp client exit hooks, if any.
function exit_with_hooks() {
exit_status=$1
if [ -f /etc/dhclient-exit-hooks ]; then
. /etc/dhclient-exit-hooks
fi
# probably should do something with exit status of the local script
exit $exit_status
}
# Invoke the local dhcp client enter hooks, if they exist.
if [ -f /etc/dhclient-enter-hooks ]; then
exit_status=0
. /etc/dhclient-enter-hooks
# allow the local script to abort processing of this state
# local script must set exit_status variable to nonzero.
if [ $exit_status -ne 0 ]; then
exit $exit_status
fi
fi
# Import Mandrake Linux configuration
cd /etc/sysconfig/network-scripts;
.. /etc/sysconfig/network-scripts/network-functions
.. /etc/rc.d/init.d/functions
[ -f ../network ] && . ../network
[ -f ../networking/network ] && . ../networking/network
CONFIG=$interface
need_config ${CONFIG}
[ -f "${CONFIG}" ] || {
echo $"$0: configuration for $interface not found." >&2
exit_with_hooks 1
}
source_config
release=`uname -r`
release=`expr $release : '\(.*\)\..*'`
relminor=`echo $release |sed -e 's/[0-9]*\.\([0-9][0-9]*\)\(\..*\)*$/\1/'`
relmajor=`echo $release |sed -e 's/\([0-9][0-9]*\)\..*$/\1/'`
if [ x$new_broadcast_address != x ]; then
new_broadcast_arg="broadcast $new_broadcast_address"
fi
if [ x$old_broadcast_address != x ]; then
old_broadcast_arg="broadcast $old_broadcast_address"
fi
if [ x$new_subnet_mask != x ]; then
new_subnet_arg="netmask $new_subnet_mask"
fi
if [ x$old_subnet_mask != x ]; then
old_subnet_arg="netmask $old_subnet_mask"
fi
if [ x$alias_subnet_mask != x ]; then
alias_subnet_arg="netmask $alias_subnet_mask"
fi
if [ x$reason = xMEDIUM ]; then
# Linux doesn't do mediums (ok, ok, media).
exit_with_hooks 0
fi
if [ x$reason = xPREINIT ]; then
if [ x$alias_ip_address != x ]; then
# Bring down alias interface. Its routes will disappear too.
ifconfig $interface:0- inet 0
fi
if [ $relmajor -lt 2 ] || ( [ $relmajor -eq 2 ] && [ $relminor -eq 0 ] )
then
ifconfig $interface inet 0.0.0.0 netmask 0.0.0.0 \
broadcast 255.255.255.255 up
# Add route to make broadcast work. Do not omit netmask.
route add default dev $interface netmask 0.0.0.0
else
ifconfig $interface 0 up
fi
# We need to give the kernel some time to get the interface up.
sleep 1
exit_with_hooks 0
fi
if [ x$reason = xARPCHECK ] || [ x$reason = xARPSEND ]; then
exit_with_hooks 0
fi
if [ x$reason = xBOUND ] || [ x$reason = xRENEW ] || \
[ x$reason = xREBIND ] || [ x$reason = xREBOOT ]; then
if [ x$old_ip_address != x ] && [ x$alias_ip_address != x ] && \
[ x$alias_ip_address != x$old_ip_address ]; then
# Possible new alias. Remove old alias.
ifconfig $interface:0- inet 0
fi
if [ x$old_ip_address != x ] && [ x$old_ip_address != x$new_ip_address ]; then
# IP address changed. Bringing down the interface will delete all routes,
# and clear the ARP cache.
ifconfig $interface inet 0 down
fi
if [ x$old_ip_address = x ] || [ x$old_ip_address != x$new_ip_address ] || \
[ x$reason = xBOUND ] || [ x$reason = xREBOOT ]; then
ifconfig $interface inet $new_ip_address $new_subnet_arg \
$new_broadcast_arg
# Add a network route to the computed network address.
if [ $relmajor -lt 2 ] || \
( [ $relmajor -eq 2 ] && [ $relminor -eq 0 ] ); then
route add -net $new_network_number $new_subnet_arg dev $interface
fi
for router in $new_routers; do
route add default gw $router
done
fi
if [ x$new_ip_address != x$alias_ip_address ] && [ x$alias_ip_address != x ];
then
ifconfig $interface:0- inet 0
ifconfig $interface:0 inet $alias_ip_address $alias_subnet_arg
route add -host $alias_ip_address $interface:0
fi
if [ "${PEERDNS}" != "no" ]; then
make_resolv_conf
fi
if [ "$NEEDHOSTNAME" = yes ] || need_hostname; then
if [ -z "$new_host_name" ]; then
eval `/bin/ipcalc --silent --hostname $new_ip_address`
new_host_name=$HOSTNAME
fi
if [ -n "$new_host_name" ]; then
current_hostname=`hostname`
if [ "$new_host_name" != "$current_hostname" ]; then
set_hostname $new_host_name
fi
fi
fi
exit_with_hooks 0
fi
if [ x$reason = xEXPIRE ] || [ x$reason = xFAIL ] || [ x$reason = xRELEASE ] \
|| [ x$reason = xSTOP ]; then
if [ x$alias_ip_address != x ]; then
# Turn off alias interface.
ifconfig $interface:0- inet 0
fi
if [ x$old_ip_address != x ]; then
# Shut down interface, which will delete routes and clear arp cache.
ifconfig $interface inet 0 down
fi
if [ x$alias_ip_address != x ]; then
ifconfig $interface:0 inet $alias_ip_address $alias_subnet_arg
route add -host $alias_ip_address $interface:0
fi
exit_with_hooks 0
fi
if [ x$reason = xTIMEOUT ]; then
if [ x$alias_ip_address != x ]; then
ifconfig $interface:0- inet 0
fi
ifconfig $interface inet $new_ip_address $new_subnet_arg \
$new_broadcast_arg
set $new_routers
if ping -q -c 1 -w 10 $1 > /dev/null 2>&1; then
if [ x$new_ip_address != x$alias_ip_address ] && \
[ x$alias_ip_address != x ]; then
ifconfig $interface:0 inet $alias_ip_address $alias_subnet_arg
route add -host $alias_ip_address dev $interface:0
fi
if [ $relmajor -lt 2 ] || \
( [ $relmajor -eq 2 ] && [ $relminor -eq 0 ] ); then
route add -net $new_network_number
fi
for router in $new_routers; do
route add default gw $router
done
if [ "${PEERDNS}" != "no" ]; then
make_resolv_conf
fi
exit_with_hooks 0
fi
ifconfig $interface inet 0 down
exit_with_hooks 1
fi
exit_with_hooks 0
--
- Linux: the choice of a GNU generation
- free; as in free speech and free beer
remove '.eh' to email
- Posted by John-Paul Stewart on January 12th, 2004
johnny bobby bee wrote:
Do *NOT* change that script. (It may break things and will get
overwriten during package upgrades anyway.)
You need to find the appropriate config file, probably somewhere under
/etc. /etc/sysconfig might be the directory to try. 'man dhclient'
should tell you exactly what config file it uses. Edit the specified
config file, not the script itself. A first guess would be to add
"USEPEERDNS=no" to the appropriate config file (without quotes), but
again 'man dhclient' (or whatever the name of your DHCP client is)
should tell you exactly what you need to change.
I'll repeat: *do* *not* edit the script in /sbin.
- Posted by jvda on January 14th, 2004
By me, it's in /etc/dhcp3/dhclient.conf. Maybe it's in /etc/dhclient.conf
You just need to remove dns entry in the request command of your dhclient
Best regards
jvda