View Full Version : проблема с udhcpc
С какого-то момента udhcpc перестал выставлять IP адрес. Попробывал уже все. Не могу понять в чем дело. Запускал в ручную с параметром -s <свой скрипт>: udhcpc выдает leasefail.
Смотрю в tcpdump - провадеровский сервер адрес выдает.
tcpdump:
04:10:13.365399 IP (tos 0x0, ttl 64, id 0, offset 0, flags [none], length: 576) 0.0.0.0.68 > 255.255.255.255.67: [udp sum ok] BOOTP/DHCP, Request from 00:0c:6e:38:42:81, length: 548, xid:0xf31a165d, secs:3, flags: [none] (0x0000)
Client Ethernet Address: 00:0c:6e:38:42:81
Vendor-rfc1048:
DHCP:DISCOVER
CID:[ether]00:0c:6e:38:42:81
PR:SM+DG+NS+HN+DN+BR+SR+YD+YS+NTP+T249
04:10:13.369404 IP (tos 0x0, ttl 63, id 39006, offset 0, flags [DF], length: 578) 10.6.1.1.67 > 10.6.4.106.68: [udp sum ok] BOOTP/DHCP, Reply, length: 550, hops:2, xid:0xf31a165d, secs:3, flags: [none] (0x0000)
Your IP: 10.6.4.106
Gateway IP: 10.6.1.1
Client Ethernet Address: 00:0c:6e:38:42:81
Vendor-rfc1048:
DHCP:OFFER
SID:10.100.0.11
LT:54000
SM:255.255.240.0
DG:10.6.1.1
NS:10.100.0.11
DN:"psk-net.ru"
Где грабли?
Неужели вернулась старая болячка?
# 0.9.7 (020526)
# Use add_lease in read_leases, sanitizes leases more, and clears out exprired ones if there is no more room (me)
# Moved udhcpd.leases to /var/lib/misc/udhcpd.leases (Debian bug #147747)
# Change (obsolete) AF_INET in arping.c to PF_PACKET (Debian bug #127049)
# Added script hook for DHCPNAK (nak), as well as providing the message option (me)
# Generate the paramaters request list by seeing what options in options.c are ored with OPTION_REQ in options.c
# Fix dhcp renew forgetfullness on client (bug #1230)
# Fix dhcp release bug on client (bug #1231)
# Set option request list for DHCP renew (bug #1233)
# Set BOOTREQUEST/REPLY properly
# Change client-identifier field to popularly expected behavior (me)
# Only reopen port on errors (me)
# Change fork/close/setsid structures to daemon() (me)
# Allow user to specify udhcpd config file at run time (Steven, me)
# Write pidfile after changing it (Steven CTR Carr)
# Added env var docs to udhcpc man page (Matt)
# Standardized lowercase udhcp in documentation (me)
# Accept packets without a UDP checksum (me)
# Accept packets with extra garbage (me)
# Better error handling in files.c (me)
# Combined read_interface function to reduce COMBINED_BINARY size (me)
# Drop calc_length(), some servers choke on smaller packets (me)
# Try to clean some fat out (me)
А вот это ягодки не одного ли поля?
Вопрос к спецам по WL-500G Premium (http://wl500g.info/showthread.php?t=84710&p=84710)
А вот это ягодки не одного ли поля?
Вопрос к спецам по WL-500G Premium (http://wl500g.info/showthread.php?t=84710&p=84710)
К сожалению, нет. У меня нет VPN.
10.6.1.1.67 > 10.6.4.106.68
Где грабли?
С какого перепою они шлют ответ 10.6.4.106, если адрес ещё не присвоен?
С какого перепою они шлют ответ 10.6.4.106, если адрес ещё не присвоен?
Так шлют, то они его по правильному маку. И с опцией -r адрес не подбирает.
Значит дело в чём-то другом. DN тут никаким боком.
Значит дело в чём-то другом. DN тут никаким боком.
В ответах сервера есть ещё T249. Я так понимаю это маршруты?
Только в ответах я их не вижу. В запросе вижу.
Да, маршруты.
Ясно. Значит и не в них, т.к. раньше работало. Пробывал несколько прошивок (8, 8.12, 8.14, 8.19). Одна и та же петрушка на всех.
Только в ответах я их не вижу. В запросе вижу.
Их там много. Я не стал их вставлять. Если это важно, то могу ещё раз ответ запостить.
Ответ полностью:
09:28:13.414577 IP (tos 0x0, ttl 63, id 106, offset 0, flags [DF], length: 578) 10.6.1.1.67 > 10.6.4.106.68: [udp sum ok] BOOTP/DHCP, Reply, length: 550, hops:2, xid:0x6d2cd001, secs:3, flags: [none] (0x0000)
Your IP: 10.6.4.106
Gateway IP: 10.6.1.1
Client Ethernet Address: 00:0c:6e:38:42:81
Vendor-rfc1048:
DHCP:OFFER
SID:10.100.0.11
LT:54000
SM:255.255.240.0
DG:10.6.1.1
NS:10.100.0.11
DN:"psk-net.ru"
T249:6336,43208,2566,257,6154,25600,2566,257,5130, 256,2566,257,5130,512,2566,257,5130,768,2566,257,5 130,1280,2566,257,5130,1792,2566,257,7690,65021,33 802,1537,269,2760,2566,257,3082,53258,1537,269,263 2,2566,257,5723,51424,2566,257,5824,43088,2566,257 ,6336,43223,2566,257,7616,43008,2058,1537,284,4932 0,16,2566,257,7104,43008,8202,1537,282,49320,64,25 66,257,6336,43009,2566,257,6080,43010,2566,257,582 4,43012,2566,257,5568,43016,2566,257,5312,43024,25 66,257,6336,43209,2566,257,6336,43200,2566,257,608 0,43210,2566,257,5824,43212,2566,257,5312,43216,25 66,257,6339,61310,2566,257,6339,61317,2566,257
Раз раньше работало, а теперь с той же версией нет, то очевидно, что дело не в прошивке... Меня смущает именно то, что ответ не броадкастный.
Взял версию udhcpc из svn. Компильнул с дебагом.
Работает.
./udhcpc -i vlan1 -s /usr/local/root/showparams
udhcpc (v0.9.9-pre) started
adapter index 6
adapter hardware address 00:0c:6e:38:42:81
vforking and execle'ing /usr/local/root/showparams
deconfig
entering raw listen mode
Opening raw socket on ifindex 6
adding option 0x35
adding option 0x3d
adding option 0x3c
Sending discover...
Waiting on select...
oooooh!!! got some!
adding option 0x35
adding option 0x3d
adding option 0x3c
adding option 0x32
adding option 0x36
Sending select for 10.6.4.106...
Waiting on select...
oooooh!!! got some!
Lease of 10.6.4.106 obtained, lease time 54000
vforking and execle'ing /usr/local/root/showparams
bound
entering none listen mode
При этом tcpdump показывает следующее:
tcpdump: listening on vlan1, link-type EN10MB (Ethernet), capture size 1500 bytes
16:01:12.141515 IP (tos 0x0, ttl 64, id 0, offset 0, flags [none], length: 576) 0.0.0.0.68 > 255.255.255.255.67: [udp sum ok] BOOTP/DHCP, Request from 00:0c:6e:38:42:81, length: 548, xid:0x8824b449, flags: [none] (0x0000)
Client Ethernet Address: 00:0c:6e:38:42:81
Vendor-rfc1048:
DHCP:DISCOVER
CID:[ether]00:0c:6e:38:42:81
VC:"udhcp 0.9.9-pre"
PR:SM+DG+NS+HN+DN+BR+YD+YS+NTP
16:01:12.145112 IP (tos 0x0, ttl 63, id 43342, offset 0, flags [DF], length: 334) 10.6.1.1.67 > 10.6.4.106.68: [udp sum ok] BOOTP/DHCP, Reply, length: 306, hops:2, xid:0x8824b449, flags: [none] (0x0000)
Your IP: 10.6.4.106
Gateway IP: 10.6.1.1
Client Ethernet Address: 00:0c:6e:38:42:81
Vendor-rfc1048:
DHCP:OFFER
SID:10.100.0.11
LT:54000
SM:255.255.240.0
DG:10.6.1.1
NS:10.100.0.11
DN:"psk-net.ru"
16:01:12.148293 IP (tos 0x0, ttl 64, id 0, offset 0, flags [none], length: 576) 0.0.0.0.68 > 255.255.255.255.67: [udp sum ok] BOOTP/DHCP, Request from 00:0c:6e:38:42:81, length: 548, xid:0x8824b449, flags: [none] (0x0000)
Client Ethernet Address: 00:0c:6e:38:42:81
Vendor-rfc1048:
DHCP:REQUEST
CID:[ether]00:0c:6e:38:42:81
VC:"udhcp 0.9.9-pre"
RQ:10.6.4.106
SID:10.100.0.11
PR:SM+DG+NS+HN+DN+BR+YD+YS+NTP
16:01:12.151933 IP (tos 0x0, ttl 63, id 43346, offset 0, flags [DF], length: 334) 10.6.1.1.67 > 10.6.4.106.68: [udp sum ok] BOOTP/DHCP, Reply, length: 306, hops:2, xid:0x8824b449, flags: [none] (0x0000)
Your IP: 10.6.4.106
Gateway IP: 10.6.1.1
Client Ethernet Address: 00:0c:6e:38:42:81
Vendor-rfc1048:
DHCP:ACK
SID:10.100.0.11
LT:54000
SM:255.255.240.0
DG:10.6.1.1
NS:10.100.0.11
DN:"psk-net.ru"
Олег,
У меня тут мысль возникла. Может udhcpc из прошивки ждет пакет с не тем mac адресом?
Раз раньше работало, а теперь с той же версией нет, то очевидно, что дело не в прошивке... Меня смущает именно то, что ответ не броадкастный.
Про не броадкастный ответ есть в описании протокола BOOTP следущее (см. п. 2a):
4. Chicken / Egg Issues
How can the server send an IP datagram to the client, if the client
doesnt know its own IP address (yet)? Whenever a bootreply is being
sent, the transmitting machine performs the following operations:
1. If the client knows its own IP address ('ciaddr' field is
nonzero), then the IP can be sent 'as normal', since the client
will respond to ARPs [5].
2. If the client does not yet know its IP address (ciaddr zero),
then the client cannot respond to ARPs sent by the transmitter of
the bootreply. There are two options:
a. If the transmitter has the necessary kernel or driver hooks
Croft & Gilmore [Page 4]
RFC 951 September 1985
Bootstrap Protocol
to 'manually' construct an ARP address cache entry, then it can
fill in an entry using the 'chaddr' and 'yiaddr' fields. Of
course, this entry should have a timeout on it, just like any
other entry made by the normal ARP code itself. The
transmitter of the bootreply can then simply send the bootreply
to the client's IP address. UNIX (4.2 BSD) has this
capability.
b. If the transmitter lacks these kernel hooks, it can simply
send the bootreply to the IP broadcast address on the
appropriate interface. This is only one additional broadcast
over the previous case.
В общем всё как-то странно...
Попробуйте собрать бизибоксный udhcpc с отладкой и посмотреть в чём дело.
так вроде его и брал svn://busybox.net/trunk/udhcp
Или Вы не это имели ввиду?
ещё напрягает ругань на vlan1 прошивочного клиента:
udhcpc -i vlan1 -s /tmp/udhcpc
udhcpc (v0.9.9-pre) started
vlan1: No such process
Sending discover...
Sending discover...
Sending discover...
У меня нет никакой ругани:
$ udhcpc -i vlan1 -s /bin/true
udhcpc (v0.9.9-pre) started
Sending discover...
Можно strace поставить и глянуть, на что именно он ругается.
В прошивке используется другой клиент, который интегрирован в бизибокс.
В прошивке используется другой клиент, который интегрирован в бизибокс.
собрал и бизибоксного. То же самое - работает...
./udhcpc -i vlan1 -s /usr/local/root/showparams
info, udhcpc (v0.9.9-pre) started
info, adapter index 6
info, adapter hardware address 00:0c:6e:38:42:81
info, vforking and execle'ing /usr/local/root/showparams
SP:deconfig
info, entering raw listen mode
info, Opening raw socket on ifindex 6
info, adding option 0x35
info, adding option 0x3d
info, adding option 0x3c
debug, Sending discover...
info, Waiting on select...
info, oooooh!!! got some!
info, adding option 0x35
info, adding option 0x3d
info, adding option 0x3c
info, adding option 0x32
info, adding option 0x36
debug, Sending select for 10.6.4.106...
info, Waiting on select...
info, oooooh!!! got some!
info, Lease of 10.6.4.106 obtained, lease time 54000
info, vforking and execle'ing /usr/local/root/showparams
SP:bound
info, entering none listen mode
strace
strace udhcpc -i vlan1 -s /tmp/udhcpc
execve("/sbin/udhcpc", ["udhcpc", "-i", "vlan1", "-s", "/tmp/udhcpc"], [/* 10 vars */]) = 0
svr4_syscall() = -1 ERRNO_4090 (Unknown error 4090)
mprotect(0x2aac0000, 25392, PROT_READ|PROT_WRITE|PROT_EXEC) = 0
mprotect(0x400000, 1198572, PROT_READ|PROT_WRITE|PROT_EXEC) = 0
readlink("/lib/ld-uClibc.so.0", 0x7fff78c8, 1024) = -1 EINVAL (Invalid argument)
open("/lib/libcrypt.so.0", O_RDONLY) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\10\0\1\0\0\000 0\6\0\0004\0\0\0"..., 4096) = 4096
old_mmap(NULL, 348160, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2ab07000
old_mmap(0x2ab07000, 13316, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0) = 0x2ab07000
old_mmap(0x2ab4a000, 1124, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x3000) = 0x2ab4a000
old_mmap(0x2ab4b000, 67920, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x2ab4b000
close(3) = 0
open("/lib/libm.so.0", O_RDONLY) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\10\0\1\0\0\0\3 00\22\0\0004\0\0\0"..., 4096) = 4096
old_mmap(NULL, 344064, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2ab5c000
old_mmap(0x2ab5c000, 79748, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0) = 0x2ab5c000
old_mmap(0x2abaf000, 2236, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x13000) = 0x2abaf000
close(3) = 0
open("/lib/libm.so.0", O_RDONLY) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\10\0\1\0\0\0\3 20\251\0\0004\0\0\0"..., 4096) = 4096
old_mmap(NULL, 737280, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2abb0000
old_mmap(0x2abb0000, 452276, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0) = 0x2abb0000
old_mmap(0x2ac5e000, 11584, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x6e000) = 0x2ac5e000
old_mmap(0x2ac61000, 10280, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x2ac61000
close(3) = 0
mprotect(0x400000, 1198572, PROT_READ|PROT_EXEC) = 0
mprotect(0x2aac0000, 25392, PROT_READ|PROT_EXEC) = 0
ioctl(0, TIOCNXCL, {B38400 opost isig icanon echo ...}) = 0
ioctl(1, TIOCNXCL, {B38400 opost isig icanon echo ...}) = 0
brk(0x10010004) = 0x10010004
brk(0x10011000) = 0x10011000
brk(0x10012000) = 0x10012000
getuid() = 0
getgid() = 0
setgid(0) = 0
setuid(0) = 0
open("/dev/null", O_RDWR|O_LARGEFILE) = 3
close(3) = 0
write(1, "udhcpc (v0.9.9-pre) started\n", 28udhcpc (v0.9.9-pre) started
) = 28
rt_sigaction(SIGPIPE, {SIG_DFL}, {SIG_DFL}, 16) = 0
socket(PF_FILE, SOCK_DGRAM, 0) = 3
connect(3, {sa_family=AF_FILE, path="/dev/log"}, 10) = 0
time([1203970337]) = 1203970337
open("/etc/TZ", O_RDONLY) = 4
read(4, "MSK-3MSD\n", 68) = 9
read(4, "", 59) = 0
close(4) = 0
getpid() = 355
write(3, "<134>Feb\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0cpc[355]"..., 62) = 62
rt_sigaction(SIGPIPE, {0x7fff74da, [], SA_STACK|SA_RESTART|SA_INTERRUPT|SA_NOMASK|SA_SIGI NFO|SA_NOCLDWAIT|0x7fe74d2}, NULL, 16) = 0
socket(PF_INET, SOCK_RAW, IPPROTO_RAW) = 4
ioctl(4, 0x8933, {ifr_name="vlan1", ifr_index=6}) = 0
ioctl(4, 0x8927, {ifr_name="vlan1", ifr_hwaddr=00:0c:6e:38:42:81}) = 0
close(4) = 0
brk(0x10013000) = 0x10013000
socketpair(PF_FILE, SOCK_STREAM, 0, [4, 5]) = 0
rt_sigaction(SIGUSR1, {0x10000000, [], SA_NOCLDWAIT|0x467dc0}, {SIG_DFL}, 16) = 0
rt_sigaction(SIGUSR2, {0x10000000, [], SA_NOCLDWAIT|0x467dc0}, {SIG_DFL}, 16) = 0
rt_sigaction(SIGTERM, {0x10000000, [], SA_NOCLDWAIT|0x467dc0}, {SIG_DFL}, 16) = 0
brk(0x10014000) = 0x10014000
brk(0x10015000) = 0x10015000
open("/dev/null", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 6
ioctl(6, TIOCNXCL, 0x7fff7818) = -1 ENOTTY (Inappropriate ioctl for device)
close(6) = 0
open("/dev/null", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 6
ioctl(6, TIOCNXCL, 0x7fff7818) = -1 ENOTTY (Inappropriate ioctl for device)
close(6) = 0
open("/dev/null", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 6
ioctl(6, TIOCNXCL, 0x7fff7818) = -1 ENOTTY (Inappropriate ioctl for device)
close(6) = 0
fork() = 356
wait4(356, vlan1: No such process
NULL, 0, NULL) = 356
--- SIGCHLD (Child exited) @ 0 (0) ---
Олег,
Подскажите, пожалуйста, как включить недостающие фичи в udhcp? Это наверное какие-нибудь патчи?
UDHCPC из прошивки PR:SM+DG+NS+HN+DN+BR+SR+YD+YS+NTP+T249
UDHCPC из бизибокса PR:SM+DG+NS+HN+DN+BR+YD+YS+NTP
Спасибо.
Нашел косяк.
Проблема в длине массива options в структуре dhcpMessage. Надо бы увеличить.
Провайдер размахался с маршрутами, аж не влазят! :)