(возможно, вам придется установить пакет ip
на openwrt (v12 / регулировка ориентации)
ifconfig / netstat и т.д. считаются устаревшими , поэтому вы должны использовать (как root)
ss -nlput | grep sshd
показать сокеты TCP / UDP, на которых sshd
слушает работающая программа, содержащая строку
-n
нет порта для разрешения имени
-l
только прослушивающие розетки
-p
показать процессы прослушивания
-u
показать сокеты udp
-t
показать сокеты tcp
Затем вы получаете список, как этот:
tcp LISTEN 0 128 *:22 *:* users:(("sshd",3907,4))
tcp LISTEN 0 128 :::22 :::* users:(("sshd",3907,3))
tcp LISTEN 0 128 127.0.0.1:6010 *:* users:(("sshd",4818,9))
tcp LISTEN 0 128 ::1:6010 :::* users:(("sshd",4818,8))
интересным является 5-й столбец, который показывает комбинацию IP-адреса и порта:
*:22
прослушивать порт 22 на каждом доступном IPv4-адресе
:::22
прослушивать порт 22 на каждом доступном IP-адресе (я не пишу IPv6, так как IP - это IPv6 для RFC 6540 )
127.0.0.1:6010
прослушивание IPv4-адреса 127.0.0.1 (localhost / loopback) и порта 6010
::1:6010
прослушивать IP-адрес :: 1 (0: 0: 0: 0: 0: 0: 0: 1 в полной нотации, а также localhost / loopback) и порт 6010
Затем вы хотите узнать, какие интерфейсы имеют адрес IPv4 (для покрытия 1.)
ip -4 a
# or "ip -4 address"
# or "ip -4 address show"
или IP-адрес (для покрытия 2.)
ip -6 a
# or "ip -6 address
# or "ip -6 address show
(если вы не добавите опцию для IP ( -6
) или IPv4 ( -4
), оба будут показаны)
Вы также можете посмотреть, что вывод и поиск, например, 127.0.0.1
или любой другой IP / IPv4-адрес
# here a demo where i show all addresses of the device "lo" (loopback)
ip a show dev lo
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
Строки, начинающиеся с inet
и inet6
показывающие, что эти IP-адреса привязаны к этому интерфейсу, могут иметь много таких строк на интерфейс:
he-ipv6: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1480 qdisc noqueue state UNKNOWN
link/sit 192.0.2.1 peer 192.0.2.3
inet6 2001:db8:12::1/64 scope global
valid_lft forever preferred_lft forever
inet6 2001:db8::2/64 scope global
valid_lft forever preferred_lft forever
inet6 fe80::1111:1111/128 scope link
valid_lft forever preferred_lft forever
и в скрипте:
address="127.0.0.1"
for i in $(grep ':' /proc/net/dev | cut -d ':' -f 1 | tr -d ' ') ; do
if $(ip address show dev $i | grep -q "${address}") ; then
echo "${address} found on interface ${i}"
fi
done
(заменить "127.0.0.1")
Используя
lsof
(как root):iproute2
«sss
может сделать это, тоже (как корень):... и, наконец,
netstat
(как root):источник
*:ssh
или0.0.0.0:22
означает, что он прослушивает подстановочный интерфейс (т. Е. Все они). Что-то вродеhost-eth1:ssh
или10.0.0.4:22
означает, что он слушает на этом конкретном интерфейсе192.168.1.5
илиa.lan
в вашем вопросе). Если*
в этом месте есть, то он прослушивает все интерфейсы (*:ssh
в ответе sr_).Насколько я знаю, вы не можете (за исключением систем BSD, где решение Finkregh работает отлично). Это может быть возможно, но вам все равно, потому что большинство приложений прослушивают каждый интерфейс, даже если он привязан к IP-адресу.
В linux (и openwrt) единственный способ для приложения прослушивать только определенный интерфейс - это
SO_BINDTODEVICE
опция сокета. Мало кто из приложений на самом деле поддерживает это, так как это зависит от конкретной ОС. Это, или они используют сокет пакета, но это для протоколов низкого уровня (таких как серверы DHCP).В linux, который использует модель слабого хоста, каждое приложение по умолчанию прослушивает все интерфейсы, даже когда привязывает сокет к IP-адресу. Единственное исключение - привязка к 127.0.0.1, которая гарантирует, что приложение прослушивает только
lo
интерфейс.Вы правильно поняли : если у вас есть два интерфейса (скажем,
eth0
иeth1
) с двумя разными IP-адресами (например, 192.0.2.1 дляeth0
и 198.51.100.1 дляeth1
), и вы указываете приложению связываться с 192.0.2.1, приложение все равно будет прослушивать оба интерфейса, но будут отвечать, только если IP-адрес назначения равен 192.0.2.1. Таким образом, кто-то вeth1
интерфейсе, если его таблица маршрутизации определена надлежащим образом, может получить доступ к вашему приложению, обратившись к нему через адрес 192.0.2.1 (но не через 198.51.100.1) вeth1
интерфейсе.Предполагать, что привязка к IP-адресу такая же, как привязка к сетевому интерфейсу, совершенно неверна в Linux. Если это вас беспокоит, используйте политику маршрутизации и / или
iptables
.источник
Также с netstat, но конкретные аргументы:
источник
man netstat
. Разница, которую я предлагаю, заключается в изменении «запроса», который вы выполняете, чтобы явно указать интерфейс, который вы хотите проверить.netstat -i
перечислит интерфейсы, а не прослушивающие порты, -1 для ответа, который не отражает реальность