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