Чтение Linux gre [tap] локальный / удаленный адрес

С iproute2 в Linux интерфейсы gre / gretap настраиваются с помощью ip link add , что для GRE требует удаленного и необязательно локальные атрибуты, определяющие конечные точки. Однако я не могу найти способ прочитать эти атрибуты. ip link show не показывает их, и, похоже, они не представлены нигде в структурах данных, возвращаемых функцией C getifaddrs (например, если я хотел реализовать свой собственный инструмент для их получения). Я работаю в среде, где существует очень большое количество таких интерфейсов, и мне нужно найти тот, который связан с определенным удаленным адресом. Есть ли способ сделать это, не сохраняя отображение где-нибудь вне диапазона?

2
задан 26 November 2020 в 04:54
1 ответ

Чтобы получить всю информацию с интерфейса, вы можете использовать опцию ip -details:

-d, -details

    Вывод более подробной информации.

# ip link add name gretaptest type gretap remote 192.0.2.1 local 192.0.2.2
# ip -details link show dev gretaptest
49: gretaptest@NONE: <BROADCAST,MULTICAST> mtu 1462 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether 5e:1d:10:f9:05:f9 brd ff:ff:ff:ff:ff:ff promiscuity 0 minmtu 68 maxmtu 0 
    gretap remote 192.0.2.1 local 192.0.2.2 ttl inherit erspan_ver 0 addrgenmode eui64 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535 

Если вы хотите использовать это в сценариях, вам действительно следует использовать -json вместе с инструментом jq .Очень простой пример (без какой-либо проверки):

# ip -json -details link show dev gretaptest | jq '.[].linkinfo.info_data | .remote, .local'
"192.0.2.1"
"192.0.2.2"

Если вы хотите реализовать это непосредственно в своих инструментах, используя доступные системные вызовы и функции, вы должны начать с просмотра здесь:

  • rtnetlink (7) - Linux Сокет маршрутизации IPv4 (это намного больше, чем просто IPv4)

    для интерфейсов это, вероятно, RTM_GETLINK

  • rtnetlink (3) - макросы для управления сообщениями rtnetlink

Вы можете запустить strace на команду ip, чтобы просто увидеть, какие системные вызовы и структуры используются.

Некоторая документация, найденная вокруг:

networking:generic_netlink_howto

Существуют также библиотеки более высокого уровня, такие как libnl.

4
ответ дан 26 November 2020 в 23:41

Теги

Похожие вопросы