LINUX.ORG.RU

[Корбина][Gentoo]DHCP

 


0

0

Пользователи Дженты и Корбины, помогите. Стандартная связка DCHP клиент+сервер отказывается работать с Корбиной. То ли система не получает данные от DHCP-сервера провайдера, то ли не может получить именно список DNS. Суть такова:

Подключение eth0 видно по #ifconfig, но пинги к локальным ресурсам не идут(Unknown host), а если обращаться по IP, то «Network unreachable».

Использовать другой модуль(напр. udhcpc) не представляется возможным по очевидным причинам.

//Всё проверялось на minimalCD.

★★★★★

Ответ на: комментарий от KRoN73

Видел я этот гайд, пробовал. Не работает. Хоть DNS и прописываются в /etc/resolve.conf, хоть в /var/log/messages всё нормально, но тем не менее сеть недоступна.

Lighting ★★★★★
() автор топика
Ответ на: комментарий от KRoN73

Я в своё время Gentoo с таким конфигом гонял без проблем: http://balancer.ru/files/0912/net.corbina

Я правильно понял, что корбина раздаёт интернет по pptp, и перед подключением нужно сначала установить маршрут до VPN-сервера, иначе образуется «петля»? Похоже эта болезнь всех провайдеров, раздающих интернет таким странным способом...

У меня для решения этой проблемы написана обёртка над клиентом pptp:

#!/bin/sh

ip_list_cache="/var/cache/pptp-wrapper.%s.%s.ip-list"

# Log error message and exit.
# $1 - Message.
die()
{
	logger -t "pptp-wrapper" -i -p "daemon.err" "ERROR: ${1}"
	sleep 3
	delRouteAndExit 1
}

# Log warning message.
# $1 - Message.
warn()
{
	logger -t "pptp-wrapper" -i -p "daemon.warning" "WARNING: ${1}"
}

# Log information message.
# $1 - Message.
info()
{
	logger -t "pptp-wrapper" -i -p "daemon.info" "${1}"
}

# Delete added route and exit.
# $1 - Exit code.
delRouteAndExit()
{
	if [ "x${ip}" != "x" ] && [ "x${interface}" != "x" ]; then
		if route del -host "${ip}" dev "${interface}" 2>/dev/null; then
			info "Route \"-host ${ip} dev ${interface}\" deleted"
		else
			warn "Can't del route \"-host ${ip} dev ${interface}\""
		fi
	fi

	info "Terminated"
	exit $1
}

# Script arguments:
# $1 - Hostname.
# $2 - Network interface for route.

if [ "x${1}" = "x" ] || [ "x${2}" = "x" ] || [ $# -gt 2 ]; then
	die "Invalid arguments"
fi
address="${1}"
interface="${2}"

ip_list_cache=$( printf "${ip_list_cache}" "${address}" "${interface}" )

trap 'delRouteAndExit 0' SIGHUP SIGINT SIGQUIT SIGABRT SIGTERM

ip_list=$( host -t A "${address}" 2>/dev/null | cut -d " " -f 4 | \
		grep "^[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*$" )
if [ "x${ip_list}" = "x" ]; then
	warn "Can't resolve hostname \"${address}\""
	if [ -r "${ip_list_cache}" ]; then
		ip_list=$( cat "${ip_list_cache}" )
	else
		die "Can't get IP list from cache file"
	fi
else
	touch "${ip_list_cache}"
	chmod 0644 "${ip_list_cache}"
	echo "${ip_list}" > "${ip_list_cache}"
fi

ip=$( echo "${ip_list}" | shuf -n 1 )
info "Address resolved \"${address}\" -> ${ip}"

gw=$( route -n | sed -n "s/^0\.0\.0\.0 *\([^ ]*\).* *${interface}$/\1/p" | \
		head -n 1 )
[ "x${gw}" = "x0.0.0.0" ] && gw=""
[ "x${gw}" != "x" ] && gw="gw ${gw} "

if route add -host "${ip}" $gw dev "${interface}" 2>/dev/null; then
	info "Route \"-host ${ip} ${gw}dev ${interface}\" added"
else
	warn "Can't add route \"-host ${ip} ${gw}dev ${interface}\""
fi

pptp "${ip}" --nolaunchpppd || die "pptp error"
delRouteAndExit 0
Скрипт сначала получает список IP-адресов VPN-серверов с помощью утилиты host (net-dns/bind-tools), если это не получилось - берёт список, закешированный с прошлого раза в файле /var/cache/pptp-wrapper.$VPN_SERVER.$INTERFACE (бывет у провайдера подключивают DNS-сервера). Потом на случайно выбранный IP делается маршрут и на этот же IP запускается pptp. После завершения pptp маршрут удаляется.

Deleted
()
Ответ на: комментарий от Deleted

Вот кусок моего /etc/conf.d/net, использующего этот скрипт (/etc/ppp/pptp-wrapper):

# Ethernet-интерфейс до провайдера
modules_is74=("dhcpcd" "!plug")
config_is74=("dhcp")
dhcpcd_is74="-A -b -o ms_classless_static_routes -t 0 -X 192.168.0.1"
# -A - не тестировать доступность выданного адреса
# -b - "демонизироваться" сразу же, не дожидаясь получения адреса (чтобы не тормозила загрузка)
# -o ms_classless_static_routes - нужно, чтобы dhcpcd смог получить все маршруты от говноDHCP-сервера провайдера (это микрософтовское расширение протокола)
# -t 0 - если сервер не отвечает, пытаться получить лизу бесконечно
# -X 192.168.0.1 - игнорировать сообщения от DHCP-сервера с этим IP (помогает от криворуких пользователей, неспособных правильно настроить и подключить свои роутеры =))
metric_is74="2"

config_ppp1=("ppp")
link_ppp1=("pty '/etc/ppp/pptp-wrapper unlim.chelcom.ru is74'")
username_ppp1="*****"
password_ppp1="*****"
metric_ppp1="1"

pppd_ppp1=(
	"lcp-restart 60"

	"lcp-echo-interval 30"
	"lcp-echo-failure 5"

	"mtu 1492"

	"defaultroute"
	"usepeerdns"

	"defaultmetric ${metric_ppp1}"
)

depend_ppp1() {
	need net.is74
}

Разные метрики нужны, чтобы могли одновременно сосуществовать два дефолтных маршрута. Все пакеты естественно будут идти только по одному. Это нужно только для того, чтобы не нужно было удалять/восстанавливать дефолтный маршрут от ethernet-интерфейса при включении/выключении pptp-соединения.

Deleted
()
Ответ на: комментарий от Lighting

Нет маршрута по умолчанию. Корбина не даёт, а ваш клиент DHCP значит это не просит. Что-то типа

0.0.0.0        10.86.72.1      0.0.0.0       UG        0 0          0 eth0

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.