Ubuntu как узнать dhcp

Обновлено: 02.07.2024

Как работает DHCP?

  • После загрузки подключенный к сети клиент (на котором настроено использование DHCP) отправляет DHCP-серверу пакет DHCPDISCOVER.
  • Получив пакет запроса DHCPDISCOVER, DHCP-сервер отвечает пакетом DHCPOFFER.
  • Клиент принимает пакет DHCPOFFER и отправляет серверу пакет DHCPREQUEST, подтверждая готовность принять сетевую конфигурацию, предоставленную в пакете.
  • Получив от клиента пакет DHCPREQUEST, сервер отправляет пакет DHCPACK, который разрешает клиенту использование выделенного IP-адреса.

В данном руководстве мы рассмотрим настройку DHCP-сервера в Ubuntu/Debian Linux, но большенство настроек будет работать и в других дистрибутивах. Для получения административных привилегий все команды будут выполняться через sudo.

Шаг 1: Установка DHCP-сервера

1. Для установки пакета DCHP-сервера, ранее известного как dhcp3-server, нужно выполнить следующую команду:

2. После завершения установки отредактируйте файл /etc/default/isc-dhcp-server для определения интерфейсов, которые будет использовать DHCPD для обработки DHCP-запросов, при помощи опции INTERFACES.

Например, если вам нужно, чтобы демон DHCPD прослушивал eth0, задайте следующее значение:

Для этого сетевого интерфейса нужно настроить статический IP-адрес.

Шаг 2: Настройка DHCP-сервера

  • параметры – указывают, как выполнять задание (например, на какое время выделять адрес), выполнять ли его вообще (например, выделять ли адреса неизвестным клиентам) или какие параметры сетевой конфигурации отправлять DHCP-клиенту.
  • декларации – определяют топологию сети, описывают клиентов и предоставляемые им адреса, или применяют группу параметров к группе деклараций.

4. Для определения настроек DHCP-сервера откроем и отредактируем файл конфигурации:

5. Теперь нужно указать подсеть, в нашем примере мы будем использовать DHCP в локальной сети 192.168.10.0/24.

Здесь мы использовали следующие параметры:

Шаг 3: Настройка статических IP-адресов для машин клиентов

6. Для выделения конкретным клиентам фиксированного (статического) IP-адреса нужно добавить в файл конфигурации секции следующего вида, где явно указаны MAC-адрес и статически выделяемый IP-адрес:

7. Запустим службу DHCP и установим ее автоматический запуск при загрузке:

8. Далее нужно создать правило для службы DHCP в брандмауэре (Демон DHCPD прослушивает UDP-порт 67):

Шаг 4: Настройка машин клиентов

9. Теперь можно настроить клиентские компьютеры в сети для автоматического получения IP-адресов от DHCP-сервера.

Отредактируйте файл конфигурации интерфейса Ethernet на клиентской машине (обратите внимание на имя/номер интерфейса):

Укажите следующие опции:

Сохраните и закройте файл, а затем перезапустите сетевые службы или перезагрузите систему:

Если все настроено правильно, клиентская машина должна автоматически получать IP-адреса от DHCP-сервера.

Настройка DHCP-сервера завершена. Более подробную информацию о dhcpd и dhcpd.conf с описанием всех возможных опций можно получить в соответствующих man-страницах:

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Доброго времени суток! Озадачили меня тут: надо проверить из программы (C++) работает ли dhcp или сеть сконфигурирована с постоянным адресом. Гуглеж дал лишь советы проверять leases в /var/lib/dhcpd/dhcpd.leases. Ubuntu 12.04,


Можно послать DHCPDISCOVER и найти таким образом DHCP-серверы.

Ещё можно узнать адрес сервера у NetworkManager, распарсив вывод команды:

($UUID — это UUID соединения).

Вместо запуска команды лучше получить нужную информацию напрямую через D-Bus.

gentoo_root ★★★★★ ( 22.11.12 22:56:13 )
Последнее исправление: gentoo_root 22.11.12 22:56:44 (всего исправлений: 1)


лучше получить нужную информацию напрямую через D-Bus

