Я не думаю, що є остаточно правильна відповідь на ваше запитання. Натомість існує великий набір способів наблизитись до того, що ви бажаєте. Отже, я дам кілька підказок, як це зробити.
Якщо машина має більше двох інтерфейсів ( 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-адреси. Отже, в LAN не потрібно багато часу, щоб просто пропрасувати їх усі. Це дає вам статистичний підказку про те, де з вашої точки зору знаходиться більшість Інтернету. Однак ви повинні бути трохи розумнішими, ніж знаменитий https://de.wikipedia.org/wiki/SQL_Slammer
ICMP і навіть ARP - хороші джерела для інформації про бічну смугу мережі. Це може допомогти і вам.
Ви можете використовувати широкомовну адресу Ethernet для зв’язку з усіма вашими пристроями мережевої інфраструктури, які часто можуть допомогти, наприклад, DHCP (навіть DHCPv6) тощо.
Цей додатковий список, мабуть, нескінченний і завжди неповний, тому що кожен виробник мережевих пристроїв діловито вигадує нові отвори в безпеці щодо автоматичного виявлення власних пристроїв. Що часто дуже допомагає виявити якийсь публічний інтерфейс, де його не повинно бути.
'Нафф сказав. Вийшов.