Linux: из C кода, как определить, какой интерфейс eth обращается к WAN? - PullRequest
0 голосов
/ 26 апреля 2020

Среда: C код, Linux

Что: Я хотел бы открыть порт на маршрутизаторе, используя UPNP для протокола S SH. Я знаю, как это сделать с помощью библиотеки miniupnp c. Я могу отправить запрос UPNP, и этот запрос состоит из: Внешний порт для перенаправления с Внутреннего порта для перенаправления на Внутренний адрес машины, принимающий S SH traffi c.

Проблема: В случае внутреннего компьютера имеет несколько интерфейсов eth, как мне найти подходящий?

Например: скажем, у меня есть:

eth0, address 10.10.10.1 [WAN connection]
eth1, address 20.20.20.1 [No WAN connection]

eth0 - это интерфейс, подключенный к маршрутизатору и имеющий доступ к глобальной сети. Eth1 - это интерфейс, подключенный к внутренней сети, не имеющий доступа к WAN.

Когда отправленный запрос UPNP должен содержать:

External port: 2222
Internal port: 22
Local machine address: 10.10.10.1 [eth0]

Вопрос:

Как из C кода я могу определить, какой интерфейс обращается к WAN? Я не должен запускать внешний скрипт, только код C. Использование внешней библиотеки в порядке.

1 Ответ

2 голосов
/ 26 апреля 2020

Полагаю, вам нужно определить, какой интерфейс назначил шлюз по умолчанию (только для нулей), прочитав содержимое / proc / net / route, или то же самое можно сделать с помощью интерфейса netlink.

Возможно, вы захотите использовать гнездо (AF_NETLINK, SOCK_RAW, NETLINK_ROUTE) с запросом типа RTM_GETROUTE. Хороший и полный пример можно найти по адресу: блог Олега . Код может быть как-то сокращен с помощью libnl . Некоторые подробности также можно найти на веб-сайте linuxfoundation .

...