а вот с этого места поподробнее, пожалуйста.


А мне не надо настройки получать, нужно лишь определить наличие DHCP сервера.

А мне не надо настройки получать, нужно лишь определить наличие DHCP сервера.

  • На клиентской машине: определить, получены ли настройки по DHCP, или заданы локально.
  • На клиентской машине: определить, работает ли в локальной сети DHCP-сервер.
  • На сервере: определить, работает ли DHCP-сервер на этой же системе.

Что именно из этого тебе нужно?


На клиентской машине: определить, работает ли в локальной сети DHCP-сервер

Именно это. Пардон муа, что не оговорил сразу.

Почитай описание работы DHCP, посмотри снифером какие пакеты шлют dhcp-клиенты при поиске серверов и посмотри исходники dhcp-клиентов.

а вот с этого места поподробнее, пожалуйста.

Но если таки нужно определить наличие DHCP-сервера, а не факт его использования клиентом, но нужно посылать DHCPDISCOVER.


и наилучшие пожелания :)


Премного благодарен! Кажется, это то, что мне надо.

А вот я не уверен. Если таки нужно это:

На клиентской машине: определить, работает ли в локальной сети DHCP-сервер

то нужно посылать DHCPDISCOVER и ждать ответа.

Если же сгодится и это:

На клиентской машине: определить, получены ли настройки по DHCP, или заданы локально.

тогда действительно можно опрашивать NetworkManager.


А за помощь - спасибо. Я думаю, что смогу обойтись вариантом опроса NetworkManager.


думаю, что смогу обойтись вариантом опроса NetworkManager.

Не рекомендовал бы зацикливаться на NetworkManager'е, так как:
во-первых, существуют и другие менеджеры сети (например, wvdial),
во-вторых, сеть может работать и без менеджеров (в дебиане, например, может задаваться через /etc/network/interfaces).

Ну и в-третьих, даже если на этой машине стоит NetworkManager и настройки заданы вручную, в сети могут быть работоспособные dhcp-сервера.


Ибо уже по граблям прошел. NetworkManager работает, а файла сервиса нет. Придется искать другие пути. Кстати, там где надо определяться, в /etc/network/interfaces практически пусто. С чем еще посоветуете повозиться?


Погуглируй по слову DHCPDISCOVER как и советовали.

Т.е. тебе нужно посылать в сеть по протоколу UDP специально сформированный широковещательный запрос. И слушать ответы на 67/68 портах UDP.

Возможно, тебе придется изучить работу с udp-пакетами, а также формат запросов. А может быть тебе повезет, и найдешь готовую C++ библиотеку для работы с DHCP. Ищи ;-)



Читал, читаю и буду читать. Только давайте посмотрим на задачу с другой стороны. В /etc/network/interfaces нет адреса, заданного явно. NeworkManager работает, в сети есть dhcp-сервер. Можно ли узнать (и как), какой ip у машины? Пропала связь, через некоторое время восстановилась, какой адрес получен?


В /etc/network/interfaces нет адреса, заданного явно

Эммм. Почему-то ты всё время говоришь о файлах и о службах.
Мне кажется тебе нужно делать упор на системные функции из системных библиотек.

Работай через системные функции.

p.s. Сам пишу на Ruby, тут всё проще :)


Работай через системные функции.

есть вызов сетевых системных функций


тогда действительно можно опрашивать NetworkManager.

Которого вполне может не быть


вообще-то коррелирует - если DHCP есть, то клиент от него получает IP, а если его нет, то использует свой IP из своих настроек. Конечно IRL возможны варианты.

