Я не думаю, что есть правильный ответ на ваш вопрос. Вместо этого есть множество способов как приблизиться к тому, что вы хотите. Поэтому я дам несколько советов, как это сделать.
Если машина имеет более 2 интерфейсов (lo
считается одним), у вас будут проблемы с автоматическим определением правильного интерфейса. Вот несколько рецептов, как это сделать.
Проблема, например, заключается в том, что хосты находятся в DMZ за брандмауэром NAT, который изменяет публичный IP на какой-то частный IP и пересылает запросы. Ваша машина может иметь 10 интерфейсов, но только один соответствует общедоступному.
Даже автоопределение не работает, если вы используете двойной NAT, где ваш брандмауэр даже переводит исходный IP в нечто совершенно иное. Так что вы даже не можете быть уверены, что маршрут по умолчанию ведет к вашему интерфейсу с открытым интерфейсом.
Обнаружение по маршруту по умолчанию
Это мой рекомендуемый способ автоматического определения вещей
Что-то вроде ip r get 1.1.1.1
обычно говорит вам интерфейс, который имеет маршрут по умолчанию.
Если вы хотите воссоздать это на своем любимом языке сценариев / программирования, используйте strace ip r get 1.1.1.1
и следуйте по дороге из желтого кирпича.
Установите его с помощью /etc/hosts
Это моя рекомендация, если вы хотите сохранить контроль
Вы можете создать запись в /etc/hosts
как
80.190.1.3 publicinterfaceip
Затем вы можете использовать этот псевдоним publicinterfaceip
для ссылки на ваш публичный интерфейс.
К сожалению haproxy
не использует этот трюк с IPv6
Использование окружающей среды
Это хороший обходной путь для /etc/hosts
, если вы не root
То же, что и /etc/hosts
. но используйте для этого окружающую среду. Вы можете попробовать /etc/profile
или ~/.profile
для этого.
Следовательно, если вашей программе нужна переменная MYPUBLICIP
, вы можете включить в нее такой код (это C, не стесняйтесь создавать из него C ++):
#define MYPUBLICIPENVVAR "MYPUBLICIP"
const char *mypublicip = getenv(MYPUBLICIPENVVAR);
if (!mypublicip) { fprintf(stderr, "please set environment variable %s\n", MYPUBLICIPENVVAR); exit(3); }
Итак, вы можете назвать свой скрипт / программу /path/to/your/script
вот так
MYPUBLICIP=80.190.1.3 /path/to/your/script
это даже работает в crontab
.
Перечислите все интерфейсы и исключите те, которые вам не нужны
Отчаянный путь, если вы не можете использовать ip
Если вы знаете, чего не хотите, вы можете перечислить все интерфейсы и игнорировать все ложные.
Здесь, кажется, уже есть ответ https://stackoverflow.com/a/265978/490291 для этого подхода.
Делай как DLNA
Путь пьяного человека, который пытается утопиться в алкоголе
Вы можете попытаться перечислить все шлюзы UPnP в вашей сети и таким образом найти правильный маршрут для некоторой «внешней» вещи. Это может быть даже маршрут, на который маршрут по умолчанию не указывает.
Подробнее об этом, возможно, см. https://en.wikipedia.org/wiki/Internet_Gateway_Device_Protocol
Это дает хорошее представление о том, какой из них является вашим общедоступным интерфейсом, даже если ваш маршрут по умолчанию указывает в другом месте.
Есть еще больше
Где гора встречает пророка
Маршрутизаторы IPv6 объявляют себя, чтобы дать вам правильный префикс IPv6. Просмотр префикса дает подсказку о том, имеет ли он внутренний или глобальный IP-адрес.
Вы можете прослушивать кадры IGMP или IBGP, чтобы найти подходящий шлюз.
Существует менее 2 ^ 32 IP-адресов. Следовательно, в локальной сети не требуется много времени, чтобы просто пропинговать их всех. Это дает вам статистическую подсказку о том, где находится большая часть Интернета с вашей точки зрения. Однако вы должны быть немного более разумным, чем знаменитый https://de.wikipedia.org/wiki/SQL_Slammer
ICMP и даже ARP являются хорошими источниками информации о боковой полосе сети. Это может помочь вам.
Вы можете использовать широковещательный адрес Ethernet для связи со всеми устройствами сетевой инфраструктуры, которые часто выручают, такими как DHCP (даже DHCPv6) и т. Д.
Этот дополнительный список, вероятно, бесконечен и всегда неполон, потому что каждый производитель сетевых устройств активно изобретает новые дыры в безопасности, связанные с автоматическим обнаружением их собственных устройств. Что часто очень помогает в обнаружении публичного интерфейса там, где его нет.
'Нуфф сказал. Out.