Физические и виртуальные сетевые интерфейсы с одинаковым MAC. Является ли это возможным?
Прежде всего, я новичок в сети, поэтому, возможно, где-то есть ответ на мой вопрос, но я не смог найти ответ.
Ну, у меня много устройств с подключением к Интернету. Я хочу объединить их всех в одну сеть, используя технологии VPN. Я использую tinc-vpn для решения своих задач и хочу использовать DHCP для настройки своей сети.
Проблема здесь: я успешно настроил DHCP-сервер, и он хорошо обслуживает все подключенные устройства, но когда я перезагружаю устройство, он получает новый адрес от DHCP.
Как я понимаю, когда устройство подключается к сети, оно отправляет специальный запрос на вещание в сеть, содержащую MAC устройства. DHCP обрабатывает запрос и отправляет ответ с конфигурацией сети обратно на устройство. Что ж, ifconfig
Запустите виртуальный интерфейс для VPN на устройстве и назначьте ему случайный MAC-адрес. Вот почему я всегда получаю случайный IP. Я думаю, если я спрошу ifconfig
назначить MAC-адрес физической сети для виртуального интерфейса, я решу свою проблему. Является ли это возможным? Если нет, то как я могу решить мою проблему? Я не стал бы беспокоиться об этом, если бы пул IP-адресов DHCP был очень большим, но он обслуживал только 250 устройств, и устройство очень часто отключалось.
Заранее спасибо.
3 ответа
Еще один.
Я обнаружил проблему, почему я не могу получить конфигурации с моего DHCP на устройстве, когда соединение установлено. Причина в том, что tinc-up
или другие сценарии, которые tinc
выполняется после создания туннеля синхронно со службами tinc, и мой клиент dhcp завершается по таймауту до tinc
сделать рукопожатие.
Чтобы решить эту проблему, я запускаю клиент dhcp в фоновом режиме внутри tinc-up
скрипт.
tinc-up
скрипт теперь выглядит так:
#!/bin/sh
ifconfig $INTERFACE hw ether fe:fd:00:00:00:00 # set interface hw address to get same IP from leases every time, connection established
dhcpcd -w $INTERFACE & # start dhcp client parralel with handshake proccess of tinc
Спасибо всем за ответ.
Я думаю, что нашел отличное решение, без DHCP. Он основан на вычислении уникального статического IP-адреса с использованием физического MAC-адреса устройства.
В моем решении я буду использовать подсеть /16 (10.1.0.0, например). Итак, для всех устройств я должен рассчитать последние 2 октета IP. Для своих расчетов я использую хеш-функцию CRC-16 на реальном MAC-адресе устройства. В результате я получу 2-байтовое целое число, которое содержит октеты IP-адреса.
Пример. MAC-адрес устройства 22-23-B2-72-99-3A. CRC-16 MAC будет 0x2e49. 0x2e == 46 и 0x49 = 73, поэтому IP-адрес устройства будет 10.1.46.73.
Плюсы:
- Нет DHCP;
- Уже известен постоянный и уникальный IP-адрес устройства для всех сетей.
Минусы:
- Столкновения CRC-16 для MAC (два устройства в одной подсети с одинаковым IP, но с разными MAC). Но вероятность ситуации ничтожна, я думаю.
Любые предложения и критика приветствуются.
Чтобы ответить на заголовок: можно установить один и тот же MAC-адрес на двух интерфейсах, но это может привести к некоторым проблемам в сети или просто неожиданному поведению.
Есть четыре способа (я знаю), чтобы решить вашу проблему:
- В соответствии с предложением: зарезервируйте IP-адрес на DHCP-сервере для определенного имени хоста.
- После создания виртуального сетевого устройства назначьте ему определенный MAC-адрес. В Linux это можно автоматизировать с помощью скрипта.
- Запросите определенный IP-адрес с вашим клиентом DHCP. Чтобы сделать это надежным, вы должны сделать длительность аренды DHCP довольно короткой (например, 5 минут или 1 час, в зависимости от частоты входа в vpn), чтобы запрошенный IP-адрес все еще не был занят активной арендой.
- Поскольку ваш VPN-шлюз вряд ли будет часто меняться, вы можете использовать статическую настройку IP. Вы хотите, чтобы IP всегда - зачем тогда DHCP? Уменьшите диапазон IP-адресов DHCP и используйте часть освобожденного пространства для статических IP-адресов...
Редактировать:
Таким образом, скрипт запускается несколько раз для автоматизации создания новых устройств. В этом случае вы можете вычислить IP (или MAC) из имени устройства. Пример:
PREFIX='tap'
DEV_NUM=${INTERFACE#$PREFIX}
# it's good idea to increment, because devices usually number from 0
# and ip ending with .0 and .1 generally shouldn't be used by a client
DEV_NUM=$(($DEV_NUM+2))
ifconfig ${INTERFACE} 10.0.1.${DEV_NUM} netmask 255.255.0.0
MAC_NUM=`printf "%02d\n" ${DEV_NUM}`
ip link set dev ${INTERFACE} address ba:df:ace:00:00:${MAC_NUM}
Или сохраните файл с назначением IP имени устройства. Пример:
ADDRESS_MAP='/etc/vpn-ip-mapping.conf'
while IFS='='; read -ra line; do
if [ "${line[0]}" == "${INTERFACE}" ]; then
IP_ADDRESS=${line[1]}
ifconfig ${INTERFACE} ${IP_ADDRESS} netmask 255.255.0.0
break
fi
done < ${ADDRESS_MAP}