Вот в этом и есть одна из проблем линукса — существует куча велосипедов, делающих одно и то же и конфликтующих друг с другом, и на компьютере пользователя запущен абсолютно произвольный набор программ, одинаковое будет только ядро. Как новой программе взаимодействовать с этим всем зоопарком, непонятно, потому что недостаточно стандартизированы уровни абстракции. Было бы гораздо лучше, если бы такие уровни абстракции существовали. Например, где-то был бы описан стандарт, каким должен быть API, через который настраивается сеть. Тогда программы, которым необходимо получить или изменить какие-либо настройки, связанные с сетью, использовали бы только этот API, а программа, делающая настройки сети, вызывая методы ядра, предоставляла бы этот API, и было бы гораздо проще разрабатывать программы. Но сейчас таких стандартов нет, есть только попытки создания подобных API (одна их этих попыток — NetworkManager, пример конкурирующих разных API для одной цели — logind и ConsoleKit). Конечно, есть небольшое число стандартизированных вещей (например, стандарты xdg и freedesktop), но они необязательны и их недостаточно. И одна из причин этого — свободное ПО, для которого очень трудно сделать такие стандарты, потому что тот, кто не захочет им подчиняться, может форкнуть проект и забить на эти стандарты (пример этому — два недавно появившихся форка udev), и это очень сильно тормозит развитие линукса.


где этот самый DHCP хранит полученный от сервера ip?

если DHCP есть, то клиент от него получает IP

Клиент не обязан получать адрес от DHCP, даже если в сети работает DHCP-сервер.

а если его нет, то использует свой IP из своих настроек

Динамический IPv4-адрес можно получить и без DHCP, например link local 169.254.0.0/16.

И, к тому же, адреса, выдаваемые по DHCP, не обязаны быть динамическими, они могут быть и жёстко завязаны на конкретных клиентов.

где этот самый DHCP хранит полученный от сервера ip?

Deleted ( 24.11.12 23:19:59 )
Последнее исправление: Deleted 24.11.12 23:20:24 (всего исправлений: 1)


зачем формировать DHCP запрос самостоятельно, если можно вызвать уже имеющуюся в системе программу-DHCP-клиент?


где этот самый DHCP хранит полученный от сервера ip?

зачем его где-то хранить? Он устанавливается при настройке интерфейса, у меня это делает /sbin/dhcpcd, ну а посмотреть его можно ip a или ifconfig.


Клиент не обязан получать адрес от DHCP, даже если в сети работает DHCP-сервер.

не обязан. А кто говорит, что обязан? Но на кой хрен ставить в сети DHCP сервер(ы), а потом статически прописывать IP?

Динамический IPv4-адрес можно получить и без DHCP, например link local 169.254.0.0/16.

И, к тому же, адреса, выдаваемые по DHCP, не обязаны быть динамическими, они могут быть и жёстко завязаны на конкретных клиентов.

я в курсе. Могут и не жёстко. dhcpd можно настроить так, что-бы он выдавал клиенту последний его IP, если это возможно. На практике это приводит к тому, что IP очень редко меняется, и почти постоянный (постоянный, если клиентов не очень много, и IP адресов всегда и на всех хватает. Если клиентов больше 64K, а пул в 64К, то очевидно, возникнет момент, когда 65536у клиенту придётся выдать чужой IP из пула.) К сожалению у нас ISP с эти не заморачиваются.


Озадачили меня тут: надо проверить из программы (C++) работает ли dhcp или сеть сконфигурирована с постоянным адресом.

кстати, а как же /var/log/message?

очевидно, у меня dhcp есть. и оно работает (адрес кстати жёстко привязан к MAC, и никогда не меняется)

Но на кой хрен ставить в сети DHCP сервер(ы), а потом статически прописывать IP?

Совершенно типичная ситуация: DHCP только для клиентских машин.

А вообще, автор судя по всему сам не знает что он хочет и зачем ему это надо. То ему надо определить, что адрес получен по DHCP, то ему надо определить, что в сети работает DHCP-сервер.


Совершенно типичная ситуация: DHCP только для клиентских машин.

Настройка сетевого подключения это важнейший шаг при работе с Ubuntu, который может вызвать у новичка много вопросов.

В этой статье вы можете найти ответы на некоторые из них.

nmcli

nmcli conn show

Чтобы получить список интерфейсов нужно воспользоваться командой

На выходе будет что-то похожее на

Раньше интерфейсы назывались eth0, eth1 и так далее, сейчас у них более разнообразные названия.

1: Первый интерфейс это lo он направлен на локальную машину и имеет IP 127.0.0.1/8

