При загрузке, как я могу переключиться на статический IP на основе IP шлюза, предоставленного DHCP?

241
bernz

У меня есть «безголовый» * хост NIX - назовем его «foo», который должен быть доступен через SSH и VNC-tunneled-over-SSH в произвольной частной локальной сети 192.168.xy / 24. Иногда я хочу физически переместить 'foo' из одной локальной сети в другую, так что 'x' зависит от локальной сети, и я хочу, чтобы 'y' был постоянным, с упорядоченным списком альтернатив для обработки конфликта распределения.

Поэтому, хотя мне нужен статический адрес (для цели с SSH), мне также нужно, чтобы он был динамическим (чтобы соответствовать подсети локальной сети, к которой он был подключен).

Да, некоторые маршрутизаторы допускают «особый соус», такой как резервирование DHCP или дополнительную конфигурацию маршрутизации, но допустим, что у меня нет доступа к маршрутизатору, но я могу ожидать, что он предоставит DHCP.

Итак, если бы я делал это вручную, я бы настроил 'foo' на использование DHCP при загрузке, и как только я получу оболочку, я могу посмотреть на адрес шлюза, чтобы выяснить мою подсеть, 192.168.x.0, где «х» - это то, что меняется от одной локальной сети к другой; затем я отредактировал бы / etc / network / interfaces (или эквивалентный), чтобы переключиться с DHCP на статический, синтезируя адрес из 'x' и константу 'y' (сначала пингуя 192.168.xy, чтобы проверить, занят ли он, и если так выбрав следующий «y» из списка предопределенных вариантов, поэтому в менее оптимальных ситуациях мне может понадобиться попробовать несколько адресов при запуске SSH), а затем перезапустить сетевой сервис.

Более хитрым вариантом будет локальная сеть без DHCP; в этом случае подсеть, вероятно, можно было бы определить путем выборки трафика локальной сети.

Если такая настройка может быть автоматизирована, то 'foo' может быть просто подключен к произвольной локальной сети и загружен, и будет хороший шанс найти его IP-адрес с первой попытки.

Есть ли какие-нибудь умные способы сделать то, что я после?

Помните, что вся конфигурация должна выполняться на хосте 'foo', и единственное предположение, которое можно сделать относительно целевой ЛВС, к которой он подключен, заключается в том, что он использует частную подсеть 192.168.xy / 24.

2
вам придется оставить его как DHCP. и запустите скрипт для анализа предоставленного шлюза, а затем измените адрес. самая сложная часть будет заключаться в том, чтобы установить его обратно на DHCP для следующей загрузки, иначе все будет разобрано. Сам скрипт будет зависеть от ОС. довольно легко изменить файл / etc / network / interfaces и перезапустить сетевой сервис на linux из скрипта, а в Windows есть netsh и WMI, которые могут это сделать. Frank Thomas 9 лет назад 0
Фрэнк, верно, это * NIX-only, я отредактировал вопрос, чтобы отразить это. Но да, похоже, я должен приготовить свое собственное решение; Я думал, что уже может быть инструмент, чтобы сделать что-то подобное. Есть ли способ заставить '/ etc / network / interfaces' запускаться из "шаблона" (поэтому он всегда загружается с DHCP) ...? bernz 9 лет назад 0
не забывайте, когда вы подключаете это ... хм, скажем, "скрывающееся" устройство ... в ... ах, "чужую" сеть, ваше предположение о диапазоне IP 192.168 неадекватно. это может быть 10, 10.1, 10.0.1, ... вы получите дрейф. Однако это не сложнее, чем ваш пример. Daniel 9 лет назад 0
@bernz ... PM мне, если вы хотите, чтобы я написал этот сценарий для вас. Daniel 9 лет назад 0
Спасибо Даниэль, согласился. В моем случае это RasPi, который я хочу перетащить между домом и работой - не для чего-то гнусного, заметьте ;-) - и обе сети используют частные подсети 192.168.xy. @ Даниил, извините, я здесь в режиме новичка ... похоже, что для StackExchange нет функции PM ... если вы не возражаете опубликовать сценарий здесь, это будет оценено. :-) bernz 9 лет назад 0
Я напишу это, когда вернусь домой сегодня вечером. Daniel 9 лет назад 0

1 ответ на вопрос

1
Daniel

Some bugs probably, but should be enough to do what's needed.

run as root.


#!/bin/bash ARPCOUNT=10 LOCALNET=`route | grep default | awk '' | cut -f1-3 -d'.'` NETMASK=`route | grep default | awk ''` DEVICE=`route | grep default | awk ''` for ((xval=100; xval<254; xval++ )) ; do CURIP=$LOCALNET.$xval arping -c $ARPCOUNT $CURIP > /dev/null ARPRESULT=$? if ! [ $ARPRESULT ] ; then echo "No IP found at $CURIP." else route ifconfig $DEVICE down ifconfig $DEVICE $LOCALNET.$xval netmask $NETMASK ifconfig $DEVICE up route echo "Changed to IP $CURIP." exit fi done 
Спасибо, это похоже на отличное начало; Я буду учиться и взламывать его, пока он не будет работать для моего устройства. bernz 9 лет назад 0