Определить, через какой интерфейс проходит трафик к IP-адресу

Определить, через какой интерфейс проходит трафик к IP-адресу

Я создаю скрипт, и мне нужно определить, в каком интерфейсе проходит трафик IP. Это потому, что в архитектуре IP-адрес обслуживается только для одного из четырех сетевых адаптеров, но может быть любым из этих четырех.

Ручной способ, который я использовал, — запуск tcpdump: если я вижу пакеты, то это тот интерфейс; если нет, отменяю tcpdump и запускаю еще один tcpdump на другом интерфейсе.

Я использую FreeBSD.

решение1

Вызовroute get.

route get 192.0.2.42 | awk '$1 ~ /interface/ {print $2}'

решение2

netstat -tauпоказывает вам локальный адрес и порт, используемые программой. Каждый интерфейс имеет свой собственный адрес, за исключением случаев, таких как связывание... Это та информация, которая вам нужна?

Если это так, то его легко grepиспользовать cutв скрипте.

Например: netstat -taunpe | grep firefox | awk '{print $4}' | cut -d ':' -f 1 извлекает локальный адрес, используемый соединениями, установленными «firefox».

решение3

Я не уверен насчет *BSD, но в Linux route -nсообщает (помимо прочего) флаги (вероятно, вам следует поискать строку, которая отмечена как маршрут по умолчанию) и имя устройства:

$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.100.63.254   0.0.0.0         UG    0      0        0 eth0
10.100.0.0      0.0.0.0         255.255.192.0   U     0      0        0 eth0
127.0.0.0       0.0.0.0         255.0.0.0       U     0      0        0 lo
169.254.0.0     0.0.0.0         255.255.0.0     U     0      0        0 eth0

или:

$ ip route
default via 10.100.63.254 dev eth0 
10.100.0.0/18 dev eth0  proto kernel  scope link  src 10.100.12.38 
127.0.0.0/8 dev lo  scope link 
169.254.0.0/16 dev eth0  scope link

Связанный контент