2: Второй интерфейс enp3s0 это моё поключение к по Ethernet к другому ПК.

В этом примере компьютер с Ubuntu(1) соединён с компьютером с Windows (2) напрямую через Ethernet кабель

Через это подключение я захожу на комп номер 1 по SSH.

Как настроить этот IP читайте дальше

3: Третий интефейс wlp1s0 это подключение к местному Wi-Fi от мобильного телефона. IP получен динамически 192.168.43.4/24

Если нужно получать ip автоматически

iface eth0 inet dhcp

Статический IP

Сперва нужно узнать имена интерфейсов

Далее можно воспользоваться утилитой ip либо настроить через netplan

netplan

Нужно зайти в директорию

и посмотреть как называется файл с настройками

Отредактируем файл 01-network-manager-all.yaml

sudo vi 01-network-manager-all.yaml

Самое главное - это следить за отступами. Например, - перед IP должна быть ровно под второй буквой d в слове addresses.

Делать отступы нужно пробелом, не табуляцией

network: version: 2 renderer: networkd ethernets: ens32: addresses: - 172.16.120.74/16 nameservers: addresses: [127.0.0.53, 172.16.1.5]

nameservers: нужны не всегда, можете сперва их не указывать и посмотреть всё ли вас устраивает.

Применить новые настройки можно командой

sudo netplan apply

Проверить результат можно выполнив снова ip a

1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: enp3s0:
mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 30:f9:ed:d9:ea:d3 brd ff:ff:ff:ff:ff:ff inet 192.0.2.131/24 brd 192.0.2.255 scope global enp3s0 valid_lft forever preferred_lft forever 3: wlp1s0:
mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether b8:76:3f:f5:c4:1f brd ff:ff:ff:ff:ff:ff inet 192.168.43.4/24 brd 192.168.43.255 scope global dynamic noprefixroute wlp1s0 valid_lft 2822sec preferred_lft 2822sec inet6 fe80::4deb:2d14:d1e8:8c7f/64 scope link noprefixroute valid_lft forever preferred_lft forever

ВКЛЮЧИТЬ интерфейс enp0s25:

ip link set dev enp0s25 up

ВЫКЛЮЧИТЬ интерфейс enp0s25:

ip link set dev enp0s25 down

Изменить Gateway

Удаление старого gateway

route delete default

Добавление нового gateway

route add default gw IP_Address

Если старых gateway много, то нужно указать какой конкретно IP с какого интерфейса удалить

route delete default gw 10.0.0.1 eth0

Для создания тоже можно указать конкретные данные

route add default gw 192.168.0.1 eth0

Изменить netmask

Что такое netmask или маска подсети вы можете узнать в статье «Компьютерные сети»

Узнать свою маску

Прослушиваемые порты

Утилита lsof позволяет посмотреть все открытые в системе соединения.

Чтобы изучить именно сетевые соединения воспользуйтесь опцией i

Чтобы отображались именно порты, а не названия сетевых служб примените опцию P

На вопрос как посмотреть список открытых портов также может ответить утилита ss

Если нужно проверить используется ли определённый порт, например 5000

ss -na | grep :5000

Если вывод пуст, значит порт не используется

Чтобы узнать какая программа слушает определённый порт нужно предварительно установить один из инструментов:

netstat, fuser или lsof

Начнём с netstat

Netstat

sudo apt install net-tools

С помощью команды netstat можно посмотреть список активных соединений по сети

Обычно netstat используют с набором опций tulpn который и позволяет понять какая программа слушает какой порт.

(Not all processes could be identified, non-owned process info will not be shown, you would have to be root to see it all.) Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN - tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN - tcp 0 0 127.0.0.1:6010 0.0.0.0:* LISTEN - tcp 0 0 127.0.0.1:6011 0.0.0.0:* LISTEN - tcp6 0 0 . 22 . * LISTEN - tcp6 0 0 ::1:631 . * LISTEN - tcp6 0 0 ::1:6010 . * LISTEN - tcp6 0 0 ::1:6011 . * LISTEN - tcp6 0 0 . 80 . * LISTEN - udp 0 0 0.0.0.0:52756 0.0.0.0:* - udp 0 0 0.0.0.0:68 0.0.0.0:* - udp 0 0 0.0.0.0:631 0.0.0.0:* - udp 0 0 0.0.0.0:5353 0.0.0.0:* - udp6 0 0 . 45815 . * - udp6 0 0 . 5353 . * -

rsyslog

За этот лог отвечает rsyslog поэтому нужно сперва проверить установлена ли эта служба. Если нет - установите командой

apt-get install rsyslog

service start rsyslog

Остановить, перезапустить и проверить статус можно командами

service stop rsyslog service restart rsyslog service status rsyslog

Чтобы подключиться к удалённой машине по SSH нужно, например, знать IP машины, имя пользователя, пароль

Если вы подключаетесь впервые, то получите предупреждение

Это предупреждение отображается, потому что в файле known_hosts , отвечающем за ивестные хосты нет записи о 192.168.0.2

Файл known_hosts находится в директории

Он содержит строки такого вида:

|1|abcdefghijklmnopqrstuvwxyz1=|abcdefghijklmnopqrstuvwxyz1= ecdsa-sha2-nistp256 ABCDEFGHJKLMNOPQRSTUVWXYZABCDEFGHJKLMNOPQRSTUVWXYZABCDEFGHJKLMNOP+ABCDEFGHJKLMNOPQRS/ABCDEFGHJKLMNOPQRSTUVWXYZABCDEFGHJKLMNOPQRSTUVWXYZABCD=

Зачастую в больших сетях для упрощения работы с добавлением новых компьютеров и других устройств в сеть используют протокол динамического выделения адресов — DHCP. Это значительно упрощает настройку оборудования и экономит огромное количество времени. Используя DHCP нам не нужно производить настройку сети на каждом отдельном устройстве, нужно лишь подключить устройство к сети и DHCP сервер сделает все настройки автоматически. Каждый домашний WiFi роутер имеет в себе встроенный DHCP сервер, поэтому вам не нужно каждый раз при подключении к разным роутерам прописывать все настройки вручную, роутер делает это за вас.

  • Адрес ip;
  • Маску подсети;
  • IP адрес шлюза;
  • IP адрес DNS сервера;
  • Имя хоста;
  • Имя домена;
  • Адрес серверов времени(NTP);

Установка и настройка DHCP сервера

В Ubuntu установка и настройка DHCP сервера выполняется всего в несколько шагов, быстро и продуктивно. Для того, чтобы начать использовать сервер нужно установить программное обеспечение на компьютер, делается это при помощи команды:

Минимальная настройка DHCP сервера включает в себя редактирование только 2х файлов.

Первый файл который мы с вами отредактируем, это nano /etc/default/isc-dhcp-server и добавляем/редактируем всего одну строку: где «eth3» интерфейс к которому подключаются клиенты с внутренней сети и который будет слушать DHCP;

Теперь собственно и сама настройка DHCP сервера. Открываем файл nano /etc/dhcp/dhcpd.conf и удаляем все содержимое.
Сейчас мы с вами настроим сервер только для раздачи адресов всем устройствам, которые будут запрашивать у сервера адрес. Добавляем в файл строки:

  • default-lease-time — время аренды(в секундах) адреса у сервера, если клиент не запросил другое;
  • max-lease-time — максимальное время аренды адреса;
  • subnet — описывает сеть ip и её маску;
  • range — диапазон адресов с которых по запросу клиента будут предоставляться адреса;
  • optionrouters — адрес роутера. Это должен быть адрес интерфейса через который пользователи попадают в интернет.
  • optiondomain-name-servers — адрес DNS сервера. Указывает на то, что сервер расположен на этом же компьютере и слушает интерфейс с адресом 192.168.0.1
  • /etc/ init . d / isc - dhcp - server start — запуск сервера;
  • /etc/ init . d / isc - dhcp - server stop — остановка сервера;
  • /etc/ init . d / isc - dhcp - server restart — перезапуск сервера;

Если у вас возникнут вопросы по настройке или установке оставляйте ваши комментарии.

Читайте также: